Commit 2925744114c5a16d4ee786b74842d10d26740f5c

Authored by Alexey Boroda
1 parent d8203a8c

-Manager filter on statistics

controllers/StatisticsController.php
@@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
4 4
5 use artweb\artbox\ecommerce\models\Label; 5 use artweb\artbox\ecommerce\models\Label;
6 use artweb\artbox\ecommerce\models\Order; 6 use artweb\artbox\ecommerce\models\Order;
  7 + use common\models\User;
7 use yii\data\ActiveDataProvider; 8 use yii\data\ActiveDataProvider;
8 use yii\helpers\ArrayHelper; 9 use yii\helpers\ArrayHelper;
9 use yii\helpers\VarDumper; 10 use yii\helpers\VarDumper;
@@ -11,7 +12,7 @@ @@ -11,7 +12,7 @@
11 12
12 class StatisticsController extends Controller 13 class StatisticsController extends Controller
13 { 14 {
14 - public function actionIndex($date_range = NULL, $label = NULL) 15 + public function actionIndex($date_range = NULL, $label = NULL, $manager = NULL)
15 { 16 {
16 /** 17 /**
17 * Get a dates range 18 * Get a dates range
@@ -34,6 +35,12 @@ @@ -34,6 +35,12 @@
34 } else { 35 } else {
35 $labelFilter = []; 36 $labelFilter = [];
36 } 37 }
  38 +
  39 + if (!empty($manager)) {
  40 + $managerFilter = [ 'manager_id' => $manager ];
  41 + } else {
  42 + $managerFilter = [];
  43 + }
37 44
38 /** 45 /**
39 * Get labels 46 * Get labels
@@ -41,34 +48,41 @@ @@ -41,34 +48,41 @@
41 $labels = Label::find() 48 $labels = Label::find()
42 ->with('lang') 49 ->with('lang')
43 ->all(); 50 ->all();
  51 +
  52 + /**
  53 + * Get user
  54 + */
  55 + $managers = User::find()
  56 + ->all();
44 57
45 /** 58 /**
46 * Generate statistics 59 * Generate statistics
47 */ 60 */
48 $labelStatistics = ArrayHelper::map( 61 $labelStatistics = ArrayHelper::map(
49 $labels, 62 $labels,
50 - function($model) {  
51 - /**  
52 - * @var Label $model  
53 - */ 63 + function(Label $model) {
54 return $model->lang->title; 64 return $model->lang->title;
55 }, 65 },
56 - function($model) use ($dateFilter) {  
57 - /**  
58 - * @var Label $model  
59 - */  
60 - return $model->getStatistics($dateFilter); 66 + function(Label $model) use ($dateFilter, $managerFilter) {
  67 + return $model->getStatistics($dateFilter, $managerFilter);
61 } 68 }
62 ); 69 );
63 - 70 +
  71 + /**
  72 + * Data provider for table
  73 + */
64 $dataProvider = new ActiveDataProvider( 74 $dataProvider = new ActiveDataProvider(
65 [ 75 [
66 'query' => Order::find() 76 'query' => Order::find()
67 ->filterWhere($dateFilter) 77 ->filterWhere($dateFilter)
  78 + ->andFilterWhere($managerFilter)
68 ->andFilterWhere($labelFilter), 79 ->andFilterWhere($labelFilter),
69 ] 80 ]
70 ); 81 );
71 82
  83 + /**
  84 + * Creating charts data
  85 + */
72 $labelChartData1 = [ 86 $labelChartData1 = [
73 'labels' => array_keys($labelStatistics), 87 'labels' => array_keys($labelStatistics),
74 'datasets' => [ 88 'datasets' => [
@@ -94,7 +108,7 @@ @@ -94,7 +108,7 @@
94 ], 108 ],
95 ], 109 ],
96 ]; 110 ];
97 - 111 +
98 $labelChartData3 = [ 112 $labelChartData3 = [
99 'labels' => array_keys($labelStatistics), 113 'labels' => array_keys($labelStatistics),
100 'datasets' => [ 114 'datasets' => [
@@ -115,8 +129,14 @@ @@ -115,8 +129,14 @@
115 ], 129 ],
116 ]; 130 ];
117 131
118 - $rejectStatistics = Order::getRejectionStatistics($dateFilter);  
119 - 132 + /**
  133 + * Getting rejection statistics
  134 + */
  135 + $rejectStatistics = Order::getRejectionStatistics($dateFilter, $managerFilter);
  136 +
  137 + /**
  138 + * Charts data for rejects
  139 + */
120 $rejectChartData1 = [ 140 $rejectChartData1 = [
121 'labels' => array_keys($rejectStatistics), 141 'labels' => array_keys($rejectStatistics),
122 'datasets' => [ 142 'datasets' => [
@@ -129,7 +149,7 @@ @@ -129,7 +149,7 @@
129 ], 149 ],
130 ], 150 ],
131 ]; 151 ];
132 - 152 +
133 $rejectChartData2 = [ 153 $rejectChartData2 = [
134 'labels' => array_keys($rejectStatistics), 154 'labels' => array_keys($rejectStatistics),
135 'datasets' => [ 155 'datasets' => [
@@ -147,16 +167,18 @@ @@ -147,16 +167,18 @@
147 'index', 167 'index',
148 [ 168 [
149 'labels' => $labels, 169 'labels' => $labels,
  170 + 'managers' => $managers,
150 'labelStatistics' => $labelStatistics, 171 'labelStatistics' => $labelStatistics,
151 'rejectionStatistics' => $rejectStatistics, 172 'rejectionStatistics' => $rejectStatistics,
152 'dataProvider' => $dataProvider, 173 'dataProvider' => $dataProvider,
153 - 'labelChartData1' => $labelChartData1,  
154 - 'labelChartData2' => $labelChartData2,  
155 - 'labelChartData3' => $labelChartData3,  
156 - 'rejectChartData1' => $rejectChartData1,  
157 - 'rejectChartData2' => $rejectChartData2, 174 + 'labelChartData1' => $labelChartData1,
  175 + 'labelChartData2' => $labelChartData2,
  176 + 'labelChartData3' => $labelChartData3,
  177 + 'rejectChartData1' => $rejectChartData1,
  178 + 'rejectChartData2' => $rejectChartData2,
158 'dateValue' => empty($date_range) ? '' : $date_range, 179 'dateValue' => empty($date_range) ? '' : $date_range,
159 'dataLabel' => empty($label) ? false : $label, 180 'dataLabel' => empty($label) ? false : $label,
  181 + 'dataManager' => empty($manager) ? false : $manager,
160 ] 182 ]
161 ); 183 );
162 } 184 }
@@ -65,40 +65,43 @@ @@ -65,40 +65,43 @@
65 ]; 65 ];
66 } 66 }
67 67
68 - public function getStatistics(array $where = []) 68 + public function getStatistics(array $date = [], array $manager = [])
69 { 69 {
70 - $query = ( new Query() )->select(  
71 - [  
72 - 'sum' => 'SUM(total)',  
73 - 'count' => 'COUNT(*)',  
74 - 'unique' => ( new Query() )->select('COUNT(*)')  
75 - ->from('order')  
76 - ->leftJoin(  
77 - 'order_product',  
78 - '"order"."id"="order_product"."order_id"'  
79 - )  
80 - ->where([ 'order.label' => $this->id ])  
81 - ->andFilterWhere(  
82 - $where  
83 - ),  
84 - 'products' => ( new Query() )->select('SUM(count)')  
85 - ->from('order')  
86 - ->leftJoin(  
87 - 'order_product',  
88 - '"order"."id"="order_product"."order_id"'  
89 - )  
90 - ->where([ 'order.label' => $this->id ])  
91 - ->andFilterWhere(  
92 - $where  
93 - ),  
94 - ]  
95 - )  
96 - ->from('order')  
97 - ->where([ 'label' => $this->id ])  
98 - ->andFilterWhere(  
99 - $where  
100 - );  
101 - 70 + $query = ( new Query() )->select(
  71 + [
  72 + 'sum' => 'SUM(total)',
  73 + 'count' => 'COUNT(*)',
  74 + 'unique' => ( new Query() )->select('COUNT(*)')
  75 + ->from('order')
  76 + ->leftJoin(
  77 + 'order_product',
  78 + '"order"."id"="order_product"."order_id"'
  79 + )
  80 + ->where([ 'order.label' => $this->id ])
  81 + ->andFilterWhere(
  82 + $date
  83 + )
  84 + ->andFilterWhere($manager),
  85 + 'products' => ( new Query() )->select('SUM(count)')
  86 + ->from('order')
  87 + ->leftJoin(
  88 + 'order_product',
  89 + '"order"."id"="order_product"."order_id"'
  90 + )
  91 + ->where([ 'order.label' => $this->id ])
  92 + ->andFilterWhere(
  93 + $date
  94 + )
  95 + ->andFilterWhere($manager),
  96 + ]
  97 + )
  98 + ->from('order')
  99 + ->where([ 'label' => $this->id ])
  100 + ->andFilterWhere(
  101 + $date
  102 + )
  103 + ->andFilterWhere($manager);
  104 +
102 return $query->one(); 105 return $query->one();
103 } 106 }
104 } 107 }
@@ -102,11 +102,12 @@ @@ -102,11 +102,12 @@
102 } 102 }
103 103
104 /** 104 /**
105 - * @param array $where 105 + * @param array $date
  106 + * @param array $manager
106 * 107 *
107 * @return array 108 * @return array
108 */ 109 */
109 - public static function getRejectionStatistics(array $where = []) 110 + public static function getRejectionStatistics(array $date = [], array $manager = [])
110 { 111 {
111 $result = []; 112 $result = [];
112 foreach (self::REASONS as $id => $reason) { 113 foreach (self::REASONS as $id => $reason) {
@@ -122,7 +123,8 @@ @@ -122,7 +123,8 @@
122 'reason' => $id, 123 'reason' => $id,
123 ] 124 ]
124 ) 125 )
125 - ->andFilterWhere($where) 126 + ->andFilterWhere($date)
  127 + ->andFilterWhere($manager)
126 ->one(); 128 ->one();
127 } 129 }
128 130
@@ -190,8 +192,8 @@ @@ -190,8 +192,8 @@
190 ]; 192 ];
191 } elseif ($attr == 'pay') { 193 } elseif ($attr == 'pay') {
192 return [ 194 return [
193 - 'old' => ($values[ 'old' ] == true) ? 'Оплачен' : 'Не оплачен',  
194 - 'new' => ($values[ 'new' ] == true) ? 'Оплачен' : 'Не оплачен', 195 + 'old' => ( $values[ 'old' ] == true ) ? 'Оплачен' : 'Не оплачен',
  196 + 'new' => ( $values[ 'new' ] == true ) ? 'Оплачен' : 'Не оплачен',
195 ]; 197 ];
196 } else { 198 } else {
197 return $values; 199 return $values;
views/statistics/index.php
1 <?php 1 <?php
2 use artweb\artbox\ecommerce\models\Label; 2 use artweb\artbox\ecommerce\models\Label;
3 use artweb\artbox\ecommerce\models\Order; 3 use artweb\artbox\ecommerce\models\Order;
  4 + use artweb\artbox\ecommerce\models\ProductVariant;
  5 + use common\models\User;
4 use kartik\daterange\DateRangePicker; 6 use kartik\daterange\DateRangePicker;
5 use kartik\grid\GridView; 7 use kartik\grid\GridView;
6 use kartik\select2\Select2; 8 use kartik\select2\Select2;
@@ -14,23 +16,25 @@ @@ -14,23 +16,25 @@
14 /** 16 /**
15 * @var View $this 17 * @var View $this
16 * @var Label[] $labels 18 * @var Label[] $labels
  19 + * @var User[] $managers
17 * @var array $labelStatistics 20 * @var array $labelStatistics
18 * @var array $rejectionStatistics 21 * @var array $rejectionStatistics
19 * @var ActiveDataProvider $dataProvider 22 * @var ActiveDataProvider $dataProvider
20 * @var array $labelChartData1 23 * @var array $labelChartData1
21 * @var array $labelChartData2 24 * @var array $labelChartData2
22 * @var array $labelChartData3 25 * @var array $labelChartData3
23 - * @var array $rejectChartData1  
24 - * @var array $rejectChartData2 26 + * @var array $rejectChartData1
  27 + * @var array $rejectChartData2
25 * @var string $dateValue 28 * @var string $dateValue
26 * @var int | boolean $dataLabel 29 * @var int | boolean $dataLabel
  30 + * @var int | boolean $dataManager
27 */ 31 */
28 - 32 +
29 $js = <<< JS 33 $js = <<< JS
30 $('[data-toggle="popover"]').popover(); 34 $('[data-toggle="popover"]').popover();
31 JS; 35 JS;
32 -$this->registerJs($js, View::POS_READY);  
33 - 36 + $this->registerJs($js, View::POS_READY);
  37 +
34 ?> 38 ?>
35 39
36 <div class="box box-default"> 40 <div class="box box-default">
@@ -46,7 +50,7 @@ $this-&gt;registerJs($js, View::POS_READY); @@ -46,7 +50,7 @@ $this-&gt;registerJs($js, View::POS_READY);
46 'get' 50 'get'
47 ) ?> 51 ) ?>
48 <div class="row"> 52 <div class="row">
49 - <div class="col-md-4"> 53 + <div class="col-md-3">
50 <?= DateRangePicker::widget( 54 <?= DateRangePicker::widget(
51 [ 55 [
52 'name' => 'date_range', 56 'name' => 'date_range',
@@ -60,7 +64,7 @@ $this-&gt;registerJs($js, View::POS_READY); @@ -60,7 +64,7 @@ $this-&gt;registerJs($js, View::POS_READY);
60 ] 64 ]
61 ) ?> 65 ) ?>
62 </div> 66 </div>
63 - <div class="col-md-6"> 67 + <div class="col-md-4">
64 <?= Select2::widget( 68 <?= Select2::widget(
65 [ 69 [
66 'name' => 'label', 70 'name' => 'label',
@@ -75,7 +79,30 @@ $this-&gt;registerJs($js, View::POS_READY); @@ -75,7 +79,30 @@ $this-&gt;registerJs($js, View::POS_READY);
75 } 79 }
76 ), 80 ),
77 'options' => [ 81 'options' => [
78 - 'placeholder' => 'Все', 82 + 'placeholder' => 'Все метки',
  83 + ],
  84 + 'pluginOptions' => [
  85 + 'allowClear' => true,
  86 + ],
  87 + ]
  88 + ) ?>
  89 + </div>
  90 + <div class="col-md-3">
  91 + <?= Select2::widget(
  92 + [
  93 + 'name' => 'manager',
  94 + 'value' => $dataManager,
  95 + 'data' => ArrayHelper::map(
  96 + $managers,
  97 + function(User $model) {
  98 + return $model->id;
  99 + },
  100 + function(User $model) {
  101 + return $model->username;
  102 + }
  103 + ),
  104 + 'options' => [
  105 + 'placeholder' => 'Все менеджеры',
79 ], 106 ],
80 'pluginOptions' => [ 107 'pluginOptions' => [
81 'allowClear' => true, 108 'allowClear' => true,
@@ -98,7 +125,7 @@ $this-&gt;registerJs($js, View::POS_READY); @@ -98,7 +125,7 @@ $this-&gt;registerJs($js, View::POS_READY);
98 125
99 <div class="box box-default"> 126 <div class="box box-default">
100 <div class="box-header with-border"> 127 <div class="box-header with-border">
101 - <h3 class="box-title">Метки, статистика за <?=empty($dateValue) ? 'всё время' : $dateValue ?></h3> 128 + <h3 class="box-title">Метки, статистика за <?= empty($dateValue) ? 'всё время' : $dateValue ?></h3>
102 <div class="box-tools pull-right"> 129 <div class="box-tools pull-right">
103 <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> 130 <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
104 </div><!-- /.box-tools --> 131 </div><!-- /.box-tools -->
@@ -124,15 +151,17 @@ $this-&gt;registerJs($js, View::POS_READY); @@ -124,15 +151,17 @@ $this-&gt;registerJs($js, View::POS_READY);
124 } ?> 151 } ?>
125 </table> 152 </table>
126 </div><!-- /.box-body --> 153 </div><!-- /.box-body -->
127 - 154 +
128 <div class="box-footer"> 155 <div class="box-footer">
129 <div class="nav-tabs-custom"> 156 <div class="nav-tabs-custom">
130 157
131 <!-- Nav tabs --> 158 <!-- Nav tabs -->
132 <ul class="nav nav-tabs" role="tablist"> 159 <ul class="nav nav-tabs" role="tablist">
133 - <li role="presentation" class="active"><a href="#home" aria-controls="home" role="tab" data-toggle="tab">Заказы</a></li> 160 + <li role="presentation" class="active">
  161 + <a href="#home" aria-controls="home" role="tab" data-toggle="tab">Заказы</a></li>
134 <li role="presentation"><a href="#profile" aria-controls="profile" role="tab" data-toggle="tab">Сумма</a></li> 162 <li role="presentation"><a href="#profile" aria-controls="profile" role="tab" data-toggle="tab">Сумма</a></li>
135 - <li role="presentation"><a href="#messages" aria-controls="messages" role="tab" data-toggle="tab">Товары</a></li> 163 + <li role="presentation"><a href="#messages" aria-controls="messages" role="tab" data-toggle="tab">Товары</a>
  164 + </li>
136 </ul> 165 </ul>
137 166
138 <!-- Tab panes --> 167 <!-- Tab panes -->
@@ -220,7 +249,7 @@ $this-&gt;registerJs($js, View::POS_READY); @@ -220,7 +249,7 @@ $this-&gt;registerJs($js, View::POS_READY);
220 249
221 <div class="box box-default"> 250 <div class="box box-default">
222 <div class="box-header with-border"> 251 <div class="box-header with-border">
223 - <h3 class="box-title">Причины отказа, статистика за <?=empty($dateValue) ? 'всё время' : $dateValue ?></h3> 252 + <h3 class="box-title">Причины отказа, статистика за <?= empty($dateValue) ? 'всё время' : $dateValue ?></h3>
224 <div class="box-tools pull-right"> 253 <div class="box-tools pull-right">
225 <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> 254 <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
226 </div><!-- /.box-tools --> 255 </div><!-- /.box-tools -->
@@ -245,13 +274,14 @@ $this-&gt;registerJs($js, View::POS_READY); @@ -245,13 +274,14 @@ $this-&gt;registerJs($js, View::POS_READY);
245 ?> 274 ?>
246 </table> 275 </table>
247 </div><!-- /.box-body --> 276 </div><!-- /.box-body -->
248 - 277 +
249 <div class="box-footer"> 278 <div class="box-footer">
250 <div class="nav-tabs-custom"> 279 <div class="nav-tabs-custom">
251 280
252 <!-- Nav tabs --> 281 <!-- Nav tabs -->
253 <ul class="nav nav-tabs" role="tablist"> 282 <ul class="nav nav-tabs" role="tablist">
254 - <li role="presentation" class="active"><a href="#count" aria-controls="count" role="tab" data-toggle="tab">Заказы</a></li> 283 + <li role="presentation" class="active">
  284 + <a href="#count" aria-controls="count" role="tab" data-toggle="tab">Заказы</a></li>
255 <li role="presentation"><a href="#sum" aria-controls="sum" role="tab" data-toggle="tab">Сумма</a></li> 285 <li role="presentation"><a href="#sum" aria-controls="sum" role="tab" data-toggle="tab">Сумма</a></li>
256 </ul> 286 </ul>
257 287
@@ -311,7 +341,7 @@ $this-&gt;registerJs($js, View::POS_READY); @@ -311,7 +341,7 @@ $this-&gt;registerJs($js, View::POS_READY);
311 341
312 </div> 342 </div>
313 </div> 343 </div>
314 - 344 +
315 </div><!-- /.box --> 345 </div><!-- /.box -->
316 346
317 347
@@ -331,41 +361,46 @@ $this-&gt;registerJs($js, View::POS_READY); @@ -331,41 +361,46 @@ $this-&gt;registerJs($js, View::POS_READY);
331 'created_at:datetime', 361 'created_at:datetime',
332 'name', 362 'name',
333 [ 363 [
334 - 'label' => 'Товары', 364 + 'label' => 'Товары',
335 'content' => function(Order $model) { 365 'content' => function(Order $model) {
336 - if (empty($model->products)) {  
337 - return '';  
338 - } else {  
339 - $content = '';  
340 - $i = 0;  
341 - foreach ($model->products as $product) {  
342 - $i ++;  
343 - $content .= Html::a(  
344 - $product->sku,  
345 - '#',  
346 - [  
347 - 'onclick' => 'event.preventDefault();',  
348 - 'data-toggle' => 'popover',  
349 - 'data-placement' => 'right',  
350 - 'data-html' => 'true',  
351 - 'data-content' => Html::img(  
352 - $product->productVariant->imageUrl,  
353 - [  
354 - 'class' => 'img-rounded',  
355 - ]  
356 - ) . Html::tag('p', $product->product_name),  
357 - ]  
358 - );  
359 - if ($i != count($model->products) ) {  
360 - $content .= ', ';  
361 - }  
362 - if ($i % 2 == 0) {  
363 - $content .= '<br>';  
364 - } 366 + if (empty($model->products)) {
  367 + return '';
  368 + } else {
  369 + $content = '';
  370 + $i = 0;
  371 + foreach ($model->products as $product) {
  372 + if(empty($product->productVariant)){
  373 + $image = '';
  374 + } else {
  375 + $image = $product->productVariant->imageUrl;
  376 + }
  377 + $i++;
  378 + $content .= Html::a(
  379 + $product->sku,
  380 + '#',
  381 + [
  382 + 'onclick' => 'event.preventDefault();',
  383 + 'data-toggle' => 'popover',
  384 + 'data-placement' => 'right',
  385 + 'data-html' => 'true',
  386 + 'data-content' => Html::img(
  387 + $image,
  388 + [
  389 + 'class' => 'img-rounded',
  390 + ]
  391 + ) . Html::tag('p', $product->product_name),
  392 + ]
  393 + );
  394 + if ($i != count($model->products)) {
  395 + $content .= ', ';
  396 + }
  397 + if ($i % 2 == 0) {
  398 + $content .= '<br>';
  399 + }
  400 + }
  401 + return $content;
365 } 402 }
366 - return $content;  
367 - }  
368 - } 403 + },
369 ], 404 ],
370 'city', 405 'city',
371 [ 406 [