fix(timeline): StatusSummary/Stepper show real SMS state from sms_campaign_log (delivered/failed), not just first_sms_sent_at
This commit is contained in:
parent
6fe0bfbc73
commit
4a4b088949
|
|
@ -172,7 +172,7 @@ const STAGES_PICKUP = [
|
||||||
{ key: "picked_up", icon: "📦", label: "Вывезено" },
|
{ key: "picked_up", icon: "📦", label: "Вывезено" },
|
||||||
];
|
];
|
||||||
|
|
||||||
const getActiveStageIndex = (order) => {
|
const getActiveStageIndex = (order, smsLogs = []) => {
|
||||||
const deliveryStatus = order?.deliveryStatus || order?.delivery_status || "";
|
const deliveryStatus = order?.deliveryStatus || order?.delivery_status || "";
|
||||||
const notifStatus = order?.notificationStatus || order?.notification_status || "";
|
const notifStatus = order?.notificationStatus || order?.notification_status || "";
|
||||||
const firstSms = order?.firstSmsSentAt || order?.first_sms_sent_at;
|
const firstSms = order?.firstSmsSentAt || order?.first_sms_sent_at;
|
||||||
|
|
@ -197,17 +197,19 @@ const getActiveStageIndex = (order) => {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (firstSms || ["first_sms_sent", "second_sms_sent", "confirmed"].includes(notifStatus)) {
|
// SMS stage counts as done when any first_sms record exists (even failed), not just when delivered
|
||||||
|
const hasFirstSmsLog = smsLogs.some((l) => l.campaign_type === "first_sms");
|
||||||
|
if (firstSms || hasFirstSmsLog || ["first_sms_sent", "second_sms_sent", "confirmed"].includes(notifStatus)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
const ProgressStepper = ({ order }) => {
|
const ProgressStepper = ({ order, smsLogs = [] }) => {
|
||||||
const isPickup = (order?.deliveryType || order?.delivery_type) === "pickup";
|
const isPickup = (order?.deliveryType || order?.delivery_type) === "pickup";
|
||||||
const stages = isPickup ? STAGES_PICKUP : STAGES_DELIVERY;
|
const stages = isPickup ? STAGES_PICKUP : STAGES_DELIVERY;
|
||||||
const activeIdx = getActiveStageIndex(order);
|
const activeIdx = getActiveStageIndex(order, smsLogs);
|
||||||
|
|
||||||
if (activeIdx === -1) {
|
if (activeIdx === -1) {
|
||||||
return (
|
return (
|
||||||
|
|
@ -274,7 +276,7 @@ const ProgressStepper = ({ order }) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
// ─── Current Status Summary (compact card above timeline) ───────────
|
// ─── Current Status Summary (compact card above timeline) ───────────
|
||||||
const StatusSummary = ({ order }) => {
|
const StatusSummary = ({ order, smsLogs = [] }) => {
|
||||||
const isPickup = (order?.deliveryType || order?.delivery_type) === "pickup";
|
const isPickup = (order?.deliveryType || order?.delivery_type) === "pickup";
|
||||||
const deliveryStatus = order?.deliveryStatus || order?.delivery_status || "";
|
const deliveryStatus = order?.deliveryStatus || order?.delivery_status || "";
|
||||||
const notifStatus = order?.notificationStatus || order?.notification_status || "";
|
const notifStatus = order?.notificationStatus || order?.notification_status || "";
|
||||||
|
|
@ -291,13 +293,29 @@ const StatusSummary = ({ order }) => {
|
||||||
|
|
||||||
const items = [];
|
const items = [];
|
||||||
|
|
||||||
// SMS status
|
// SMS status — prefer sms_campaign_log when available (real delivery state)
|
||||||
if (firstSms) {
|
const firstSmsLog = smsLogs.find((l) => l.campaign_type === "first_sms");
|
||||||
|
const secondSmsLog = smsLogs.find((l) => l.campaign_type === "second_sms");
|
||||||
|
const isDelivered = (log) => log && (log.status === "delivered" || log.sms_code === "103");
|
||||||
|
const isFailed = (log) => log && ["expired", "error", "send_failed", "limit_exceeded"].includes(log.status);
|
||||||
|
|
||||||
|
if (isDelivered(firstSmsLog)) {
|
||||||
|
items.push({ icon: "📨", label: "1-е SMS", value: `доставлено ${fmtTimestamp(firstSmsLog.updated_at || firstSmsLog.created_at)}`, tone: "ok" });
|
||||||
|
} else if (isFailed(firstSmsLog)) {
|
||||||
|
items.push({ icon: "📨", label: "1-е SMS", value: `${fmtTimestamp(firstSmsLog.created_at)} · ${firstSmsLog.status === "expired" ? "не доставлено (срок истёк)" : firstSmsLog.status}${firstSmsLog.error_message ? ` · ${firstSmsLog.error_message}` : ""}`, tone: "danger" });
|
||||||
|
} else if (firstSms) {
|
||||||
items.push({ icon: "📨", label: "1-е SMS", value: fmtTimestamp(firstSms), tone: "ok" });
|
items.push({ icon: "📨", label: "1-е SMS", value: fmtTimestamp(firstSms), tone: "ok" });
|
||||||
|
} else if (firstSmsLog) {
|
||||||
|
items.push({ icon: "📨", label: "1-е SMS", value: `${fmtTimestamp(firstSmsLog.created_at)} · ${firstSmsLog.status || "отправлено"}`, tone: "warning" });
|
||||||
} else {
|
} else {
|
||||||
items.push({ icon: "📨", label: "1-е SMS", value: "не отправлено", tone: "muted" });
|
items.push({ icon: "📨", label: "1-е SMS", value: "не отправлено", tone: "muted" });
|
||||||
}
|
}
|
||||||
if (secondSms) {
|
|
||||||
|
if (isDelivered(secondSmsLog)) {
|
||||||
|
items.push({ icon: "📨", label: "2-е SMS", value: `доставлено ${fmtTimestamp(secondSmsLog.updated_at || secondSmsLog.created_at)}`, tone: "ok" });
|
||||||
|
} else if (isFailed(secondSmsLog)) {
|
||||||
|
items.push({ icon: "📨", label: "2-е SMS", value: `${fmtTimestamp(secondSmsLog.created_at)} · ${secondSmsLog.status === "expired" ? "не доставлено (срок истёк)" : secondSmsLog.status}${secondSmsLog.error_message ? ` · ${secondSmsLog.error_message}` : ""}`, tone: "danger" });
|
||||||
|
} else if (secondSms) {
|
||||||
items.push({ icon: "📨", label: "2-е SMS", value: fmtTimestamp(secondSms), tone: "ok" });
|
items.push({ icon: "📨", label: "2-е SMS", value: fmtTimestamp(secondSms), tone: "ok" });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -600,8 +618,8 @@ export const OrderHistoryTimeline = ({ order, userRole }) => {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<ProgressStepper order={order} />
|
<ProgressStepper order={order} smsLogs={smsLogs} />
|
||||||
<StatusSummary order={order} />
|
<StatusSummary order={order} smsLogs={smsLogs} />
|
||||||
<div className={`rounded-xl border px-3 py-2.5 ${
|
<div className={`rounded-xl border px-3 py-2.5 ${
|
||||||
activePushSubscriptions.length > 0
|
activePushSubscriptions.length > 0
|
||||||
? "border-[rgba(18,128,92,0.25)] bg-[var(--color-accent-soft)]"
|
? "border-[rgba(18,128,92,0.25)] bg-[var(--color-accent-soft)]"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue