| | | 1 | | using System.Globalization; |
| | | 2 | | using Services.ApiServices.TradesoftApi.Models.Response; |
| | | 3 | | |
| | | 4 | | namespace Services.ApiSupplierSettingsServices; |
| | | 5 | | |
| | | 6 | | /// <summary>Прибавляет к срокам предложения надбавку из настроек API-поставщика. |
| | | 7 | | /// Точное значение живёт в часах, а колонки проценки остаются в днях: их округляем вверх, |
| | | 8 | | /// иначе надбавка меньше суток просто теряется.</summary> |
| | | 9 | | public static class SupplierDeliverySurcharge |
| | | 10 | | { |
| | | 11 | | /// <summary>Максимально допустимая надбавка — 30 суток: больше похоже на ошибку ввода, чем на срок доставки.</summa |
| | | 12 | | public const int MaxExtraHours = 720; |
| | | 13 | | |
| | | 14 | | public static void Apply(IEnumerable<PreOrderItem> items, int extraHours) |
| | | 15 | | { |
| | 28 | 16 | | foreach (var item in items) Apply(item, extraHours); |
| | 5 | 17 | | } |
| | | 18 | | |
| | | 19 | | public static void Apply(PreOrderItem item, int extraHours) |
| | | 20 | | { |
| | 16 | 21 | | var extra = Math.Clamp(extraHours, 0, MaxExtraHours); |
| | 16 | 22 | | item.ExtraDeliveryHours = extra; |
| | 16 | 23 | | item.DeliveryHoursMin = Math.Max(0, item.DeliveryDaysMin) * 24 + extra; |
| | 16 | 24 | | item.DeliveryHoursMax = Math.Max(0, item.DeliveryDaysMax) * 24 + extra; |
| | 20 | 25 | | if (extra == 0) return; |
| | | 26 | | |
| | 12 | 27 | | item.DeliveryDaysMin = ToDays(item.DeliveryHoursMin); |
| | 12 | 28 | | item.DeliveryDaysMax = ToDays(item.DeliveryHoursMax); |
| | | 29 | | // DeliveryDays — отображаемый «средний» срок, у части поставщиков это "-" или пусто: |
| | | 30 | | // такие значения оставляем как есть, число сдвигаем на ту же надбавку. |
| | 12 | 31 | | if (int.TryParse(item.DeliveryDays, NumberStyles.Integer, CultureInfo.InvariantCulture, out var days)) |
| | 11 | 32 | | item.DeliveryDays = ToDays(Math.Max(0, days) * 24 + extra).ToString(CultureInfo.InvariantCulture); |
| | 12 | 33 | | } |
| | | 34 | | |
| | 35 | 35 | | private static int ToDays(int hours) => (int)Math.Ceiling(hours / 24.0); |
| | | 36 | | } |