--- /dev/null
+<?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
--- /dev/null
+<?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