5b04d751c0
Сессия 4 плана docs/superpowers/plans/2026-07-27-client-telegram-ads-module.md. Всё в песочнице (TG_SANDBOX): деньги/живой запуск выключены; робот в тестах замокан. 4.1 Авто-режим (пачка): - Таблица client_tg_auto_rule (правило: объявление + budget_cap на пачку, одно на тенанта, RLS). - TelegramAutoAccumulator: копит номера новых лидов в один открытый авто-черновик (audience_kind=list, created_by IS NULL); при наборе пачки (порог client_tg.auto_batch_threshold, по умолчанию 367 кандидатов) доводит смету, ставит кампанию в очередь В РАМКАХ budget_cap_rub и ставит RunTelegramCampaignJob. Ниже порога — только копим. Дедуп номеров на входе. Отличие от СМС-близнеца: СМС шлёт по одной на лид, Telegram копит ПАЧКУ (МТС показывает базе). 4.2 Защитный observer: - DealTelegramObserver на created: freshness-guard (сутки) → ставит AccumulateTelegramLeadJob. 🔴 try/catch(Throwable) НИКОГДА не роняет приём лида (регресс DealCreateTest 10/10 зелёный). - Приёма-джоб уводит работу с роли приёмщика (crm_supplier_worker, без GRANT на auto_rule) на очередь (crm_app_user) с tenant-контекстом — иначе на проде был бы «тихий ноль». ПДн: телефон в payload не кладём, перечитываем по deal_id. Зеркало DealSmsObserver + SendAutoSmsForDealJob. 4.3 Своё имя/бренд + помесячная оплата: - Таблица client_tg_senders (одно имя на тенанта, RLS; app_user S/I/U, supplier S, admin S/U). - TelegramSenderService — жизненный цикл: клиент requestSender (заявка+бронь месячной платы) / disableSender; админ approve (списание+снятие брони+paid_until +1мес) / reject / disableByAdmin. - ChargeTgNameFeeJob (ежедневно 05:10 МСК, routes/console.php): помесячное списание, проверка free≥cost ДО списания, идемпотентно по периоду (external_key), долг > grace (29д) → suspended, кросс-тенантно через pgsql_supplier, деньги под SET LOCAL. В песочнице деньги не двигаются. Лёгкое зеркало client_sms_senders + ChargeSmsNameFeeJob (без документов/операторов — согласование в Телеграме уточняется живой разведкой §8 спеки; здесь фиксируем денежный цикл). 4.4 Админ-тарифы/настройки: - Api\Admin\TgTariffController (GET/PUT /api/admin/telegram/tariffs|settings) под saas-admin,admin-db. - Фронт: api/admin.ts (fetchTgTariffs/updateTgTariffs/updateTgSettings), AdminTgView.vue (правка ступеней + плата за имя/грейс), маршрут /admin/telegram. Зеркало AdminSmsView (без секции имён). Проверки: 89/89 Pest ClientTg зелёные (+37 новых), регресс DealCreateTest 10/10, Vitest зелёный (+4 admin-tg-view), phpstan 0 по своему коду (level 5), pint чисто, deptrac 0 нарушений. rls-reviewer: PASS по обеим новым таблицам (client_tg_auto_rule, client_tg_senders). CHANGELOG_schema v8.87 + напоминание ПЕРЕзапустить db/03_service_bypass_policies.sql на кластере (Сессия 6). Робот в тестах замокан (кабинет МТС не тронут). Синтетические номера 7999… — реальных нет. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
42 lines
2.3 KiB
PHP
42 lines
2.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
return [
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Песочница Telegram-рекламы
|
|
|--------------------------------------------------------------------------
|
|
| По умолчанию ВКЛ (true) — робот доводит кампанию только до черновика
|
|
| (mode:'draft'), деньги не списываются, «запустить/оплатить» не жмётся.
|
|
| Живой режим (mode:'live' + списание) открывается ОСОЗНАННО (Сессия 6)
|
|
| выставлением TG_SANDBOX=false после проверки в песочнице.
|
|
*/
|
|
'sandbox' => filter_var(env('TG_SANDBOX', true), FILTER_VALIDATE_BOOL),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Порог авто-пачки
|
|
|--------------------------------------------------------------------------
|
|
| Авто-режим копит новых лидов и запускает кампанию, когда наберётся столько
|
|
| кандидатов (МТС показывает рекламу базе, а не по одному номеру). Минимальная
|
|
| осмысленная пачка у МТС Маркетолог — 367 (спека §5).
|
|
*/
|
|
'auto_batch_threshold' => (int) env('TG_AUTO_BATCH', 367),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Node-робот кабинета МТС (bots/mts-telegram-ads)
|
|
|--------------------------------------------------------------------------
|
|
| У МТС нет API — кампанию доводит браузер-робот. TelegramRobotRunner
|
|
| запускает `node <script> --task <file>` в каталоге <cwd>. Воркер этой
|
|
| очереди живёт на Windows-машине с живой сессией МТС (профиль браузера).
|
|
*/
|
|
'robot' => [
|
|
'node' => env('TG_ROBOT_NODE', 'node'),
|
|
'script' => env('TG_ROBOT_SCRIPT', base_path('bots/mts-telegram-ads/bin/run.js')),
|
|
'cwd' => env('TG_ROBOT_CWD', base_path('bots/mts-telegram-ads')),
|
|
'timeout' => (int) env('TG_ROBOT_TIMEOUT', 300),
|
|
],
|
|
];
|