68 lines
2.9 KiB
PHP
68 lines
2.9 KiB
PHP
|
|
<?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(),
|
|||
|
|
]);
|
|||
|
|
}
|
|||
|
|
}
|