# DeliveryService ## Назначение Сервис рассчитывает возможность и стоимость доставки по заданному тарифу, точке на карте и весу заказа. Также отдаёт «книгу тарифов» (полный справочник тарифных зон и сеток цен). ## Публичные методы * `GetTariffsBookAsync(): TariffsBook` - вернуть текущую конфигурацию: все тарифы и все зоны. * `SearchDeliveryInfoAsync(tariffName, pin, weight): DeliveryInfo` - вычислить зону по координатам, подобрать подходящую «ступень» веса и вернуть цену. Если доставка недоступна - вернётся `DeliveryInfo.NotAvailable` (`IsAvailable = false`). > Контроль доступа осуществляется из NBSession (как и в других сервисах): вызов выполняется от имени текущего пользователя. ## Модели ### `TariffsBook` Справочник, который агрегирует: * `Tariff[] Tariffs` - перечень тарифов (название + «сетка» цен). * `TariffZone[] Zones` - перечень геозон (имя + полигон координат). ### `Tariff` и `TariffNet` * `Tariff.Name` - имя тарифа (например, «Курьер», «Самовывоз-город»). * `Tariff.Net[]` - набор правил «до веса X → цена Y» **в привязке к зоне**: * `ZoneName` - имя зоны, к которой относится правило, * `UntilWeightKg` - верхняя граница веса (включительно), * `Price` - цена. ### `TariffZone` * `Name` - идентификатор зоны (например, «City», «RegionA»). * `Coordinates[]` - массив точек полигона зоны (для попадания по `pin`). ### `DeliveryConfig` Конфигурация, из которой формируется «книга тарифов»: * `Zones[]` - зоны, * `Tariffs[]` - тарифы. ### `DeliveryInfo` Результат поиска: * `IsAvailable` - доступна ли доставка, * `TariffName`, `ZoneName` - что выбрано, * `UntilWeightKg` - порог, сработавший по весу, * `Price` - расчётная стоимость. ## Практические рекомендации * **Единые названия зон**: `Tariff.Net.ZoneName` должен совпадать с `TariffZone.Name` - это ключ связывания. * **Границы веса**: формируйте «сетку» без дырок и перекрытий. Рекомендуемый набор: `[0.5, 1, 2, 5, 10, 20, 999]`. * **Полигон зон**: координаты упорядочивайте по обходу (по/против часовой) и закрывайте полигон (первая точка = последняя), если это требуется вашим утилитам попадания. * **NotAvailable**: используйте готовую константу для отказов - `DeliveryInfo.NotAvailable`. Это унифицирует ответы. ## Конфигурация Сервис читает конфиг (зоны + тарифы) из `config.json` в `DeliveryConfig` и формирует `TariffsBook`. Изменение конфигурации осуществляется заменой json файла. Для обновления конфигурации требуется перезагрузка сервиса. [Назад](/index.md)