50 "; public static $SQL_FIX_KEY_STATUS = " update card as c1 left join card_key_assignment k on k.id_card = c1.id_card set flag = CASE WHEN k.id_key is null then (c1.flag | 1 << 2) else ( c1.flag & ~(1 << 2 ) ) end, flag_out = CASE WHEN k.id_key is null then ( c1.flag_out & ~(1 << 2 )) else (c1.flag_out | 1 << 2 ) end WHERE c1.type <> 50 "; public static $SQL_CLEAR_KEY_STATUS = " UPDATE card set flag = ( flag & ~(1 << 2 ) ) , flag_out = ( flag_out & ~(1 << 2 ) ) WHERE card.type <> 50 "; public static $SQL_CLEARS_STATUS_DOOR_IN = " UPDATE card set flag = ( flag & ~(1 << 1 ) ) WHERE card.type <> 50 and card.id_card = :id "; public static function SQL_CLEAR_STATUS_DOOR_ALLOWED_FLAG(){ return "UPDATE card set flag = ( flag & ~(1 << " . Card::$FLAG_DOOR_ALLOWED. " ) ) WHERE card.type <> 50 "; } public static function SQL_CLEAR_STATUS_DOOR_ALLOWED_FLAG_FOR_CARD(){ return Card::SQL_CLEAR_STATUS_DOOR_ALLOWED_FLAG() . " and card.id_card = :id "; } public static $SQL_UPDATE_FLAG_STATUS_ACTIVE = ' update card set flag = CASE WHEN status = 20 then (flag | 1 << 3) else ( flag & ~(1 << 3 ) ) end '; /** * @inheritdoc */ public static function tableName() { return 'card'; } /** * @inheritdoc */ public function rules() { return [ [['number', 'type','status'], 'required'], [['status', 'type'], 'integer'], [['number'], 'string', 'max' => 20], [['rfid_key'], 'string', 'max' => 25], [['number'], 'unique' ], [['rfid_key','number'] , 'validateAscii'] ]; } /** * @inheritdoc */ public function attributeLabels() { /** @noinspection PhpUndefinedClassInspection */ return [ 'id_card' => Yii::t('common/card', 'Id Card'), 'number' => Yii::t('common/card', 'Number'), 'rfid_key' => Yii::t('common/card', 'RFID key'), 'status' => Yii::t('common/card', 'Status'), 'type' => Yii::t('common/card', 'Type'), 'created_at' => Yii::t('common/card', 'Created At'), 'updated_at' => Yii::t('common/card', 'Updated At'), ]; } public function validateAscii($attribute, /** @noinspection PhpUnusedParameterInspection */ $params){ if ( !$this->hasErrors($this->$attribute)){ $this->$attribute = Helper::fixAsciiChars($this->$attribute); /** @noinspection PhpUndefinedClassInspection */ Yii::info(" $attribute converted to: " . $this->$attribute); } } static function statuses() { /** @noinspection PhpUndefinedClassInspection */ return [ self::STATUS_ACTIVE => 'Aktív', self::STATUS_DELETED => 'Törölve', self::STATUS_INACTIVE => 'Inaktív', ]; } public function getStatusHuman(){ $result = null; $s = self::statuses(); if ( array_key_exists($this->status, $s)){ $result = $s[$this->status]; } return $result; } public static function toStatusName($status , $def = ""){ return Helper::getArrayValue(self::statuses(), $status, $def); } public static function toTypeName($type , $def = ""){ return Helper::getArrayValue(self::types(), $type, $def); } static function types() { /** @noinspection PhpUndefinedClassInspection */ return [ self::TYPE_RFID => Yii::t('common/card', 'RFID'), self::TYPE_QRCODE => Yii::t('common/card', 'QRCODE'), self::TYPE_BARCODE => Yii::t('common/card', 'BARCODE'), self::TYPE_OLD => Yii::t('common/card', 'OLD'), self::TYPE_EMPLOYEE => Yii::t('common/card', 'Munkatárs'), self::TYPE_REVIEW => Yii::t('common/card', 'Review'), ]; } public function getTypeHuman(){ $result = null; $s = self::types(); if ( array_key_exists($this->type, $s)){ $result = $s[$this->type]; } return $result; } public function isInactive(){ return $this->status == self::STATUS_DELETED; } /** * Load card from the DB , where the number equals with card number or RFID number * @param number|string $number the card number or the RFID number * @param null|boolean $free optional. if set, append free or not free condition. * @return \common\models\Card|null the card or null, if not found with given conditions */ public static function readCard($number,$free = null){ $card = null; $query = Card::find() ->leftJoin(Customer::tableName(), 'card.id_card = customer.id_customer_card ' ); Card::addCardNumberCondition($query, $number); if ( isset($free) ){ if ( $free == true){ $query->andWhere('customer.id_customer is null'); }else{ $query->andWhere('customer.id_customer is not null'); } } $cards = $query->all(); if ( count($cards) == 1){ $card = $cards[0]; } return $card; } public function getCustomer(){ return $this->hasOne(Customer::className(), ['id_customer_card' => 'id_card']); } public function getCustomerName(){ $name = null; if ( $this->customer != null){ $name = $this->customer->name; } return $name; } /** @noinspection PhpUndefinedClassInspection */ /** * @param \yii\db\Query $query * @param number $number * @param string $field_number * @param string $field_rfid_key */ public static function addCardNumberCondition($query, $number, $field_number = "card.number", $field_rfid_key = "card.rfid_key"){ $query->andWhere(['or', ['and',[ 'in',$field_number , [$number]],"trim(coalesce(card.number, '')) <>'' " ], ['and', ['in',$field_rfid_key ,[ $number ] ],"trim(coalesce(card.rfid_key, '')) <>'' "], ]); } public static function updateCardFlagTicket($id){ if ( !isset($id)){ return ; } /** @noinspection PhpUndefinedClassInspection */ $db = \Yii::$app->db; $command = $db->createCommand(Ticket::$SQL_UPDATE_CARD,[':id' => $id]); $command->execute(); $command = $db->createCommand(Card::$SQL_CLEARS_STATUS_DOOR_IN,[':id' => $id]); $command->execute(); if ( Helper::isTicketTypeDoorAllowedCheckOn()) { $command = $db->createCommand(Ticket::SQL_UPDATE_DOOR_ALLOWED_FLAG_FOR_CARD(), [':id' => $id]); $command->execute(); }else{ $command = $db->createCommand(Card::SQL_CLEAR_STATUS_DOOR_ALLOWED_FLAG_FOR_CARD(), [':id' => $id]); $command->execute(); } } public function beforeSave($insert) { if (parent::beforeSave($insert)){ $this->flag = Helper::setBit( $this->flag , Card::$FLAG_STATUS, ( $this->status != Card::STATUS_ACTIVE ) ); return true; } return false; } public function getFlagText(){ return Helper::getArrayValue(DoorLog::getCardFlagTexts(), $this->validity, "Ismeretlen"); } public function setFlagsHasKey($hasKey){ if (Helper::isKeyRequired()){ $this->flag = $hasKey ? ( $this->flag & ~(1 << Card::$FLAG_KEY) ) : ( $this->flag | 1 << Card::$FLAG_KEY ); $this->flag_out = $hasKey ? ( $this->flag_out | 1 << Card::$FLAG_KEY ) : ( $this->flag_out & ~(1 << Card::$FLAG_KEY) ); /** @noinspection PhpUndefinedClassInspection */ }else{ $this->flag = ( $this->flag & ~(1 << Card::$FLAG_KEY) ); $this->flag_out = ( $this->flag_out & ~(1 << Card::$FLAG_KEY) ); } \Yii::info("flag has key: ".$this->flag .";".$this->flag_out); } public function isFlagValidity(){ return Helper::isBitOn($this->flag,Card::$FLAG_TICKET); } public function isFlagDoor(){ return Helper::isBitOn($this->flag,Card::$FLAG_DOOR); } public function isFlagKey(){ return Helper::isBitOn($this->flag,Card::$FLAG_KEY); } public function isFlagStatus(){ return Helper::isBitOn($this->flag,Card::$FLAG_STATUS); } public function isFlagOutDoor(){ return Helper::isBitOn($this->flag_out,Card::$FLAG_DOOR); } public function isFlagOutKey(){ return Helper::isBitOn($this->flag_out,Card::$FLAG_KEY); } /** * if flag is on, door entry is not allowed. */ public function isFlagDoorAllowed(){ return Helper::isBitOn($this->flag,Card::$FLAG_DOOR_ALLOWED); } public static function updateFlagStatus(){ \Yii::$app->db->createCommand(self::$SQL_UPDATE_FLAG_STATUS_ACTIVE)->execute(); } public function isFree(){ return !isset($this->customer); } public function getActiveTickets(){ return Ticket::readActive($this); } }