From 017a46274604565ce8b4345030fc9a56af59ca30 Mon Sep 17 00:00:00 2001 From: Ruan Bueno Date: Wed, 20 Aug 2025 09:36:22 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20normaliza=20a=20ordena=C3=A7=C3=A3o=20de?= =?UTF-8?q?=20opcionais=20e=20ajusta=20a=20chave=20de=20agrupamento=20para?= =?UTF-8?q?=20pedidos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/cron/food_orders/route.ts | 7 +++++++ src/lib/mail/html-mock.ts | 11 ++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/app/api/cron/food_orders/route.ts b/src/app/api/cron/food_orders/route.ts index 12277af6..cf13c451 100644 --- a/src/app/api/cron/food_orders/route.ts +++ b/src/app/api/cron/food_orders/route.ts @@ -65,7 +65,14 @@ export async function GET() { const pedidosAgrupados: GroupedEmailOrder[] = orders.map((order, idx) => { const fullName = `${order.user.firstName} ${order.user?.lastName ?? ""}`.trim(); const prato = order.menuItem?.name ?? ""; + // Ordena por nome da opção e depois nome da escolha para garantir consistência const opcionais = (order.optionSelections ?? []) + .slice() + .sort((a, b) => { + const optCmp = a.choice.option.name.localeCompare(b.choice.option.name, "pt-BR", { sensitivity: "base" }); + if (optCmp !== 0) return optCmp; + return a.choice.name.localeCompare(b.choice.name, "pt-BR", { sensitivity: "base" }); + }) .map((sel) => `${sel.choice.option.name}: ${sel.choice.name}`) .filter(Boolean); const opc = opcionais.length > 0 ? opcionais.join(", ") : ""; // vazio => "sem adicional" diff --git a/src/lib/mail/html-mock.ts b/src/lib/mail/html-mock.ts index eedcb6a2..9c030b6c 100644 --- a/src/lib/mail/html-mock.ts +++ b/src/lib/mail/html-mock.ts @@ -495,7 +495,16 @@ export type GroupedEmailOrder = { function getGroupKey(p: GroupedEmailOrder) { const opc = (p.opc ?? "").trim(); - return opc ? `${p.prato} com ${opc}` : `${p.prato} sem adicional`; + if (!opc) return `${p.prato} sem adicional`; + // Normaliza a string de opcionais para evitar diferenças de ordem + // Ex.: "Feijão: Sim, Salada: Não" e "Salada: Não, Feijão: Sim" viram a mesma chave + const normalized = opc + .split(",") + .map((s) => s.trim()) + .filter(Boolean) + .sort((a, b) => a.localeCompare(b, "pt-BR", { sensitivity: "base" })) + .join(", "); + return `${p.prato} com ${normalized}`; } function groupPedidosByPratoOpc(pedidos: GroupedEmailOrder[]) {