Commit ee0e1df535acc02bc75e94742ef3742ced2e7b49

Authored by Alexey Boroda
1 parent c130fad8

-Statistics half way done

controllers/StatisticsController.php
@@ -4,7 +4,7 @@ @@ -4,7 +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 yii\db\Query; 7 + use yii\data\ActiveDataProvider;
8 use yii\helpers\ArrayHelper; 8 use yii\helpers\ArrayHelper;
9 use yii\helpers\VarDumper; 9 use yii\helpers\VarDumper;
10 use yii\web\Controller; 10 use yii\web\Controller;
@@ -19,33 +19,58 @@ @@ -19,33 +19,58 @@
19 if (!empty($date_range)) { 19 if (!empty($date_range)) {
20 $arr = []; 20 $arr = [];
21 preg_match('@(.*)\s:\s(.*)@', $date_range, $arr); 21 preg_match('@(.*)\s:\s(.*)@', $date_range, $arr);
22 - $date_from = strtotime($arr[1]);  
23 - $date_to = strtotime($arr[2]); 22 + $dateFilter = [
  23 + 'between',
  24 + 'created_at',
  25 + strtotime($arr[1]),
  26 + strtotime($arr[2]),
  27 + ];
24 } else { 28 } else {
25 - $date_from = 0;  
26 - $date_to = 0; 29 + $dateFilter = [];
27 } 30 }
28 -  
29 - $labels = ArrayHelper::map(  
30 - Label::find()  
31 - ->joinWith('lang')  
32 - ->asArray()  
33 - ->all(),  
34 - 'id',  
35 - 'lang.title'  
36 - );  
37 31
38 if (!empty($label)) { 32 if (!empty($label)) {
39 - $label = Label::findOne($label);  
40 - /**  
41 - * continue here!!!  
42 - */ 33 + $labelFilter = ['label' => $label];
  34 + } else {
  35 + $labelFilter = [];
43 } 36 }
44 37
  38 + /**
  39 + * Get labels
  40 + */
  41 + $labels = Label::find()
  42 + ->with('lang')
  43 + ->all();
  44 +
  45 + /**
  46 + * Generate statistics
  47 + */
  48 + $labelStatistics = ArrayHelper::map(
  49 + $labels,
  50 + function($model) {
  51 + /**
  52 + * @var Label $model
  53 + */
  54 + return $model->lang->title;
  55 + },
  56 + function($model) use ($dateFilter) {
  57 + /**
  58 + * @var Label $model
  59 + */
  60 + return $model->getStatistics($dateFilter);}
  61 + );
  62 +
  63 + $dataProvider = new ActiveDataProvider([
  64 + 'query' => Order::find()->filterWhere($dateFilter)->andFilterWhere($labelFilter),
  65 + ]);
  66 +
45 return $this->render( 67 return $this->render(
46 'index', 68 'index',
47 [ 69 [
48 'labels' => $labels, 70 'labels' => $labels,
  71 + 'labelStatistics' => $labelStatistics,
  72 + 'rejectionStatistics' => Order::getRejectionStatistics($dateFilter),
  73 + 'dataProvider' => $dataProvider,
49 ] 74 ]
50 ); 75 );
51 } 76 }
@@ -65,19 +65,8 @@ @@ -65,19 +65,8 @@
65 ]; 65 ];
66 } 66 }
67 67
68 - public function getStatistics(int $dateFrom, int $dateTo) 68 + public function getStatistics(array $where = [])
69 { 69 {
70 -  
71 - if ($dateTo != 0) {  
72 - $where = [  
73 - 'between',  
74 - 'created_at',  
75 - $dateFrom,  
76 - $dateTo,  
77 - ];  
78 - } else {  
79 - $where = [];  
80 - }  
81 $query = ( new Query() )->select( 70 $query = ( new Query() )->select(
82 [ 71 [
83 'sum' => 'SUM(total)', 72 'sum' => 'SUM(total)',
@@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
7 use Yii; 7 use Yii;
8 use yii\behaviors\TimestampBehavior; 8 use yii\behaviors\TimestampBehavior;
9 use yii\db\ActiveRecord; 9 use yii\db\ActiveRecord;
  10 + use yii\db\Query;
10 11
11 /** 12 /**
12 * Class Order 13 * Class Order
@@ -91,6 +92,32 @@ @@ -91,6 +92,32 @@
91 { 92 {
92 return 'order'; 93 return 'order';
93 } 94 }
  95 +
  96 + /**
  97 + * @param array $where
  98 + *
  99 + * @return array
  100 + */
  101 + public static function getRejectionStatistics(array $where = [])
  102 + {
  103 + $result = [];
  104 + foreach (self::REASONS as $id => $reason) {
  105 + $result[ $reason ] = ( new Query() )->select(
  106 + [
  107 + 'sum' => 'SUM(total)',
  108 + 'count' => 'COUNT(*)',
  109 + ]
  110 + )
  111 + ->from(self::tableName())
  112 + ->where(
  113 + [
  114 + 'reason' => $id,
  115 + ]
  116 + )->andFilterWhere($where)->one();
  117 + }
  118 +
  119 + return $result;
  120 + }
94 121
95 public function behaviors() 122 public function behaviors()
96 { 123 {
@@ -185,7 +212,7 @@ @@ -185,7 +212,7 @@
185 public function afterFind() 212 public function afterFind()
186 { 213 {
187 parent::afterFind(); 214 parent::afterFind();
188 - $this->deadline = !empty( $this->deadline ) ? date('d.m.Y', $this->deadline) : ''; 215 + $this->deadline = !empty($this->deadline) ? date('d.m.Y', $this->deadline) : '';
189 216
190 } 217 }
191 218
@@ -202,7 +229,7 @@ @@ -202,7 +229,7 @@
202 229
203 protected function convertDate() 230 protected function convertDate()
204 { 231 {
205 - if (!empty( $this->deadline )) { 232 + if (!empty($this->deadline)) {
206 $date = new \DateTime(); 233 $date = new \DateTime();
207 $date->setTimestamp(strtotime($this->deadline)); 234 $date->setTimestamp(strtotime($this->deadline));
208 $date->format("d.m.Y"); 235 $date->format("d.m.Y");
@@ -291,8 +318,8 @@ @@ -291,8 +318,8 @@
291 */ 318 */
292 public function getDeliveryString() 319 public function getDeliveryString()
293 { 320 {
294 - if (!empty( $this->orderDelivery )) {  
295 - if (!empty( $this->orderDelivery->parent )) { 321 + if (!empty($this->orderDelivery)) {
  322 + if (!empty($this->orderDelivery->parent)) {
296 return $this->orderDelivery->parent->lang->title . ': ' . $this->orderDelivery->lang->title; 323 return $this->orderDelivery->parent->lang->title . ': ' . $this->orderDelivery->lang->title;
297 } else { 324 } else {
298 return $this->orderDelivery->lang->title; 325 return $this->orderDelivery->lang->title;
@@ -310,7 +337,7 @@ @@ -310,7 +337,7 @@
310 */ 337 */
311 public function getWasted() 338 public function getWasted()
312 { 339 {
313 - if (empty( $this->deadline )) { 340 + if (empty($this->deadline)) {
314 return false; 341 return false;
315 } else { 342 } else {
316 return time() > strtotime($this->deadline); 343 return time() > strtotime($this->deadline);
views/statistics/index.php
1 <?php 1 <?php
  2 + use artweb\artbox\ecommerce\models\Label;
2 use kartik\daterange\DateRangePicker; 3 use kartik\daterange\DateRangePicker;
  4 + use kartik\grid\GridView;
3 use kartik\select2\Select2; 5 use kartik\select2\Select2;
  6 + use yii\data\ActiveDataProvider;
  7 + use yii\helpers\ArrayHelper;
4 use yii\helpers\Html; 8 use yii\helpers\Html;
5 use yii\web\View; 9 use yii\web\View;
6 10
7 /** 11 /**
8 - * @var View $this  
9 - * @var array $labels 12 + * @var View $this
  13 + * @var Label[] $labels
  14 + * @var array $labelStatistics
  15 + * @var array $rejectionStatistics
  16 + * @var ActiveDataProvider $dataProvider
10 */ 17 */
11 18
12 ?> 19 ?>
@@ -19,32 +26,121 @@ @@ -19,32 +26,121 @@
19 </div><!-- /.box-tools --> 26 </div><!-- /.box-tools -->
20 </div><!-- /.box-header --> 27 </div><!-- /.box-header -->
21 <div class="box-body"> 28 <div class="box-body">
22 - <?= Html::beginForm(['/ecommerce/statistics'], 'get', [  
23 - 'class' => 'form-inline'  
24 - ])?>  
25 -  
26 - <?= DateRangePicker::widget([  
27 - 'name' => 'date_range',  
28 - 'pluginOptions' => [  
29 - 'locale' => [  
30 - 'format' => 'DD-MM-Y',  
31 - 'separator' => ' : ',  
32 - ],  
33 - ],  
34 - ])?>  
35 -  
36 - <?= Select2::widget([  
37 - 'name' => 'label',  
38 - 'data' => $labels,  
39 - 'options' => [  
40 - 'placeholder' => 'Все',  
41 - ],  
42 - ])?>  
43 -  
44 - <?= Html::submitButton('Go', [  
45 - 'class' => 'btn btn-success',  
46 - ])?>  
47 - 29 + <?= Html::beginForm(
  30 + [ '/ecommerce/statistics' ],
  31 + 'get'
  32 + ) ?>
  33 + <div class="row">
  34 + <div class="col-md-4">
  35 + <?= DateRangePicker::widget(
  36 + [
  37 + 'name' => 'date_range',
  38 + 'pluginOptions' => [
  39 + 'locale' => [
  40 + 'format' => 'DD-MM-Y',
  41 + 'separator' => ' : ',
  42 + ],
  43 + ],
  44 + ]
  45 + ) ?>
  46 + </div>
  47 + <div class="col-md-6">
  48 + <?= Select2::widget(
  49 + [
  50 + 'name' => 'label',
  51 + 'data' => ArrayHelper::map(
  52 + $labels,
  53 + function($model) {
  54 + return $model->id;
  55 + },
  56 + function($model) {
  57 + return $model->lang->title;
  58 + }
  59 + ),
  60 + 'options' => [
  61 + 'placeholder' => 'Все',
  62 + ],
  63 + ]
  64 + ) ?>
  65 + </div>
  66 + <div class="col-md-2">
  67 + <?= Html::submitButton(
  68 + 'Go',
  69 + [
  70 + 'class' => 'btn btn-success',
  71 + ]
  72 + ) ?>
  73 + </div>
  74 + </div>
48 <?= Html::endForm() ?> 75 <?= Html::endForm() ?>
49 </div><!-- /.box-body --> 76 </div><!-- /.box-body -->
50 </div><!-- /.box --> 77 </div><!-- /.box -->
  78 +
  79 +<div class="box box-default">
  80 + <div class="box-header with-border">
  81 + <h3 class="box-title">Метки, статистика за </h3>
  82 + <div class="box-tools pull-right">
  83 + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
  84 + </div><!-- /.box-tools -->
  85 + </div><!-- /.box-header -->
  86 + <div class="box-body table-responsive no-padding">
  87 + <table class="table table-hover">
  88 + <tr>
  89 + <td><b>Метка</b></td>
  90 + <td><b>Заказов, шт.</b></td>
  91 + <td><b>На сумму, грн.</b></td>
  92 + <td><b>Заказано товаров, шт.</b></td>
  93 + <td><b>Уникальных товаров, шт.</b></td>
  94 + </tr>
  95 + <?php
  96 + foreach ($labelStatistics as $name => $statistic) {
  97 + ?>
  98 + <tr>
  99 + <td><?= $name ?></td>
  100 + <td><?= $statistic[ 'count' ] ?></td>
  101 + <td><?= $statistic[ 'sum' ] ?></td>
  102 + <td><?= $statistic[ 'products' ] ?></td>
  103 + <td><?= $statistic[ 'unique' ] ?></td>
  104 + </tr>
  105 + <?php } ?>
  106 + </table>
  107 + </div><!-- /.box-body -->
  108 +</div><!-- /.box -->
  109 +
  110 +<div class="box box-default">
  111 + <div class="box-header with-border">
  112 + <h3 class="box-title">Метки, статистика за </h3>
  113 + <div class="box-tools pull-right">
  114 + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
  115 + </div><!-- /.box-tools -->
  116 + </div><!-- /.box-header -->
  117 + <div class="box-body table-responsive no-padding">
  118 + <table class="table table-hover">
  119 + <tr>
  120 + <td><b>Причина</b></td>
  121 + <td><b>Заказов, шт.</b></td>
  122 + <td><b>На сумму, грн.</b></td>
  123 + </tr>
  124 + <?php
  125 + foreach ($rejectionStatistics as $name => $statistic) {
  126 + ?>
  127 + <tr>
  128 + <td><?= $name ?></td>
  129 + <td><?= $statistic[ 'count' ] ?></td>
  130 + <td><?= $statistic[ 'sum' ] ?></td>
  131 + </tr>
  132 + <?php } ?>
  133 + </table>
  134 + </div><!-- /.box-body -->
  135 +</div><!-- /.box -->
  136 +
  137 +<?=GridView::widget([
  138 + 'dataProvider' => $dataProvider,
  139 + 'columns' => [
  140 + 'id',
  141 + 'created_at:datetime',
  142 + 'name',
  143 + 'city',
  144 +
  145 + ],
  146 + ])?>