doorcardpass && door move manager logging
This commit is contained in:
143
common/manager/DoorCardPassManager.php
Normal file
143
common/manager/DoorCardPassManager.php
Normal file
@@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
namespace common\manager;
|
||||
|
||||
use common\components\DateUtil;
|
||||
use common\components\Helper;
|
||||
use common\models\Card;
|
||||
use common\models\DoorCardPass;
|
||||
use DateInterval;
|
||||
use yii\base\BaseObject;
|
||||
use yii\web\NotFoundHttpException;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: rocho
|
||||
* Date: 2018.12.17.
|
||||
* Time: 6:12
|
||||
*/
|
||||
class
|
||||
DoorCardPassManager extends BaseObject
|
||||
{
|
||||
|
||||
public function createNewDoorCardPass($idCard)
|
||||
{
|
||||
$model = new DoorCardPass();
|
||||
$model->id_card = $idCard;
|
||||
|
||||
$validUntilTime = DateUtil::utcDateTime();
|
||||
$validUntilTime->add(new DateInterval('PT' . Helper::getDoorPassValidityIntervalMinutes() . 'M'));
|
||||
$validUntilTime->setTime($validUntilTime->format("H"), $validUntilTime->format("i"), 0);
|
||||
$model->valid_until_at = DateUtil::formatDateTimeUtc($validUntilTime);
|
||||
$model->save(false);
|
||||
return $model;
|
||||
}
|
||||
|
||||
public function hardReset(){
|
||||
$now = DateUtil::utcDateTime();
|
||||
DoorCardPass::updateAll(
|
||||
[
|
||||
'invalidated_at' => DateUtil::formatDateTimeUtc($now)
|
||||
],
|
||||
[
|
||||
'invalidated_at' => null
|
||||
]
|
||||
);
|
||||
\Yii::$app->db->createCommand(Card::SQL_DENY_DOOR_CARD_PASS())->execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws NotFoundHttpException
|
||||
*/
|
||||
public function updateDoorCardPassStateForCard($idCard)
|
||||
{
|
||||
$now = DateUtil::utcDateTime();
|
||||
$card = Card::findOne($idCard);
|
||||
if (!isset($card)) {
|
||||
throw new NotFoundHttpException();
|
||||
}
|
||||
$passes = $this->readAllNovInvalidatedAtCardPassForCard($idCard,$now);
|
||||
$this->setCardFlagAndInvalidateDoorCardPasses($card, $passes,$now);
|
||||
}
|
||||
|
||||
public function updateDoorCardPassStateForAllCard(){
|
||||
$passes = $this->readAllNonInvalidated();
|
||||
$map = array();
|
||||
foreach ($passes as $pass){
|
||||
$idCard = $pass->id_card;
|
||||
if ( !array_key_exists($idCard,$map)){
|
||||
$map[$idCard] = array();
|
||||
}
|
||||
$map[$idCard][] = $pass;
|
||||
}
|
||||
|
||||
$now = DateUtil::utcDateTime();
|
||||
|
||||
foreach ($map as $idCard => $passes){
|
||||
$card = Card::findOne($idCard);
|
||||
if (isset($card)) {
|
||||
$this->setCardFlagAndInvalidateDoorCardPasses($card, $passes,$now);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function readAllNovInvalidatedAtCardPassForCard($idCard)
|
||||
{
|
||||
return DoorCardPass::find()
|
||||
->andWhere(
|
||||
[
|
||||
'id_card' => $idCard,
|
||||
'invalidated_at' => null,
|
||||
]
|
||||
)->all();
|
||||
}
|
||||
|
||||
private function readAllNonInvalidated()
|
||||
{
|
||||
return DoorCardPass::find()
|
||||
->andWhere(
|
||||
['invalidated_at' => null]
|
||||
)->all() ;
|
||||
}
|
||||
|
||||
private function setCardFlagAndInvalidateDoorCardPasses($card, $doorCardPasses, $now)
|
||||
{
|
||||
$allowed = $this->hasActiveDoorCardPass($doorCardPasses, $now);
|
||||
$origFlag = $card->flag;
|
||||
$card->flag = Helper::setBit($card->flag, Card::$FLAG_DOOR_PASS_ALLOWED, !$allowed);
|
||||
if ($card->flag !== $origFlag) {
|
||||
$card->save(false);
|
||||
}
|
||||
$this->invalidateNonActiveDoorCardPasses($doorCardPasses, $now);
|
||||
}
|
||||
|
||||
private function invalidateNonActiveDoorCardPasses($doorCardPasses, $now)
|
||||
{
|
||||
foreach ($doorCardPasses as $pass) {
|
||||
if (isset($pass->valid_until_at) && !empty($pass->valid_until_at)) {
|
||||
\Yii::error( "mydate". print_r($pass->valid_until_at ,true));
|
||||
|
||||
$validUntilAt = DateUtil::parseDateTime($pass->valid_until_at);
|
||||
$active = ($validUntilAt >= $now);
|
||||
if (!$active) {
|
||||
$pass->invalidated_at = DateUtil::formatDateTimeUtc($now);
|
||||
$pass->save(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function hasActiveDoorCardPass($doorCardPasses, $now)
|
||||
{
|
||||
$active = false;
|
||||
foreach ($doorCardPasses as $pass) {
|
||||
if (isset($pass->valid_until_at)) {
|
||||
$validUntilAt = DateUtil::parseDateTime($pass->valid_until_at);
|
||||
$active |= ($validUntilAt >= $now);
|
||||
}
|
||||
}
|
||||
return $active;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user