From 31470c6290679962445892d9213a161c3432c6d8 Mon Sep 17 00:00:00 2001 From: Vladimir Fomichev Date: Tue, 27 Jan 2026 12:17:24 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?utf8?q?=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/api2/controllers/DataController.php | 20 ++----- erp24/config/console.php | 2 +- erp24/config/params.php | 4 +- erp24/config/web.php | 2 +- erp24/services/MarketplaceService.php | 58 +++++++++++++++++++ erp24/services/OrderControlReportService.php | 6 +- erp24/services/UploadService.php | 20 ++----- ...erControlReportServiceNotificationTest.php | 8 +-- 8 files changed, 77 insertions(+), 43 deletions(-) diff --git a/erp24/api2/controllers/DataController.php b/erp24/api2/controllers/DataController.php index 05aee52c..a21d3069 100644 --- a/erp24/api2/controllers/DataController.php +++ b/erp24/api2/controllers/DataController.php @@ -1605,27 +1605,15 @@ class DataController extends BaseController } if (in_array($statusId1C->status_id, $statuses1cWithCancelledId)) { $marketplaceOrder->cancelled_order_source = '1c'; - $marketplaceOrder->cancelled_order_date = date('Y-m-d H:m:s'); + $marketplaceOrder->cancelled_order_date = date('Y-m-d H:i:s'); } - $incomingSellerId = $mpOrder['seller_id'] ?? null; - $emptyGuid = '00000000-0000-0000-0000-000000000000'; - $isSellerIdEmpty = empty($incomingSellerId) || $incomingSellerId === $emptyGuid; - $isCheckGuidEmpty = empty($marketplaceOrder->check_guid); - $successfulOrderIds = MarketplaceOrder1cStatuses::getSuccessfulOrderIds(); - - // Не устанавливаем статус "Успех" без seller_id или без check_guid - if (in_array($statusId1C->id, $successfulOrderIds) && ($isSellerIdEmpty || $isCheckGuidEmpty)) { - Yii::warning( - "Статус 'Успех' (ID: {$statusId1C->id}) без seller_id или check_guid для заказа {$mpOrder['id']}. " . - "seller_id: " . ($incomingSellerId ?? 'null') . ", check_guid: " . ($marketplaceOrder->check_guid ?? 'null'), - 'marketplace-status' - ); - } else { + // Проверяем, можно ли установить статус "Успех" (seller_id и check_guid должны быть заполнены) + if (MarketplaceService::canSetSuccessStatus($statusId1C, $mpOrder, $marketplaceOrder)) { $marketplaceOrder->status_processing_1c = $statusId1C->id; } - $marketplaceOrder->seller_id = $isSellerIdEmpty ? null : $incomingSellerId; + $marketplaceOrder->seller_id = MarketplaceService::normalizeSellerId($mpOrder['seller_id'] ?? null); $marketplaceOrder->number_1c = $mpOrder['number'] ?? null; diff --git a/erp24/config/console.php b/erp24/config/console.php index e5a0fd27..05410b6f 100755 --- a/erp24/config/console.php +++ b/erp24/config/console.php @@ -66,7 +66,7 @@ $config = [ 'dsn' => sprintf( '%s://%s:%s@%s:%d', getenv('MAIL_SCHEME') ?: 'smtps', - rawurlencode(getenv('MAIL_USERNAME') ?: 'flow@bazacvetov24.ru'), + rawurlencode(getenv('MAIL_USERNAME') ?: 'noreply@localhost'), rawurlencode(getenv('MAIL_PASSWORD') ?: ''), getenv('MAIL_HOST') ?: 'smtp.yandex.ru', (int)(getenv('MAIL_PORT') ?: 465) diff --git a/erp24/config/params.php b/erp24/config/params.php index 8775208b..cd1836fb 100644 --- a/erp24/config/params.php +++ b/erp24/config/params.php @@ -40,8 +40,8 @@ return [ 'telegram_max_message_length' => 4000, // Telegram: chat_id канала (получить через @userinfobot или API после вступления бота в канал) // Канал по ТЗ: https://t.me/+wHh_lW83AvVlYWNi - 'telegram_chat_id_dev' => getenv('TELEGRAM_ORDER_CONTROL_CHAT_ID_DEV') ?: '-1001861631125', - 'telegram_chat_id_prod' => getenv('TELEGRAM_ORDER_CONTROL_CHAT_ID_PROD') ?: '4886272326', + 'telegram_chat_id_dev' => getenv('TELEGRAM_ORDER_CONTROL_CHAT_ID_DEV') ?: '', + 'telegram_chat_id_prod' => getenv('TELEGRAM_ORDER_CONTROL_CHAT_ID_PROD') ?: '', // Email получатели по ТЗ 'email_recipients_test' => array_filter(explode(',', getenv('ORDER_CONTROL_EMAIL_RECIPIENTS_TEST') ?: 'vladimir.fomichev@erp-flowers.ru,aleksey.filippov@erp-flowers.ru')), 'email_recipients' => array_filter(explode(',', getenv('ORDER_CONTROL_EMAIL_RECIPIENTS') ?: 'ekaterina.geldak@bazacvetov24.ru,irina.rogacheva@bazacvetov24.ru,alena.chelyshkina@bazacvetov24.ru')), diff --git a/erp24/config/web.php b/erp24/config/web.php index 24c2c0ea..1db20443 100644 --- a/erp24/config/web.php +++ b/erp24/config/web.php @@ -79,7 +79,7 @@ $config = [ 'dsn' => sprintf( '%s://%s:%s@%s:%d', getenv('MAIL_SCHEME') ?: 'smtps', - rawurlencode(getenv('MAIL_USERNAME') ?: 'flow@bazacvetov24.ru'), + rawurlencode(getenv('MAIL_USERNAME') ?: 'noreply@localhost'), rawurlencode(getenv('MAIL_PASSWORD') ?: ''), getenv('MAIL_HOST') ?: 'smtp.yandex.ru', (int)(getenv('MAIL_PORT') ?: 465) diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index 68880aef..8760b59d 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -3260,5 +3260,63 @@ class MarketplaceService return false; } + /** + * Проверяет, можно ли установить статус "Успех" для заказа маркетплейса + * + * Статус "Успех" не должен устанавливаться, если: + * - seller_id отсутствует, пустой или содержит нулевой GUID + * - check_guid заказа отсутствует + * + * @param MarketplaceOrder1cStatuses $statusId1C Статус 1С, который пытаемся установить + * @param array $mpOrder Данные заказа из 1С (должен содержать ключ 'seller_id') + * @param MarketplaceOrders $marketplaceOrder Запись заказа маркетплейса + * @return bool true — статус можно устанавливать, false — заблокирован (seller_id/check_guid отсутствует) + */ + public static function canSetSuccessStatus( + MarketplaceOrder1cStatuses $statusId1C, + array $mpOrder, + MarketplaceOrders $marketplaceOrder + ): bool { + $emptyGuid = '00000000-0000-0000-0000-000000000000'; + $successfulOrderIds = MarketplaceOrder1cStatuses::getSuccessfulOrderIds(); + + if (!in_array($statusId1C->id, $successfulOrderIds)) { + return true; + } + + $incomingSellerId = $mpOrder['seller_id'] ?? null; + $isSellerIdEmpty = empty($incomingSellerId) || $incomingSellerId === $emptyGuid; + $isCheckGuidEmpty = empty($marketplaceOrder->check_guid); + if ($isSellerIdEmpty || $isCheckGuidEmpty) { + Yii::warning( + "Статус 'Успех' (ID: {$statusId1C->id}) без seller_id или check_guid для заказа {$mpOrder['id']}. " . + "seller_id: " . ($incomingSellerId ?? 'null') . ", check_guid: " . ($marketplaceOrder->check_guid ?? 'null'), + 'marketplace-status' + ); + return false; + } + + return true; + } + + /** + * Нормализует seller_id из данных 1С + * + * Возвращает null если seller_id пустой или содержит нулевой GUID, + * иначе возвращает оригинальное значение. + * + * @param string|null $sellerId Значение seller_id из данных 1С + * @return string|null Нормализованный seller_id или null + */ + public static function normalizeSellerId(?string $sellerId): ?string + { + $emptyGuid = '00000000-0000-0000-0000-000000000000'; + + if (empty($sellerId) || $sellerId === $emptyGuid) { + return null; + } + + return $sellerId; + } } diff --git a/erp24/services/OrderControlReportService.php b/erp24/services/OrderControlReportService.php index 72726c80..967b8e78 100644 --- a/erp24/services/OrderControlReportService.php +++ b/erp24/services/OrderControlReportService.php @@ -66,7 +66,7 @@ class OrderControlReportService /** * Режим асинхронной отправки: использовать Job-очередь вместо блокирующего sleep() */ - private bool $asyncMode = true; + private bool $asyncMode = false; /** * Уникальный идентификатор отчёта (для логирования и отслеживания Job-ов) @@ -1310,7 +1310,7 @@ class OrderControlReportService ->setHtmlBody($html); // Устанавливаем отправителя, если настроен - $fromEmail = getenv('MAIL_USERNAME') ?: 'flow@bazacvetov24.ru'; + $fromEmail = getenv('MAIL_USERNAME') ?: 'noreply@localhost'; $message->setFrom([$fromEmail => 'ERP24 Контроль МП']); $sent = $message->send(); @@ -1359,7 +1359,7 @@ class OrderControlReportService private function sendToEmailAsync(string $html, array $recipients): bool { $subject = $this->config['email_subject'] ?? 'Контроль статусов заказов МП'; - $fromEmail = getenv('MAIL_USERNAME') ?: 'flow@bazacvetov24.ru'; + $fromEmail = getenv('MAIL_USERNAME') ?: 'noreply@localhost'; // Формируем DSN для Symfony Mailer $mailerDsn = $this->buildMailerDsn(); diff --git a/erp24/services/UploadService.php b/erp24/services/UploadService.php index f827e4c5..44c76f23 100644 --- a/erp24/services/UploadService.php +++ b/erp24/services/UploadService.php @@ -2372,27 +2372,15 @@ class UploadService { } if (in_array($statusId1C->status_id, $statuses1cWithCancelledId)) { $marketplaceOrder->cancelled_order_source = '1c'; - $marketplaceOrder->cancelled_order_date = date('Y-m-d H:m:s'); + $marketplaceOrder->cancelled_order_date = date('Y-m-d H:i:s'); } - $incomingSellerId = $mpOrder['seller_id'] ?? null; - $emptyGuid = '00000000-0000-0000-0000-000000000000'; - $isSellerIdEmpty = empty($incomingSellerId) || $incomingSellerId === $emptyGuid; - $isCheckGuidEmpty = empty($marketplaceOrder->check_guid); - $successfulOrderIds = MarketplaceOrder1cStatuses::getSuccessfulOrderIds(); - - // Не устанавливаем статус "Успех" без seller_id или без check_guid - if (in_array($statusId1C->id, $successfulOrderIds) && ($isSellerIdEmpty || $isCheckGuidEmpty)) { - Yii::warning( - "Статус 'Успех' (ID: {$statusId1C->id}) без seller_id или check_guid для заказа {$mpOrder['id']}. " . - "seller_id: " . ($incomingSellerId ?? 'null') . ", check_guid: " . ($marketplaceOrder->check_guid ?? 'null'), - 'marketplace-status' - ); - } else { + // Проверяем, можно ли установить статус "Успех" (seller_id и check_guid должны быть заполнены) + if (MarketplaceService::canSetSuccessStatus($statusId1C, $mpOrder, $marketplaceOrder)) { $marketplaceOrder->status_processing_1c = $statusId1C->id; } - $marketplaceOrder->seller_id = $isSellerIdEmpty ? null : $incomingSellerId; + $marketplaceOrder->seller_id = MarketplaceService::normalizeSellerId($mpOrder['seller_id'] ?? null); $marketplaceOrder->number_1c = $mpOrder['number'] ?? null; diff --git a/erp24/tests/unit/services/OrderControlReportServiceNotificationTest.php b/erp24/tests/unit/services/OrderControlReportServiceNotificationTest.php index 96c7dcd7..20308bd1 100644 --- a/erp24/tests/unit/services/OrderControlReportServiceNotificationTest.php +++ b/erp24/tests/unit/services/OrderControlReportServiceNotificationTest.php @@ -514,10 +514,10 @@ class OrderControlReportServiceNotificationTest extends Unit public function testEmailSenderFromConfiguration(): void { // Из кода OrderControlReportService::sendToEmail(): - // $fromEmail = getenv('MAIL_USERNAME') ?: 'flow@bazacvetov24.ru'; + // $fromEmail = getenv('MAIL_USERNAME') ?: 'noreply@localhost'; // $message->setFrom([$fromEmail => 'ERP24 Контроль МП']); - $expectedDefaultSender = 'flow@bazacvetov24.ru'; + $expectedDefaultSender = 'noreply@localhost'; $expectedSenderName = 'ERP24 Контроль МП'; $this->assertNotEmpty($expectedDefaultSender); @@ -596,7 +596,7 @@ class OrderControlReportServiceNotificationTest extends Unit // $message->setFrom([$fromEmail => 'ERP24 Контроль МП']); $expectedSubject = 'Контроль статусов заказов МП'; - $expectedFromEmail = 'flow@bazacvetov24.ru'; + $expectedFromEmail = 'noreply@localhost'; $expectedFromName = 'ERP24 Контроль МП'; $expectedRecipients = ['test@example.com']; @@ -644,7 +644,7 @@ class OrderControlReportServiceNotificationTest extends Unit $recipients = $recipientsMethod->invoke($this->service); // Получаем информацию об отправителе Email - $fromEmail = getenv('MAIL_USERNAME') ?: 'flow@bazacvetov24.ru'; + $fromEmail = getenv('MAIL_USERNAME') ?: 'noreply@localhost'; $fromName = 'ERP24 Контроль МП'; // Определяем окружение -- 2.39.5