door manager extra logging + docu improvment

This commit is contained in:
Schneider Roland
2022-11-25 19:25:29 +01:00
parent d432064b3d
commit 94364c2f56
4 changed files with 340 additions and 270 deletions

View File

@@ -15,6 +15,8 @@ use common\models\Ticket;
use common\models\VirtualKey;
use frontend\models\KeyToggleForm;
use yii\base\BaseObject;
use yii\base\InvalidConfigException;
use yii\db\Exception;
use yii\web\BadRequestHttpException;
use yii\web\ServerErrorHttpException;
@@ -42,11 +44,18 @@ class DoorManager extends BaseObject
*/
public function move($identifier, $device, $direction, $verifyOnly, $createdAt = null, $date = null)
{
$requestId = uniqid("",false);
$stopWatch = new StopWatch();
\Yii::info("move with next parameers:" . ";identifier" . $identifier . ";device" . $device . ";direction" . $direction . ";verifyOnly" . $verifyOnly . ";createdAt" . print_r($createdAt,true) . ";date" . print_r($date,true));
\Yii::info("move get request: " . print_r($_GET, true));
\Yii::info("move post request: " . print_r($_GET, true));
// for testing purposes
if ( Helper::isRestAllowVerifyOnly() === false ){
\Yii::info("$requestId: verifyonly not allowed");
$verifyOnly = false;
}
\Yii::info("$requestId: move with next parameers:" . ";identifier" . $identifier . ";device" . $device . ";direction" . $direction . ";verifyOnly" . $verifyOnly . ";createdAt" . print_r($createdAt,true) . ";date" . print_r($date,true));
\Yii::info("$requestId: move get request: " . print_r($_GET, true));
\Yii::info("$requestId: move post request: " . print_r($_GET, true));
if (isset($createdAt)) {
$createdAt = DateUtil::parseDateTime($createdAt);
@@ -61,7 +70,7 @@ class DoorManager extends BaseObject
}
if ($device === 'E') {
$this->moveEmergency($identifier, $device, $direction, $verifyOnly, $createdAt, $date);
$this->moveEmergency($requestId,$identifier, $device, $direction, $verifyOnly, $createdAt, $date);
return;
}
@@ -76,7 +85,7 @@ class DoorManager extends BaseObject
$direction = DoorLog::$DIRECTION_OUT;
break;
default:
throw new BadRequestHttpException("Direction not supported: " . $direction);
throw new BadRequestHttpException("$requestId: Direction not supported: " . $direction);
}
// if device is qr code
@@ -84,27 +93,27 @@ class DoorManager extends BaseObject
// allow only virtual key
$virtualKey = VirtualKey::findOne(['number' => $identifier]);
if (!isset($virtualKey)) {
throw new BadRequestHttpException("Virtual key not found: " . $identifier);
throw new BadRequestHttpException("$requestId: Virtual key not found: " . $identifier);
}
$card = Card::findOne($virtualKey->id_card);
if ($card != null) {
$card = Card::readCard($card->number);
}
if ($card == null) {
throw new BadRequestHttpException("Card not found by virtual key: " . $identifier . '/' . $virtualKey->id_card);
throw new BadRequestHttpException("$requestId: Card not found by virtual key: " . $identifier . '/' . $virtualKey->id_card);
}
$cardNumber = $card->number;
\Yii::info("virtual key and card loaded in sec " . $stopWatch->split());
\Yii::info("$requestId: virtual key and card loaded in sec " . $stopWatch->split());
} else {
// load by rfid or card number
$card = Card::readCard(Helper::fixAsciiChars($identifier));
\Yii::info("Card loaded in sec " . $stopWatch->split());
\Yii::info("$requestId: Card loaded in sec " . $stopWatch->split());
if (!isset($card)) {
throw new BadRequestHttpException('Card not found with number: ' . $identifier);
throw new BadRequestHttpException("$requestId: Card not found with number: " . $identifier);
}
\Yii::info("card loaded in sec " . $stopWatch->split());
\Yii::info("$requestId: card loaded in sec " . $stopWatch->split());
$virtualKey = VirtualKey::findOne(['id_card' => $card->id_card]);
\Yii::info("virtual key for card loaded in sec " . $stopWatch->split());
\Yii::info("$requestId: virtual key for card loaded in sec " . $stopWatch->split());
}
@@ -113,13 +122,13 @@ class DoorManager extends BaseObject
return;
}
$this->moveCustomer($identifier, $device, $direction, $verifyOnly, $createdAt, $date, $card, $cardNumber, $virtualKey);
$this->moveCustomer($requestId, $identifier, $device, $direction, $verifyOnly, $createdAt, $date, $card, $cardNumber, $virtualKey);
}
function moveEmergency($identifier, $device, $direction, $verifyOnly, $createdAt, $date)
function moveEmergency($requestId,$identifier, $device, $direction, $verifyOnly, $createdAt, $date)
{
\Yii::info("emergency move");
\Yii::info("$requestId: emergency move");
try {
$createdAtStr = DateUtil::formatDateTimeUtc($createdAt);
\Yii::$app->db->beginTransaction();
@@ -188,6 +197,7 @@ class DoorManager extends BaseObject
}
/**
* @param $requestId
* @param $identifier string virtual key id, card rfid or card number
* @param $device string device
* @param $direction number direction
@@ -200,19 +210,17 @@ class DoorManager extends BaseObject
* @return void
* @throws BadRequestHttpException
* @throws ServerErrorHttpException
* @throws \Throwable
* @throws \yii\base\InvalidConfigException
* @throws \yii\db\Exception
* @throws \yii\db\StaleObjectException
* @throws InvalidConfigException
* @throws Exception
*/
function moveCustomer($identifier, $device, $direction, $verifyOnly, $createdAt, $date, $card, $cardNumber, $virtualKey)
function moveCustomer($requestId, $identifier, $device, $direction, $verifyOnly, $createdAt, $date, $card, $cardNumber, $virtualKey)
{
\Yii::info("move customer");
\Yii::info("$requestId: move customer");
$stopWatch = new StopWatch();
try {
$createdAtStr = DateUtil::formatDateTimeUtc($createdAt);
\Yii::info("crated at str: ". $createdAtStr);
\Yii::info("$requestId: crated at str: ". $createdAtStr);
\Yii::$app->db->beginTransaction();
$doorLog = new DoorLog();
@@ -225,7 +233,7 @@ class DoorManager extends BaseObject
$activeTickets = Ticket::readActive($card, clone $date);
\Yii::info('active ticket count:' . count($activeTickets));
\Yii::info("$requestId: active ticket count:" . count($activeTickets));
/** @var Ticket $ticket */
$ticket = null;
if (isset($activeTickets) && count($activeTickets) > 0) {
@@ -233,54 +241,54 @@ class DoorManager extends BaseObject
}
if (!isset($ticket)) {
throw new BadRequestHttpException("No active ticket found for:" . $card->number);
throw new BadRequestHttpException("$requestId: No active ticket found for:" . $card->number);
}
\Yii::info("ticket {$ticket->id_ticket} loaded in sec " . $stopWatch->split());
\Yii::info("$requestId: ticket {$ticket->id_ticket} loaded in sec " . $stopWatch->split());
$doorLog->id_ticket_current = $ticket->id_ticket;
// customer is also required
$customer = $card->customer;
if (!isset($customer)) {
throw new BadRequestHttpException("Customer not found for:" . $card->number);
throw new BadRequestHttpException("$requestId: Customer not found for:" . $card->number);
}
$doorLog->id_customer = $customer->id_customer;
\Yii::info("customer {$customer->id_customer} loaded in sec " . $stopWatch->split());
\Yii::info("$requestId: customer {$customer->id_customer} loaded in sec " . $stopWatch->split());
if (!$verifyOnly) {
// save the door log
$doorLog->save(false);
}
\Yii::info("door log {$doorLog->id_door_log} saved in sec " . $stopWatch->split());
\Yii::info("$requestId: door log {$doorLog->id_door_log} saved in sec " . $stopWatch->split());
// if direction is in
if ($direction == DoorLog::$DIRECTION_IN) {
if ($card->isFlagDoor()) {
throw new BadRequestHttpException("Card already 'IN': " . $card->id_card);
throw new BadRequestHttpException("$requestId: Card already 'IN': " . $card->id_card);
}
if ($card->isFlagKey()) {
throw new BadRequestHttpException("Key required: " . $card->id_card);
throw new BadRequestHttpException("$requestId: Key required: " . $card->id_card);
}
if ($card->isFlagStatus()) {
throw new BadRequestHttpException("Card has no active status: " . $card->id_card);
throw new BadRequestHttpException("$requestId: Card has no active status: " . $card->id_card);
}
if (isset($virtualKey)) {
if (isset($virtualKey->direction_in_at)) {
throw new BadRequestHttpException("Virtual key - already moved in: " . $identifier . '/' . $virtualKey->id_card);
throw new BadRequestHttpException("$requestId: Virtual key - already moved in: " . $identifier . '/' . $virtualKey->id_card);
}
$virtualKey->direction_in_at = Helper::getDateTimeString();
\Yii::info("Setting virtual key direction_in_at");
\Yii::info("$requestId: Setting virtual key direction_in_at");
if (!$verifyOnly) {
\Yii::info("Updating virtual key");
\Yii::info("$requestId: Updating virtual key");
$virtualKey->save(false);
}
}
@@ -289,13 +297,13 @@ class DoorManager extends BaseObject
if (!$verifyOnly) {
// if not verifyonly, check, if ticket usage count must be increased
$countDoorLogsForTicketSince = $this->getCountDoorLogsForTicketSince($ticket->id_ticket, DateUtil::utcDate(clone $date));
\Yii::info("getCountDoorLogsForTicketSince: " . $countDoorLogsForTicketSince);
\Yii::info("$requestId: getCountDoorLogsForTicketSince: " . $countDoorLogsForTicketSince);
if (!isset($countDoorLogsForTicketSince)) {
$countDoorLogsForTicketSince = 0;
}
\Yii::info("count of door logs '{$countDoorLogsForTicketSince}' loaded in sec " . $stopWatch->split());
\Yii::info("$requestId: count of door logs '{$countDoorLogsForTicketSince}' loaded in sec " . $stopWatch->split());
// if the current event is the first door log today
if ($countDoorLogsForTicketSince == 1) {
@@ -303,7 +311,7 @@ class DoorManager extends BaseObject
$usageCount = $ticket->usage_count;
$ticket->usage_count += 1;
$ticket->save(false);
\Yii::info("First ticket usage today, increasing usage count for card: " . $card->id_card);
\Yii::info("$requestId: First ticket usage today, increasing usage count for card: " . $card->id_card);
Log::log(
[
'type' => Log::$TYPE_TICKET_USAGE_FIRST,
@@ -312,10 +320,10 @@ class DoorManager extends BaseObject
'id_door_log' => $doorLog->id_door_log
]
);
\Yii::info("Ticket usage count increased after first doorlog of day in sec " . $stopWatch->split());
\Yii::info("$requestId: Ticket usage count increased after first doorlog of day in sec " . $stopWatch->split());
} else {
\Yii::info("more then one door log today for card: " . $card->id_card);
\Yii::info("$requestId: more then one door log today for card: " . $card->id_card);
// we have already a door log for today, other than this
// Now we split the day into 3hour intervalls, starting with the createdAt value of the first event.
// If the actual event happens in an interval, in which still now doorlog event happend, we increase
@@ -332,9 +340,9 @@ class DoorManager extends BaseObject
->andWhere(['in', 'direction', [DoorLog::$DIRECTION_IN_WITHOUT_MOVE, DoorLog::$DIRECTION_IN]])
->orderBy(['door_log.created_at' => SORT_ASC])
->all();
\Yii::info("All door logs for today loaded in sec " . $stopWatch->split());
\Yii::info("$requestId: All door logs for today loaded in sec " . $stopWatch->split());
\Yii::info("allDoorLogToday", print_r($allDoorLogToday, true));
\Yii::info("$requestId: allDoorLogToday", print_r($allDoorLogToday, true));
if (isset($allDoorLogToday) && count($allDoorLogToday) > 0) {
@@ -343,7 +351,7 @@ class DoorManager extends BaseObject
if (isset($firstInToday)) {
\Yii::info("first in today for card: " . $card->id_card . " was at " . $firstInToday->created_at);
\Yii::info("$requestId: first in today for card: " . $card->id_card . " was at " . $firstInToday->created_at);
$firstEntryDateTimeToday = DateUtil::parseDateTime($firstInToday->created_at);
@@ -365,7 +373,7 @@ class DoorManager extends BaseObject
$activeInterval = $this->getActiveInterval($intervals, $createdAt);
if (!isset($activeInterval)) {
throw new ServerErrorHttpException("Active Interval not found");
throw new ServerErrorHttpException("$requestId: Active Interval not found");
}
$logCountInActiveInterval = count($activeInterval['logs']);
@@ -373,7 +381,7 @@ class DoorManager extends BaseObject
if ($logCountInActiveInterval == 1) {
$ticket->usage_count = $ticket->usage_count + 1;
$ticket->save(false);
\Yii::info("Ticket usage count increased after first IN after first door_log in interval in sec " . $stopWatch->split());
\Yii::info("$requestId: Ticket usage count increased after first IN after first door_log in interval in sec " . $stopWatch->split());
}
}
@@ -385,27 +393,27 @@ class DoorManager extends BaseObject
if ($direction == DoorLog::$DIRECTION_OUT || $direction == DoorLog::$DIRECTION_OUT_WITHOUT_MOVE) {
if ($card->isFlagOutKey()) {
throw new BadRequestHttpException("Can't exit with card has a key assigned");
throw new BadRequestHttpException("$requestId: Can't exit with card has a key assigned");
}
if ($card->isFlagStatus()) {
throw new BadRequestHttpException("Can't exit with card has inactive status");
throw new BadRequestHttpException("$requestId: Can't exit with card has inactive status");
}
$keyAssigned = CardKeyAssignment::findOne(['id_card' => $card->id_card]);
if (isset($keyAssigned)) {
throw new BadRequestHttpException("Can't exit with card has a key assigned");
throw new BadRequestHttpException("$requestId: Can't exit with card has a key assigned");
}
if (isset($virtualKey)) {
if (!isset($virtualKey->direction_in_at)) {
throw new BadRequestHttpException("Virtual key: move out without move in");
throw new BadRequestHttpException("$requestId: Virtual key: move out without move in");
}
if (isset($virtualKey->direction_out_at)) {
throw new BadRequestHttpException("Virtual key: already move out");
throw new BadRequestHttpException("$requestId: Virtual key: already move out");
}
$virtualKey->direction_out_at = Helper::getDateTimeString();
@@ -419,12 +427,12 @@ class DoorManager extends BaseObject
if (!$verifyOnly) {
$ticket->save(false);
}
\Yii::info("direction_out: ticket count_move_out set after direction_out in sec " . $stopWatch->split());
\Yii::info("$requestId: direction_out: ticket count_move_out set after direction_out in sec " . $stopWatch->split());
}
if (!$verifyOnly) {
Card::updateCardFlagTicket($ticket->id_ticket);
\Yii::info("updateCardFlagTicket: card flag updated in sec " . $stopWatch->split());
\Yii::info("$requestId: updateCardFlagTicket: card flag updated in sec " . $stopWatch->split());
// reload card after flag is set
$card = Card::readCard($cardNumber);
@@ -432,22 +440,22 @@ class DoorManager extends BaseObject
$card->flag_out = Helper::setBit($card->flag_out, Card::$FLAG_DOOR, true);
$card->flag = Helper::setBit($card->flag, Card::$FLAG_DOOR, false);
$card->save(false);
\Yii::info("direction_out: Door flag updated in sec " . $stopWatch->split());
\Yii::info("$requestId: direction_out: Door flag updated in sec " . $stopWatch->split());
} else if ($direction == DoorLog::$DIRECTION_IN || $direction == DoorLog::$DIRECTION_IN_WITHOUT_MOVE) {
$card->flag_out = Helper::setBit($card->flag_out, Card::$FLAG_DOOR, false);
$card->flag = Helper::setBit($card->flag, Card::$FLAG_DOOR, true);
$card->save(false);
\Yii::info("direction_in: Card flag updated in sec " . $stopWatch->split());
\Yii::info("$requestId: direction_in: Card flag updated in sec " . $stopWatch->split());
}
}
$stopWatch->stop();
\Yii::info("finished in sec " . $stopWatch->getTotal());
\Yii::info("$requestId: finished in sec " . $stopWatch->getTotal());
\Yii::$app->db->transaction->commit();
\Yii::info("Commited");
\Yii::info("$requestId: Commited");
} catch (\Exception $e) {
\Yii::$app->db->transaction->rollBack();
\Yii::info("rollbacked");
\Yii::info("$requestId: rollbacked");
throw $e;
}
}