feat: add picked_up (Вывезено) status — terminal status for self-pickup orders

This commit is contained in:
root 2026-06-12 18:17:44 +00:00
parent d22302838b
commit 6617abc27f
8 changed files with 17 additions and 9 deletions

View File

@ -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);

View File

@ -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

View File

@ -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: "Проблема" },
]; ];
} }

View File

@ -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 },

View File

@ -23,7 +23,7 @@ const DRIVER_KANBAN_COLUMNS = [
{ {
key: "delivered", key: "delivered",
title: "Доставлен", title: "Доставлен",
statuses: ["Доставлен", "Закрыт"], statuses: ["Доставлен", "Вывезено", "Закрыт"],
dropStatus: "Доставлен", dropStatus: "Доставлен",
}, },
{ {

View File

@ -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":

View File

@ -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 === "Доставлен"),
}); });

View File

@ -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