feat: unify manual_required status and driver label
- orderGroupViews: unify notification manual_required + pending delivery_status into single "Требуется ручное управление" status - LogisticsReadinessBoard: use status:manual_required in funnel instead of delivery:manual_confirmation_required - DriverDeliveryPlanner: show "Назначено вам" for driver_assigned instead of "Назначен водитель" - Add sync-manual-status.sql trigger patch for backend
This commit is contained in:
parent
838c4cb7ae
commit
6244749545
|
|
@ -17,7 +17,7 @@ const DRIVER_DELIVERY_STATUS_OPTIONS = [
|
||||||
{ value: "all", label: "Все статусы" },
|
{ value: "all", label: "Все статусы" },
|
||||||
...DRIVER_VISIBLE_DELIVERY_STATUSES.map((status) => ({
|
...DRIVER_VISIBLE_DELIVERY_STATUSES.map((status) => ({
|
||||||
value: status,
|
value: status,
|
||||||
label: getOrderGroupDeliveryStatusLabel(status),
|
label: status === "driver_assigned" ? "Назначено вам" : getOrderGroupDeliveryStatusLabel(status),
|
||||||
})),
|
})),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
@ -211,7 +211,7 @@ export const DriverDeliveryPlanner = ({ orderGroups = [], onOpenOrder, currentUs
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Badge tone={getOrderGroupDeliveryStatusTone(item.deliveryStatus || item.delivery_status)}>
|
<Badge tone={getOrderGroupDeliveryStatusTone(item.deliveryStatus || item.delivery_status)}>
|
||||||
{getOrderGroupDeliveryStatusLabel(item.deliveryStatus || item.delivery_status)}
|
{(() => { const s = item.deliveryStatus || item.delivery_status; return s === "driver_assigned" ? "Назначено вам" : getOrderGroupDeliveryStatusLabel(s); })()}
|
||||||
</Badge>
|
</Badge>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ export const LogisticsReadinessBoard = ({ orderGroups = [], onSelectSet, statusO
|
||||||
const FUNNEL_ORDER = [
|
const FUNNEL_ORDER = [
|
||||||
"status:ready_for_notification",
|
"status:ready_for_notification",
|
||||||
"delivery:pending_confirmation",
|
"delivery:pending_confirmation",
|
||||||
"delivery:manual_confirmation_required",
|
"status:manual_required",
|
||||||
"status:first_sms_sent",
|
"status:first_sms_sent",
|
||||||
"status:second_sms_sent",
|
"status:second_sms_sent",
|
||||||
"delivery:agreed",
|
"delivery:agreed",
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ const getDeliveryDate = (group) => normalizeDate(group.deliveryDate || group.cus
|
||||||
|
|
||||||
export const DELIVERY_GROUP_STATUS_LABELS = {
|
export const DELIVERY_GROUP_STATUS_LABELS = {
|
||||||
pending_confirmation: "Ожидает согласования",
|
pending_confirmation: "Ожидает согласования",
|
||||||
manual_confirmation_required: "Требуется ручное подтверждение",
|
manual_confirmation_required: "Взят в ручное управление",
|
||||||
agreed: "Согласовано",
|
agreed: "Согласовано",
|
||||||
driver_assigned: "Назначен водитель",
|
driver_assigned: "Назначен водитель",
|
||||||
loaded: "Загружено",
|
loaded: "Загружено",
|
||||||
|
|
@ -22,7 +22,7 @@ export const NOTIFICATION_STATUS_LABELS = {
|
||||||
second_sms_sent: "2-е приглашение отправлено",
|
second_sms_sent: "2-е приглашение отправлено",
|
||||||
send_failed: "Ошибка отправки",
|
send_failed: "Ошибка отправки",
|
||||||
confirmed: "Согласовано",
|
confirmed: "Согласовано",
|
||||||
manual_required: "Переведено в ручное",
|
manual_required: "Требуется ручное подтверждение",
|
||||||
};
|
};
|
||||||
|
|
||||||
export const DRIVER_VISIBLE_DELIVERY_STATUSES = [
|
export const DRIVER_VISIBLE_DELIVERY_STATUSES = [
|
||||||
|
|
@ -140,12 +140,19 @@ export const getOrderGroupDeliveryStatusLabel = (status) =>
|
||||||
|
|
||||||
export const getOrderGroupDisplayStatusLabel = (group) => {
|
export const getOrderGroupDisplayStatusLabel = (group) => {
|
||||||
const deliveryStatus = group?.deliveryStatus || group?.delivery_status;
|
const deliveryStatus = group?.deliveryStatus || group?.delivery_status;
|
||||||
|
const notificationStatus = group?.notificationStatus || group?.notification_status;
|
||||||
|
|
||||||
if (deliveryStatus && deliveryStatus !== "pending_confirmation") {
|
// When auto-SMS failed and logistics hasn't taken action yet → show as a todo item
|
||||||
|
const isManualRequired = notificationStatus === "manual_required";
|
||||||
|
const isStillPending = !deliveryStatus || deliveryStatus === "pending_confirmation" || deliveryStatus === "manual_confirmation_required";
|
||||||
|
if (isManualRequired && isStillPending) {
|
||||||
|
return "Требуется ручное управление";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deliveryStatus && deliveryStatus !== "pending_confirmation" && deliveryStatus !== "manual_confirmation_required") {
|
||||||
return getOrderGroupDeliveryStatusLabel(deliveryStatus);
|
return getOrderGroupDeliveryStatusLabel(deliveryStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
const notificationStatus = group?.notificationStatus || group?.notification_status;
|
|
||||||
const notificationLabel = NOTIFICATION_STATUS_LABELS[notificationStatus];
|
const notificationLabel = NOTIFICATION_STATUS_LABELS[notificationStatus];
|
||||||
if (notificationLabel && notificationStatus !== "link_ready" && notificationStatus !== "not_started") {
|
if (notificationLabel && notificationStatus !== "link_ready" && notificationStatus !== "not_started") {
|
||||||
return notificationLabel;
|
return notificationLabel;
|
||||||
|
|
@ -156,8 +163,16 @@ export const getOrderGroupDisplayStatusLabel = (group) => {
|
||||||
|
|
||||||
export const getOrderGroupDisplayStatusValue = (group) => {
|
export const getOrderGroupDisplayStatusValue = (group) => {
|
||||||
const deliveryStatus = group?.deliveryStatus || group?.delivery_status;
|
const deliveryStatus = group?.deliveryStatus || group?.delivery_status;
|
||||||
|
const notificationStatus = group?.notificationStatus || group?.notification_status;
|
||||||
|
|
||||||
if (deliveryStatus) {
|
// Unify manual_required into a single bucket regardless of delivery_status detail
|
||||||
|
const isManualRequired = notificationStatus === "manual_required";
|
||||||
|
const isStillPending = !deliveryStatus || deliveryStatus === "pending_confirmation" || deliveryStatus === "manual_confirmation_required";
|
||||||
|
if (isManualRequired && isStillPending) {
|
||||||
|
return "status:manual_required";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deliveryStatus && deliveryStatus !== "pending_confirmation" && deliveryStatus !== "manual_confirmation_required") {
|
||||||
return `delivery:${deliveryStatus}`;
|
return `delivery:${deliveryStatus}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
-- Sync manual_required notification_status into unified "Требуется ручное управление" workflow
|
||||||
|
-- and clear it when logistics takes action (changes delivery_status).
|
||||||
|
|
||||||
|
-- 1. Backfill: normalize existing rows where notification_status is manual_required
|
||||||
|
-- and delivery_status is still pending/manual_confirmation_required.
|
||||||
|
update public.order_groups
|
||||||
|
set delivery_status = 'pending_confirmation',
|
||||||
|
updated_at = timezone('utc', now())
|
||||||
|
where notification_status = 'manual_required'
|
||||||
|
and delivery_status = 'manual_confirmation_required';
|
||||||
|
|
||||||
|
-- 2. When notification_status becomes manual_required, ensure delivery_status stays pending
|
||||||
|
-- so the group appears in the unified "Требуется ручное управление" bucket.
|
||||||
|
create or replace function public.sync_manual_required_notification()
|
||||||
|
returns trigger
|
||||||
|
language plpgsql
|
||||||
|
security definer
|
||||||
|
set search_path = public
|
||||||
|
as $$
|
||||||
|
begin
|
||||||
|
-- Only act when notification_status changed to manual_required
|
||||||
|
if new.notification_status = 'manual_required'
|
||||||
|
and (old is null or old.notification_status is distinct from new.notification_status) then
|
||||||
|
if new.delivery_status is null or new.delivery_status = 'manual_confirmation_required' then
|
||||||
|
new.delivery_status := 'pending_confirmation';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
return new;
|
||||||
|
end;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
drop trigger if exists sync_manual_required_notification_trigger on public.order_groups;
|
||||||
|
create trigger sync_manual_required_notification_trigger
|
||||||
|
before insert or update on public.order_groups
|
||||||
|
for each row
|
||||||
|
execute function public.sync_manual_required_notification();
|
||||||
|
|
||||||
|
-- 3. When delivery_status is changed by logistics (away from pending/manual_confirmation_required),
|
||||||
|
-- clear notification_status so the group leaves the manual-work bucket.
|
||||||
|
create or replace function public.clear_manual_required_on_action()
|
||||||
|
returns trigger
|
||||||
|
language plpgsql
|
||||||
|
security definer
|
||||||
|
set search_path = public
|
||||||
|
as $$
|
||||||
|
begin
|
||||||
|
if old.delivery_status in ('pending_confirmation', 'manual_confirmation_required')
|
||||||
|
and new.delivery_status not in ('pending_confirmation', 'manual_confirmation_required')
|
||||||
|
and old.notification_status = 'manual_required' then
|
||||||
|
new.notification_status := 'confirmed';
|
||||||
|
end if;
|
||||||
|
return new;
|
||||||
|
end;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
drop trigger if exists clear_manual_required_on_action_trigger on public.order_groups;
|
||||||
|
create trigger clear_manual_required_on_action_trigger
|
||||||
|
before update on public.order_groups
|
||||||
|
for each row
|
||||||
|
when (new.delivery_status is distinct from old.delivery_status)
|
||||||
|
execute function public.clear_manual_required_on_action();
|
||||||
Loading…
Reference in New Issue