- Публичная ссылка
+ Доставка заказа
Согласование доставки
{isActiveState
diff --git a/src/services/deliveryInvitationApi.js b/src/services/deliveryInvitationApi.js
index d28fd37..e8f3fe6 100644
--- a/src/services/deliveryInvitationApi.js
+++ b/src/services/deliveryInvitationApi.js
@@ -23,6 +23,11 @@ export const buildShowcaseInvitation = (token = SHOWCASE_TOKEN, now = new Date()
state: "awaiting_choice",
deliveryDate: firstDay,
deliveryTime: "До обеда",
+ orderItems: [
+ { name: "Кухонный гарнитур", quantity: "1 комплект" },
+ { name: "Фурнитура Blum", quantity: "12 шт" },
+ { name: "Монтажный комплект", quantity: "1 набор" },
+ ],
availableSlots: [
`${firstDay}, До обеда`,
`${firstDay}, После обеда`,
diff --git a/src/services/deliveryInvitationApi.test.js b/src/services/deliveryInvitationApi.test.js
index a243628..ea51377 100644
--- a/src/services/deliveryInvitationApi.test.js
+++ b/src/services/deliveryInvitationApi.test.js
@@ -73,6 +73,16 @@ describe("deliveryInvitationApi", () => {
]);
});
+ it("includes readable order items in the showcase invitation", () => {
+ const invitation = buildShowcaseInvitation("showcase", new Date("2026-04-14T09:00:00Z"));
+
+ expect(invitation.orderItems).toEqual([
+ { name: "Кухонный гарнитур", quantity: "1 комплект" },
+ { name: "Фурнитура Blum", quantity: "12 шт" },
+ { name: "Монтажный комплект", quantity: "1 набор" },
+ ]);
+ });
+
it("confirms a delivery choice with the chosen slot", async () => {
invoke.mockResolvedValueOnce({
data: {
diff --git a/supabase/functions/get-delivery-invitation/index.ts b/supabase/functions/get-delivery-invitation/index.ts
index 82a9836..8474949 100644
--- a/supabase/functions/get-delivery-invitation/index.ts
+++ b/supabase/functions/get-delivery-invitation/index.ts
@@ -5,6 +5,50 @@ import {
} from "../_shared/delivery-invitations.ts";
import { createServiceClient } from "../_shared/chatbot.ts";
+const normalizeOrderItems = (
+ items: unknown,
+): Array<{ name: string; quantity?: string }> => {
+ if (!Array.isArray(items)) {
+ return [];
+ }
+
+ return items
+ .map((item) => {
+ if (typeof item === "string") {
+ const [namePart, quantityPart] = item.split("|").map((part) => part.trim());
+ const name = namePart || item.trim();
+ if (!name) {
+ return null;
+ }
+
+ return quantityPart ? { name, quantity: quantityPart } : { name };
+ }
+
+ if (item && typeof item === "object") {
+ const typedItem = item as { name?: unknown; quantity?: unknown; label?: unknown };
+ const name = typeof typedItem.name === "string"
+ ? typedItem.name.trim()
+ : typeof typedItem.label === "string"
+ ? typedItem.label.trim()
+ : "";
+ const quantity = typeof typedItem.quantity === "string"
+ ? typedItem.quantity.trim()
+ : typeof typedItem.quantity === "number"
+ ? String(typedItem.quantity)
+ : "";
+
+ if (!name && !quantity) {
+ return null;
+ }
+
+ return quantity ? { name: name || "Позиция", quantity } : { name: name || "Позиция" };
+ }
+
+ return null;
+ })
+ .filter((item): item is { name: string; quantity?: string } => Boolean(item));
+};
+
const corsHeaders = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "authorization, x-client-info, apikey, content-type",
@@ -97,6 +141,7 @@ Deno.serve(async (request) => {
orderNumber: order.order_number,
customerName: order.customer?.name || invitation.customer_name || null,
customerPhone: order.customer?.phone || invitation.customer_phone || null,
+ orderItems: normalizeOrderItems(order.customer?.items),
availableSlots: invitation.available_slots || [],
deliveryDate: invitation.delivery_date || null,
deliveryTime: invitation.delivery_time || null,