Войти Регистрация
Код-ревью

33. Тариф доставки Wildberries до ПВЗ

Лёгкая

TypeScript · 32 строк

Цена доставки до ПВЗ: база по зоне плюс 25 ₽ за каждый начатый килограмм. Килограммы считаются по большему из двух весов: фактический или объёмный (Д × Ш × В / 5000). Регионы, которых нет в таблице, — зона region.

Корзина от 1 500 ₽ включительно — доставка бесплатно, страховка 0,5 % от объявленной ценности платится всегда. Отметьте строки с ошибками.

В работе: Стоимость доставки в корзине до оформления заказа.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
TypeScriptтарифыобъёмный весокруглениеденьги

Источник: наша задача на данных Wildberries: доставка до пункта выдачи. Условие пересказано своими словами.

  1. type Zone = "msk" | "spb" | "region" | "far";
  2. interface Parcel {
  3. weightGrams: number;
  4. lengthCm: number;
  5. widthCm: number;
  6. heightCm: number;
  7. declaredValue: number; // рубли
  8. }
  9. const BASE: Record<Zone, number> = { msk: 99, spb: 99, region: 149, far: 299 };
  10. const PER_KG = 25;
  11. const FREE_FROM = 1500;
  12. const zoneByRegion: Record<string, Zone> = {
  13. "77": "msk", "50": "msk", "78": "spb", "47": "spb",
  14. "25": "far", "41": "far", "65": "far", "87": "far",
  15. };
  16. export function deliveryPrice(parcel: Parcel, regionCode: string, cartTotal: number): number {
  17. const zone = zoneByRegion[regionCode];
  18. const volumeKg = (parcel.lengthCm * parcel.widthCm * parcel.heightCm) / 5000;
  19. const realKg = parcel.weightGrams / 1000;
  20. const heavier = Math.min(volumeKg, realKg);
  21. const billedKg = Math.round(heavier);
  22. let price = BASE[zone] + billedKg * PER_KG;
  23. if (cartTotal > FREE_FROM) {
  24. price = 0;
  25. }
  26. const insurance = parcel.declaredValue * 0.005;
  27. return price + insurance;
  28. }