--- /dev/null
+<?php
+
+namespace yii_app\actions\motivation;
+
+use Yii;
+use yii\base\Action;
+use yii\base\DynamicModel;
+use yii\helpers\ArrayHelper;
+use yii_app\records\CityStore;
+use yii_app\records\Motivation;
+use yii_app\services\MotivationService;
+
+class TestSelfCostAction extends Action
+{
+ public function run() {
+
+ $stores = CityStore::find()
+ ->select(['id', 'name'])
+ ->where(['visible' => 1])
+ ->asArray()
+ ->all();
+
+ $storeList = ArrayHelper::map($stores, 'id', 'name');
+
+ // Создаем модель формы
+ $model = new DynamicModel(['startDate', 'endDate', 'storeId']);
+ $model->addRule(['startDate', 'endDate'], 'date', ['format' => 'php:Y-m-d'])
+ ->addRule(['storeId'], 'integer');
+
+ // Загружаем данные из GET-параметров
+ if ($model->load(Yii::$app->request->get()) && $model->validate()) {
+ $startDate = $model->startDate;
+ $endDate = $model->endDate;
+ $storeId = $model->storeId;
+ } else {
+ $startDate = '';
+ $endDate = '';
+ $storeId = '';
+ }
+
+ $data = [];
+ $totalSum = 0.0;
+
+ if ($startDate && $endDate && $storeId) {
+ $totalSum = MotivationService::getSelfCostSumByStore($startDate, $endDate, $storeId);
+
+ // Получаем данные о продуктах и себестоимости
+ $salesProducts = MotivationService::getSalesProductsDetails($startDate, $endDate, $storeId);
+ $data = $salesProducts;
+ }
+
+ return $this->controller->render('test-self-cost', [
+ 'storeList' => $storeList,
+ 'model' => $model,
+ 'data' => $data,
+ 'totalSum' => $totalSum,
+ ]);
+ }
+}
\ No newline at end of file
return $totalSum;
}
+
+ /**
+ * Получение информации о продуктах и их себестоимости по магазину за определенный промежуток дат.
+ *
+ * @param string $startDate Дата начала периода (формат Y-m-d).
+ * @param string $endDate Дата конца периода (формат Y-m-d).
+ * @param int $storeId ID магазина.
+ * @return array Массив с данными о товарах, их себестоимости и дате.
+ */
+ public static function getSalesProductsDetails($startDate, $endDate, $storeId)
+ {
+ $storeId = (int)$storeId;
+ $startDate = date('Y-m-d', strtotime($startDate));
+ $endDate = date('Y-m-d 23:59:59', strtotime($endDate));
+
+ // Находим все продажи за указанный период
+ $salesRecords = Sales::find()
+ ->select(['id', 'date'])
+ ->where(['store_id' => $storeId, 'operation' => Sales::OPERATION_SALE])
+ ->andWhere(['>=', 'date', $startDate])
+ ->andWhere(['<=', 'date', $endDate])
+ ->asArray()
+ ->all();
+
+ $endDatePlusThreeWeeks = date('Y-m-d 23:59:59', strtotime($endDate . ' +3 weeks'));
+
+ // Находим возвраты за указанный период + 3 недели
+ $returnedSales = Sales::find()
+ ->select(['sales_check'])
+ ->where(['store_id' => $storeId, 'operation' => Sales::OPERATION_RETURN])
+ ->andWhere(['>=', 'date', $startDate])
+ ->andWhere(['<=', 'date', $endDatePlusThreeWeeks])
+ ->andWhere(['is not', 'sales_check', null])
+ ->asArray()
+ ->all();
+
+ $returnedSalesIds = array_column($returnedSales, 'sales_check');
+
+ // Фильтруем продажи, исключая возвраты
+ $salesRecords = array_filter($salesRecords, function($sale) use ($returnedSalesIds) {
+ return !in_array($sale['id'], $returnedSalesIds);
+ });
+
+ if (empty($salesRecords)) {
+ return [];
+ }
+
+ $salesIds = array_column($salesRecords, 'id');
+ $saleDates = array_column($salesRecords, 'date', 'id');
+
+ // Находим товары, проданные в выбранных продажах
+ $salesProducts = SalesProducts::find()
+ ->select(['check_id', 'product_id', 'quantity'])
+ ->where(['check_id' => $salesIds])
+ ->asArray()
+ ->all();
+
+ $productIds = array_unique(array_column($salesProducts, 'product_id'));
+ $selfCosts = SelfCostProduct::find()
+ ->select(['product_guid', 'price', 'date'])
+ ->where(['store_id' => $storeId, 'product_guid' => $productIds])
+ ->andWhere(['date' => array_map(fn($date) => date('Y-m-d', strtotime($date)), $saleDates)])
+ ->asArray()
+ ->all();
+
+ $selfCostsMap = [];
+ foreach ($selfCosts as $cost) {
+ $selfCostsMap[$cost['product_guid']][$cost['date']] = $cost['price'];
+ }
+
+ // Находим имена продуктов
+ $products = Products1c::find()
+ ->select(['id', 'name'])
+ ->where(['id' => $productIds])
+ ->asArray()
+ ->all();
+
+ $productNamesMap = ArrayHelper::map($products, 'id', 'name');
+
+ $result = [];
+
+ foreach ($salesProducts as $product) {
+ $productId = $product['product_id'];
+ $quantity = (float)$product['quantity'];
+ $checkDate = date('Y-m-d', strtotime($saleDates[$product['check_id']]));
+
+ $price = $selfCostsMap[$productId][$checkDate] ?? 0.0;
+
+ $result[] = [
+ 'product_id' => $productId,
+ 'product_name' => $productNamesMap[$productId] ?? 'Неизвестный товар',
+ 'price' => $price,
+ 'date' => $checkDate,
+ ];
+ }
+
+ return $result;
+ }
+
+
public static function getCostConsumablesSalesSupportByStore($startDate, $endDate, $storeId) {
$exportImportTable = ExportImportTable::find()->select(['export_val'])->where(['entity' => 'city_store', 'entity_id' => $storeId, 'export_id' => 1])->one();
--- /dev/null
+<?php
+use yii\helpers\Html;
+use yii\widgets\ActiveForm;
+use kartik\select2\Select2;
+
+/* @var $this yii\web\View */
+/* @var $storeList array */
+/* @var $model \yii\base\DynamicModel */
+/* @var $data array */
+/* @var $totalSum float */
+
+$this->title = 'Себестоимость товаров по магазинам';
+?>
+
+<div class="motivation-index">
+ <h1><?= Html::encode($this->title) ?></h1>
+
+ <div class="search-form col-4">
+ <?php $form = ActiveForm::begin(['action' => ['motivation/test-selfcost'], 'method' => 'get']); ?>
+
+ <?= $form->field($model, 'startDate')->input('date') ?>
+
+ <?= $form->field($model, 'endDate')->input('date') ?>
+
+ <?= $form->field($model, 'storeId')->widget(Select2::classname(), [
+ 'data' => $storeList,
+ 'options' => ['placeholder' => 'Выберите магазин'],
+ 'pluginOptions' => [
+ 'allowClear' => true,
+ ],
+ ]); ?>
+
+ <div class="form-group">
+ <?= Html::submitButton('Показать', ['class' => 'btn btn-primary']) ?>
+ </div>
+
+ <?php ActiveForm::end(); ?>
+ </div>
+
+ <?php if (!empty($data)): ?>
+ <h2>Результаты</h2>
+ <table class="table table-bordered">
+ <thead>
+ <tr>
+ <th>ID товара</th>
+ <th>Название</th>
+ <th>Цена</th>
+ <th>Дата</th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($data as $item): ?>
+ <tr>
+ <td><?= Html::encode($item['product_id']) ?></td>
+ <td><?= Html::encode($item['product_name']) ?></td>
+ <td><?= Html::encode($item['price']) ?></td>
+ <td><?= Html::encode($item['date']) ?></td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+ <h3>Общая стоимость: <?= Html::encode($totalSum) ?></h3>
+ <?php endif; ?>
+</div>
\ No newline at end of file