c975e16a14
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
79 lines
3.0 KiB
PHP
79 lines
3.0 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace App\Console\Commands;
|
||
|
||
use App\Models\SupplierLead;
|
||
use App\Services\LeadRegionResolver;
|
||
use App\Support\RussianRegions;
|
||
use Illuminate\Console\Command;
|
||
|
||
/**
|
||
* Staging-smoke резолва региона по телефону (spec §9.4): дёргает живой каскад
|
||
* DaData → Россвязь → tag и печатает решение. В БД ничего НЕ пишет.
|
||
*
|
||
* php artisan phone-region:smoke --phone=79161234567 [--tag=Москва]
|
||
*
|
||
* Принудительно включает services.dadata.enabled на время прогона (smoke всегда
|
||
* проверяет полный каскад, независимо от глобального feature-flag). С реальным
|
||
* DADATA_API_KEY делает платный вызов — запускать осознанно.
|
||
*/
|
||
class PhoneRegionSmokeCommand extends Command
|
||
{
|
||
/** @var string */
|
||
protected $signature = 'phone-region:smoke
|
||
{--phone= : Телефон в формате 7XXXXXXXXXX}
|
||
{--tag= : Регион-тег поставщика (fallback-слой)}';
|
||
|
||
/** @var string */
|
||
protected $description = 'Прогон резолва региона по телефону (DaData→Россвязь→tag) без записи в БД (staging-smoke)';
|
||
|
||
public function handle(LeadRegionResolver $resolver): int
|
||
{
|
||
$phone = (string) $this->option('phone');
|
||
if ($phone === '') {
|
||
$this->error('Укажите --phone=7XXXXXXXXXX');
|
||
|
||
return self::FAILURE;
|
||
}
|
||
|
||
// Smoke всегда прогоняет полный каскад, даже если глобальный флаг выключен.
|
||
config(['services.dadata.enabled' => true]);
|
||
|
||
$lead = new SupplierLead([
|
||
'phone' => $phone,
|
||
'raw_payload' => ['tag' => (string) $this->option('tag')],
|
||
]);
|
||
|
||
$r = $resolver->resolve($lead);
|
||
|
||
$region = $r->subjectCode !== null
|
||
? (RussianRegions::CODE_TO_NAME[$r->subjectCode] ?? '?')
|
||
: '—';
|
||
|
||
$this->info('Телефон: '.$this->maskPhone($phone));
|
||
$this->line('Источник: '.$r->source);
|
||
$this->line('Субъект: '.($r->subjectCode ?? '—').' ('.$region.')');
|
||
$this->line('Оператор: '.($r->phoneOperator ?? '—'));
|
||
$this->line('DaData qc: '.($r->qc ?? '—'));
|
||
$this->line('Cache hit: '.($r->cacheHit ? 'да' : 'нет'));
|
||
$this->line('Россвязь: '.($r->rossvyazMatched ? 'совпала' : 'нет'));
|
||
$this->line('Длит., мс: '.($r->durationMs ?? '—'));
|
||
$this->newLine();
|
||
$this->comment('NB: запись в БД НЕ выполнялась (smoke).');
|
||
|
||
return self::SUCCESS;
|
||
}
|
||
|
||
private function maskPhone(string $phone): string
|
||
{
|
||
$digits = preg_replace('/\D+/', '', $phone) ?? '';
|
||
if (strlen($digits) < 8) {
|
||
return '***';
|
||
}
|
||
|
||
return substr($digits, 0, 4).'***'.substr($digits, -4);
|
||
}
|
||
}
|