From 424987bedb203632ccc24ae242977a5b75b6d75e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Sat, 16 May 2026 17:42:49 +0300 Subject: [PATCH] =?UTF-8?q?feat(import):=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8?= =?UTF-8?q?=D1=81=20StatusRuToSlugMapper=20(=D0=A2=D0=97=20=C2=A76.4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Services/Import/StatusRuToSlugMapper.php | 50 +++++++++++++++++++ .../Unit/Import/StatusRuToSlugMapperTest.php | 23 +++++++++ 2 files changed, 73 insertions(+) create mode 100644 app/app/Services/Import/StatusRuToSlugMapper.php create mode 100644 app/tests/Unit/Import/StatusRuToSlugMapperTest.php diff --git a/app/app/Services/Import/StatusRuToSlugMapper.php b/app/app/Services/Import/StatusRuToSlugMapper.php new file mode 100644 index 00000000..5a17f870 --- /dev/null +++ b/app/app/Services/Import/StatusRuToSlugMapper.php @@ -0,0 +1,50 @@ + Канонический маппинг ТЗ §6.4 (14 статусов воронки). */ + private const STATUS_RU_TO_SLUG = [ + 'Новые' => 'new', + 'Просмотрено' => 'viewed', + 'Проработан' => 'worked', + 'База' => 'base', + 'Недозвон' => 'missed', + 'Переговоры' => 'negotiations', + 'Ожидаем оплаты' => 'waiting_payment', + 'Партнерка' => 'partnership', + 'Оплачено' => 'paid', + 'Закрыто и не реализовано' => 'closed', + 'Тест драйв' => 'test_drive', + 'Горячий' => 'hot', + 'На замену' => 'replacement', + 'Конечный недозвон' => 'final_missed', + ]; + + /** + * Возвращает slug или null, если статус не входит в каноническую таблицу. + */ + public function toSlug(string $statusRu): ?string + { + return self::STATUS_RU_TO_SLUG[trim($statusRu)] ?? null; + } + + /** + * Полная каноническая таблица — для UI wizard'а (показать варианты). + * + * @return array + */ + public function map(): array + { + return self::STATUS_RU_TO_SLUG; + } +} diff --git a/app/tests/Unit/Import/StatusRuToSlugMapperTest.php b/app/tests/Unit/Import/StatusRuToSlugMapperTest.php new file mode 100644 index 00000000..ea4b2dc9 --- /dev/null +++ b/app/tests/Unit/Import/StatusRuToSlugMapperTest.php @@ -0,0 +1,23 @@ +toSlug('Новые'))->toBe('new') + ->and($mapper->toSlug('Оплачено'))->toBe('paid') + ->and($mapper->toSlug('Конечный недозвон'))->toBe('final_missed') + ->and($mapper->map())->toHaveCount(14); +}); + +test('тримит пробелы вокруг значения', function (): void { + expect((new StatusRuToSlugMapper)->toSlug(' Переговоры '))->toBe('negotiations'); +}); + +test('возвращает null для неизвестного статуса', function (): void { + expect((new StatusRuToSlugMapper)->toSlug('Архив'))->toBeNull() + ->and((new StatusRuToSlugMapper)->toSlug(''))->toBeNull(); +});