Commit bb962a6d5b8b24bcd84fa62d427864dde92da62e

Authored by Alexey Boroda
1 parent 2b29877e

-Order in process

models/Order.php
... ... @@ -5,8 +5,6 @@
5 5 use Yii;
6 6 use yii\behaviors\TimestampBehavior;
7 7 use yii\db\ActiveRecord;
8   - use yii\db\Expression;
9   - use yii\web\Session;
10 8  
11 9 /**
12 10 * Class Order
... ... @@ -45,27 +43,38 @@
45 43 */
46 44 class Order extends ActiveRecord
47 45 {
48   -
49   - const SCENARIO_QUICK = 'quick';
50   -
51   - private $data;
  46 + const PAYMENT_LIST = [
  47 + 1 => [
  48 + 'label' => 'Оплатить наличными',
  49 + ],
  50 + 2 => [
  51 + 'label' => 'Оплатить на карту Приват Банка',
  52 + 'hint' => 'оплата поступает 30 минут до суток!',
  53 + ],
  54 + 3 => [
  55 + 'label' => 'Оплатить "Правекс-телеграф"',
  56 + 'hint' => 'оплата денежным переводом поступает от 30 мин. до 4 часов',
  57 + ],
  58 + 4 => [
  59 + 'label' => 'Оплатить по безналичному расчету',
  60 + 'hint' => 'оплата поступает на счет от 1 до 3 рабочих дней! Счет на оплату отправим сразу после обработки заказана на ваш e-mail',
  61 + ],
  62 + ];
  63 +
  64 + const SHIPPING_BY = [
  65 + 1 => [
  66 + 'label' => 'Отправитель',
  67 + ],
  68 + 2 => [
  69 + 'label' => 'Получатель',
  70 + ],
  71 + ];
52 72  
53 73 public static function tableName()
54 74 {
55 75 return 'order';
56 76 }
57 77  
58   - public function scenarios()
59   - {
60   - $scenarios = array_merge(
61   - parent::scenarios(),
62   - [
63   - self::SCENARIO_QUICK => [ 'phone' ],
64   - ]
65   - );
66   - return $scenarios;
67   - }
68   -
69 78 public function behaviors()
70 79 {
71 80 return [
... ... @@ -79,6 +88,10 @@
79 88 {
80 89 return [
81 90 [
  91 + ['pay'],
  92 + 'boolean',
  93 + ],
  94 + [
82 95 [
83 96 'created_at',
84 97 'updated_at',
... ... @@ -94,22 +107,23 @@
94 107 ],
95 108 [
96 109 [ 'comment' ],
97   - 'safe',
  110 + 'string',
98 111 ],
99 112 [
100 113 [ 'email' ],
101 114 'email',
102 115 ],
103 116 [
104   - [ 'phone' ],
  117 + [
  118 + 'phone',
  119 + 'phone2',
  120 + ],
105 121 'match',
106 122 'pattern' => '/^\+38\(\d{3}\)\d{3}-\d{2}-\d{2}$/',
107   - 'on' => self::SCENARIO_QUICK,
108 123 ],
109 124 [
110 125 [
111 126 'name',
112   - 'phone2',
113 127 'numbercard',
114 128 'body',
115 129 'declaration',
... ... @@ -152,149 +166,6 @@
152 166 ];
153 167 }
154 168  
155   - // public function beforeSave($insert)
156   - // {
157   - // $this->user_id = Yii::$app->user->id;
158   - // $this->date_time = new Expression('NOW()');
159   - // return parent::beforeSave($insert);
160   - // }
161   - //
162   - // public function beforeDelete()
163   - // {
164   - // return parent::beforeDelete();
165   - // }
166   -
167   - public function addBasket($product_variant_id, $count)
168   - {
169   - $session = new Session;
170   - $session->open();
171   - $data = $session[ 'basket' ];
172   - $i = 0;
173   - if (isset( $session[ 'basket' ] )) {
174   - foreach ($session[ 'basket' ] as $key => $basket) {
175   - if ($product_variant_id == $basket[ 'id' ]) {
176   - $data[ $key ][ 'count' ] += $count;
177   - $session[ 'basket' ] = $data;
178   - $i++;
179   - }
180   - }
181   - }
182   - if ($i == 0) {
183   - $data[] = [
184   - 'id' => $product_variant_id,
185   - 'count' => $count,
186   - ];
187   - $session[ 'basket' ] = $data;
188   - }
189   - }
190   -
191   - public function rowBasket()
192   - {
193   - $session = new Session;
194   - $session->open();
195   - $cost = 0;
196   - $count = 0;
197   - if (isset( $session[ 'basket' ] ) && count($session[ 'basket' ])) {
198   - foreach ($session[ 'basket' ] as $product) {
199   - $count += $product[ 'count' ];
200   - }
201   - }
202   -
203   - return (object) [
204   - 'cost' => $cost,
205   - 'count' => $count,
206   - ];
207   - }
208   -
209   - public function deleteBasketMod($id)
210   - {
211   - $session = new Session;
212   - $session->open();
213   - $basket = $session[ 'basket' ];
214   - foreach ($basket as $key => $product) {
215   - if ($id == $product[ 'id' ]) {
216   - unset( $basket[ $key ] );
217   - }
218   - }
219   - $session[ 'basket' ] = $basket;
220   - }
221   -
222   - public function updateBasket($row)
223   - {
224   - $session = new Session;
225   - $session->open();
226   - //$data = array();
227   - if ($row[ 'count' ] > 0) {
228   - $this->data[] = [
229   - 'id' => $row[ 'id' ],
230   - 'count' => $row[ 'count' ],
231   - ];
232   - }
233   - $session[ 'basket' ] = $this->data;
234   - }
235   -
236   - public function getBasketMods()
237   - {
238   - $session = new Session;
239   - $session->open();
240   - $products = [];
241   - if (empty( $session[ 'basket' ] )) {
242   - return [];
243   - }
244   - foreach ($session[ 'basket' ] as $product) {
245   - $row = ProductVariant::find()
246   - ->select(
247   - [
248   - 'product_variant.*',
249   - 'product.name as productName',
250   - 'product.alias',
251   - ]
252   - )
253   - ->where([ 'product_variant.id' => $product[ 'id' ] ])
254   - ->leftJoin('product', 'product.id = product_variant.product_id')
255   - ->one();
256   - $row->count = $product[ 'count' ];
257   - $row->sum_cost = $product[ 'count' ] * $row->price;
258   - $products[] = $row;
259   - }
260   -
261   - return $products;
262   - }
263   -
264   - public function getSumCost()
265   - {
266   - $session = new Session;
267   - $session->open();
268   - $cost = 0;
269   - if (empty( $session[ 'basket' ] )) {
270   - return false;
271   - }
272   - foreach ($session[ 'basket' ] as $product) {
273   - $cost += ( $this->getModCost($product[ 'id' ]) * $product[ 'count' ] );
274   - }
275   -
276   - return $cost;
277   - }
278   -
279   - private function getModCost($product_variant_id)
280   - {
281   - /**
282   - * @var ProductVariant $mod
283   - */
284   - $mod = ProductVariant::find()
285   - ->where([ 'id' => $product_variant_id ])
286   - ->one();
287   -
288   - return $mod->price;
289   - }
290   -
291   - public function clearBasket()
292   - {
293   - $session = new Session;
294   - $session->open();
295   - $session[ 'basket' ] = NULL;
296   - }
297   -
298 169 public function getUser()
299 170 {
300 171 return $this->hasOne(Customer::className(), [ 'id' => 'user_id' ]);
... ...
models/OrderSearch.php
... ... @@ -38,6 +38,7 @@
38 38 'date_from',
39 39 'date_to',
40 40 'date_range',
  41 + 'created_at'
41 42 ],
42 43 'safe',
43 44 ],
... ... @@ -73,7 +74,7 @@
73 74 );
74 75  
75 76 $this->load($params);
76   -
  77 +
77 78 if (!$this->validate()) {
78 79 // uncomment the following line if you do not want to return any records when validation fails
79 80 // $query->where('0=1');
... ... @@ -112,9 +113,25 @@
112 113 $this->phone,
113 114 ]
114 115 );
115   -
116   - $query->andFilterWhere(['>=', 'date_time', $this->date_from]);
117   - $query->andFilterWhere(['<=', 'date_time', $this->date_to]);
  116 + if (!empty($this->date_range)) {
  117 + $this->date_from = strtotime(explode('to', $this->date_range)[ 0 ]);
  118 + $this->date_to = strtotime(explode('to', $this->date_range)[ 1 ]);
  119 +
  120 + $query->andFilterWhere(
  121 + [
  122 + '>=',
  123 + 'created_at',
  124 + $this->date_from,
  125 + ]
  126 + );
  127 + $query->andFilterWhere(
  128 + [
  129 + '<=',
  130 + 'created_at',
  131 + $this->date_to,
  132 + ]
  133 + );
  134 + }
118 135  
119 136 return $dataProvider;
120 137 }
... ...
views/order/_form.php
1 1 <?php
2 2  
  3 + use artweb\artbox\ecommerce\models\Label;
3 4 use artweb\artbox\ecommerce\models\Order;
4 5 use artweb\artbox\ecommerce\models\OrderProduct;
5   - use frontend\models\OrderFrontend;
6 6 use kartik\grid\GridView;
  7 + use kartik\widgets\DatePicker;
7 8 use kartik\widgets\Select2;
  9 + use kartik\widgets\SwitchInput;
8 10 use yii\data\ActiveDataProvider;
9 11 use yii\helpers\Html;
10 12 use yii\bootstrap\ActiveForm;
... ... @@ -41,6 +43,15 @@ $(document).on(&#39;submit&#39;, &#39;#add-product-form&#39;, function(e) {
41 43 JS;
42 44  
43 45 $this->registerJs($js, View::POS_READY);
  46 +
  47 + $js = <<< JS
  48 +$('#order-phone, #order-phone2').mask('+38(000)000-00-00', {
  49 + placeholder: '+38(___)___-__-__'
  50 +});
  51 +JS;
  52 +
  53 + $this->registerJs($js, View::POS_READY);
  54 +
44 55 ?>
45 56  
46 57 <?php $form = ActiveForm::begin(); ?>
... ... @@ -56,6 +67,34 @@ JS;
56 67 <div class="row">
57 68 <div class="col-sm-6">
58 69  
  70 + <?= $form->field($model, 'deadline')->widget(DatePicker::className(), [
  71 +
  72 + ])?>
  73 +
  74 + <?php
  75 + echo $form->field($model, 'pay')
  76 + ->widget(
  77 + SwitchInput::className(),
  78 + [
  79 + 'name' => 'pay',
  80 + 'pluginOptions' => [
  81 + 'onText' => \Yii::t('app', 'Оплачено'),
  82 + 'offText' => \Yii::t('app', 'Не оплачено'),
  83 + ],
  84 + ]
  85 + ); ?>
  86 +
  87 + <?= $form->field($model, 'label')
  88 + ->dropDownList(
  89 + ArrayHelper::map(
  90 + Label::find()
  91 + ->asArray()
  92 + ->all(),
  93 + 'id',
  94 + 'label'
  95 + ),
  96 + [ 'prompt' => 'Метка' ]
  97 + ); ?>
59 98  
60 99 <?= $form->field($model, 'name') ?>
61 100  
... ... @@ -67,63 +106,49 @@ JS;
67 106  
68 107 <?= $form->field($model, 'numbercard') ?>
69 108  
70   - <?= $form->field($model, 'body')
  109 + <?= $form->field($model, 'comment')
71 110 ->textarea([ 'rows' => '3' ]) ?>
72   -
73   - <?php $form->field($model, 'delivery')
74   - ->dropDownList(
75   - ArrayHelper::map(
76   - Delivery::find()
77   - ->asArray()
78   - ->all(),
79   - 'id',
80   - 'title'
81   - )
82   - ) ?>
  111 + <?= $form->field($model, 'delivery')
  112 + ->dropDownList(
  113 + ArrayHelper::map(
  114 + Delivery::find()
  115 + ->joinWith('lang')
  116 + ->asArray()
  117 + ->all(),
  118 + 'id',
  119 + 'lang.title'
  120 + ),
  121 + [ 'prompt' => \Yii::t('app', 'Выберите доставку ...') ]
  122 + ) ?>
  123 +
  124 + </div>
  125 + <div class="col-sm-6">
83 126  
84 127 <?= $form->field($model, 'declaration') ?>
85 128  
86 129 <?= $form->field($model, 'stock') ?>
87 130  
88   - <?= $form->field($model, 'consignment') ?>
89   - </div>
90   - <div class="col-sm-6">
91   -
92 131 <?= $form->field($model, 'payment')
93 132 ->dropDownList(
94   - ArrayHelper::getColumn(OrderFrontend::PAYMENT_LIST, 'label'),
95   - [ 'prompt' => '...' ]
  133 + ArrayHelper::getColumn(Order::PAYMENT_LIST, 'label'),
  134 + [ 'prompt' => 'Способ оплаты ...' ]
96 135 ); ?>
97 136  
98 137 <?= $form->field($model, 'insurance') ?>
99 138  
100 139 <?= $form->field($model, 'amount_imposed') ?>
101 140  
102   - <?= $form->field($model, 'shipping_by') ?>
  141 + <?= $form->field($model, 'shipping_by')
  142 + ->dropDownList(
  143 + ArrayHelper::getColumn(Order::SHIPPING_BY, 'label'),
  144 + [ 'prompt' => 'Оплата доставки ...' ]
  145 + ); ?>
103 146  
104 147 <?= $form->field($model, 'city') ?>
105 148  
106 149 <?= $form->field($model, 'adress') ?>
107 150  
108   -
109   - <?= $form->field($model, 'total') ?>
110   -
111   - <?= $form->field($model, 'status')
112   - ->dropDownList(
113   - [
114   - 'Нет' => 'Нет',
115   - 'Обработан' => 'Обработан',
116   - 'На комплектации' => 'На комплектации',
117   - 'Укомплектован' => 'Укомплектован',
118   - 'Доставка' => 'Доставка',
119   - 'Выполнен' => 'Выполнен',
120   - 'Резерв оплачен' => 'Резерв оплачен',
121   - 'Резерв неоплачен' => 'Резерв неоплачен',
122   - ],
123   - [ 'prompt' => '...' ]
124   - ); ?>
125   -
126   - <?= $form->field($model, 'comment')
  151 + <?= $form->field($model, 'body')
127 152 ->textarea([ 'rows' => '3' ]) ?>
128 153 </div>
129 154 </div>
... ... @@ -137,7 +162,7 @@ JS;
137 162 echo GridView::widget(
138 163 [
139 164 'dataProvider' => $dataProvider,
140   - 'layout' => '{items}{pager}',
  165 + 'layout' => '{items}{pager}',
141 166 'columns' => [
142 167 'id',
143 168 'product_name',
... ... @@ -172,7 +197,7 @@ JS;
172 197 'pjaxSettings' => [
173 198 'options' => [
174 199 'scrollTo' => 'false',
175   - 'id' => 'order-products-grid',
  200 + 'id' => 'order-products-grid',
176 201 ],
177 202 ],
178 203 ]
... ... @@ -199,7 +224,7 @@ JS;
199 224 'options' => [ 'placeholder' => 'Search for a product ...' ],
200 225 'pluginOptions' => [
201 226 'allowClear' => true,
202   - 'disabled' => $model->isNewRecord ? true : false,
  227 + 'disabled' => $model->isNewRecord ? true : false,
203 228 'minimumInputLength' => 3,
204 229 'language' => [
205 230 'errorLoading' => new JsExpression(
... ... @@ -229,7 +254,8 @@ JS;
229 254 ?>
230 255 </div>
231 256 <div class="col-md-2">
232   - <?php echo $newProductForm->field($newOrderProduct, 'count')->input('number'); ?>
  257 + <?php echo $newProductForm->field($newOrderProduct, 'count')
  258 + ->input('number'); ?>
233 259 </div>
234 260 <div class="col-md-2">
235 261 <?php echo Html::submitButton(
... ...
views/order/index.php
... ... @@ -5,12 +5,17 @@
5 5 * @var View $this
6 6 */
7 7  
  8 + use artweb\artbox\ecommerce\models\Delivery;
  9 + use artweb\artbox\ecommerce\models\Label;
8 10 use artweb\artbox\ecommerce\models\OrderSearch;
9 11 use kartik\daterange\DateRangePicker;
  12 + use kartik\select2\Select2;
10 13 use yii\data\ActiveDataProvider;
11 14 use yii\helpers\Html;
12   - use kartik\grid\GridView;
  15 + use yii\grid\GridView;
  16 + use yii\helpers\Url;
13 17 use yii\web\View;
  18 + use yii\widgets\ActiveForm;
14 19  
15 20 $this->title = 'Заказы';
16 21 $this->params[ 'breadcrumbs' ][] = $this->title;
... ... @@ -20,32 +25,109 @@
20 25 <?= Html::a('Add order', [ 'create' ], [ 'class' => 'btn btn-success' ]) ?>
21 26 </p>
22 27  
23   -<?= GridView::widget(
24   - [
25   - 'dataProvider' => $dataProvider,
26   - 'filterModel' => $searchModel,
27   - 'columns' => [
28   - 'id',
29   - [
30   - 'attribute' => 'date_time',
31   - 'filter' => DateRangePicker::widget(
32   - [
33   - 'name' => 'OrderSearch[date_range]',
34   - 'model' => $searchModel,
35   - 'convertFormat' => false,
36   - 'pluginOptions' => [
37   - 'format' => 'YYYY-MM-DD',
38   - 'opens' => 'left',
39   - ],
40   - ]
41   - ),
  28 +<?php
  29 + $searchForm = ActiveForm::begin(
  30 + [
  31 + 'method' => 'GET',
  32 + 'action' => Url::to([ 'order/index' ]),
  33 + 'id' => 'search-form',
  34 + ]
  35 + );
  36 +?>
  37 +
  38 +<p>
  39 +
  40 + <?php echo Html::submitButton(
  41 + 'Search',
  42 + [
  43 + 'class' => 'btn btn-primary',
  44 + ]
  45 + ) ?>
  46 +
  47 +</p>
  48 +
  49 +<?php
  50 + echo Select2::widget(
  51 + [
  52 + 'model' => $searchModel,
  53 + 'attribute' => 'label',
  54 + 'data' => Label::find()
  55 + ->joinWith('lang')
  56 + ->select(['CONCAT(order_label.label,order_label_lang.title) AS name', 'id'])
  57 + ->indexBy('id')
  58 + ->asArray()
  59 + ->column(),
  60 + 'options' => [ 'placeholder' => 'Select a state ...' ],
  61 + 'pluginOptions' => [
  62 + 'allowClear' => true,
  63 + 'multiple' => true,
42 64 ],
43   - 'name',
44   - 'phone',
45   - 'status',
46   - [
47   - 'class' => 'yii\grid\ActionColumn',
  65 + ]
  66 + );
  67 +?>
  68 +<br>
  69 +<?php
  70 + echo Select2::widget(
  71 + [
  72 + 'model' => $searchModel,
  73 + 'attribute' => 'delivery',
  74 + 'data' => Delivery::find()
  75 + ->joinWith('lang')
  76 + ->select('order_delivery_lang.title, id')
  77 + ->indexBy('id')
  78 + ->asArray()
  79 + ->column(),
  80 + 'options' => [ 'placeholder' => 'Select a state ...' ],
  81 + 'pluginOptions' => [
  82 + 'allowClear' => true,
  83 + 'multiple' => true,
  84 + ],
  85 + ]
  86 + );
  87 +?>
  88 +<p>
  89 +<?php
  90 + echo GridView::widget(
  91 + [
  92 + 'dataProvider' => $dataProvider,
  93 + 'filterModel' => $searchModel,
  94 + 'columns' => [
  95 + [
  96 + 'attribute' => 'id',
  97 + 'filter' => $searchForm->field($searchModel, 'id')
  98 + ->textInput(),
  99 + ],
  100 + [
  101 + 'attribute' => 'created_at',
  102 + 'format' => 'date',
  103 + 'filter' => $searchForm->field($searchModel, 'date_range')
  104 + ->widget(
  105 + DateRangePicker::className(),
  106 + [
  107 + 'convertFormat' => false,
  108 + 'pluginOptions' => [
  109 + 'locale' => [
  110 + 'format' => 'D-M-Y',
  111 + 'separator' => ' to ',
  112 + ],
  113 + 'opens' => 'left',
  114 + ],
  115 + ]
  116 + )
  117 + ->label(false)
  118 + ->render(),
  119 + ],
  120 + 'name',
  121 + 'phone',
  122 + 'status',
  123 + [
  124 + 'class' => 'yii\grid\ActionColumn',
  125 + ],
48 126 ],
49   - ],
50   - ]
51   -) ?>
  127 + ]
  128 + );
  129 +?>
  130 +</p>
  131 +<?php
  132 + ActiveForm::end();
  133 +?>
... ...