]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
add sale summ per employee with view
authorAlexander Smirnov <fredeom@mail.ru>
Thu, 30 May 2024 13:35:57 +0000 (16:35 +0300)
committerAlexander Smirnov <fredeom@mail.ru>
Thu, 30 May 2024 13:35:57 +0000 (16:35 +0300)
erp24/controllers/EmployeeSalesReportController.php [new file with mode: 0644]
erp24/views/employee-sales-report/index.php [new file with mode: 0644]

diff --git a/erp24/controllers/EmployeeSalesReportController.php b/erp24/controllers/EmployeeSalesReportController.php
new file mode 100644 (file)
index 0000000..abd758c
--- /dev/null
@@ -0,0 +1,101 @@
+<?php
+
+namespace app\controllers;
+
+use Yii;
+use yii\base\DynamicModel;
+use yii\helpers\ArrayHelper;
+use yii\web\Controller;
+use yii_app\records\Admin;
+use yii_app\records\CityStore;
+use yii_app\records\Sales;
+use yii_app\records\StoreDynamic;
+
+class EmployeeSalesReportController extends Controller {
+    public function actionIndex() {
+
+        $model = DynamicModel::validateData([
+            'scope' => 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 (file)
index 0000000..75d5406
--- /dev/null
@@ -0,0 +1,98 @@
+<?php
+
+use yii\helpers\Html;
+use yii\widgets\ActiveForm;
+use yii\base\DynamicModel;
+
+use dosamigos\datetimepicker\DateTimePicker;
+
+/** @var $model DynamicModel */
+/** @var $clusters array */
+/** @var $stores array */
+/** @var $admins array */
+/** @var $adminIds array */
+/** @var $paymentsPerAdmin array */
+/** @var $paymentsCntPerAdmin array */
+
+?>
+
+<div class="employeeSalesReport m-5">
+    <h1>Отчёт по продажам сотрудников</h1>
+    <?php $form = ActiveForm::begin(['method' => 'GET', 'action' => 'index']) ?>
+
+    <div class="row">
+        <div class="col-1">
+            <?= $form->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) ?>
+        </div>
+        <div class="col-9">
+            <span id="chooseBranch">
+                Куст: <div style="display: inline-block"><?= $form->field($model, 'cluster_ind')->dropDownList($clusters)->label(false); ?></div>
+            </span>
+            <span id="chooseStore">
+                Магазин: <div style="display: inline-block"><?= $form->field($model, 'store_id')->dropDownList($stores)->label(false); ?></div>
+            </span>
+            Смена: <div style="display: inline-block"><?= $form->field($model, 'shift')->dropDownList(['Обе', 'Дневная', 'Ночная'])->label(false); ?></div>
+            Дата с: <div style="display: inline-block"><?= $form->field($model, 'date_start')->widget(DateTimePicker::class, [
+                    'language' => 'ru',
+                    'template' => '{input}',
+                    'clientOptions' => [
+                        'autoclose' => true,
+                        'format' => 'Y-m-d',
+                        'todayBtn' => true
+                    ],
+                ])->label(false) ?></div>
+            по: <div style="display: inline-block"><?= $form->field($model, 'date_end')->widget(DateTimePicker::class, [
+                    'language' => 'ru',
+                    'template' => '{input}',
+                    'clientOptions' => [
+                        'autoclose' => true,
+                        'format' => 'Y-m-d',
+                        'todayBtn' => true
+                    ],
+                ])->label(false) ?></div>
+            Сортировка по: <div style="display: inline-block"><?= $form->field($model, 'sorting')->dropDownList(['убыванию', 'возрастанию'])->label(false); ?></div>
+        </div>
+    </div>
+    <div class="row">
+        <div class="col-2">
+            <?= Html::submitButton('Применить', ['class' => 'btn btn-primary btn-sm']) ?>
+        </div>
+    </div>
+    <?php ActiveForm::end(); ?>
+
+    <div class="row m-5"></div>
+
+    <div style="max-width: 400px">
+    <table class="row-border stripe">
+        <thead>
+            <tr>
+                <th>Имя</th>
+                <th style="width: 100px; text-align: right">Продажи</th>
+                <th style="width: 200px; text-align: right">Среднее по продажам</th>
+            </tr>
+        </thead>
+        <tbody>
+            <?php foreach ($adminIds as $adminId): ?>
+            <tr>
+                <td><?= $admins[$adminId] ?></td>
+                <td style="text-align: right;"><?= number_format($paymentsPerAdmin[$adminId], 0, '', ' ') ?></td>
+                <td style="text-align: right;"><?= number_format($paymentsPerAdmin[$adminId] / $paymentsCntPerAdmin[$adminId], 0, '',' ') ?></td>
+            </tr>
+            <?php endforeach; ?>
+        </tbody>
+    </table>
+    </div>
+</div>
+
+<script>
+    $(document).ready(() => {
+        $("#chooseScope").trigger('change');
+        $("table").DataTable({
+            sorting: false,
+            info: false,
+            paging: false,
+            searching: true,
+            language: data_table_language
+        });
+    });
+</script>
\ No newline at end of file