fitness-web/common/manager/DoorCardPassManager.php
2023-02-11 14:32:17 +01:00

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;
}
}