Blame view

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