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();
         });
     }
 }
Пример #3
0
 /**
  * @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;
 }
Пример #4
0
 /**
  * @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');
 }
Пример #5
0
 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);
 }
Пример #6
0
 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;
 }
Пример #7
0
?>

    <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>
Пример #8
0
 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]);
 }
Пример #9
0
    <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});");
Пример #10
0
 /**
  * @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);
         }
     }
 }
Пример #11
0
 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]);
 }
Пример #12
0
 /**
  * @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;
 }