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