144 lines
4.2 KiB
PHP
144 lines
4.2 KiB
PHP
<?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;
|
|
}
|
|
|
|
|
|
}
|