public function notify(Request $request) { $request->on(Request::EVENT_AFTER_UPDATE, function ($event) { /** @var $request Request */ $request = $event->sender; \Yii::$app->mailer->compose('rso-agreement-updated', ['request' => $request])->setFrom([\Yii::$app->params['email.admin'] => \Yii::$app->name])->setTo($request->owner->email)->setSubject('Изменение статуса согласования заявки с РСО')->send(); }); }
public function notify(Request $request) { if ($request->rsoAgreement === Request::RSO_AGREEMENT_IN_PROCESS) { $eventName = $request->isNewRecord ? Request::EVENT_AFTER_INSERT : Request::EVENT_AFTER_UPDATE; $request->on($eventName, function ($event) { $query = User::find()->where(['_id' => \Yii::$app->authManager->getUserIdsByRole(SystemRole::RSO)])->asArray(); $emails = ArrayHelper::getColumn($query->all(), 'email'); \Yii::$app->mailer->compose('rso-new-agreement', ['request' => $event->sender])->setFrom([\Yii::$app->params['email.admin'] => \Yii::$app->name])->setTo($emails)->setSubject('Необходимо согласование заявки')->send(); }); } }
/** * @return ActiveDataProvider */ public function search() { $query = Request::find(); $sort = new Sort(['attributes' => ['date' => ['asc' => ['date' => SORT_ASC, 'beginTime' => SORT_ASC], 'desc' => ['date' => SORT_DESC, 'beginTime' => SORT_DESC]], 'beginTime']]); $dataProvider = new ActiveDataProvider(['sort' => $sort, 'query' => $query]); if ($this->scenario === self::SCENARIO_SEARCH_SCHEDULE) { $dataProvider->pagination = false; $sort->defaultOrder = ['date' => SORT_DESC, 'beginTime' => SORT_ASC]; } elseif ($this->scenario === self::SCENARIO_SEARCH_PERSONAL) { $dataProvider->pagination = new Pagination(['pageSize' => 20]); $sort->defaultOrder = ['date' => SORT_DESC]; } if (!$this->validate()) { return $dataProvider; } $query->andFilterWhere(['date' => $this->date]); if (is_array($this->participantsId)) { $query->andWhere(['participantsId' => ['$in' => $this->participantsId]]); } if ($this->searchKey !== null) { $query->andWhere(['$or' => [['topic' => ['$regex' => $this->searchKey, '$options' => 'i']], ['note' => ['$regex' => $this->searchKey, '$options' => 'i']]]]); } $query->andFilterWhere(['createdBy' => $this->createdBy]); return $dataProvider; }
/** * @param \MongoDate $date * @return array|string */ public static function participantsCountPerHour(\MongoDate $date) { /** @var $collection Collection */ $collection = \Yii::$app->get('mongodb')->getCollection(Request::collectionName()); $map = new \MongoCode("function() {\n for (var i = 8 * 60; i < 19 * 60; i = i + 30) {\n if (this.beginTime < i + 30 && this.endTime > i) {\n emit(i, this.participantsId.length);\n }\n }\n }"); $reduce = new \MongoCode("function (key, values) {return Array.sum(values)}"); $out = ['inline' => true]; $condition = ['date' => $date, 'mode' => Request::MODE_WITH_VKS, 'status' => ['$ne' => Request::STATUS_CANCEL]]; $result = $collection->mapReduce($map, $reduce, $out, $condition); return ArrayHelper::map($result, '_id', 'value'); }
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 getRoomApproveList() { /** @var Collection $collection */ $collection = \Yii::$app->get('mongodb')->getCollection(Participant::collectionName()); $list = $collection->aggregate([['$match' => ['confirmPersonId' => $this->_id, 'log.status' => Participant::STATUS_CONSIDIRATION]], ['$unwind' => '$log'], ['$match' => ['log.status' => Participant::STATUS_CONSIDIRATION]], ['$project' => ['name' => 1, 'request' => '$log.requestId']]]); foreach ($list as $key => $value) { $list[$key]['request'] = VksRequest::findOne(['_id' => $value['request']]); } return $list; }
?> <div class="row"> <div class="col-md-8"> <?php echo $form->field($model, 'searchKey')->textInput(['placeholder' => 'Введите текст заявки'])->label(false); ?> </div> <div class="col-md-4" style="vertical-align: bottom"> <?php echo Html::submitButton('<span class="glyphicon glyphicon-search"></span> Найти', ['class' => 'btn btn-primary']); ?> </div> </div> <?php ActiveForm::end(); ?> <?php echo GridView::widget(['dataProvider' => $dataProvider, 'tableOptions' => ['class' => 'table'], 'columns' => [['class' => 'yii\\grid\\SerialColumn'], ['attribute' => 'topic', 'content' => function ($model) { return Html::a($model->topic, ['vks-request/view', 'id' => (string) $model->primaryKey]); }, 'contentOptions' => ['style' => 'width: 62%']], ['attribute' => 'status', 'value' => function ($model) { return Request::statusName($model->status); }, 'contentOptions' => ['style' => 'width: 13%']], ['attribute' => 'date', 'content' => function ($model) { return Yii::$app->formatter->asDate($model->date->sec) . " c {$model->beginTimeString} по {$model->endTimeString}"; }, 'contentOptions' => ['style' => 'width: 20%']], ['class' => \yii\grid\ActionColumn::className(), 'controller' => 'vks-request', 'template' => '{delete}', 'visible' => Yii::$app->user->can(SystemPermission::DELETE_REQUEST)]]]); ?> </div>
public function actionApproveBooking($roomId, $requestId, $status = Participant::STATUS_APPROVE) { $request = Request::findOne(['_id' => $requestId]); if (!$request instanceof Request) { throw new NotFoundHttpException("Заявка на бронирование не найдена."); } $model = new ApproveRoomForm(['approvedRoomId' => $roomId, 'request' => $request]); if ($status === Participant::STATUS_CANCEL) { $model->scenario = ApproveRoomForm::SCENARIO_CANCEL_ROOM; } if ($model->load(\Yii::$app->request->post()) && $model->validate()) { if ($status === Participant::STATUS_APPROVE) { $model->approveRoom($roomId); } elseif ($status === Participant::STATUS_CANCEL) { $model->cancelRoom($roomId); } return $this->redirect(['user/booking-approve-list']); } return $this->render('approve-room', ['model' => $model]); }
<div id="vks-schedule-legend"> <div> <div class="status-color-box status-considiration"></div> - <?php echo Request::statusName(Request::STATUS_OSKR_CONSIDERATION); ?> </div> <div> <div class="status-color-box status-approve"></div> - <?php echo Request::statusName(Request::STATUS_APPROVE); ?> </div> <div> <div class="status-color-box status-ahu-approve"></div> - <?php echo Request::statusName(Request::STATUS_ROOMS_CONSIDIRATION); ?> </div> <div> <div class="status-color-box status-cancel"></div> - <?php echo Request::statusName(Request::STATUS_CANCEL); ?> </div> </div> <?php $options = \yii\helpers\Json::encode(['timeColumnWidth' => 45, 'timeGridSelector' => 'table.vks-time-grid', 'currentTimeSelector' => '#current-time', 'requestsGridSelector' => '#vks-schedule-grid', 'requestContainerSelector' => 'button.vks-request', 'modalWidgetSelector' => '#vks-view-modal-widget', 'modalContentSelector' => '#vks-view-container']); $this->registerJs("\$('#vks-schedule').schedule({$options});");
/** * @inheritDoc */ public function afterSave($insert, $changedAttributes) { parent::afterSave($insert, $changedAttributes); if ($insert) { $this->trigger(self::EVENT_STATUS_CHANGED, new RequestStatusChangedEvent(['request' => $this])); foreach ($this->participants as $participant) { if ($participant->ahuConfirmation) { $roomStatus = Participant::STATUS_CONSIDIRATION; $participant->trigger(Participant::EVENT_STATUS_CHANGED, new RoomStatusChangedEvent(['request' => $this, 'roomStatus' => $roomStatus])); } else { $roomStatus = Participant::STATUS_APPROVE; } $participant->writeLog($this, $roomStatus, true); } } }
public function actionListRequests() { $this->layout = 'request-list-menu'; $dataProvider = new ActiveDataProvider(['query' => Request::find()->where(['rsoAgreement' => ['$ne' => Request::RSO_AGREEMENT_NO_NEED]])->orderBy(['date' => -1])]); return $this->render('list-requests', ['dataProvider' => $dataProvider]); }
/** * @param Request $request * @return Participant[] * @throws \yii\base\InvalidConfigException * @throws \yii\mongodb\Exception */ public static function findAllByRequest(Request $request) { /** @var $collection Collection */ $collection = \Yii::$app->get('mongodb')->getCollection(Request::collectionName()); $busyParticipants = $collection->aggregate([['$match' => ['_id' => ['$ne' => $request->primaryKey], 'date' => $request->date, 'beginTime' => ['$lt' => $request->endTime], 'endTime' => ['$gt' => $request->beginTime], 'status' => ['$ne' => $request::STATUS_CANCEL]]], ['$unwind' => '$participantsId'], ['$project' => ['_id' => 0, 'id' => '$participantsId', 'beginTime' => 1, 'endTime' => 1]]]); /** @var Participant[] $participants */ $participants = self::find()->with('company', 'confirmPerson')->orderBy('name')->all(); $busyParticipantsId = ArrayHelper::getColumn($busyParticipants, 'id'); foreach ($participants as $key => $participant) { $busyParticipantKey = array_search($participant->primaryKey, $busyParticipantsId); if ($busyParticipantKey !== false) { $participants[$key]->setBusy(); $participants[$key]->busyFrom = $busyParticipants[$busyParticipantKey]['beginTime']; $participants[$key]->busyTo = $busyParticipants[$busyParticipantKey]['endTime']; } } return $participants; }