diff --git a/app/app/Services/Import/StatusRuToSlugMapper.php b/app/app/Services/Import/StatusRuToSlugMapper.php index 5a17f870..56111256 100644 --- a/app/app/Services/Import/StatusRuToSlugMapper.php +++ b/app/app/Services/Import/StatusRuToSlugMapper.php @@ -12,22 +12,28 @@ namespace App\Services\Import; */ class StatusRuToSlugMapper { - /** @var array Канонический маппинг ТЗ §6.4 (14 статусов воронки). */ + /** @var array Русские названия → 5 slug'ов воронки (редизайн 2026-05-17). */ private const STATUS_RU_TO_SLUG = [ - 'Новые' => 'new', + // Новые названия 5-статусной воронки. + 'Новая сделка' => 'new', 'Просмотрено' => 'viewed', - 'Проработан' => 'worked', - 'База' => 'base', - 'Недозвон' => 'missed', - 'Переговоры' => 'negotiations', - 'Ожидаем оплаты' => 'waiting_payment', - 'Партнерка' => 'partnership', - 'Оплачено' => 'paid', - 'Закрыто и не реализовано' => 'closed', - 'Тест драйв' => 'test_drive', - 'Горячий' => 'hot', - 'На замену' => 'replacement', - 'Конечный недозвон' => 'final_missed', + 'В работе' => 'in_progress', + 'Сделка' => 'won', + 'Не реализовано' => 'lost', + // Старые 14 названий поставщика → новые slug'и (исторический CSV-импорт). + 'Новые' => 'new', + 'Проработан' => 'in_progress', + 'База' => 'in_progress', + 'Недозвон' => 'in_progress', + 'Переговоры' => 'in_progress', + 'Ожидаем оплаты' => 'in_progress', + 'Партнерка' => 'in_progress', + 'Оплачено' => 'won', + 'Закрыто и не реализовано' => 'lost', + 'Тест драйв' => 'in_progress', + 'Горячий' => 'in_progress', + 'На замену' => 'in_progress', + 'Конечный недозвон' => 'in_progress', ]; /** diff --git a/app/tests/Unit/Import/StatusRuToSlugMapperTest.php b/app/tests/Unit/Import/StatusRuToSlugMapperTest.php index ea4b2dc9..0a291664 100644 --- a/app/tests/Unit/Import/StatusRuToSlugMapperTest.php +++ b/app/tests/Unit/Import/StatusRuToSlugMapperTest.php @@ -4,20 +4,32 @@ declare(strict_types=1); use App\Services\Import\StatusRuToSlugMapper; -test('маппит все 14 канонических статусов §6.4', function (): void { - $mapper = new StatusRuToSlugMapper; +test('старые русские статусы поставщика мапятся в 5 новых slug-ов', function (): void { + $m = new StatusRuToSlugMapper; - expect($mapper->toSlug('Новые'))->toBe('new') - ->and($mapper->toSlug('Оплачено'))->toBe('paid') - ->and($mapper->toSlug('Конечный недозвон'))->toBe('final_missed') - ->and($mapper->map())->toHaveCount(14); + expect($m->toSlug('Новые'))->toBe('new') + ->and($m->toSlug('Просмотрено'))->toBe('viewed') + ->and($m->toSlug('Проработан'))->toBe('in_progress') + ->and($m->toSlug('Переговоры'))->toBe('in_progress') + ->and($m->toSlug('Конечный недозвон'))->toBe('in_progress') + ->and($m->toSlug('Оплачено'))->toBe('won') + ->and($m->toSlug('Закрыто и не реализовано'))->toBe('lost'); +}); + +test('новые русские названия 5-статусной воронки мапятся', function (): void { + $m = new StatusRuToSlugMapper; + + expect($m->toSlug('Новая сделка'))->toBe('new') + ->and($m->toSlug('В работе'))->toBe('in_progress') + ->and($m->toSlug('Сделка'))->toBe('won') + ->and($m->toSlug('Не реализовано'))->toBe('lost'); }); test('тримит пробелы вокруг значения', function (): void { - expect((new StatusRuToSlugMapper)->toSlug(' Переговоры '))->toBe('negotiations'); + expect((new StatusRuToSlugMapper)->toSlug(' Переговоры '))->toBe('in_progress'); }); test('возвращает null для неизвестного статуса', function (): void { - expect((new StatusRuToSlugMapper)->toSlug('Архив'))->toBeNull() + expect((new StatusRuToSlugMapper)->toSlug('Абракадабра'))->toBeNull() ->and((new StatusRuToSlugMapper)->toSlug(''))->toBeNull(); });