]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Экшн контроллера проверки origin/feature_fomichev_erp-20251022_check_filter_dashboard
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 23 Oct 2025 14:24:45 +0000 (17:24 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 23 Oct 2025 14:24:45 +0000 (17:24 +0300)
erp24/actions/dashboard/CheckMismatchAction.php [new file with mode: 0644]

diff --git a/erp24/actions/dashboard/CheckMismatchAction.php b/erp24/actions/dashboard/CheckMismatchAction.php
new file mode 100644 (file)
index 0000000..fd0af48
--- /dev/null
@@ -0,0 +1,135 @@
+<?php
+declare(strict_types = 1);
+
+namespace yii_app\actions\dashboard;
+
+use Yii;
+use yii\base\Action;
+use yii_app\records\CreateChecks;
+use yii_app\records\Sales;
+use yii_app\records\CityStore;
+
+class CheckMismatchAction extends Action
+{
+    public function run()
+    {
+        $uploadedData = null;
+        $mismatchedChecks = [];
+        $availableDates = [];
+
+        if (Yii::$app->request->isPost && isset($_FILES['jsonFile'])) {
+            $uploadFile = $_FILES['jsonFile'];
+            
+            if ($uploadFile['error'] === UPLOAD_ERR_OK) {
+                $fileContent = file_get_contents($uploadFile['tmp_name']);
+                $uploadedData = json_decode($fileContent, true);
+
+                if ($uploadedData && isset($uploadedData['checks'])) {
+                    $mismatchedChecks = $this->analyzeChecks($uploadedData['checks']);
+                    $availableDates = $this->extractDatesFromChecks($uploadedData['checks']);
+                }
+            }
+        }
+
+        return $this->controller->render('/dashboard/check-mismatch', [
+            'uploadedData' => $uploadedData,
+            'mismatchedChecks' => $mismatchedChecks,
+            'availableDates' => $availableDates,
+            'storeGuidNames' => CityStore::getAllActiveGuidName(),
+        ]);
+    }
+
+    /**
+     * Анализирует чеки из загруженного файла и находит несовпадения
+     */
+    private function analyzeChecks(array $checks): array
+    {
+        $mismatches = [];
+
+        foreach ($checks as $check) {
+            // Пропускаем чеки без order_id
+            if (empty($check['order_id'])) {
+                continue;
+            }
+
+            $checkId = $check['id'] ?? null;
+            $orderId = $check['order_id'];
+            $checkDate = $check['date'] ?? null;
+            $storeId = $check['store_id'] ?? null;
+
+            if (!$checkId || !$checkDate) {
+                continue;
+            }
+
+            // Ищем запись в таблице CreateChecks
+            $createCheck = CreateChecks::findOne([
+                'check_id' => $checkId,
+                'order_id' => (int)$orderId,
+            ]);
+
+            if ($createCheck) {
+                // Ищем продажу в таблице Sales
+                $sales = Sales::find()
+                    ->where(['order_id' => $orderId])
+                    ->andWhere(['not', ['date' => null]])
+                    ->all();
+
+                foreach ($sales as $sale) {
+                    // Проверяем, что все даты валидны
+                    if (!$sale->date || !$createCheck->date) {
+                        continue;
+                    }
+
+                    try {
+                        $salesDate = date('Y-m-d', strtotime($sale->date));
+                        $createCheckDate = date('Y-m-d', strtotime($createCheck->date));
+                        $checkDateFormatted = date('Y-m-d', strtotime($checkDate));
+                    } catch (\Exception $e) {
+                        // Пропускаем если ошибка при парсинге даты
+                        continue;
+                    }
+
+                    // Если дата чека и дата продажи не совпадают
+                    if ($createCheckDate !== $salesDate) {
+                        $mismatches[] = [
+                            'check_id' => $checkId,
+                            'order_id' => $orderId,
+                            'store_id' => $storeId,
+                            'check_date' => $checkDate,
+                            'create_check_date' => $createCheck->date,
+                            'sales_date' => $sale->date,
+                            'check_date_formatted' => $checkDateFormatted,
+                            'create_check_date_formatted' => $createCheckDate,
+                            'sales_date_formatted' => $salesDate,
+                            'check_type' => $check['type'] ?? '',
+                            'check_status' => $check['status'] ?? '',
+                            'check_number' => $check['check_number'] ?? '',
+                        ];
+                    }
+                }
+            }
+        }
+
+        return $mismatches;
+    }
+
+    /**
+     * Извлекает все уникальные даты из чеков
+     */
+    private function extractDatesFromChecks(array $checks): array
+    {
+        $dates = [];
+
+        foreach ($checks as $check) {
+            if (isset($check['date'])) {
+                $date = date('Y-m-d', strtotime($check['date']));
+                if (!in_array($date, $dates)) {
+                    $dates[] = $date;
+                }
+            }
+        }
+
+        sort($dates);
+        return $dates;
+    }
+}