diff --git a/.gitignore b/.gitignore index c2ad370..1d55b7d 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ dist .worktrees .superpowers .ruff_cache +volumes/db/data/ diff --git a/src/components/client/PickupSlotsPicker.jsx b/src/components/client/PickupSlotsPicker.jsx index efcb16a..93653f1 100644 --- a/src/components/client/PickupSlotsPicker.jsx +++ b/src/components/client/PickupSlotsPicker.jsx @@ -105,14 +105,37 @@ const getPickupSlots = (referenceDate = new Date()) => { }; const FREE_STORAGE_NOTICE = ( -
ℹ️ Условия хранения
-- Бесплатное хранение — 2 рабочих дня с даты готовности. -
-- Начиная с 3-го рабочего дня — 300 ₽/день платного хранения. -
++ Условия хранения +
+Тип доставки
-{order.deliveryType === "pickup" ? "Самовывоз" : "Доставка"}
+{order.deliveryType === "pickup" ? "Самовывоз" : order.deliveryStatus === "requires_address" || order.delivery_status === "requires_address" ? "Доставка (требуется адрес)" : "Доставка"}
+ {(order.deliveryStatus === "requires_address" || order.delivery_status === "requires_address") && ( +Адрес доставки не указан
+Клиент выбрал доставку, но адрес отсутствует. Уточните адрес у клиента и заполните поле ниже.
+@@ -1125,6 +1136,7 @@ export const OrderDetailPanel = ({ { value: "on_route", label: "В пути", manual: true }, { value: "delivered", label: "Доставлено", manual: true }, { value: "pickup", label: "Самовывоз", manual: true }, + { value: "requires_address", label: "Требуется адрес", manual: true }, { value: "problem", label: "Проблема", manual: true }, { value: "cancelled", label: "Отменено", manual: true }, ].map((statusOption) => { diff --git a/src/constants/deliveryWorkflow.js b/src/constants/deliveryWorkflow.js index 8fcf233..15f1491 100644 --- a/src/constants/deliveryWorkflow.js +++ b/src/constants/deliveryWorkflow.js @@ -109,6 +109,15 @@ export const ORDER_STATUS_META = { criticalAfterHours: 48, tone: "accent", }, + "Требуется адрес": { + comment: "Клиент выбрал доставку, но адрес доставки отсутствует. Менеджеру нужно уточнить адрес.", + ownerRole: "logistician", + stageKey: "logistics", + stageLabel: getStageLabel("logistics"), + warningAfterHours: 4, + criticalAfterHours: 12, + tone: "warning", + }, "Передан логисту": { comment: "Автоматическое согласование не завершилось, заказ передан логисту на ручную обработку.", ownerRole: "logistician", @@ -228,8 +237,8 @@ export const ORDER_STATUS_TRANSITIONS = { "В производстве": ["Готов к отгрузке", "Требует уточнения", "Отменён"], "Готов к отгрузке": ["Ожидает согласования доставки", "Ожидает ответа клиента", "Проблема доставки", "Отменён"], "Ожидает ответа клиента": ["Доставка согласована", "Передан логисту", "Платное хранение", "Проблема доставки", "Отменён"], - "Ожидает согласования доставки": ["Доставка согласована", "Самовывоз", "Проблема доставки", "Отменён"], - "Доставка согласована": ["Назначен водитель", "Ожидает согласования доставки", "Проблема доставки", "Самовывоз"], + "Ожидает согласования доставки": ["Доставка согласована", "Самовывоз", "Требуется адрес", "Проблема доставки", "Отменён"], + "Доставка согласована": ["Назначен водитель", "Ожидает согласования доставки", "Проблема доставки", "Самовывоз", "Требуется адрес"], "Передан логисту": ["Доставка согласована", "Платное хранение", "Проблема доставки", "Отменён"], "Назначен водитель": ["Загружен", "Проблема доставки"], Загружен: ["Доставлен", "Проблема доставки"], @@ -238,6 +247,7 @@ export const ORDER_STATUS_TRANSITIONS = { "Проблема доставки": ["Ожидает согласования доставки", "Назначен водитель", "Отменён", "Закрыт"], "Платное хранение": ["Доставка согласована", "Отменён", "Закрыт"], "Самовывоз": ["Доставка согласована", "Закрыт", "Отменён", "Платное хранение"], + "Требуется адрес": ["Доставка согласована", "Самовывоз", "Отменён", "Проблема доставки"], Закрыт: [], Отменён: [], }; @@ -254,6 +264,7 @@ export const ROLE_TRANSITION_TARGETS = { "Передан логисту", "Назначен водитель", "Самовывоз", + "Требуется адрес", "Проблема доставки", "Платное хранение", "Закрыт", @@ -276,6 +287,7 @@ export const LOGISTICS_STATUSES = [ "Доставка согласована", "Назначен водитель", "Самовывоз", + "Требуется адрес", "Проблема доставки", ]; diff --git a/src/pages/ClientDeliveryPage.jsx b/src/pages/ClientDeliveryPage.jsx index 3780e2b..c6385b6 100644 --- a/src/pages/ClientDeliveryPage.jsx +++ b/src/pages/ClientDeliveryPage.jsx @@ -193,6 +193,7 @@ export const ClientDeliveryPage = () => { const [selectedSlot, setSelectedSlot] = React.useState(null); const [choiceSaved, setChoiceSaved] = React.useState(false); const [activeTab, setActiveTab] = React.useState(TAB_DELIVERY); + const [deliveryAddress, setDeliveryAddress] = React.useState(""); const referenceDate = React.useMemo(() => new Date(), [token]); React.useEffect(() => { @@ -278,6 +279,9 @@ export const ClientDeliveryPage = () => { pickupDate: effectiveSelectedSlot.date, pickupTimeSlot: effectiveSelectedSlot.time, } : {}), + ...(activeTab === TAB_DELIVERY && deliveryAddress.trim() ? { + deliveryAddress: deliveryAddress.trim(), + } : {}), }); const loadedInvitation = await fetchDeliveryInvitation(token); setInvitation(loadedInvitation); @@ -403,6 +407,27 @@ export const ClientDeliveryPage = () => {
Укажите адрес доставки
++ Адрес доставки отсутствует в заказе. Пожалуйста, введите полный адрес, куда нужно привезти заказ. +
+