diff --git a/controllers/StatisticsController.php b/controllers/StatisticsController.php index 58dd2c8..8cfb9e1 100755 --- a/controllers/StatisticsController.php +++ b/controllers/StatisticsController.php @@ -2,6 +2,7 @@ namespace artweb\artbox\ecommerce\controllers; + use arturoliveira\ExcelView; use artweb\artbox\ecommerce\models\Label; use artweb\artbox\ecommerce\models\Order; use common\models\User; @@ -9,6 +10,7 @@ use yii\helpers\ArrayHelper; use yii\helpers\VarDumper; use yii\web\Controller; + use yii\web\Response; class StatisticsController extends Controller { @@ -35,7 +37,7 @@ } else { $labelFilter = []; } - + if (!empty($manager)) { $managerFilter = [ 'manager_id' => $manager ]; } else { @@ -48,7 +50,7 @@ $labels = Label::find() ->with('lang') ->all(); - + /** * Get user */ @@ -67,7 +69,7 @@ return $model->getStatistics($dateFilter, $managerFilter); } ); - + /** * Data provider for table */ @@ -75,11 +77,11 @@ [ 'query' => Order::find() ->filterWhere($dateFilter) - ->andFilterWhere($managerFilter) + ->andFilterWhere($managerFilter) ->andFilterWhere($labelFilter), ] ); - + /** * Creating charts data */ @@ -128,12 +130,12 @@ ], ], ]; - + /** * Getting rejection statistics */ $rejectStatistics = Order::getRejectionStatistics($dateFilter, $managerFilter); - + /** * Charts data for rejects */ @@ -178,8 +180,92 @@ 'rejectChartData2' => $rejectChartData2, 'dateValue' => empty($date_range) ? '' : $date_range, 'dataLabel' => empty($label) ? false : $label, - 'dataManager' => empty($manager) ? false : $manager, + 'dataManager' => empty($manager) ? false : $manager, ] ); } + + public function actionExport($date_range = NULL, $label = NULL, $manager = NULL) + { + $formatter = \Yii::$app->formatter; + /** + * Get export options + */ + 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 = []; + } + + if (!empty($manager)) { + $managerFilter = [ 'manager_id' => $manager ]; + } else { + $managerFilter = []; + } + + $orders = Order::find() + ->with( + [ + 'products', + 'orderLabel', + 'manager', + ] + ) + ->filterWhere($dateFilter) + ->andFilterWhere($labelFilter) + ->andFilterWhere($managerFilter) + ->limit(10) + ->all(); + + $file = fopen(\Yii::getAlias('@backend') . '/web/export/' . time() . '_export.csv', 'a'); + foreach ($orders as $order) { + $line = []; + /** + * @var Order $order + */ + $line[] = $formatter->asDecimal($order->id); + $line[] = $formatter->asDatetime($order->created_at); + $line[] = $formatter->asText($order->name); + if (empty($order->products)) { + $line[] = ''; + } else { + $i = 0; + $products = ''; + foreach ($order->products as $product) { + $products .= $product->sku; + if (count($order->products) != $i) { + $products .= ' ;'; + } + } + $line[] = $products; + } + $line[] = $formatter->asText($order->city); + $line[] = $formatter->asText($order->orderLabel->label); + $line[] = $formatter->asDecimal($order->total); + $line[] = empty($order->reason) ? '' : $formatter->asText(Order::REASONS[$order->reason]); + $line[] = empty($order->manager) ? '' : $formatter->asText($order->manager->username); + $line[] = $formatter->asText($order->body); + + fputcsv($file, $line); + } + fclose($file); + + /** + * Start here + * @todo Ajax download button generation + */ + } } diff --git a/models/Order.php b/models/Order.php index e3e6bdf..9988607 100755 --- a/models/Order.php +++ b/models/Order.php @@ -63,6 +63,7 @@ * @property OrderLog[] $logs * @property float $credit_sum * @property int $credit_month + * @property User $manager */ class Order extends ActiveRecord { diff --git a/views/statistics/export.php b/views/statistics/export.php new file mode 100644 index 0000000..3876d4c --- /dev/null +++ b/views/statistics/export.php @@ -0,0 +1,11 @@ +