Files
portal/app/tests/Support/Imitation/SnapshotForge.php
T
2026-06-03 19:09:12 +03:00

68 lines
2.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
namespace Tests\Support\Imitation;
use Carbon\Carbon;
use Illuminate\Support\Facades\Artisan;
/**
* Генератор снапшота маршрутизации для имитационного стенда (Phase 1).
*
* Делегирует команде `snapshot:rebuild` (DELETE+INSERT, детерминированно):
* - activeDate() — зеркало LeadRouter::activeSnapshotDate(): до 21:00 МСК — сегодня,
* с 21:00 МСК — завтра (§4.2.3 slepok-routing spec).
* - rebuild() — вызывает Artisan::call('snapshot:rebuild', ['--date' => activeDate()])
* для перестройки project_routing_snapshots за активную дату.
*
* Механизм выбора (per README §4):
* «Для живого портала (Task 14) — `php artisan snapshot:rebuild --date=<activeDate>`
* (DELETE+INSERT, детерминированно)».
*
* В тестах `rebuild()` вызывается статически ПОСЛЕ создания проекта (фабрика),
* до вызова LeadRouter. SnapshotRebuildCommand работает через pgsql_supplier
* (BYPASSRLS crm_supplier_worker) — совместимо с SharesSupplierPdo.
*
* activeDate() возвращает строку 'YYYY-MM-DD' — ровно то, что LeadRouter передаёт
* в SQL WHERE snap.snapshot_date = ?::date.
*
* Task 3 — Phase 1 Portal Client Imitation Harness.
* Spec: docs/superpowers/specs/2026-06-03-portal-client-imitation-phase1-design.md
*/
final class SnapshotForge
{
/**
* Активная дата слепка — зеркало LeadRouter::activeSnapshotDate().
*
* До 21:00 МСК — сегодня, с 21:00 МСК — завтра (§4.2.3).
*
* Возвращает строку 'YYYY-MM-DD' (как LeadRouter передаёт в SQL).
*/
public static function activeDate(): string
{
$msk = Carbon::now('Europe/Moscow');
return $msk->hour >= 21
? $msk->copy()->addDay()->toDateString()
: $msk->toDateString();
}
/**
* Перестраивает project_routing_snapshots за активную дату из live-проектов.
*
* Использует команду `snapshot:rebuild --date=<activeDate>` (DELETE+INSERT),
* которая отбирает все active + unfrozen проекты с подходящим delivery_days_mask
* и вставляет строки в project_routing_snapshots.
*
* Вызывать ПОСЛЕ создания тестовых проектов (фабрика) — команда читает
* projects из БД на момент вызова.
*/
public static function rebuild(): void
{
Artisan::call('snapshot:rebuild', [
'--date' => self::activeDate(),
]);
}
}