From b888eba09b4a713eb07467d1b087fd1e59e1acae Mon Sep 17 00:00:00 2001 From: root Date: Mon, 15 Jun 2026 17:32:14 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BA=D0=BE=D0=BB=D0=BE=D0=BD=D0=BA?= =?UTF-8?q?=D0=B0=20has=5Fdelivery=5Fproblem=20+=20delivery=5Fproblem=5Fno?= =?UTF-8?q?te?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - saveShipmentData автоматически заполняет has_delivery_problem (boolean) и delivery_problem_note (текст с перечислением неотгруженных позиций и причин) - OrdersTable: колонка 'Проблема' показывает ⚠ Проблема + детали из delivery_problem_note - orderGroupViews: warning-тон для групп с hasDeliveryProblem - n8n/1C: просто читать has_delivery_problem (0/1) и delivery_problem_note --- src/components/orders/OrdersTable.jsx | 68 +++++++------------ src/services/orderGroupViews.js | 8 +-- src/services/supabase/orderGroupRepository.js | 11 ++- 3 files changed, 37 insertions(+), 50 deletions(-) diff --git a/src/components/orders/OrdersTable.jsx b/src/components/orders/OrdersTable.jsx index 09acfd9..f64b1b5 100644 --- a/src/components/orders/OrdersTable.jsx +++ b/src/components/orders/OrdersTable.jsx @@ -136,29 +136,17 @@ export const OrdersTable = ({
{buildGroupSummary(group)}
{renderMobileOrderNumbers(group)}
- {(() => { - const issues = getShipmentIssues(group); - const data = group?.driverShipmentData; - if (!Array.isArray(data) || data.length === 0) return null; - const shippedCount = data.filter((i) => i.shipped).length; - const total = data.length; - if (issues && issues.length > 0) { - return ( -
- ⚠ Отгрузка: {shippedCount}/{total} - — {issues.slice(0, 2).map((i) => i.name).join(", ")}{issues.length > 2 ? ` +${issues.length - 2}` : ""} - {issues.some((i) => i.comment) && ( -
{issues.filter((i) => i.comment).slice(0, 1).map((i) => i.comment)}
- )} -
- ); - } - return ( -
- ✓ Отгружено: {total}/{total} -
- ); - })()} + {group.hasDeliveryProblem && ( +
+ ⚠ Проблема с доставкой + {group.deliveryProblemNote && ( +
{group.deliveryProblemNote}
+ )} +
+ )} + {!group.hasDeliveryProblem && Array.isArray(group?.driverShipmentData) && group.driverShipmentData.length > 0 && ( +
✓ Доставка без проблем
+ )}
{formatDateTime(group.updatedAt)}
@@ -179,7 +167,7 @@ export const OrdersTable = ({
Статус
Водитель
Дата доставки
-
Отгрузка
+
Проблема
Обновлён
{orderGroups.map((group) => ( @@ -213,26 +201,20 @@ export const OrdersTable = ({ )}
- {(() => { - const issues = getShipmentIssues(group); - const data = group?.driverShipmentData; - if (!Array.isArray(data) || data.length === 0) { - return ; - } - const shippedCount = data.filter((i) => i.shipped).length; - const total = data.length; - if (issues && issues.length > 0) { - return ( -
- ⚠ {shippedCount}/{total} -
- {issues.slice(0, 2).map((i) => i.name).join(", ")}{issues.length > 2 ? ` +${issues.length - 2}` : ""} -
+ {group.hasDeliveryProblem ? ( +
+ ⚠ Проблема + {group.deliveryProblemNote && ( +
+ {group.deliveryProblemNote}
- ); - } - return ✓ {total}/{total}; - })()} + )} +
+ ) : Array.isArray(group?.driverShipmentData) && group.driverShipmentData.length > 0 ? ( + ✓ Ок + ) : ( + + )}
{formatDateTime(group.updatedAt)} diff --git a/src/services/orderGroupViews.js b/src/services/orderGroupViews.js index 8487470..d831178 100644 --- a/src/services/orderGroupViews.js +++ b/src/services/orderGroupViews.js @@ -461,12 +461,8 @@ export const buildOrderGroupBuckets = (groups) => { export const getOrderGroupStatusTone = (group) => { const deliveryStatus = group?.deliveryStatus || group?.delivery_status; - // Highlight groups with shipment issues (partial delivery) - const shipmentData = group?.driverShipmentData; - if (Array.isArray(shipmentData) && shipmentData.length > 0) { - const hasIssues = shipmentData.some((i) => !i.shipped); - if (hasIssues) return "warning"; - } + // Highlight groups with delivery problems + if (group?.hasDeliveryProblem) return "warning"; if (deliveryStatus && deliveryStatus !== "pending_confirmation") { return getOrderGroupDeliveryStatusTone(deliveryStatus); diff --git a/src/services/supabase/orderGroupRepository.js b/src/services/supabase/orderGroupRepository.js index 6c2d2af..8a69f82 100644 --- a/src/services/supabase/orderGroupRepository.js +++ b/src/services/supabase/orderGroupRepository.js @@ -221,6 +221,8 @@ export const mapOrderGroupRowToDeliveryGroup = (row) => { pickupDate: row.pickup_date || null, pickupTimeSlot: row.pickup_time_slot || null, driverShipmentData: row.driver_shipment_data || null, + hasDeliveryProblem: row.has_delivery_problem || false, + deliveryProblemNote: row.delivery_problem_note || null, syncedTo1cAt: row.synced_to_1c_at || null, deliveryHalfDay: getOrderGroupDeliveryHalfDay({ deliveryHalfDay: rawDeliveryHalfDay, @@ -262,7 +264,7 @@ export const mapOrderGroupRowToDeliveryGroup = (row) => { }; }; -const ORDER_GROUP_SELECT_FIELDS = `id, group_key, order_numbers, status, delivery_status, sms_sent_at, created_at, updated_at, created_from_exchange_at, source_key, customer_name, customer_phone, customer_phone_normalized, customer_date, orders_total, orders_ready, orders_not_ready, source_orders, order_list, order_list_structured, delivery_invitation_id, delivery_link, notification_status, sms_attempts, first_sms_sent_at, second_sms_sent_at, last_sms_error, next_notification_check_at, delivery_date, delivery_time, delivery_address, customer_address, delivery_date_source, manual_confirmation_at, paid_storage_at, assigned_driver_id, assigned_driver:users!order_groups_assigned_driver_id_fkey(id, name), driver_shipment_data, delivery_type, pickup_date, pickup_time_slot, synced_to_1c_at`; +const ORDER_GROUP_SELECT_FIELDS = `id, group_key, order_numbers, status, delivery_status, sms_sent_at, created_at, updated_at, created_from_exchange_at, source_key, customer_name, customer_phone, customer_phone_normalized, customer_date, orders_total, orders_ready, orders_not_ready, source_orders, order_list, order_list_structured, delivery_invitation_id, delivery_link, notification_status, sms_attempts, first_sms_sent_at, second_sms_sent_at, last_sms_error, next_notification_check_at, delivery_date, delivery_time, delivery_address, customer_address, delivery_date_source, manual_confirmation_at, paid_storage_at, assigned_driver_id, assigned_driver:users!order_groups_assigned_driver_id_fkey(id, name), driver_shipment_data, delivery_type, pickup_date, pickup_time_slot, has_delivery_problem, delivery_problem_note, synced_to_1c_at`; export const updateOrderGroupDeliveryChoice = async ({ orderGroupId, @@ -391,11 +393,18 @@ export const assignDriverToOrderGroup = async ({ export const saveShipmentData = async ({ orderGroupId, shipmentData }) => { return safeSupabaseCall(async () => { const client = requireSupabase(); + const unshipped = shipmentData.filter((i) => !i.shipped); + const hasProblem = unshipped.length > 0; + const problemNote = hasProblem + ? unshipped.map((i) => `${i.name}${i.quantity ? ` (${i.quantity}${i.unit ? ` ${i.unit}` : ""})` : ""}${i.comment ? ` — ${i.comment}` : ""}`).join("; ") + : null; const { error: updateError } = await client .from("order_groups") .update({ driver_shipment_data: shipmentData, + has_delivery_problem: hasProblem, + delivery_problem_note: problemNote, updated_at: new Date().toISOString(), }) .eq("id", orderGroupId);