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