feat: add picked_up (Вывезено) status — terminal status for self-pickup orders
This commit is contained in:
parent
d22302838b
commit
6617abc27f
|
|
@ -92,7 +92,7 @@ const countByStatus = (items) => {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// Sort: delivered last (green = done), others by severity
|
// 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) => {
|
result.sort((a, b) => {
|
||||||
const ia = order.indexOf(a.status);
|
const ia = order.indexOf(a.status);
|
||||||
const ib = order.indexOf(b.status);
|
const ib = order.indexOf(b.status);
|
||||||
|
|
@ -347,7 +347,7 @@ export const DriverDeliveryPlanner = ({ orderGroups = [], onOpenOrder, currentUs
|
||||||
statusBuckets.get(s).items.push(item);
|
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 sortedBuckets = Array.from(statusBuckets.entries()).sort(([a], [b]) => {
|
||||||
const ia = statusOrder.indexOf(a);
|
const ia = statusOrder.indexOf(a);
|
||||||
const ib = statusOrder.indexOf(b);
|
const ib = statusOrder.indexOf(b);
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const DriverAssignmentPanel = ({
|
||||||
if (isPickupOrder) return null;
|
if (isPickupOrder) return null;
|
||||||
|
|
||||||
const ds = order.deliveryStatus || order.delivery_status;
|
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 (
|
return (
|
||||||
<Panel className="space-y-4 p-5">
|
<Panel className="space-y-4 p-5">
|
||||||
|
|
@ -31,7 +31,7 @@ const DriverAssignmentPanel = ({
|
||||||
<strong>Назначение водителя</strong>
|
<strong>Назначение водителя</strong>
|
||||||
<p className="mt-1 text-sm text-[var(--color-text-muted)]">
|
<p className="mt-1 text-sm text-[var(--color-text-muted)]">
|
||||||
{(() => {
|
{(() => {
|
||||||
if (["loaded", "on_route", "delivered"].includes(ds)) {
|
if (["loaded", "on_route", "delivered", "picked_up"].includes(ds)) {
|
||||||
return "Доставка в процессе — сменить водителя нельзя.";
|
return "Доставка в процессе — сменить водителя нельзя.";
|
||||||
}
|
}
|
||||||
return order.assignedDriverId
|
return order.assignedDriverId
|
||||||
|
|
|
||||||
|
|
@ -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";
|
const isPickupOrder = order.deliveryType === "pickup" || order.deliveryStatus === "pickup" || order.delivery_status === "pickup";
|
||||||
// Show "agreed" banner only when selected tab matches the already-agreed type
|
// Show "agreed" banner only when selected tab matches the already-agreed type
|
||||||
const agreedTypeMatchesTab = isDeliveryAgreed && !isEditingDate && (
|
const agreedTypeMatchesTab = isDeliveryAgreed && !isEditingDate && (
|
||||||
|
|
@ -1050,11 +1050,12 @@ export const OrderDetailPanel = ({
|
||||||
const isOnRoute = IN_TRANSIT_STATUSES.includes(currentStatus);
|
const isOnRoute = IN_TRANSIT_STATUSES.includes(currentStatus);
|
||||||
|
|
||||||
let statusOptions = [];
|
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 = [];
|
statusOptions = [];
|
||||||
} else {
|
} else {
|
||||||
statusOptions = [
|
statusOptions = [
|
||||||
{ value: "delivered", label: "Доставлено" },
|
{ value: "delivered", label: "Доставлено" },
|
||||||
|
{ value: "picked_up", label: "Вывезено" },
|
||||||
{ value: "problem", label: "Проблема" },
|
{ value: "problem", label: "Проблема" },
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ const StatusActionPanel = ({
|
||||||
{ value: "loaded", label: "Загружено", manual: true },
|
{ value: "loaded", label: "Загружено", manual: true },
|
||||||
{ value: "on_route", label: "В пути", manual: true },
|
{ value: "on_route", label: "В пути", manual: true },
|
||||||
{ value: "delivered", label: "Доставлено", manual: true },
|
{ value: "delivered", label: "Доставлено", manual: true },
|
||||||
|
{ value: "picked_up", label: "Вывезено", manual: true },
|
||||||
{ value: "pickup", label: "Самовывоз", manual: true },
|
{ value: "pickup", label: "Самовывоз", manual: true },
|
||||||
{ value: "requires_address", label: "Требуется адрес", manual: true },
|
{ value: "requires_address", label: "Требуется адрес", manual: true },
|
||||||
{ value: "problem", label: "Проблема", manual: true },
|
{ value: "problem", label: "Проблема", manual: true },
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const DRIVER_KANBAN_COLUMNS = [
|
||||||
{
|
{
|
||||||
key: "delivered",
|
key: "delivered",
|
||||||
title: "Доставлен",
|
title: "Доставлен",
|
||||||
statuses: ["Доставлен", "Закрыт"],
|
statuses: ["Доставлен", "Вывезено", "Закрыт"],
|
||||||
dropStatus: "Доставлен",
|
dropStatus: "Доставлен",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ export const DELIVERY_GROUP_STATUS_LABELS = {
|
||||||
loaded: "Загружено",
|
loaded: "Загружено",
|
||||||
on_route: "В пути",
|
on_route: "В пути",
|
||||||
delivered: "Доставлено",
|
delivered: "Доставлено",
|
||||||
|
picked_up: "Вывезено",
|
||||||
problem: "Проблема",
|
problem: "Проблема",
|
||||||
paid_storage: "Платное хранение",
|
paid_storage: "Платное хранение",
|
||||||
pickup: "Самовывоз",
|
pickup: "Самовывоз",
|
||||||
|
|
@ -33,6 +34,7 @@ export const DRIVER_VISIBLE_DELIVERY_STATUSES = [
|
||||||
"on_route",
|
"on_route",
|
||||||
"problem",
|
"problem",
|
||||||
"delivered",
|
"delivered",
|
||||||
|
"picked_up",
|
||||||
];
|
];
|
||||||
|
|
||||||
export const DRIVER_ACTIVE_DELIVERY_STATUSES = ["driver_assigned", "loaded", "on_route", "problem"];
|
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:loaded", label: DELIVERY_GROUP_STATUS_LABELS.loaded },
|
||||||
{ value: "delivery:on_route", label: DELIVERY_GROUP_STATUS_LABELS.on_route },
|
{ value: "delivery:on_route", label: DELIVERY_GROUP_STATUS_LABELS.on_route },
|
||||||
{ value: "delivery:delivered", label: DELIVERY_GROUP_STATUS_LABELS.delivered },
|
{ 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:problem", label: DELIVERY_GROUP_STATUS_LABELS.problem },
|
||||||
{ value: "delivery:paid_storage", label: DELIVERY_GROUP_STATUS_LABELS.paid_storage },
|
{ value: "delivery:paid_storage", label: DELIVERY_GROUP_STATUS_LABELS.paid_storage },
|
||||||
{ value: "delivery:cancelled", label: DELIVERY_GROUP_STATUS_LABELS.cancelled },
|
{ value: "delivery:cancelled", label: DELIVERY_GROUP_STATUS_LABELS.cancelled },
|
||||||
|
|
@ -353,6 +357,8 @@ export const getOrderGroupDeliveryStatusTone = (status) => {
|
||||||
return "warning";
|
return "warning";
|
||||||
case "delivered":
|
case "delivered":
|
||||||
return "accent";
|
return "accent";
|
||||||
|
case "picked_up":
|
||||||
|
return "accent";
|
||||||
case "paid_storage":
|
case "paid_storage":
|
||||||
return "warning";
|
return "warning";
|
||||||
case "problem":
|
case "problem":
|
||||||
|
|
|
||||||
|
|
@ -108,7 +108,7 @@ const buildStageColumns = (orders, { includeCompleted }) => {
|
||||||
key: "delivered",
|
key: "delivered",
|
||||||
title: "Доставлен",
|
title: "Доставлен",
|
||||||
stageKey: "completed",
|
stageKey: "completed",
|
||||||
statuses: ["Доставлен"],
|
statuses: ["Доставлен", "Вывезено"],
|
||||||
dropStatus: "Доставлен",
|
dropStatus: "Доставлен",
|
||||||
items: orders.filter((order) => order.status === "Доставлен"),
|
items: orders.filter((order) => order.status === "Доставлен"),
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -337,7 +337,7 @@ export const assignDriverToOrderGroup = async ({
|
||||||
// For loaded/on_route/delivered, keep existing status (driver reassigned mid-delivery).
|
// 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).
|
// For pending/manual statuses, also set driver_assigned (driver chosen before formal agreement).
|
||||||
const currentStatus = currentGroup.delivery_status;
|
const currentStatus = currentGroup.delivery_status;
|
||||||
const ADVANCED_STATUSES = ["loaded", "on_route", "delivered"];
|
const ADVANCED_STATUSES = ["loaded", "on_route", "delivered", "picked_up"];
|
||||||
const newStatus = driverId
|
const newStatus = driverId
|
||||||
? (ADVANCED_STATUSES.includes(currentStatus) ? undefined : "driver_assigned")
|
? (ADVANCED_STATUSES.includes(currentStatus) ? undefined : "driver_assigned")
|
||||||
: null; // removing driver → reset to pending
|
: null; // removing driver → reset to pending
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue