From e55a4cafcc6476fcd7ae373d53a33fa40b350c1b Mon Sep 17 00:00:00 2001 From: root Date: Fri, 3 Jul 2026 12:18:28 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20manual=5Fcampaign=20EXISTS=20check=20?= =?UTF-8?q?=E2=80=94=20no=20manual=5Frequired=20without=20SMS=20sent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Scenario 3 (link_ready + next_check expired) now requires EXISTS in sms_campaign_log. Prevents groups from being moved to manual_required before first SMS is ever sent. --- scripts/sms_manual_campaign.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/sms_manual_campaign.py b/scripts/sms_manual_campaign.py index 6a30f97..446fafe 100644 --- a/scripts/sms_manual_campaign.py +++ b/scripts/sms_manual_campaign.py @@ -123,9 +123,16 @@ def get_groups_to_manual(conn): AND (og.next_notification_check_at IS NULL OR og.next_notification_check_at <= NOW()) AND og.first_sms_sent_at < NOW() - INTERVAL '3 hours' AND og.second_sms_sent_at IS NOT NULL) - -- 3. link_ready + next_check в прошлом + нет активных SMS в логе + -- 3. link_ready + next_check в прошлом + SMS уже отправлялась хотя бы раз + -- ВАЖНО: если SMS никогда не отправлялась (нет записи в логе), не переводить в manual -- + -- возможно first campaign ещё не успел отправить (БД была недоступна и т.п.) OR (COALESCE(og.notification_status, '') = 'link_ready' AND (og.next_notification_check_at IS NULL OR og.next_notification_check_at <= NOW()) + AND EXISTS ( + SELECT 1 FROM sms_campaign_log scl + WHERE scl.order_group_id = og.id + AND scl.status IN ('sent', 'checking', 'delivered') + ) AND NOT EXISTS ( SELECT 1 FROM sms_campaign_log scl WHERE scl.order_group_id = og.id