Blame view

frontend/controllers/TenderController.php 9 KB
97fb6489   Yarik   test
1
  <?php
50ed5626   Yarik   test
2
      namespace frontend\controllers;
97fb6489   Yarik   test
3
  
50ed5626   Yarik   test
4
5
6
7
8
      use common\models\Chat;
      use common\models\Message;
      use common\models\Project;
      use common\modules\comment\models\CommentProject;
      use Yii;
50ed5626   Yarik   test
9
      use yii\helpers\Html;
50ed5626   Yarik   test
10
      use yii\web\Controller;
50ed5626   Yarik   test
11
      use yii\filters\AccessControl;
50ed5626   Yarik   test
12
      use common\models\User;
71ad29c4   Yarik   test
13
      use yii\web\NotFoundHttpException;
97fb6489   Yarik   test
14
  
97fb6489   Yarik   test
15
      /**
50ed5626   Yarik   test
16
       * Site controller
97fb6489   Yarik   test
17
       */
50ed5626   Yarik   test
18
      class TenderController extends Controller
97fb6489   Yarik   test
19
      {
7e6d3f52   Administrator   24.02.16
20
  
50ed5626   Yarik   test
21
          public $enableCsrfValidation = false;
97fb6489   Yarik   test
22
  
38a6e1dd   Yarik   test
23
          /**
50ed5626   Yarik   test
24
           * @inheritdoc
38a6e1dd   Yarik   test
25
           */
50ed5626   Yarik   test
26
27
28
29
30
31
32
33
34
35
36
37
38
39
          public function actions()
          {
              return [
                  'error'   => [
                      'class' => 'yii\web\ErrorAction',
                  ],
                  'captcha' => [
                      'class'           => 'yii\captcha\CaptchaAction',
                      'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : NULL,
                  ],
                  'verbs'   => [
                      'class'   => \yii\filters\VerbFilter::className(),
                      'actions' => [
                          'change-state' => [ 'post' ],
ce4a4468   Yarik   test
40
41
                          'offer-form'   => [ 'post' ],
                          'offer'        => [ 'post' ],
50ed5626   Yarik   test
42
43
44
45
46
47
48
49
50
51
52
53
54
                      ],
                  ],
                  'access'  => [
                      'class' => AccessControl::className(),
                      'rules' => [
                          [
                              'actions' => [ 'change-state' ],
                              'allow'   => true,
                              'roles'   => [ '@' ],
                          ],
                      ],
                  ],
              ];
38a6e1dd   Yarik   test
55
          }
50ed5626   Yarik   test
56
  
38a6e1dd   Yarik   test
57
          /**
ce4a4468   Yarik   test
58
59
60
           * Redirect to search page.
           *
           * @return string
38a6e1dd   Yarik   test
61
           */
50ed5626   Yarik   test
62
63
64
          public function actionIndex()
          {
              return $this->redirect([ 'search/project' ]);
38a6e1dd   Yarik   test
65
          }
50ed5626   Yarik   test
66
67
68
  
          public function actionView($tender_id)
          {
ce4a4468   Yarik   test
69
70
71
              /**
               * @var Project $model
               */
50ed5626   Yarik   test
72
              $model = Project::findOne($tender_id);
ce4a4468   Yarik   test
73
74
              if(!empty($model)) {
                  $model->updateCounters(['view_count' => 1]);
71ad29c4   Yarik   test
75
76
              } else {
                  throw new NotFoundHttpException(Yii::t('app', 'project_not_found'));
ce4a4468   Yarik   test
77
              }
50ed5626   Yarik   test
78
79
80
81
  
              return $this->render('view', [
                  'model' => $model,
              ]);
38a6e1dd   Yarik   test
82
          }
50ed5626   Yarik   test
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  
          public function actionChangeState()
          {
              /**
               * @var User $user
               */
              $response = \Yii::$app->response;
              $response->format = $response::FORMAT_JSON;
              $user = \Yii::$app->user->identity;
              $project_id = \Yii::$app->request->post('project_id');
              $comment_id = \Yii::$app->request->post('comment_id');
              $state = \Yii::$app->request->post('state');
              if(empty( $project_id ) || empty( $comment_id ) || empty( $state )) {
                  return [ 'error' => 'project_id, comment_id, state должны быть отправлены в запросе' ];
              }
              /**
               * @var Project $project
               */
              $project = Project::findOne($project_id);
              if(empty( $project )) {
b9a54f61   Yarik   test
103
                  return [ 'error' => 'Заказ не найден' ];
50ed5626   Yarik   test
104
              }
25bd78f8   Yarik   test
105
106
107
  //            elseif($project->user_id != $user->id) {
  //                return [ 'error' => 'Вы можете менять статус только собственных проектов' ];
  //            }
50ed5626   Yarik   test
108
109
110
111
112
113
114
115
116
117
118
119
120
              /**
               * @var CommentProject $comment
               */
              $comment = CommentProject::find()
                                       ->where([
                                           'comment_id' => $comment_id,
                                           'model'      => $project->className(),
                                           'model_id'   => $project->project_id,
                                       ])
                                       ->one();
              if(empty( $comment )) {
                  return [ 'error' => 'Данного предложения не существует' ];
              }
25bd78f8   Yarik   test
121
              if($project->user_id != $user->id && $comment->user_id != $user->id) {
b9a54f61   Yarik   test
122
                  return ['error' => 'Вы можете менять статус только своих предложений, либо предложений по своим заказам'];
25bd78f8   Yarik   test
123
124
              }
              if($comment->user_id == $user->id) {
50ed5626   Yarik   test
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
                  $comment->scenario = $comment::SCENARIO_OWNER;
              } else {
                  $comment->scenario = $comment::SCENARIO_STATE;
              }
              if($comment->state == $comment::STATE_TRASH && $comment->scenario == $comment::SCENARIO_STATE) {
                  return [ 'error' => 'Исполнитель отменил данное предложение' ];
              }
              if($comment->state == $comment::STATE_DENY && $comment->scenario == $comment::SCENARIO_OWNER) {
                  return [ 'error' => 'Заказчик отменил Ваше предложение' ];
              }
  
              $comment->state = $state;
              if(!$comment->validate()) {
                  return [ 'error' => 'Недопустимое значение state' ];
              }
              if($comment->changeState()) {
                  return [ 'message' => 'Автор оповещен о вашем решении' ];
              } else {
                  return [ 'error' => 'Ошибка обновления.' ];
              }
32ed90fd   Yarik   test
145
146
          }
  
50ed5626   Yarik   test
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
          public function actionOfferForm()
          {
              /**
               * @var User $user
               */
              $response = \Yii::$app->response;
              $request = \Yii::$app->request;
              $response->format = $response::FORMAT_JSON;
              $user = \Yii::$app->user->identity;
              $performer_id = $request->post('performer_id');
              if(empty( $performer_id )) {
                  return [ 'error' => 'performer_id должен быть задан' ];
              }
              $projects = $user->getProjects()
                               ->with('parent')
                               ->all();
ce4a4468   Yarik   test
163
              if(empty( $projects )) {
b9a54f61   Yarik   test
164
                  return [ 'error' => 'У Вас еще нету заказов' ];
50ed5626   Yarik   test
165
166
167
168
169
170
171
              }
              return [
                  'message' => $this->renderAjax('forms-modal-offer', [
                      'performer_id' => $performer_id,
                      'projects'     => $projects,
                  ]),
              ];
38a6e1dd   Yarik   test
172
          }
50ed5626   Yarik   test
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
  
          public function actionOffer()
          {
              /**
               * @var User    $user
               * @var Project $project
               * @var User    $performer
               * @var Chat    $chat
               */
              $response = \Yii::$app->response;
              $request = \Yii::$app->request;
              $response->format = $response::FORMAT_JSON;
              $user = \Yii::$app->user->identity;
              $project_id = $request->post('project_id');
              $performer_id = $request->post('performer_id');
              if(empty( $project_id ) || empty( $performer_id )) {
                  return [ 'error' => 'project_id и performer_id должны быть заданы' ];
              }
              $performer = User::find()
                               ->where([ 'id' => $performer_id ])
                               ->one();
              if(empty( $performer )) {
                  return [ 'error' => 'Исполнитель не найден' ];
              }
              $project = Project::find()
                                ->where([ 'project_id' => $project_id ])
                                ->one();
              if(empty( $project )) {
b9a54f61   Yarik   test
201
                  return [ 'error' => 'Заказ не найден' ];
50ed5626   Yarik   test
202
              } elseif($project->user_id != $user->id) {
b9a54f61   Yarik   test
203
                  return [ 'error' => 'Вы можете предлагать только собственные заказы' ];
50ed5626   Yarik   test
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
              }
              $chat = $user->getChat($performer->id)
                           ->one();
              if(empty( $chat )) {
                  $chat = new Chat([
                      'form_user' => $user->id,
                      'to_user'   => $performer->id,
                  ]);
                  if(!$chat->save()) {
                      return [ 'error' => 'Не удалось создать чат' ];
                  }
              }
              $message = new Message([
                  'chat_id' => $chat->chat_id,
                  'user_id' => $user->id,
                  'status'  => 1,
              ]);
b9a54f61   Yarik   test
221
              $text = "<p>Здравствуйте, {$performer->name}!</p><p>Предлагаю Вам принять участие в " . Html::a('заказе', [
50ed5626   Yarik   test
222
223
224
225
226
227
228
229
230
                      'tender/view',
                      'tender_id' => $project->project_id,
                  ]) . "</p>";
              $message->text = $text;
              if(!$message->save()) {
                  return [ 'error' => 'Не удалось отправить предложение' ];
              } else {
                  return [ 'message' => 'Предложение успешно отправлено' ];
              }
38a6e1dd   Yarik   test
231
          }
38a6e1dd   Yarik   test
232
  
50ed5626   Yarik   test
233
      }