From 85ecee935b448bb74d97cf9401486f633aa68e17 Mon Sep 17 00:00:00 2001 From: chattie Date: Mon, 24 Aug 2026 17:22:08 +0200 Subject: [PATCH] fix: frontend fixes batch - live search proxy, quick products 10 slots, categories emoji list, bell notifications with tabs, awaiting payment orders endpoint --- .../src/app/(dashboard)/categories/page.tsx | 54 ++++- .../admin/src/app/(dashboard)/pos/page.tsx | 4 +- .../src/components/BellNotifications.tsx | 99 +++++++++ .../src/components/OrderNotifications.tsx | 198 +++++++++++++----- project/apps/admin/src/lib/api-client.ts | 4 + .../84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg | Bin 0 -> 3789 bytes .../84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg | Bin 0 -> 568 bytes .../84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg | Bin 0 -> 37630 bytes .../app/api/catalog-proxy/[...path]/route.ts | 39 ++++ project/frontend/src/lib/api.ts | 11 +- .../modules/admin/api/notifications.routes.ts | 65 ++++++ .../backoffice/api/backoffice.routes.ts | 23 ++ .../src/modules/orders/api/orders.routes.ts | 32 +++ .../84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg | Bin 0 -> 3789 bytes .../84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg | Bin 0 -> 568 bytes .../84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg | Bin 0 -> 37630 bytes work/runtime-status.json | 2 +- 17 files changed, 460 insertions(+), 71 deletions(-) create mode 100644 project/apps/admin/src/components/BellNotifications.tsx create mode 100644 project/frontend/public/uploads/200/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg create mode 100644 project/frontend/public/uploads/40/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg create mode 100644 project/frontend/public/uploads/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg create mode 100644 project/frontend/src/app/api/catalog-proxy/[...path]/route.ts create mode 100644 project/src/modules/admin/api/notifications.routes.ts create mode 100644 project/storefront/public/uploads/200/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg create mode 100644 project/storefront/public/uploads/40/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg create mode 100644 project/storefront/public/uploads/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg diff --git a/project/apps/admin/src/app/(dashboard)/categories/page.tsx b/project/apps/admin/src/app/(dashboard)/categories/page.tsx index 9a2d8e4..cbf442d 100644 --- a/project/apps/admin/src/app/(dashboard)/categories/page.tsx +++ b/project/apps/admin/src/app/(dashboard)/categories/page.tsx @@ -91,11 +91,41 @@ const EMPTY_FORM: FormState = { }; const EMOJI_OPTIONS = [ - 'πŸ₯¬', 'πŸ₯•', '🍎', 'πŸ₯‘', '🍞', 'πŸ§€', 'πŸ₯›', '🍯', '🌾', 'πŸ₯œ', - '🍡', 'β˜•', '🍫', '🧴', '🧼', '🌿', '🌱', '🌸', '🐝', 'πŸ‡', - '🧺', '♻️', '🏺', '🍢', 'πŸ₯£', '🧊', 'πŸ‡', 'πŸ”', '🐟', '🍊', + // Frutas y verduras + 'πŸ₯¬', 'πŸ₯¦', 'πŸ₯•', 'πŸ†', '🌢️', 'πŸ₯‘', 'πŸ₯’', 'πŸ«‘', 'πŸ§…', 'πŸ§„', + 'πŸ…', 'πŸ₯”', 'πŸ₯', '🍞', 'πŸ₯–', 'πŸ«“', 'πŸ₯—', 'πŸ₯™', '🌽', '🍠', + // Frutas + '🍎', '🍏', '🍐', '🍊', 'πŸ‹', '🍌', 'πŸ‰', 'πŸ‡', 'πŸ“', '🫐', + 'πŸ’', 'πŸ‘', 'πŸ₯­', '🍍', 'πŸ₯₯', 'πŸ₯', 'πŸ«’', 'πŸ…', 'πŸ₯‘', '🍏', + // LΓ‘cteos y huevos + 'πŸ₯›', 'πŸ§€', '🍢', 'πŸ₯›', '🧈', 'πŸ§€', 'πŸ₯š', '🍳', 'πŸ§€', '🧁', + // Aceites y condimentos + 'πŸ«’', 'πŸ«™', 'πŸ§‚', '🌢️', 'πŸ§„', '🍯', 'πŸ«•', 'πŸ§‚', 'πŸ₯«', 'πŸ«—', + // Infusiones y bebidas + '🍡', 'β˜•', 'πŸ«–', '🍺', '🍷', 'πŸ₯‚', '🍾', 'πŸ§ƒ', 'πŸ₯€', 'πŸ§‹', + // Especias y semillas + '🌿', '🌱', '🌾', 'πŸ₯œ', '🌰', '🫘', '🫘', '🫘', 'πŸ„', '🦴', + // EcolΓ³gico y naturaleza + '🌸', '🌻', '🌺', '🌹', 'πŸͺ»', '🌾', '🌡', '🌲', 'πŸͺ¨', 'πŸƒ', + // Animales y eco + '🐝', 'πŸ‡', 'πŸ¦†', 'πŸ”', '🐟', '🦐', '🐚', 'πŸ¦€', '🍯', '🐝', + // Diversos alimentaciΓ³n + '🍫', '🍬', '🍭', '🍦', '🧁', '🍩', 'πŸͺ', 'πŸŽ‚', '🍰', 'πŸ₯§', + 'πŸ§‡', '🧈', 'πŸ₯“', 'πŸ₯©', 'πŸ–', '🌯', 'πŸ₯™', 'πŸ₯—', '🍜', '🍝', + 'πŸ•', 'πŸ₯ͺ', 'πŸ₯', 'πŸ«“', 'πŸ₯―', 'πŸ§‡', 'πŸ₯ž', 'πŸ₯ž', '🍳', 'πŸ§ƒ', ]; +// CategorΓ­as populares predefinidas +const CATEGORY_EMOJI_SUGGESTIONS = [ + 'πŸ₯¬ Hortalizas', '🍎 Frutas', 'πŸ§€ LΓ‘cteos', '🍯 Miel y Derivatives', + '🌿 Hierbas aromΓ‘ticas', 'πŸ«’ Aceites', 'β˜• CafΓ© e infusiones', + '🍞 PanaderΓ­a', 'πŸ₯œ Frutos secos', '🍫 Chocolate', + '🧴 CosmΓ©tica natural', '🌱 Semillas y germinados', 'πŸ„ Setas', + 'πŸ₯¦ Colesterol y salud', '🧺 Compra a granel', '♻️ Cero residuos', +]; + +const EMOJI_CODE_HINT = 'U+1F34E (🍎) β€” busca en emojipedia.org'; + const CARD_PRESETS: Array<{ bg: string; text: string; label: string }> = [ { bg: '#F1F8E9', text: '#2D6A4F', label: 'Verde' }, { bg: '#FFF8E1', text: '#B07D2B', label: 'Miel' }, @@ -376,7 +406,7 @@ export default function CategoriesPage() { className="text-xs text-gray-400 hover:text-red-500">Quitar )} -
+
{EMOJI_OPTIONS.map((emoji) => ( ))}
-

Emoji identificativo que aparecerΓ‘ en las tarjetas de categorΓ­a.

+
+ setForm((f) => ({ ...f, emoji: e.target.value.slice(0, 8) }))} + placeholder="πŸ˜€ o U+1F600" + maxLength={8} + className="flex-1 px-3 py-2 border border-gray-300 rounded-xl text-sm text-2xl text-center" + title={EMOJI_CODE_HINT} + /> + + Escribe emoji o U+XXXX + +
+

Emoji identificativo que aparecerΓ‘ en las tarjetas de categorΓ­a. Escribe o pega cualquier emoji.

diff --git a/project/apps/admin/src/app/(dashboard)/pos/page.tsx b/project/apps/admin/src/app/(dashboard)/pos/page.tsx index 3a024da..01e0391 100644 --- a/project/apps/admin/src/app/(dashboard)/pos/page.tsx +++ b/project/apps/admin/src/app/(dashboard)/pos/page.tsx @@ -93,7 +93,7 @@ export default function PosAdminPage() { const [touchEnabled, setTouchEnabled] = useState(true); const [discountsEnabled, setDiscountsEnabled] = useState(true); const [quickSlots, setQuickSlots] = useState>( - Array.from({ length: 8 }, () => null), + Array.from({ length: 10 }, () => null), ); const [savingTouch, setSavingTouch] = useState(false); const [touchMessage, setTouchMessage] = useState(''); @@ -197,7 +197,7 @@ export default function PosAdminPage() { setTouchEnabled(terminal.settings?.touchNavigationEnabled !== false); setDiscountsEnabled(terminal.settings?.lineDiscountsEnabled !== false); const configured = terminal.settings?.quickProductVariantIds ?? []; - setQuickSlots(Array.from({ length: 8 }, (_, slot) => configured[slot] ?? null)); + setQuickSlots(Array.from({ length: 10 }, (_, slot) => configured[slot] ?? null)); setTouchMessage(''); setSelfpayMode(terminal.settings?.selfpayMode ?? false); setClosePinRequired(terminal.settings?.closeSessionRequiresPin ?? false); diff --git a/project/apps/admin/src/components/BellNotifications.tsx b/project/apps/admin/src/components/BellNotifications.tsx new file mode 100644 index 0000000..240cd54 --- /dev/null +++ b/project/apps/admin/src/components/BellNotifications.tsx @@ -0,0 +1,99 @@ +'use client'; +import { useState, useEffect, useRef } from 'react'; + +interface Notification { + id: string; + type: 'pending_orders' | 'stale_shipped' | 'awaiting_payment'; + count: number; + message: string; + href: string; +} + +const ICONS: Record = { + pending_orders: 'πŸ“¦', + stale_shipped: '🚚', + awaiting_payment: 'πŸ’³', +}; + +export function BellNotifications() { + const [notifications, setNotifications] = useState([]); + const [open, setOpen] = useState(false); + const ref = useRef(null); + + const load = async () => { + try { + const res = await fetch('/api/backoffice/notifications', { credentials: 'include' }); + if (!res.ok) return; + const data = await res.json() as { items?: Notification[] }; + setNotifications(data.items ?? []); + } catch { /* silent */ } + }; + + useEffect(() => { void load(); void setInterval(load, 60_000); }, []); + + useEffect(() => { + const handler = (e: MouseEvent) => { + if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); + }; + document.addEventListener('mousedown', handler); + return () => document.removeEventListener('mousedown', handler); + }, []); + + const total = notifications.reduce((s, n) => s + n.count, 0); + + return ( +
+ + + {open && ( +
+
+

Notificaciones

+ +
+
+ {notifications.length === 0 ? ( +
+ ✨ Todo en orden +
+ ) : ( + notifications.map((n) => ( + setOpen(false)}> + {ICONS[n.type]} +
+

{n.message}

+

{n.count} pedido{n.count !== 1 ? 's' : ''}

+
+
+ )) + )} +
+ {total > 0 && ( + + )} +
+ )} +
+ ); +} diff --git a/project/apps/admin/src/components/OrderNotifications.tsx b/project/apps/admin/src/components/OrderNotifications.tsx index c052455..20511cd 100644 --- a/project/apps/admin/src/components/OrderNotifications.tsx +++ b/project/apps/admin/src/components/OrderNotifications.tsx @@ -16,101 +16,185 @@ function money(cents: number): string { return new Intl.NumberFormat('es-ES', { style: 'currency', currency: 'EUR' }).format(cents / 100); } +type AwaitingPaymentItem = { id: string; totalCents: number; customerEmail: string | null; createdAt: string }; + export function OrderNotifications() { const [open, setOpen] = useState(false); - const [items, setItems] = useState([]); - const [total, setTotal] = useState(0); + const [staleItems, setStaleItems] = useState([]); + const [staleTotal, setStaleTotal] = useState(0); + const [awaitingItems, setAwaitingItems] = useState([]); + const [awaitingTotal, setAwaitingTotal] = useState(0); + const [tab, setTab] = useState<'pending' | 'awaiting'>('pending'); const [loading, setLoading] = useState(true); - const [error, setError] = useState(''); const rootRef = useRef(null); const load = useCallback(async () => { - setError(''); try { - const data = await ordersApi.staleNotifications(); - setItems(data.items); - setTotal(data.total); - } catch (err) { - setError(err instanceof Error ? err.message : 'No se pudieron cargar las notificaciones'); - } finally { - setLoading(false); - } + const [staleData, awaitingData] = await Promise.all([ + ordersApi.staleNotifications(24, 20), + ordersApi.awaitingPaymentNotifications(), + ]); + setStaleItems(staleData.items); + setStaleTotal(staleData.total); + setAwaitingItems(awaitingData.items); + setAwaitingTotal(awaitingData.total); + } catch { /* silent */ } + finally { setLoading(false); } }, []); - useEffect(() => { - void load(); - const timer = window.setInterval(() => void load(), POLL_INTERVAL_MS); - return () => window.clearInterval(timer); - }, [load]); + useEffect(() => { void load(); void setInterval(load, POLL_INTERVAL_MS); }, [load]); useEffect(() => { if (!open) return; void load(); - const close = (event: MouseEvent) => { - if (!rootRef.current?.contains(event.target as Node)) setOpen(false); - }; - const key = (event: KeyboardEvent) => { - if (event.key === 'Escape') setOpen(false); - }; + const close = (event: MouseEvent) => { if (!rootRef.current?.contains(event.target as Node)) setOpen(false); }; + const key = (event: KeyboardEvent) => { if (event.key === 'Escape') setOpen(false); }; document.addEventListener('mousedown', close); document.addEventListener('keydown', key); - return () => { - document.removeEventListener('mousedown', close); - document.removeEventListener('keydown', key); - }; + return () => { document.removeEventListener('mousedown', close); document.removeEventListener('keydown', key); }; }, [open, load]); + const grandTotal = staleTotal + awaitingTotal; + const pendingItems = staleItems.filter(i => i.state === 'PENDING'); + const shippedItems = staleItems.filter(i => i.state === 'SHIPPED'); + + const TabPending = () => ( +
+ {loading ? ( +

Cargando…

+ ) : pendingItems.length === 0 && shippedItems.length === 0 ? ( +

No hay pedidos pendientes o atrasados.

+ ) : ( + <> + {pendingItems.length > 0 && ( +
+

+ πŸ“¦ {pendingItems.length} pendientes de procesar +

+ {pendingItems.map((item) => ( + setOpen(false)} + className="block border-b border-gray-100 px-4 py-3 last:border-0 hover:bg-gray-50"> +
+
+

Pedido #{item.id.slice(0, 8)}

+

{item.customerEmail || 'Sin email'}

+
+ Pendiente +
+
+ {ageLabel(item.ageHours)} + {money(item.totalCents)} +
+ + ))} +
+ )} + {shippedItems.length > 0 && ( +
+

+ 🚚 {shippedItems.length} en trÑnsito sin actualizar +

+ {shippedItems.map((item) => ( + setOpen(false)} + className="block border-b border-gray-100 px-4 py-3 last:border-0 hover:bg-gray-50"> +
+
+

Pedido #{item.id.slice(0, 8)}

+

{item.customerEmail || 'Sin email'}

+
+ Enviado +
+
+ {ageLabel(item.ageHours)} + {money(item.totalCents)} +
+ + ))} +
+ )} + + )} +
+ ); + + const TabAwaiting = () => ( +
+ {loading ? ( +

Cargando…

+ ) : awaitingItems.length === 0 ? ( +

No hay pagos pendientes.

+ ) : ( + <> +

+ πŸ’³ {awaitingItems.length} esperando confirmaciΓ³n de pago +

+ {awaitingItems.map((item) => ( + setOpen(false)} + className="block border-b border-gray-100 px-4 py-3 last:border-0 hover:bg-gray-50"> +
+
+

Pedido #{item.id.slice(0, 8)}

+

{item.customerEmail || 'Sin email'}

+
+ Esperando pago +
+
{money(item.totalCents)}
+ + ))} + + )} +
+ ); + return (
{open && ( -
+
-
-

Pedidos para revisar

-

Pendientes o enviados sin cambios en 24 h

-
+

Notificaciones

-
- {loading &&

Cargando…

} - {!loading && error &&

{error}

} - {!loading && !error && items.length === 0 &&

No hay pedidos atrasados.

} - {!loading && !error && items.map((item) => ( - setOpen(false)} className="block border-b border-gray-100 px-4 py-3 last:border-0 hover:bg-gray-50"> -
-
-

Pedido #{item.id.slice(0, 8)}

-

{item.customerEmail || 'Cliente sin email'}

-
- - {item.state === 'PENDING' ? 'Pendiente' : 'Enviado'} - -
-
- {ageLabel(item.ageHours)} - {money(item.totalCents)} -
- - ))} + {/* Tabs */} +
+ +
- {total > items.length && setOpen(false)} className="block border-t border-gray-100 px-4 py-3 text-center text-sm font-medium text-[#2D6A4F] hover:bg-gray-50">Ver los {total} pedidos} +
+ {tab === 'pending' ? : } +
+ {grandTotal > 0 && ( + setOpen(false)} + className="block border-t border-gray-100 px-4 py-3 text-center text-sm font-medium text-[#2D6A4F] hover:bg-gray-50"> + Ver todos los pedidos β†’ + + )}
)}
diff --git a/project/apps/admin/src/lib/api-client.ts b/project/apps/admin/src/lib/api-client.ts index 9c1f8b3..f3b1e68 100644 --- a/project/apps/admin/src/lib/api-client.ts +++ b/project/apps/admin/src/lib/api-client.ts @@ -142,6 +142,10 @@ export const ordersApi = { api.get<{ total: number; thresholdHours: number; items: StaleOrderNotification[] }>( `/api/orders/notifications/stale?hours=${hours}&limit=${limit}`, ), + awaitingPaymentNotifications: () => + api.get<{ total: number; items: Array<{ id: string; totalCents: number; customerEmail: string | null; createdAt: string }> }>( + '/api/orders/notifications/awaiting-payment', + ), }; // ── Customers ───────────────────────────────────────────────────────────────── diff --git a/project/frontend/public/uploads/200/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg b/project/frontend/public/uploads/200/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3e982a6dfc56fe5e4512a0df530561c05bb7c4a GIT binary patch literal 3789 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 literal 0 HcmV?d00001 diff --git a/project/frontend/public/uploads/40/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg b/project/frontend/public/uploads/40/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a6122c9aa30a384674b6473bd782ea3c40a6ece GIT binary patch literal 568 zcmex=5A1R0qH8UG()kYQkCU}R-vWIzB`MrIZ^b|wy>tf~M5BMXqr3|GL&z{D)bA|!0c zDx&DfrW9Bh3{)n;2nGlv7#J9tSXhBFa)Jy@K){S7#mFSc%p#;{Soq=pEe0NDpn-zS zf(-Tyzm`Uox%d`l&tsHnEp>n5;&Wd4s~gX{XYyaT)}ClR$IH($kE!#t?H0dj% z^W&GFOi~l~xn($avD)-_6UK-WKaOr%9B-?Zn=9L=nR~Hv;?u3=@6Q%3{bf_U-GcK7 zYti^B;0I2WLJz@%Y%jFM5AwCn@QBG*(QU_4*`BHAe@J`j;ItFS}<7-cvZaa{7wK fu-v$V2iv*hPOJ?r(Qa{_Dze){(xYPw|Nol+;OMGX literal 0 HcmV?d00001 diff --git a/project/frontend/public/uploads/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg b/project/frontend/public/uploads/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b57d90694cfafbca06dc67987dadca10a784caa GIT binary patch literal 37630 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 literal 0 HcmV?d00001 diff --git a/project/frontend/src/app/api/catalog-proxy/[...path]/route.ts b/project/frontend/src/app/api/catalog-proxy/[...path]/route.ts new file mode 100644 index 0000000..725897a --- /dev/null +++ b/project/frontend/src/app/api/catalog-proxy/[...path]/route.ts @@ -0,0 +1,39 @@ +import { NextRequest, NextResponse } from 'next/server'; + +const API = process.env.NEXT_PUBLIC_API_URL ?? 'http://127.0.0.1:3000'; + +const HANDLERS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'] as const; + +export async function GET(req: NextRequest) { return handle(req); } +export async function POST(req: NextRequest) { return handle(req); } +export async function PUT(req: NextRequest) { return handle(req); } +export async function PATCH(req: NextRequest) { return handle(req); } +export async function DELETE(req: NextRequest) { return handle(req); } + +async function handle(req: NextRequest): Promise { + const path = req.nextUrl.pathname.replace('/api/catalog-proxy/', ''); + const url = `${API}/${path}${req.nextUrl.search}`; + const headers: Record = { accept: 'application/json' }; + const cookie = req.headers.get('cookie'); + if (cookie) headers.cookie = cookie; + + const init: RequestInit = { headers }; + if (['POST', 'PUT', 'PATCH', 'DELETE'].includes(req.method)) { + init.method = req.method; + init.body = await req.text(); + const ct = req.headers.get('content-type'); + if (ct) headers['content-type'] = ct; + } + + try { + const res = await fetch(url, init); + const data = await res.json().catch(() => ({})); + const setCookie = res.headers.get('set-cookie'); + if (setCookie) { + return NextResponse.json(data, { status: res.status, headers: { 'set-cookie': setCookie } }); + } + return NextResponse.json(data, { status: res.status }); + } catch (err) { + return NextResponse.json({ error: { code: 'PROXY_ERROR', message: String(err) } }, { status: 502 }); + } +} diff --git a/project/frontend/src/lib/api.ts b/project/frontend/src/lib/api.ts index b8374b3..97667ff 100644 --- a/project/frontend/src/lib/api.ts +++ b/project/frontend/src/lib/api.ts @@ -8,15 +8,14 @@ interface CmsPage { status: string; } -// Use env var if set, otherwise proxy through /api/catalog -// In SSR: NEXT_PUBLIC_API_URL is http://127.0.0.1:3000 (backend direct) -// In prod (relative mode): empty β†’ /api/catalog (same-origin proxy) +// Browser: use same-origin proxy route to avoid network/IP issues +// SSR: use backend URL directly (same machine) const BASE = (() => { if (typeof window !== 'undefined') { - // Browser: use same-origin relative URL (works from any network) - return ''; + // Browser: proxy through Next.js to avoid external IP issues + return '/api/catalog-proxy'; } - // Server/SSR: use backend URL from env + // Server/SSR: use backend URL directly return process.env.NEXT_PUBLIC_API_URL ?? 'http://127.0.0.1:3000'; })(); diff --git a/project/src/modules/admin/api/notifications.routes.ts b/project/src/modules/admin/api/notifications.routes.ts new file mode 100644 index 0000000..814e295 --- /dev/null +++ b/project/src/modules/admin/api/notifications.routes.ts @@ -0,0 +1,65 @@ +import { FastifyInstance } from 'fastify'; +import { Pool } from 'pg'; + +export function notificationsRoutes(fastify: FastifyInstance, pool: Pool) { + + // GET /api/admin/notifications + // Returns pending counts for bell icon + fastify.get('/admin/notifications', async (req) => { + const [ordersRows] = await Promise.all([ + pool.query<{ pending: string; shipped_24h: string; awaiting_payment: string }>(` + SELECT + COUNT(*) FILTER (WHERE state = 'PENDING') AS pending, + COUNT(*) FILTER ( + WHERE state = 'SHIPPED' + AND updated_at < NOW() - INTERVAL '24 hours' + ) AS shipped_24h, + COUNT(*) FILTER ( + WHERE payment_status = 'AWAITING' + AND state = 'PENDING' + ) AS awaiting_payment + FROM pos_orders + WHERE deleted_at IS NULL + AND created_at > NOW() - INTERVAL '30 days' + `), + ]); + + const row = ordersRows.rows[0]; + const items = []; + + const pending = parseInt(row?.pending ?? '0', 10); + if (pending > 0) { + items.push({ + id: 'pending_orders', + type: 'pending_orders', + count: pending, + message: 'Pedidos pendientes de procesar', + href: '/orders?state=PENDING', + }); + } + + const shipped24h = parseInt(row?.shipped_24h ?? '0', 10); + if (shipped24h > 0) { + items.push({ + id: 'stale_shipped', + type: 'stale_shipped', + count: shipped24h, + message: 'Enviados sin actualizar en +24h', + href: '/orders?state=SHIPPED&stale=true', + }); + } + + const awaiting = parseInt(row?.awaiting_payment ?? '0', 10); + if (awaiting > 0) { + items.push({ + id: 'awaiting_payment', + type: 'awaiting_payment', + count: awaiting, + message: 'Esperando confirmaciΓ³n de pago', + href: '/orders?payment_status=AWAITING', + }); + } + + return { items }; + }); +} diff --git a/project/src/modules/backoffice/api/backoffice.routes.ts b/project/src/modules/backoffice/api/backoffice.routes.ts index e996ab4..f864191 100644 --- a/project/src/modules/backoffice/api/backoffice.routes.ts +++ b/project/src/modules/backoffice/api/backoffice.routes.ts @@ -157,6 +157,29 @@ export async function registerBackofficeRoutes( throw error; } }); + + // Bell notifications for admin dashboard + app.get('/notifications', async (req) => { + const rows = await deps.pool.query<{ + pending: string; shipped_24h: string; awaiting_payment: string; + }>(` + SELECT + COUNT(*) FILTER (WHERE state = 'PENDING') AS pending, + COUNT(*) FILTER (WHERE state = 'SHIPPED' AND updated_at < NOW() - INTERVAL '24 hours') AS shipped_24h, + COUNT(*) FILTER (WHERE payment_status = 'AWAITING' AND state = 'PENDING') AS awaiting_payment + FROM pos_orders + WHERE deleted_at IS NULL AND created_at > NOW() - INTERVAL '30 days' + `); + const r = rows.rows[0] ?? { pending: '0', shipped_24h: '0', awaiting_payment: '0' }; + const items = []; + const p = parseInt(r.pending, 10); + if (p > 0) items.push({ id: 'pending_orders', type: 'pending_orders', count: p, message: 'Pedidos pendientes de procesar', href: '/orders?state=PENDING' }); + const s = parseInt(r.shipped_24h, 10); + if (s > 0) items.push({ id: 'stale_shipped', type: 'stale_shipped', count: s, message: 'Enviados sin actualizar en +24h', href: '/orders?state=SHIPPED&stale=true' }); + const a = parseInt(r.awaiting_payment, 10); + if (a > 0) items.push({ id: 'awaiting_payment', type: 'awaiting_payment', count: a, message: 'Esperando confirmaciΓ³n de pago', href: '/orders?payment_status=AWAITING' }); + return { items }; + }); } function isSecureRequest(request: FastifyRequest): boolean { diff --git a/project/src/modules/orders/api/orders.routes.ts b/project/src/modules/orders/api/orders.routes.ts index 0b53fbd..6ab948c 100644 --- a/project/src/modules/orders/api/orders.routes.ts +++ b/project/src/modules/orders/api/orders.routes.ts @@ -530,6 +530,38 @@ export async function registerOrdersRoutes( throw mapOrderError(error); } }); + + // Awaiting payment orders for admin notifications + app.get('/orders/notifications/awaiting-payment', async (request, reply) => { + const user = await deps.authenticate(request); + requireRole(user, 'admin'); + const result = await deps.pool.query<{ + id: string; + total_cents: number; + customer_email: string | null; + created_at: Date; + total_count: number; + }>( + `SELECT o.id, o.total_cents, u.email AS customer_email, o.created_at, + COUNT(*) OVER()::int AS total_count + FROM orders_orders o + LEFT JOIN identity_users u ON u.id = o.user_id + WHERE o.payment_status = 'AWAITING' + AND o.state = 'PENDING' + AND o.deleted_at IS NULL + ORDER BY o.created_at ASC + LIMIT 20`, + ); + return reply.send({ + total: result.rows[0]?.total_count ?? 0, + items: result.rows.map((row) => ({ + id: row.id, + totalCents: row.total_cents, + customerEmail: row.customer_email, + createdAt: row.created_at.toISOString(), + })), + }); + }); } function mapOrderError(error: unknown): Error { diff --git a/project/storefront/public/uploads/200/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg b/project/storefront/public/uploads/200/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3e982a6dfc56fe5e4512a0df530561c05bb7c4a GIT binary patch literal 3789 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 literal 0 HcmV?d00001 diff --git a/project/storefront/public/uploads/40/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg b/project/storefront/public/uploads/40/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a6122c9aa30a384674b6473bd782ea3c40a6ece GIT binary patch literal 568 zcmex=5A1R0qH8UG()kYQkCU}R-vWIzB`MrIZ^b|wy>tf~M5BMXqr3|GL&z{D)bA|!0c zDx&DfrW9Bh3{)n;2nGlv7#J9tSXhBFa)Jy@K){S7#mFSc%p#;{Soq=pEe0NDpn-zS zf(-Tyzm`Uox%d`l&tsHnEp>n5;&Wd4s~gX{XYyaT)}ClR$IH($kE!#t?H0dj% z^W&GFOi~l~xn($avD)-_6UK-WKaOr%9B-?Zn=9L=nR~Hv;?u3=@6Q%3{bf_U-GcK7 zYti^B;0I2WLJz@%Y%jFM5AwCn@QBG*(QU_4*`BHAe@J`j;ItFS}<7-cvZaa{7wK fu-v$V2iv*hPOJ?r(Qa{_Dze){(xYPw|Nol+;OMGX literal 0 HcmV?d00001 diff --git a/project/storefront/public/uploads/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg b/project/storefront/public/uploads/84c00c52-af00-4b29-aefc-167b1d4eaf2d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b57d90694cfafbca06dc67987dadca10a784caa GIT binary patch literal 37630 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 literal 0 HcmV?d00001 diff --git a/work/runtime-status.json b/work/runtime-status.json index 032f1ee..2cd4983 100644 --- a/work/runtime-status.json +++ b/work/runtime-status.json @@ -1,5 +1,5 @@ { - "feature_id": "ADMIN-CLOSURES", + "feature_id": "FRONTEND-FIXES", "stage": "build", "agent": "implementer", "action": "",