StatisticsController.php 3.37 KB
<?php
    
    namespace artweb\artbox\ecommerce\controllers;
    
    use artweb\artbox\ecommerce\models\Label;
    use artweb\artbox\ecommerce\models\Order;
    use yii\data\ActiveDataProvider;
    use yii\helpers\ArrayHelper;
    use yii\helpers\VarDumper;
    use yii\web\Controller;
    
    class StatisticsController extends Controller
    {
        public function actionIndex($date_range = NULL, $label = NULL)
        {
            /**
             * Get a dates range
             */
            if (!empty($date_range)) {
                $arr = [];
                preg_match('@(.*)\s:\s(.*)@', $date_range, $arr);
                $dateFilter = [
                    'between',
                    'created_at',
                    strtotime($arr[ 1 ]),
                    strtotime($arr[ 2 ]),
                ];
            } else {
                $dateFilter = [];
            }
            
            if (!empty($label)) {
                $labelFilter = [ 'label' => $label ];
            } else {
                $labelFilter = [];
            }
            
            /**
             * Get labels
             */
            $labels = Label::find()
                           ->with('lang')
                           ->all();
            
            /**
             * Generate statistics
             */
            $labelStatistics = ArrayHelper::map(
                $labels,
                function($model) {
                    /**
                     * @var Label $model
                     */
                    return $model->lang->title;
                },
                function($model) use ($dateFilter) {
                    /**
                     * @var Label $model
                     */
                    return $model->getStatistics($dateFilter);
                }
            );
            
            $dataProvider = new ActiveDataProvider(
                [
                    'query' => Order::find()
                                    ->filterWhere($dateFilter)
                                    ->andFilterWhere($labelFilter),
                ]
            );
            
            $chartData = [];
            foreach ($labelStatistics as $statistic) {
                $chartData[] = $statistic[ 'sum' ];
            }
            $chartLabels = [];
            foreach ($labelStatistics as $name => $statistic) {
                $chartLabels[] = $name;
            }
            $labelChartData = [
                'labels'   => $chartLabels,
                'datasets' => [
                    [
                        'label' => 'На сумму, грн.',
                        'data'  => $chartData,
                    ],
                ],
            ];
            return $this->render(
                'index',
                [
                    'labels'              => $labels,
                    'labelStatistics'     => $labelStatistics,
                    'rejectionStatistics' => Order::getRejectionStatistics($dateFilter),
                    'dataProvider'        => $dataProvider,
                    'labelChartData'      => $labelChartData,
                    'dateValue'           => empty($date_range) ? '' : $date_range,
                    'dataLabel'           => empty($label) ? false : $label,
                ]
            );
        }
    }