From 0e4ac31131d52561ffdc8726d0d22b3b76b7c473 Mon Sep 17 00:00:00 2001 From: Vladimir Fomichev Date: Thu, 23 Oct 2025 17:24:45 +0300 Subject: [PATCH] =?utf8?q?=D0=AD=D0=BA=D1=88=D0=BD=20=D0=BA=D0=BE=D0=BD?= =?utf8?q?=D1=82=D1=80=D0=BE=D0=BB=D0=BB=D0=B5=D1=80=D0=B0=20=D0=BF=D1=80?= =?utf8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../actions/dashboard/CheckMismatchAction.php | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 erp24/actions/dashboard/CheckMismatchAction.php diff --git a/erp24/actions/dashboard/CheckMismatchAction.php b/erp24/actions/dashboard/CheckMismatchAction.php new file mode 100644 index 00000000..fd0af48e --- /dev/null +++ b/erp24/actions/dashboard/CheckMismatchAction.php @@ -0,0 +1,135 @@ +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; + } +} -- 2.39.5