Commit 2925744114c5a16d4ee786b74842d10d26740f5c

Authored by Alexey Boroda
1 parent d8203a8c

-Manager filter on statistics

controllers/StatisticsController.php
... ... @@ -4,6 +4,7 @@
4 4  
5 5 use artweb\artbox\ecommerce\models\Label;
6 6 use artweb\artbox\ecommerce\models\Order;
  7 + use common\models\User;
7 8 use yii\data\ActiveDataProvider;
8 9 use yii\helpers\ArrayHelper;
9 10 use yii\helpers\VarDumper;
... ... @@ -11,7 +12,7 @@
11 12  
12 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 18 * Get a dates range
... ... @@ -34,6 +35,12 @@
34 35 } else {
35 36 $labelFilter = [];
36 37 }
  38 +
  39 + if (!empty($manager)) {
  40 + $managerFilter = [ 'manager_id' => $manager ];
  41 + } else {
  42 + $managerFilter = [];
  43 + }
37 44  
38 45 /**
39 46 * Get labels
... ... @@ -41,34 +48,41 @@
41 48 $labels = Label::find()
42 49 ->with('lang')
43 50 ->all();
  51 +
  52 + /**
  53 + * Get user
  54 + */
  55 + $managers = User::find()
  56 + ->all();
44 57  
45 58 /**
46 59 * Generate statistics
47 60 */
48 61 $labelStatistics = ArrayHelper::map(
49 62 $labels,
50   - function($model) {
51   - /**
52   - * @var Label $model
53   - */
  63 + function(Label $model) {
54 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 74 $dataProvider = new ActiveDataProvider(
65 75 [
66 76 'query' => Order::find()
67 77 ->filterWhere($dateFilter)
  78 + ->andFilterWhere($managerFilter)
68 79 ->andFilterWhere($labelFilter),
69 80 ]
70 81 );
71 82  
  83 + /**
  84 + * Creating charts data
  85 + */
72 86 $labelChartData1 = [
73 87 'labels' => array_keys($labelStatistics),
74 88 'datasets' => [
... ... @@ -94,7 +108,7 @@
94 108 ],
95 109 ],
96 110 ];
97   -
  111 +
98 112 $labelChartData3 = [
99 113 'labels' => array_keys($labelStatistics),
100 114 'datasets' => [
... ... @@ -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 140 $rejectChartData1 = [
121 141 'labels' => array_keys($rejectStatistics),
122 142 'datasets' => [
... ... @@ -129,7 +149,7 @@
129 149 ],
130 150 ],
131 151 ];
132   -
  152 +
133 153 $rejectChartData2 = [
134 154 'labels' => array_keys($rejectStatistics),
135 155 'datasets' => [
... ... @@ -147,16 +167,18 @@
147 167 'index',
148 168 [
149 169 'labels' => $labels,
  170 + 'managers' => $managers,
150 171 'labelStatistics' => $labelStatistics,
151 172 'rejectionStatistics' => $rejectStatistics,
152 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 179 'dateValue' => empty($date_range) ? '' : $date_range,
159 180 'dataLabel' => empty($label) ? false : $label,
  181 + 'dataManager' => empty($manager) ? false : $manager,
160 182 ]
161 183 );
162 184 }
... ...
models/Label.php
... ... @@ -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 105 return $query->one();
103 106 }
104 107 }
... ...
models/Order.php
... ... @@ -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 108 * @return array
108 109 */
109   - public static function getRejectionStatistics(array $where = [])
  110 + public static function getRejectionStatistics(array $date = [], array $manager = [])
110 111 {
111 112 $result = [];
112 113 foreach (self::REASONS as $id => $reason) {
... ... @@ -122,7 +123,8 @@
122 123 'reason' => $id,
123 124 ]
124 125 )
125   - ->andFilterWhere($where)
  126 + ->andFilterWhere($date)
  127 + ->andFilterWhere($manager)
126 128 ->one();
127 129 }
128 130  
... ... @@ -190,8 +192,8 @@
190 192 ];
191 193 } elseif ($attr == 'pay') {
192 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 198 } else {
197 199 return $values;
... ...
views/statistics/index.php
1 1 <?php
2 2 use artweb\artbox\ecommerce\models\Label;
3 3 use artweb\artbox\ecommerce\models\Order;
  4 + use artweb\artbox\ecommerce\models\ProductVariant;
  5 + use common\models\User;
4 6 use kartik\daterange\DateRangePicker;
5 7 use kartik\grid\GridView;
6 8 use kartik\select2\Select2;
... ... @@ -14,23 +16,25 @@
14 16 /**
15 17 * @var View $this
16 18 * @var Label[] $labels
  19 + * @var User[] $managers
17 20 * @var array $labelStatistics
18 21 * @var array $rejectionStatistics
19 22 * @var ActiveDataProvider $dataProvider
20 23 * @var array $labelChartData1
21 24 * @var array $labelChartData2
22 25 * @var array $labelChartData3
23   - * @var array $rejectChartData1
24   - * @var array $rejectChartData2
  26 + * @var array $rejectChartData1
  27 + * @var array $rejectChartData2
25 28 * @var string $dateValue
26 29 * @var int | boolean $dataLabel
  30 + * @var int | boolean $dataManager
27 31 */
28   -
  32 +
29 33 $js = <<< JS
30 34 $('[data-toggle="popover"]').popover();
31 35 JS;
32   -$this->registerJs($js, View::POS_READY);
33   -
  36 + $this->registerJs($js, View::POS_READY);
  37 +
34 38 ?>
35 39  
36 40 <div class="box box-default">
... ... @@ -46,7 +50,7 @@ $this-&gt;registerJs($js, View::POS_READY);
46 50 'get'
47 51 ) ?>
48 52 <div class="row">
49   - <div class="col-md-4">
  53 + <div class="col-md-3">
50 54 <?= DateRangePicker::widget(
51 55 [
52 56 'name' => 'date_range',
... ... @@ -60,7 +64,7 @@ $this-&gt;registerJs($js, View::POS_READY);
60 64 ]
61 65 ) ?>
62 66 </div>
63   - <div class="col-md-6">
  67 + <div class="col-md-4">
64 68 <?= Select2::widget(
65 69 [
66 70 'name' => 'label',
... ... @@ -75,7 +79,30 @@ $this-&gt;registerJs($js, View::POS_READY);
75 79 }
76 80 ),
77 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 107 'pluginOptions' => [
81 108 'allowClear' => true,
... ... @@ -98,7 +125,7 @@ $this-&gt;registerJs($js, View::POS_READY);
98 125  
99 126 <div class="box box-default">
100 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 129 <div class="box-tools pull-right">
103 130 <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
104 131 </div><!-- /.box-tools -->
... ... @@ -124,15 +151,17 @@ $this-&gt;registerJs($js, View::POS_READY);
124 151 } ?>
125 152 </table>
126 153 </div><!-- /.box-body -->
127   -
  154 +
128 155 <div class="box-footer">
129 156 <div class="nav-tabs-custom">
130 157  
131 158 <!-- Nav tabs -->
132 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 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 165 </ul>
137 166  
138 167 <!-- Tab panes -->
... ... @@ -220,7 +249,7 @@ $this-&gt;registerJs($js, View::POS_READY);
220 249  
221 250 <div class="box box-default">
222 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 253 <div class="box-tools pull-right">
225 254 <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
226 255 </div><!-- /.box-tools -->
... ... @@ -245,13 +274,14 @@ $this-&gt;registerJs($js, View::POS_READY);
245 274 ?>
246 275 </table>
247 276 </div><!-- /.box-body -->
248   -
  277 +
249 278 <div class="box-footer">
250 279 <div class="nav-tabs-custom">
251 280  
252 281 <!-- Nav tabs -->
253 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 285 <li role="presentation"><a href="#sum" aria-controls="sum" role="tab" data-toggle="tab">ะกัƒะผะผะฐ</a></li>
256 286 </ul>
257 287  
... ... @@ -311,7 +341,7 @@ $this-&gt;registerJs($js, View::POS_READY);
311 341  
312 342 </div>
313 343 </div>
314   -
  344 +
315 345 </div><!-- /.box -->
316 346  
317 347  
... ... @@ -331,41 +361,46 @@ $this-&gt;registerJs($js, View::POS_READY);
331 361 'created_at:datetime',
332 362 'name',
333 363 [
334   - 'label' => 'ะขะพะฒะฐั€ั‹',
  364 + 'label' => 'ะขะพะฒะฐั€ั‹',
335 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 405 'city',
371 406 [
... ...