From 056cbed3fc26aacd8861c6c29c70106983072b29 Mon Sep 17 00:00:00 2001 From: Alexander Smirnov Date: Thu, 30 May 2024 16:35:57 +0300 Subject: [PATCH] add sale summ per employee with view --- .../EmployeeSalesReportController.php | 101 ++++++++++++++++++ erp24/views/employee-sales-report/index.php | 98 +++++++++++++++++ 2 files changed, 199 insertions(+) create mode 100644 erp24/controllers/EmployeeSalesReportController.php create mode 100644 erp24/views/employee-sales-report/index.php diff --git a/erp24/controllers/EmployeeSalesReportController.php b/erp24/controllers/EmployeeSalesReportController.php new file mode 100644 index 00000000..abd758cd --- /dev/null +++ b/erp24/controllers/EmployeeSalesReportController.php @@ -0,0 +1,101 @@ + 0, 'cluster_ind' => 0, 'store_id' => 1, 'shift' => 0, + 'date_start' => date('Y-m-d', strtotime("-7 day", time())), + 'date_end' => date('Y-m-d'), + 'sorting' => 0 + ], [[['scope', 'shift', 'cluster_ind', 'store_id', 'date_start', 'date_end', 'sorting'], 'safe']]); + + $model->load(Yii::$app->request->get()) && $model->validate(); + + if ($model->date_start > $model->date_end) { + $tmp = $model->date_start; + $model->date_start = $model->date_end; + $model->date_end = $tmp; + } + + $storeDynamic = StoreDynamic::find()->alias('s')->select(['s.store_id as id', 's.value_int as cluster', 'c.name']) + ->innerJoin("city_store c", "c.id = s.store_id") + ->where(['s.active' => 1]) + ->asArray()->all(); + + $clusters = array_unique(ArrayHelper::getColumn($storeDynamic, 'cluster')); + sort($clusters); + + $stores = []; + foreach ($storeDynamic as $store) { + $stores[$store['id']] = $store['name']; + } + + $salesQuery = Sales::find() + ->select(['id', 'summ', 'admin_id']) + ->where(['operation' => Sales::OPERATION_SALE]) + ->andWhere(['>', 'admin_id', 0]) + ->andWhere(['order_id' => ['0', '']]) + ->andWhere(['between', 'date', + date("Y-m-d 00:00:00", strtotime($model->date_start)), + date("Y-m-d 23:59:59", strtotime($model->date_end)) + ]); + if ($model->shift == 1) { + $salesQuery->andWhere(['between', "TO_CHAR(date, 'HH:MM')", "08:00", "20:00"]); + } + if ($model->shift ==2) { + $salesQuery->andWhere(['or', + ['>=', "TO_CHAR(date, 'HH:MM')", "20:00"], + ['<=', "TO_CHAR(date, 'HH:MM')", "08:00"] + ]); + } + if ($model->scope > 0) { + $store_ids = []; + if ($model->scope == 1) { + foreach ($storeDynamic as $store) { + if ($store['cluster'] == $clusters[$model->cluster_ind]) { + $store_ids[] = $store['id']; + } + } + } + if ($model->scope == 2) { + $store_ids [] = $model->store_id; + } + $salesQuery->andWhere(['store_id' => $store_ids]); + } + + $sales = $salesQuery->all(); + $salesIds = ArrayHelper::getColumn($sales, 'id'); + $returns = Sales::find()->where(['operation' => Sales::OPERATION_RETURN, 'sales_check' => $salesIds])->all(); + $returnIds = ArrayHelper::getColumn($returns, 'sales_check'); + + $paymentsPerAdmin = []; + $paymentsCntPerAdmin = []; + foreach ($sales as $sale) { + if (!in_array($sale->id, $returnIds)) { + $paymentsPerAdmin[$sale->admin_id] = ($paymentsPerAdmin[$sale->admin_id] ?? 0) + $sale->summ; + $paymentsCntPerAdmin[$sale->admin_id] = ($paymentsCntPerAdmin[$sale->admin_id] ?? 0) + 1; + } + } + + $admins = Admin::find()->select(['id', 'name'])->where(['id' => array_keys($paymentsPerAdmin)])->all(); + $admins = ArrayHelper::map($admins, 'id', 'name'); + + $adminIds = array_keys($paymentsPerAdmin); + usort($adminIds, function($a, $b) use ($paymentsPerAdmin, $model) { return ($model->sorting == 0 ? 1 : -1) * ($paymentsPerAdmin[$a] - $paymentsPerAdmin[$b]); }); + + return $this->render('index', compact('model', 'clusters', 'stores', 'admins', 'adminIds', + 'paymentsPerAdmin', 'paymentsCntPerAdmin')); + } +} \ No newline at end of file diff --git a/erp24/views/employee-sales-report/index.php b/erp24/views/employee-sales-report/index.php new file mode 100644 index 00000000..75d54060 --- /dev/null +++ b/erp24/views/employee-sales-report/index.php @@ -0,0 +1,98 @@ + + +
+

Отчёт по продажам сотрудников

+ 'GET', 'action' => 'index']) ?> + +
+
+ field($model, 'scope')->dropDownList(['Розница', 'Куст', 'Магазин'], ['id' => 'chooseScope', 'onchange' => '$("#chooseBranch").hide(); $("#chooseStore").hide(); if (this.value == 1) { $("#chooseBranch").show(); } else if (this.value == 2) { $("#chooseStore").show(); }; '])->label(false) ?> +
+
+ + Куст:
field($model, 'cluster_ind')->dropDownList($clusters)->label(false); ?>
+
+ + Магазин:
field($model, 'store_id')->dropDownList($stores)->label(false); ?>
+
+ Смена:
field($model, 'shift')->dropDownList(['Обе', 'Дневная', 'Ночная'])->label(false); ?>
+ Дата с:
field($model, 'date_start')->widget(DateTimePicker::class, [ + 'language' => 'ru', + 'template' => '{input}', + 'clientOptions' => [ + 'autoclose' => true, + 'format' => 'Y-m-d', + 'todayBtn' => true + ], + ])->label(false) ?>
+ по:
field($model, 'date_end')->widget(DateTimePicker::class, [ + 'language' => 'ru', + 'template' => '{input}', + 'clientOptions' => [ + 'autoclose' => true, + 'format' => 'Y-m-d', + 'todayBtn' => true + ], + ])->label(false) ?>
+ Сортировка по:
field($model, 'sorting')->dropDownList(['убыванию', 'возрастанию'])->label(false); ?>
+
+
+
+
+ 'btn btn-primary btn-sm']) ?> +
+
+ + +
+ +
+ + + + + + + + + + + + + + + + + +
ИмяПродажиСреднее по продажам
+
+
+ + \ No newline at end of file -- 2.39.5