diff --git a/src/components/driver/DriverDeliveryPlanner.jsx b/src/components/driver/DriverDeliveryPlanner.jsx index 31f15af..2ba9b1d 100644 --- a/src/components/driver/DriverDeliveryPlanner.jsx +++ b/src/components/driver/DriverDeliveryPlanner.jsx @@ -92,7 +92,7 @@ const countByStatus = (items) => { }); } // Sort: delivered last (green = done), others by severity - const order = ["problem", "cancelled", "on_route", "loaded", "driver_assigned", "paid_storage", "delivered"]; + const order = ["problem", "cancelled", "on_route", "loaded", "driver_assigned", "paid_storage", "delivered", "picked_up"]; result.sort((a, b) => { const ia = order.indexOf(a.status); const ib = order.indexOf(b.status); @@ -347,7 +347,7 @@ export const DriverDeliveryPlanner = ({ orderGroups = [], onOpenOrder, currentUs statusBuckets.get(s).items.push(item); } - const statusOrder = ["driver_assigned", "loaded", "on_route", "delivered", "problem"]; + const statusOrder = ["driver_assigned", "loaded", "on_route", "delivered", "picked_up", "problem"]; const sortedBuckets = Array.from(statusBuckets.entries()).sort(([a], [b]) => { const ia = statusOrder.indexOf(a); const ib = statusOrder.indexOf(b); diff --git a/src/components/orders/DriverAssignmentPanel.jsx b/src/components/orders/DriverAssignmentPanel.jsx index 069f585..0de2d79 100644 --- a/src/components/orders/DriverAssignmentPanel.jsx +++ b/src/components/orders/DriverAssignmentPanel.jsx @@ -23,7 +23,7 @@ const DriverAssignmentPanel = ({ if (isPickupOrder) return null; const ds = order.deliveryStatus || order.delivery_status; - const isDriverLocked = ["loaded", "on_route", "delivered"].includes(ds); + const isDriverLocked = ["loaded", "on_route", "delivered", "picked_up"].includes(ds); return ( @@ -31,7 +31,7 @@ const DriverAssignmentPanel = ({ Назначение водителя

{(() => { - if (["loaded", "on_route", "delivered"].includes(ds)) { + if (["loaded", "on_route", "delivered", "picked_up"].includes(ds)) { return "Доставка в процессе — сменить водителя нельзя."; } return order.assignedDriverId diff --git a/src/components/orders/OrderDetailPanel.jsx b/src/components/orders/OrderDetailPanel.jsx index 11b54d3..7753097 100644 --- a/src/components/orders/OrderDetailPanel.jsx +++ b/src/components/orders/OrderDetailPanel.jsx @@ -613,7 +613,7 @@ export const OrderDetailPanel = ({ ); } - const isDeliveryAgreed = ["agreed", "driver_assigned", "loaded", "on_route", "delivered"].includes(order.deliveryStatus || order.delivery_status); + const isDeliveryAgreed = ["agreed", "driver_assigned", "loaded", "on_route", "delivered", "picked_up"].includes(order.deliveryStatus || order.delivery_status); const isPickupOrder = order.deliveryType === "pickup" || order.deliveryStatus === "pickup" || order.delivery_status === "pickup"; // Show "agreed" banner only when selected tab matches the already-agreed type const agreedTypeMatchesTab = isDeliveryAgreed && !isEditingDate && ( @@ -1050,11 +1050,12 @@ export const OrderDetailPanel = ({ const isOnRoute = IN_TRANSIT_STATUSES.includes(currentStatus); let statusOptions = []; - if (currentStatus === "delivered" || currentStatus === "problem" || currentStatus === "cancelled" || currentStatus === "paid_storage") { + if (currentStatus === "delivered" || currentStatus === "picked_up" || currentStatus === "problem" || currentStatus === "cancelled" || currentStatus === "paid_storage") { statusOptions = []; } else { statusOptions = [ { value: "delivered", label: "Доставлено" }, + { value: "picked_up", label: "Вывезено" }, { value: "problem", label: "Проблема" }, ]; } diff --git a/src/components/orders/StatusActionPanel.jsx b/src/components/orders/StatusActionPanel.jsx index d719794..eaff6f5 100644 --- a/src/components/orders/StatusActionPanel.jsx +++ b/src/components/orders/StatusActionPanel.jsx @@ -35,6 +35,7 @@ const StatusActionPanel = ({ { value: "loaded", label: "Загружено", manual: true }, { value: "on_route", label: "В пути", manual: true }, { value: "delivered", label: "Доставлено", manual: true }, + { value: "picked_up", label: "Вывезено", manual: true }, { value: "pickup", label: "Самовывоз", manual: true }, { value: "requires_address", label: "Требуется адрес", manual: true }, { value: "problem", label: "Проблема", manual: true }, diff --git a/src/services/driverDeliveries.js b/src/services/driverDeliveries.js index 8008e51..71091de 100644 --- a/src/services/driverDeliveries.js +++ b/src/services/driverDeliveries.js @@ -23,7 +23,7 @@ const DRIVER_KANBAN_COLUMNS = [ { key: "delivered", title: "Доставлен", - statuses: ["Доставлен", "Закрыт"], + statuses: ["Доставлен", "Вывезено", "Закрыт"], dropStatus: "Доставлен", }, { diff --git a/src/services/orderGroupViews.js b/src/services/orderGroupViews.js index d10ac25..1257873 100644 --- a/src/services/orderGroupViews.js +++ b/src/services/orderGroupViews.js @@ -11,6 +11,7 @@ export const DELIVERY_GROUP_STATUS_LABELS = { loaded: "Загружено", on_route: "В пути", delivered: "Доставлено", + picked_up: "Вывезено", problem: "Проблема", paid_storage: "Платное хранение", pickup: "Самовывоз", @@ -33,6 +34,7 @@ export const DRIVER_VISIBLE_DELIVERY_STATUSES = [ "on_route", "problem", "delivered", + "picked_up", ]; export const DRIVER_ACTIVE_DELIVERY_STATUSES = ["driver_assigned", "loaded", "on_route", "problem"]; @@ -325,6 +327,8 @@ export const ORDER_GROUP_DISPLAY_STATUS_OPTIONS = [ { value: "delivery:loaded", label: DELIVERY_GROUP_STATUS_LABELS.loaded }, { value: "delivery:on_route", label: DELIVERY_GROUP_STATUS_LABELS.on_route }, { value: "delivery:delivered", label: DELIVERY_GROUP_STATUS_LABELS.delivered }, + { value: "delivery:picked_up", label: DELIVERY_GROUP_STATUS_LABELS.picked_up }, + { value: "delivery:pickup", label: DELIVERY_GROUP_STATUS_LABELS.pickup }, { value: "delivery:problem", label: DELIVERY_GROUP_STATUS_LABELS.problem }, { value: "delivery:paid_storage", label: DELIVERY_GROUP_STATUS_LABELS.paid_storage }, { value: "delivery:cancelled", label: DELIVERY_GROUP_STATUS_LABELS.cancelled }, @@ -353,6 +357,8 @@ export const getOrderGroupDeliveryStatusTone = (status) => { return "warning"; case "delivered": return "accent"; + case "picked_up": + return "accent"; case "paid_storage": return "warning"; case "problem": diff --git a/src/services/orderViews.js b/src/services/orderViews.js index a1e11df..4d829d0 100644 --- a/src/services/orderViews.js +++ b/src/services/orderViews.js @@ -108,7 +108,7 @@ const buildStageColumns = (orders, { includeCompleted }) => { key: "delivered", title: "Доставлен", stageKey: "completed", - statuses: ["Доставлен"], + statuses: ["Доставлен", "Вывезено"], dropStatus: "Доставлен", items: orders.filter((order) => order.status === "Доставлен"), }); diff --git a/src/services/supabase/orderGroupRepository.js b/src/services/supabase/orderGroupRepository.js index 8ad2a0d..e464e0b 100644 --- a/src/services/supabase/orderGroupRepository.js +++ b/src/services/supabase/orderGroupRepository.js @@ -337,7 +337,7 @@ export const assignDriverToOrderGroup = async ({ // For loaded/on_route/delivered, keep existing status (driver reassigned mid-delivery). // For pending/manual statuses, also set driver_assigned (driver chosen before formal agreement). const currentStatus = currentGroup.delivery_status; - const ADVANCED_STATUSES = ["loaded", "on_route", "delivered"]; + const ADVANCED_STATUSES = ["loaded", "on_route", "delivered", "picked_up"]; const newStatus = driverId ? (ADVANCED_STATUSES.includes(currentStatus) ? undefined : "driver_assigned") : null; // removing driver → reset to pending