Blame view

controllers/OrderController.php 20.3 KB
2a050410   Yarik   Order
1
2
3
  <?php
      
      namespace artbox\order\controllers;
fcd620e2   Alexey Boroda   -Number column ad...
4
      
fd40a9e1   Yarik   Products to order
5
      use artbox\catalog\models\Variant;
fdce5f4a   Anastasia   - order
6
      use artbox\core\admin\actions\Index;
36744c04   Anastasia   - fast order in a...
7
      use artbox\order\columns\ActionColumn;
fdce5f4a   Anastasia   - order
8
9
      use artbox\order\labels\models\Delivery;
      use artbox\order\labels\models\Label;
fd40a9e1   Yarik   Products to order
10
      use artbox\order\models\OrderProduct;
fdce5f4a   Anastasia   - order
11
      use artbox\order\labels\models\Payment;
a093960d   Anastasia   incust add bonuses
12
      use backend\incust\components\Incust;
8015d9d9   Anastasia   incust on frontend
13
      use common\models\IncustLog;
2a050410   Yarik   Order
14
15
      use Yii;
      use artbox\order\models\Order;
2a050410   Yarik   Order
16
17
18
      use yii\web\Controller;
      use yii\web\NotFoundHttpException;
      use yii\filters\VerbFilter;
faf0eca8   Anastasia   access control
19
      use yii\filters\AccessControl;
543a6adb   Anastasia   order
20
21
      use yii\web\Response;
      use yii\widgets\ActiveForm;
fcd620e2   Alexey Boroda   -Number column ad...
22
      
2a050410   Yarik   Order
23
24
25
26
27
28
29
30
      /**
       * OrderController implements the CRUD actions for Order model.
       */
      class OrderController extends Controller
      {
          /**
           * @inheritdoc
           */
fdce5f4a   Anastasia   - order
31
32
33
34
          public function getViewPath()
          {
              return '@artbox/order/views/order';
          }
fcd620e2   Alexey Boroda   -Number column ad...
35
          
2a050410   Yarik   Order
36
37
38
          public function behaviors()
          {
              return [
fcd620e2   Alexey Boroda   -Number column ad...
39
                  'verbs'  => [
2a050410   Yarik   Order
40
41
42
43
44
                      'class'   => VerbFilter::className(),
                      'actions' => [
                          'delete' => [ 'POST' ],
                      ],
                  ],
faf0eca8   Anastasia   access control
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
                  'access' => [
                      'class' => AccessControl::className(),
                      'rules' => [
                          [
                              'actions' => [
                                  'login',
                                  'error',
                              ],
                              'allow'   => true,
                          ],
                          [
                              'allow' => true,
                              'roles' => [ '@' ],
                          ],
                      ],
                  ],
2a050410   Yarik   Order
61
62
              ];
          }
fcd620e2   Alexey Boroda   -Number column ad...
63
          
fdce5f4a   Anastasia   - order
64
          public function actions()
2a050410   Yarik   Order
65
          {
fdce5f4a   Anastasia   - order
66
67
68
69
              return [
                  'index' => [
                      'class'            => Index::className(),
                      'columns'          => [
fcd620e2   Alexey Boroda   -Number column ad...
70
71
72
                          'id'         => [
                              'type' => Index::NUMBER_COL,
                          ],
fdce5f4a   Anastasia   - order
73
                          'name'       => [
fcd620e2   Alexey Boroda   -Number column ad...
74
                              'type'         => Index::ACTION_COL,
b983b856   Anastasia   - blog bug fix
75
                              'columnConfig' => [
36744c04   Anastasia   - fast order in a...
76
                                  'class' => ActionColumn::class,
b983b856   Anastasia   - blog bug fix
77
                                  'buttonsTemplate' => '{edit}{delete}',
36744c04   Anastasia   - fast order in a...
78
                                  'columnTemplate'  => function (Order $model){
eb8d11e8   Anastasia   fast on admin
79
80
81
82
83
84
                                      if ($model->fast) {
                                          if (empty($model->name)) {
                                              return "<span>(не указано)<b class='mouse-lmc'></b></span>";
                                          } else {
                                              return "<span>" . $model->name . "<b class='mouse-lmc'></b></span>";
                                          }
36744c04   Anastasia   - fast order in a...
85
                                         }
eb8d11e8   Anastasia   fast on admin
86
87
                                      return $model->name;
                                         
36744c04   Anastasia   - fast order in a...
88
                                  }
b983b856   Anastasia   - blog bug fix
89
                              ],
fdce5f4a   Anastasia   - order
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
                          ],
                          'phone'      => [
                              'type' => Index::STRING_COL,
                          ],
                          'email'      => [
                              'type' => Index::STRING_COL,
                          ],
                          'label'      => [
                              'type'         => Index::RELATION_COL,
                              'columnConfig' => [
                                  'relationField' => 'title',
                              ],
                          ],
                          'created_at' => [
                              'type' => Index::DATETIME_COL,
                          ],
fdce5f4a   Anastasia   - order
106
107
108
109
110
                      ],
                      'model'            => Order::className(),
                      'hasLanguage'      => false,
                      'enableMassDelete' => false,
                      'modelPrimaryKey'  => 'id',
f884421b   Anastasia   - default sort
111
112
113
                      'defaultSort'      =>  [
                          'created_at' => 'DESC'
                      ]
fdce5f4a   Anastasia   - order
114
115
                  ],
              ];
2a050410   Yarik   Order
116
          }
fcd620e2   Alexey Boroda   -Number column ad...
117
          
fcd620e2   Alexey Boroda   -Number column ad...
118
          
2a050410   Yarik   Order
119
120
121
122
123
124
125
126
127
          /**
           * Creates a new Order model.
           * If creation is successful, the browser will be redirected to the 'view' page.
           *
           * @return mixed
           */
          public function actionCreate()
          {
              $model = new Order();
fcd620e2   Alexey Boroda   -Number column ad...
128
              
2a050410   Yarik   Order
129
              if ($model->load(Yii::$app->request->post()) && $model->save()) {
b6da6360   Alexey Boroda   -Order products r...
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
                  if (!empty(\Yii::$app->request->post('Product'))) {
                      foreach (\Yii::$app->request->post('Product') as $id => $count) {
                          /**
                           * @var Variant $variant
                           */
                          $variant = Variant::findOne($id);
                          if ($variant) {
                              $orderProduct = new OrderProduct(
                                  [
                                      'variant_id' => $variant->id,
                                      'order_id'   => $model->id,
                                      'sku'        => $variant->sku,
                                      'price'      => $variant->price,
                                      'count'      => $count,
                                  ]
                              );
                              $orderProduct->save();
                          }
                      }
                  }
                  
2a050410   Yarik   Order
151
152
                  return $this->redirect(
                      [
bb609829   Anastasia   - order
153
                          'index',
2a050410   Yarik   Order
154
155
156
157
                      ]
                  );
              } else {
                  $labels = Label::find()
fdce5f4a   Anastasia   - order
158
159
                                 ->joinWith('language')
                                 ->select(
fcd620e2   Alexey Boroda   -Number column ad...
160
161
162
163
164
                                     [
                                         'title',
                                         'id',
                                     ]
                                 )
fdce5f4a   Anastasia   - order
165
                                 ->where(
fcd620e2   Alexey Boroda   -Number column ad...
166
167
168
169
                                     [
                                         'status' => true,
                                     ]
                                 )
fdce5f4a   Anastasia   - order
170
171
                                 ->indexBy('id')
                                 ->column();
2a050410   Yarik   Order
172
                  $deliveries = Delivery::find()
fdce5f4a   Anastasia   - order
173
174
                                        ->joinWith('language')
                                        ->select(
fcd620e2   Alexey Boroda   -Number column ad...
175
176
177
178
179
                                            [
                                                'title',
                                                'id',
                                            ]
                                        )
fdce5f4a   Anastasia   - order
180
                                        ->where(
fcd620e2   Alexey Boroda   -Number column ad...
181
182
183
184
                                            [
                                                'status' => true,
                                            ]
                                        )
fdce5f4a   Anastasia   - order
185
186
                                        ->indexBy('id')
                                        ->column();
2a050410   Yarik   Order
187
                  $payments = Payment::find()
fdce5f4a   Anastasia   - order
188
189
                                     ->joinWith('language')
                                     ->select(
fcd620e2   Alexey Boroda   -Number column ad...
190
191
192
193
194
                                         [
                                             'title',
                                             'id',
                                         ]
                                     )
fdce5f4a   Anastasia   - order
195
                                     ->where(
fcd620e2   Alexey Boroda   -Number column ad...
196
197
198
199
                                         [
                                             'status' => true,
                                         ]
                                     )
fdce5f4a   Anastasia   - order
200
201
                                     ->indexBy('id')
                                     ->column();
2a050410   Yarik   Order
202
                  return $this->render(
5fb852db   Anastasia   nova poshta admin
203
                      'create',
2a050410   Yarik   Order
204
205
206
207
208
209
210
211
212
                      [
                          'model'      => $model,
                          'labels'     => $labels,
                          'payments'   => $payments,
                          'deliveries' => $deliveries,
                      ]
                  );
              }
          }
e715ad66   Anastasia   incust final
213
      
2a050410   Yarik   Order
214
215
216
217
218
219
220
          /**
           * Updates an existing Order model.
           * If update is successful, the browser will be redirected to the 'view' page.
           *
           * @param integer $id
           *
           * @return mixed
a093960d   Anastasia   incust add bonuses
221
222
223
           * @throws \GuzzleHttp\Exception\GuzzleException
           * @throws \backend\incust\components\IncustErrorLoginException
           * @throws \backend\incust\components\IncustException
e715ad66   Anastasia   incust final
224
           * @throws \yii\base\InvalidConfigException
a093960d   Anastasia   incust add bonuses
225
           * @throws \yii\web\NotFoundHttpException
2a050410   Yarik   Order
226
227
228
229
           */
          public function actionUpdate($id)
          {
              $model = $this->findModel($id);
d5e063f5   Anastasia   core order incust
230
             
fcd620e2   Alexey Boroda   -Number column ad...
231
232
233
234
235
236
              
              if ($model->load(Yii::$app->request->post()) && $model->save() && !empty(
                  \Yii::$app->request->post(
                      'OrderProduct'
                  )
                  )) {
fd40a9e1   Yarik   Products to order
237
                  OrderProduct::saveItems(\Yii::$app->request->post('OrderProduct'), $id);
8015d9d9   Anastasia   incust on frontend
238
239
240
241
242
243
244
245
246
247
                 
                  if ($model->paid and class_exists(Incust::className()) and $model->incust) {
                      $incustAdd = IncustLog::find()->where(['status' => IncustLog::STARUS_ADD])->andWhere(['order_id' => $model->id]);
                      if ($incustAdd !== null){
                          return $this->redirect(
                              [
                                  'index',
                              ]
                          );
                      }
d5e063f5   Anastasia   core order incust
248
                      /**
a093960d   Anastasia   incust add bonuses
249
                       * @var \backend\incust\components\Incust $incust;
d5e063f5   Anastasia   core order incust
250
251
                       */
                      $incust = \Yii::$app->get('incust');
e715ad66   Anastasia   incust final
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
                      $check = $incust->generateCheck($model);
                      $data = $incust->processCheck($check);
                      if (is_array($data) and !empty($data)) {
                          \Yii::info('The check process ID' . $model->id);
                          $model->save(true, [ 'status_incust' => 'process_check' ]);
                          $data = $incust->finalCheck($data);
                                                  if (!empty($data) and is_array($data)){
                                                      $model->status_incust = 'final_check';
                                                      $model->id_incust = $data['id'];
                                                      $model->bonuses_add = $data['bonuses_added'];
                                                      \Yii::info('The check final ID'.$model->id);
                                                      $model->save();
                                                  }
                      }
                  }
2a050410   Yarik   Order
267
268
                  return $this->redirect(
                      [
bb609829   Anastasia   - order
269
                          'index',
2a050410   Yarik   Order
270
271
272
273
                      ]
                  );
              } else {
                  $labels = Label::find()
fdce5f4a   Anastasia   - order
274
                                 ->joinWith('language')
2a050410   Yarik   Order
275
276
277
278
279
280
281
282
283
284
285
286
287
288
                                 ->select(
                                     [
                                         'title',
                                         'id',
                                     ]
                                 )
                                 ->where(
                                     [
                                         'status' => true,
                                     ]
                                 )
                                 ->indexBy('id')
                                 ->column();
                  $deliveries = Delivery::find()
fdce5f4a   Anastasia   - order
289
290
                                        ->joinWith('language')
                                        ->select(
fcd620e2   Alexey Boroda   -Number column ad...
291
292
293
294
295
                                            [
                                                'title',
                                                'id',
                                            ]
                                        )
fdce5f4a   Anastasia   - order
296
                                        ->where(
fcd620e2   Alexey Boroda   -Number column ad...
297
298
299
300
                                            [
                                                'status' => true,
                                            ]
                                        )
fdce5f4a   Anastasia   - order
301
302
                                        ->indexBy('id')
                                        ->column();
2a050410   Yarik   Order
303
                  $payments = Payment::find()
fdce5f4a   Anastasia   - order
304
305
                                     ->joinWith('language')
                                     ->select(
fcd620e2   Alexey Boroda   -Number column ad...
306
307
308
309
310
                                         [
                                             'title',
                                             'id',
                                         ]
                                     )
fdce5f4a   Anastasia   - order
311
                                     ->where(
fcd620e2   Alexey Boroda   -Number column ad...
312
313
314
315
                                         [
                                             'status' => true,
                                         ]
                                     )
fdce5f4a   Anastasia   - order
316
317
                                     ->indexBy('id')
                                     ->column();
2a050410   Yarik   Order
318
                  return $this->render(
5fb852db   Anastasia   nova poshta admin
319
                      'update',
2a050410   Yarik   Order
320
321
322
323
324
325
326
327
328
                      [
                          'model'      => $model,
                          'labels'     => $labels,
                          'payments'   => $payments,
                          'deliveries' => $deliveries,
                      ]
                  );
              }
          }
fcd620e2   Alexey Boroda   -Number column ad...
329
          
2a050410   Yarik   Order
330
331
332
333
334
335
336
337
338
339
340
341
          /**
           * Deletes an existing Order model.
           * If deletion is successful, the browser will be redirected to the 'index' page.
           *
           * @param integer $id
           *
           * @return mixed
           */
          public function actionDelete($id)
          {
              $this->findModel($id)
                   ->delete();
fcd620e2   Alexey Boroda   -Number column ad...
342
              
2a050410   Yarik   Order
343
344
              return $this->redirect([ 'index' ]);
          }
fcd620e2   Alexey Boroda   -Number column ad...
345
          
fd40a9e1   Yarik   Products to order
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
          public function actionProductList($q = null, $id = null)
          {
              $response = \Yii::$app->response;
              $response->format = $response::FORMAT_JSON;
              $out = [
                  'results' => [
                      'id'   => '',
                      'text' => '',
                  ],
              ];
              if (!is_null($q)) {
                  $out[ 'results' ] = [];
                  /**
                   * @var Variant[] $variants
                   */
                  $variants = Variant::find()
fd40a9e1   Yarik   Products to order
362
                                     ->joinWith('product.lang', false)
a55bed64   Anastasia   - order
363
                                     ->where(
fd40a9e1   Yarik   Products to order
364
365
366
367
368
369
                                         [
                                             'like',
                                             'product_lang.title',
                                             $q,
                                         ]
                                     )
fd40a9e1   Yarik   Products to order
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
                                     ->orWhere([ 'variant.sku' => $q ])
                                     ->all();
                  foreach ($variants as $variant) {
                      $out[ 'results' ][] = [
                          'id'   => $variant->id,
                          'text' => $variant->product->lang->title,
                      ];
                  }
              } elseif ($id > 0) {
                  /**
                   * @var Variant $variant
                   */
                  $variant = Variant::find()
                                    ->with('lang', 'product.lang')
                                    ->where([ 'id' => $id ])
                                    ->one();
                  $out[ 'results' ] = [
                      'id'   => $id,
                      'text' => $variant->product->lang->title,
                  ];
              }
              return $out;
          }
fcd620e2   Alexey Boroda   -Number column ad...
393
          
fd40a9e1   Yarik   Products to order
394
395
          public function actionAddToOrder()
          {
fd40a9e1   Yarik   Products to order
396
              /**
543a6adb   Anastasia   order
397
398
399
               * @var Variant      $variant
               * @var ActiveForm   $form
               * @var OrderProduct $orderProduct
fd40a9e1   Yarik   Products to order
400
               */
543a6adb   Anastasia   order
401
402
403
              \Yii::$app->response->format = Response::FORMAT_JSON;
              $id = \Yii::$app->request->post('id');
              $count = \Yii::$app->request->post('count') ? \Yii::$app->request->post('count') : 1;
fcd620e2   Alexey Boroda   -Number column ad...
404
              
fd40a9e1   Yarik   Products to order
405
              $variant = Variant::find()
543a6adb   Anastasia   order
406
407
408
409
410
411
                                ->with('product.lang')
                                ->where(
                                    [
                                        'id' => $id,
                                    ]
                                )
fd40a9e1   Yarik   Products to order
412
                                ->one();
fcd620e2   Alexey Boroda   -Number column ad...
413
              
543a6adb   Anastasia   order
414
415
416
              if ($variant) {
                  $form = new ActiveForm();
                  $orderProduct = new OrderProduct(
fd40a9e1   Yarik   Products to order
417
                      [
fd40a9e1   Yarik   Products to order
418
                          'count'      => $count,
543a6adb   Anastasia   order
419
                          'variant_id' => $variant->id,
fd40a9e1   Yarik   Products to order
420
421
                      ]
                  );
fcd620e2   Alexey Boroda   -Number column ad...
422
                  
543a6adb   Anastasia   order
423
424
425
426
427
428
429
430
431
432
                  $row = $this->renderPartial(
                      '_order_product',
                      [
                          'orderProduct' => $orderProduct,
                          'index'        => rand(0, 10000),
                          'variant'      => $variant,
                          'price'        => $variant->price,
                          'form'         => $form,
                      ]
                  );
fcd620e2   Alexey Boroda   -Number column ad...
433
                  
543a6adb   Anastasia   order
434
435
436
                  return [
                      'success' => true,
                      'row'     => $row,
8b638e12   Anastasia   sum in order
437
                      'price'   => $variant->price * $count,
543a6adb   Anastasia   order
438
                  ];
fd40a9e1   Yarik   Products to order
439
              }
fcd620e2   Alexey Boroda   -Number column ad...
440
              
543a6adb   Anastasia   order
441
442
443
444
              return [
                  'success' => false,
                  'message' => \Yii::t('app', 'Product not found'),
              ];
b6db17e5   Anastasia   order in admin
445
          }
fcd620e2   Alexey Boroda   -Number column ad...
446
          
2a050410   Yarik   Order
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
          /**
           * Finds the Order model based on its primary key value.
           * If the model is not found, a 404 HTTP exception will be thrown.
           *
           * @param integer $id
           *
           * @return Order the loaded model
           * @throws NotFoundHttpException if the model cannot be found
           */
          protected function findModel($id)
          {
              if (( $model = Order::findOne($id) ) !== null) {
                  return $model;
              } else {
                  throw new NotFoundHttpException('The requested page does not exist.');
              }
          }
7b952362   Anastasia   price and count u...
464
          
fcd620e2   Alexey Boroda   -Number column ad...
465
466
          public function actionPrint($id)
          {
7b952362   Anastasia   price and count u...
467
468
              $this->layout = false;
              $model = $this->findModel($id);
fcd620e2   Alexey Boroda   -Number column ad...
469
470
471
472
473
474
              return $this->renderPartial(
                  '@backend/views/layouts/print',
                  [
                      'model' => $model,
                  ]
              );
7b952362   Anastasia   price and count u...
475
          }
fcd620e2   Alexey Boroda   -Number column ad...
476
          
543a6adb   Anastasia   order
477
478
479
480
          protected function hasProducts()
          {
              if (empty(\Yii::$app->request->post('OrderProduct'))) {
                  \Yii::$app->session->setFlash('error', \Yii::t('app', 'Заказ не может быть без товаров'));
fcd620e2   Alexey Boroda   -Number column ad...
481
                  
543a6adb   Anastasia   order
482
483
                  return false;
              }
fcd620e2   Alexey Boroda   -Number column ad...
484
              
543a6adb   Anastasia   order
485
486
              return true;
          }
fcd620e2   Alexey Boroda   -Number column ad...
487
          
543a6adb   Anastasia   order
488
489
490
491
492
493
          /**
           * @return array
           */
          protected function getLabels()
          {
              return Label::find()
fdce5f4a   Anastasia   - order
494
                          ->joinWith('language')
543a6adb   Anastasia   order
495
496
497
498
499
500
501
502
503
504
505
506
507
508
                          ->select(
                              [
                                  'title',
                                  'id',
                              ]
                          )
                          ->where(
                              [
                                  'status' => true,
                              ]
                          )
                          ->indexBy('id')
                          ->column();
          }
fcd620e2   Alexey Boroda   -Number column ad...
509
          
543a6adb   Anastasia   order
510
511
512
513
514
515
          /**
           * @return array
           */
          protected function getPayments()
          {
              return Payment::find()
fdce5f4a   Anastasia   - order
516
                            ->joinWith('language')
543a6adb   Anastasia   order
517
518
519
520
521
522
523
524
525
526
527
528
529
530
                            ->select(
                                [
                                    'title',
                                    'id',
                                ]
                            )
                            ->where(
                                [
                                    'status' => true,
                                ]
                            )
                            ->indexBy('id')
                            ->column();
          }
fcd620e2   Alexey Boroda   -Number column ad...
531
          
543a6adb   Anastasia   order
532
533
534
535
536
537
          /**
           * @return array
           */
          protected function getDeliveries()
          {
              return Delivery::find()
fdce5f4a   Anastasia   - order
538
                             ->joinWith('language')
543a6adb   Anastasia   order
539
540
541
542
543
544
545
546
547
548
549
550
551
552
                             ->select(
                                 [
                                     'title',
                                     'id',
                                 ]
                             )
                             ->where(
                                 [
                                     'status' => true,
                                 ]
                             )
                             ->indexBy('id')
                             ->column();
          }
2a050410   Yarik   Order
553
      }