/** * @param $attribute * @param \MongoDate|string|int $oldValue * @param \MongoDate|string|int $newValue * @return array|bool */ private function getLogRow($attribute, $oldValue, $newValue) { $row = ['date' => new \MongoDate(), 'user' => \Yii::$app->user->identity['fullName']]; switch ($attribute) { case 'date': $row['action'] = "Изменилась дата с " . \Yii::$app->formatter->asDate($oldValue->toDateTime()) . " на " . \Yii::$app->formatter->asDate($newValue->toDateTime()); return $row; case 'beginTime': $row['action'] = "Изменилось время начала с " . MinuteFormatter::asString($oldValue) . " на " . MinuteFormatter::asString($newValue); return $row; case 'endTime': $row['action'] = "Изменилось время окончания с " . MinuteFormatter::asString($oldValue) . " на " . MinuteFormatter::asString($newValue); return $row; case 'participantsId': $action = ''; foreach ($newValue as $item) { $index = array_search($item, $oldValue); if ($index !== false) { unset($oldValue[$index]); } else { $action .= "Участник '" . Participant::findOne(['_id' => $item])->shortName . "' был добавлен\n"; } } foreach ($oldValue as $item) { $action .= "Участник '" . Participant::findOne(['_id' => $item])->shortName . "' был удалён\n"; } $row['action'] = $action; return $row; default: return false; } }
public function approveRoom($roomId) { $request = $this->request; $roomMongoId = new \MongoId($roomId); $approvedRoomMongoId = new \MongoId($this->approvedRoomId); /** @var Collection $participantCollection*/ $participantCollection = \Yii::$app->get('mongodb')->getCollection(Participant::collectionName()); /** @var Collection $requestCollection*/ $requestCollection = \Yii::$app->get('mongodb')->getCollection(Request::collectionName()); $newLogRecord = false; if ($this->approvedRoomId !== $roomId) { $key = array_search($roomMongoId, $request->participantsId); /** Если меняется комната в заявке */ if ($key !== false) { $requestCollection->update(['_id' => $request->_id, 'participantsId' => $roomMongoId], ['$set' => ['participantsId.$' => $approvedRoomMongoId]]); $participantCollection->update(['_id' => $roomMongoId], ['$pull' => ['log' => ['requestId' => $request->_id]]]); \Yii::$app->mailer->compose(['html' => 'changeRoom'], ['request' => $request, 'oldRoom' => Participant::findOne(['_id' => $roomMongoId]), 'newRoom' => Participant::findOne(['_id' => $approvedRoomMongoId])])->setFrom([\Yii::$app->params['email.admin'] => 'Служба технической поддержки ' . \Yii::$app->name])->setTo($request->owner->email)->setSubject("Изменение помещения в заявке")->send(); $newLogRecord = true; } } $this->saveRoomStatus($approvedRoomMongoId, Participant::STATUS_APPROVE, $newLogRecord); }
public function behaviors() { return ['verbs' => ['class' => VerbFilter::className(), 'actions' => ['index' => ['get'], 'view' => ['get'], 'create' => ['get', 'post'], 'update' => ['get', 'post'], 'delete' => ['post'], 'approve' => ['post'], 'cancel' => ['get', 'post']]], 'access' => ['class' => AccessControl::className(), 'only' => ['approve-booking', 'update', 'create'], 'rules' => [['actions' => ['create'], 'allow' => true, 'roles' => ['@']], ['actions' => ['approve-booking'], 'allow' => true, 'matchCallback' => function () { /** @var Participant $room */ $room = Participant::findOne(['_id' => \Yii::$app->request->get('roomId')]); return \Yii::$app->user->identity['_id'] == $room->confirmPersonId; }], ['actions' => ['update'], 'allow' => true, 'matchCallback' => function () { if (\Yii::$app->user->can(SystemPermission::APPROVE_REQUEST)) { return true; } $request = Request::findOne(['_id' => \Yii::$app->request->get('id')]); if (!\Yii::$app->user->can(SystemPermission::UPDATE_REQUEST, ['object' => $request])) { return false; } $allowTime = $request->date->sec + ($request->beginTime - \Yii::$app->params['vks.allowRequestUpdateMinute']) * 60; $now = time() + 3 * 60 * 60; //Минус разница формата TimeZone if ($now > $allowTime) { throw new ForbiddenHttpException("Заявку нельзя редактировать менее чем за " . \Yii::$app->params['vks.allowRequestUpdateMinute'] . " минут до начала мероприятия"); } else { return true; } }]]]]; }