create(['balance_rub' => '500.00', 'frozen_by_balance_at' => null]); // LIVE-проект уже переведён на НОВЫЙ источник. $project = Project::factory()->for($tenant)->create([ 'is_active' => true, 'signal_type' => 'sms', 'signal_identifier' => null, 'sms_senders' => ['NewSender'], 'sms_keyword' => null, 'delivery_days_mask' => 127, 'daily_limit_target' => 100, 'delivered_today' => 0, 'regions' => [], ]); // Слепок за сегодня снят ДО смены — со СТАРЫМ источником Caranga. DB::table('project_routing_snapshots')->insert([ 'snapshot_date' => '2026-05-28', 'project_id' => $project->id, 'tenant_id' => $tenant->id, 'daily_limit' => 10, 'delivery_days_mask' => 127, 'regions' => '{}', 'signal_type' => 'sms', 'signal_identifier' => null, 'sms_senders' => json_encode(['Caranga']), 'sms_keyword' => null, 'expected_volume' => 10, 'delivered_count' => 0, 'created_at' => now(), ]); // Лид прилетел по СТАРОМУ источнику Caranga. supplier_project старого источника // (pivot оборван сменой — связи project↔sp НЕТ). $oldSp = SupplierProject::factory()->create([ 'platform' => 'B3', 'signal_type' => 'sms', 'unique_key' => 'Caranga', ]); // NB: НЕТ записи в project_supplier_links — источник сменён, связь разорвана. // Включаем новый путь (матч по слепку). DB::table('system_settings')->updateOrInsert( ['key' => 'routing_match_by_snapshot'], ['value' => 'true', 'type' => 'bool', 'updated_at' => now()], ); $matched = app(LeadRouter::class)->matchEligibleProjects($oldSp); expect($matched)->toHaveCount(1); // слепок помнит Caranga → лид доезжает Carbon::setTestNow(); }); it('со СТАРЫМ путём (флаг выкл) лид по оборванному источнику теряется — поведение прежнее', function () { Carbon::setTestNow(Carbon::parse('2026-05-28 12:00:00', 'Europe/Moscow')); $tenant = Tenant::factory()->create(['balance_rub' => '500.00', 'frozen_by_balance_at' => null]); $project = Project::factory()->for($tenant)->create([ 'is_active' => true, 'signal_type' => 'sms', 'signal_identifier' => null, 'sms_senders' => ['NewSender'], 'sms_keyword' => null, 'delivery_days_mask' => 127, 'daily_limit_target' => 100, 'delivered_today' => 0, 'regions' => [], ]); DB::table('project_routing_snapshots')->insert([ 'snapshot_date' => '2026-05-28', 'project_id' => $project->id, 'tenant_id' => $tenant->id, 'daily_limit' => 10, 'delivery_days_mask' => 127, 'regions' => '{}', 'signal_type' => 'sms', 'signal_identifier' => null, 'sms_senders' => json_encode(['Caranga']), 'sms_keyword' => null, 'expected_volume' => 10, 'delivered_count' => 0, 'created_at' => now(), ]); $oldSp = SupplierProject::factory()->create([ 'platform' => 'B3', 'signal_type' => 'sms', 'unique_key' => 'Caranga', ]); // Флаг НЕ включаем (дефолт false → старый pivot-путь). $matched = app(LeadRouter::class)->matchEligibleProjects($oldSp); expect($matched)->toHaveCount(0); // старый путь: pivot оборван → лид теряется (как было) Carbon::setTestNow(); });