Движок Фазы 3: 02 второй круг, 04 лимит/пауза под локом, 06 каналы/парсинг, 12 денежный аудит, 11 лента денег/калькуляторы, 15 сделки переживают удаление, 16 изоляция. UI-блок R3b: 19 гейт реквизитов+ИНН, 20 колокольчик+дайджест, 22 отчёты, 23 импорт CSV. Расхождения свода с кодом помечены как находки под проверку: 15 удаление проекта со сделками запрещено а не сохраняется, 20 дефолт email-дайджеста по схеме выключен, 22 PDF-формат проверить на штатность. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8.0 KiB
Приёмка liderra.ru — ПУНКТ №2: Второй круг (серия заявок раздаётся всем честно)
Для исполнителя: формат PR1 (одобрен 20.06). Каждый шаг =
🔧 Код-факт (file:line)·🎬 Действие·📋 ОТЧЁТ (было→ожидали→стало + 📸/📝)·❌ Если не так. Техника «под капотом»; владельцу — человеческие карточки.
Цель: показать, что на серии заявок (не одной, а потоком) раздача честная: со временем заявки достаются всем подходящим клиентам (не одни и те же снимают всё), и никто не получает больше своего дневного лимита. Портал отдаёт предпочтение тем, у кого больше свободных слотов — поэтому очередь выравнивается.
Что снимаем глазами: Сделки и Баланс всех 7 клиентов — у каждого появились заявки, ни у кого не больше лимита. Живые 📸.
Источник сценария: свод проверок №2 (D-ROUND); R3 «движок».
🔧 Код-факты (подтверждено чтением 20.06)
- Жребий выравнивает по остатку лимита — кандидаты сортируются
ORDER BY (snap.daily_limit − projects.delivered_today) DESC— LeadRouter.php:154-157; взвешенный отбор: вероятность ∝ остатку лимита, мелкие не отрезаются — weightedPick :171. - Дневной лимит не превышается — в отбор попадают только
delivered_today < daily_limit— :145. - CAP=3 на каждую заявку — LeadDistributor.php:22: за серию из N заявок суммарно до N×3 доставок, распределённых по 7 клиентам в рамках их лимитов.
- Счётчик
delivered_todayрастёт при каждой доставке — снижает шанс «перегруженного» клиента в следующих заявках.
Шаг 2-1 — Влить серию (~15 заявок) на источник всех 7
🔧 Код: отбор/жребий — LeadRouter :104-171; CAP — LeadDistributor :22-43.
🎬 Действие (лок): влить ~15 заявок подряд на источник, где подходят все 7 клиентов (это сценарий засева imitation:seed --clients=7 --leads=15).
📋 ОТЧЁТ:
| Что | Было | Ожидалось | Стало (факт) | Чем подтверждаем |
|---|---|---|---|---|
| Получили заявки | 0 | все 7 клиентов обслужены (никто не пустой) | (слот прогона) | 📸 Сделки каждого из 7 (есть заявки) |
| Распределение | — | примерно равномерно (жребий по остатку лимита) | (слот) | 📸 сводка по 7 (близкие числа) |
| Всего доставок | — | ≈ 15×3 = 45 (по 3 на заявку) | (слот) | 📝 SQL COUNT deals за серию |
💡 Что внутри: когда заявки идут потоком, портал следит, чтобы они доставались всем по очереди, а не оседали у первых. Он отдаёт предпочтение тем, у кого ещё много свободных мест на сегодня — поэтому отстающие догоняют, и через серию заявки получают все семеро примерно поровну.
❌ Если не так: часть клиентов осталась без заявок при свободном лимите → перекос раздачи.
Шаг 2-2 — Никто не получил больше своего дневного лимита
🔧 Код: фильтр лимита — LeadRouter :145. 🎬 Действие (лок): у каждого из 7 сверить число полученных за день с его дневным лимитом.
📋 ОТЧЁТ:
| Что | Было | Ожидалось | Стало (факт) | Чем подтверждаем |
|---|---|---|---|---|
| Доставлено за день каждому | — | ≤ дневного лимита у всех | (слот) | 📸 Сделки/счётчик дня; 📝 SQL delivered_today ≤ daily_limit |
| Клиент у лимита | — | по достижении лимита больше не получает | (слот) | 📸 его список перестал расти |
💡 Что внутри: у каждого клиента есть дневной потолок — сколько заявок в день он готов взять. Портал его соблюдает: как только клиент набрал свой лимит, новые заявки идут другим, а не сверх оплаченного объёма.
❌ Если не так: кто-то получил сверх лимита → дефект (клиент платит за лишнее).
Шаг 2-3 — Деньги по серии сходятся у всех
🔧 Код: списание — LedgerService :53-95. 🎬 Действие (лок): у нескольких клиентов сверить: число сделок × цена = уменьшение баланса.
📋 ОТЧЁТ:
| Что | Было | Ожидалось | Стало (факт) | Чем подтверждаем |
|---|---|---|---|---|
| Баланс vs сделки | — | у каждого: списано = (число сделок × цена ступени) | (слот) | 📸 Баланс + Сделки клиента |
❌ Если не так: баланс не бьётся с числом сделок → денежный дефект (связка с №7).
Verification №2 (выход из пункта)
- 📸 Все 7 клиентов получили заявки (никто не пустой при свободном лимите).
- 📸 Распределение примерно равномерное (жребий по остатку лимита).
- 📸/📝 Никто не превысил дневной лимит.
- 📸 Деньги сходятся у каждого (сделки × цена = списано).
📸 vs 📝 в этом пункте
- 📸 Скриншот: Сделки и Баланс всех 7 (или сводка), счётчик дня у клиента-у-лимита.
- 📝 Текст:
COUNT deals,delivered_todayvsdaily_limit— частично текстом.
Грабли
- Жребий случайный — равномерность приблизительная, не точная; смотрим, что все обслужены и лимиты целы, а не идеальное равенство.
- Дневной лимит — отдельная страховка; «пауза на лету» — пункт №4.
- Связка с №1 (CAP на одну заявку) — здесь проверяем поведение на серии.