59 lines
2.4 KiB
PHP
59 lines
2.4 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace App\Services\Import;
|
||
|
||
/**
|
||
* Маппинг русских названий статусов (старые 14 названий поставщика + новые 5)
|
||
* в slug 5-статусной воронки (редизайн 2026-05-17).
|
||
*
|
||
* Чистый сервис без зависимостей. Tenant-специфичные переопределения
|
||
* неизвестных статусов накладываются вызывающим кодом (HistoricalImportService).
|
||
*/
|
||
class StatusRuToSlugMapper
|
||
{
|
||
/** @var array<string, string> Русские названия → 5 slug'ов воронки (редизайн 2026-05-17). */
|
||
private const STATUS_RU_TO_SLUG = [
|
||
// Новые названия 5-статусной воронки.
|
||
'Новая сделка' => 'new',
|
||
'Просмотрено' => 'viewed',
|
||
'В работе' => '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',
|
||
];
|
||
|
||
/**
|
||
* Возвращает slug или null, если статус не входит в каноническую таблицу.
|
||
*/
|
||
public function toSlug(string $statusRu): ?string
|
||
{
|
||
return self::STATUS_RU_TO_SLUG[trim($statusRu)] ?? null;
|
||
}
|
||
|
||
/**
|
||
* Полная таблица соответствия: русское название → slug 5-статусной воронки
|
||
* (18 ключей — старые и новые названия схлопываются в 5 slug'ов).
|
||
*
|
||
* @return array<string, string>
|
||
*/
|
||
public function map(): array
|
||
{
|
||
return self::STATUS_RU_TO_SLUG;
|
||
}
|
||
}
|