From f76591518e15b1b70453fbfbe571f2de2d4fafb0 Mon Sep 17 00:00:00 2001 From: Deploy Date: Tue, 25 Aug 2026 22:24:11 +0200 Subject: [PATCH] fix(reporting): resize trend chart and repair closures detail --- project/VERSION | 2 +- project/apps/admin/package-lock.json | 4 +- project/apps/admin/package.json | 2 +- .../(dashboard)/reporting/closures/page.tsx | 65 +++++++++++-------- .../(dashboard)/reporting/dashboard/page.tsx | 2 +- .../src/components/reporting/TrendChart.tsx | 9 +-- project/apps/pos/package-lock.json | 4 +- project/apps/pos/package.json | 2 +- project/frontend/package-lock.json | 4 +- project/frontend/package.json | 2 +- project/package-lock.json | 4 +- project/package.json | 2 +- project/src/modules/pos/api/pos.routes.ts | 20 +++--- project/storefront/package-lock.json | 4 +- project/storefront/package.json | 2 +- 15 files changed, 68 insertions(+), 60 deletions(-) diff --git a/project/VERSION b/project/VERSION index 0c62199..ee1372d 100644 --- a/project/VERSION +++ b/project/VERSION @@ -1 +1 @@ -0.2.1 +0.2.2 diff --git a/project/apps/admin/package-lock.json b/project/apps/admin/package-lock.json index 246156a..60c200e 100644 --- a/project/apps/admin/package-lock.json +++ b/project/apps/admin/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mercadodevida/admin", - "version": "0.2.1", + "version": "0.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@mercadodevida/admin", - "version": "0.2.1", + "version": "0.2.2", "dependencies": { "@lexical/history": "^0.49.0", "@lexical/html": "^0.49.0", diff --git a/project/apps/admin/package.json b/project/apps/admin/package.json index 6f8b160..d025a8a 100644 --- a/project/apps/admin/package.json +++ b/project/apps/admin/package.json @@ -1,6 +1,6 @@ { "name": "@mercadodevida/admin", - "version": "0.2.1", + "version": "0.2.2", "private": true, "scripts": { "dev": "next dev --port 3001", diff --git a/project/apps/admin/src/app/(dashboard)/reporting/closures/page.tsx b/project/apps/admin/src/app/(dashboard)/reporting/closures/page.tsx index 9622d62..33623e2 100644 --- a/project/apps/admin/src/app/(dashboard)/reporting/closures/page.tsx +++ b/project/apps/admin/src/app/(dashboard)/reporting/closures/page.tsx @@ -13,18 +13,25 @@ interface SalesSummary { byState: Record; } -interface ClosedSession { - id: string; - openedAt: string; - closedAt: string; - userId: string; - status: string; - openingCashCents: number; - closingCashCents: number | null; - actualCashCents: number | null; - differenceCents: number | null; +interface CashCloseReport { + session: { + id: string; + openedAt: string; + closedAt: string | null; + userId: string; + status: string; + }; + storeId: string; + terminalId: string; + financial: { + openingCashCents: number; + closingCashCents: number; + actualCashCents: number; + expectedCashCents: number; + differenceCents: number; + }; sales: SalesSummary; - paymentsByMethod: Array<{ methodCode: string; methodName: string; totalCents: number; count: number }>; + payments: Array<{ methodCode: string; methodName: string; totalCents: number; transactionCount: number }>; items: { soldCount: number; uniqueProducts: number }; } @@ -53,10 +60,11 @@ interface SessionRow { export default function ReportingClosuresPage() { const [sessions, setSessions] = useState([]); - const [report, setReport] = useState(null); + const [report, setReport] = useState(null); const [loading, setLoading] = useState(true); const [loadingReport, setLoadingReport] = useState(false); const [error, setError] = useState(''); + const [reportError, setReportError] = useState(''); const [selectedStore, setSelectedStore] = useState(''); const [stores, setStores] = useState>([]); const [filterDays, setFilterDays] = useState(30); @@ -85,11 +93,14 @@ export default function ReportingClosuresPage() { const loadReport = async (sessionId: string) => { setLoadingReport(true); + setReport(null); + setReportError(''); try { - const data = await api.get(`/api/pos/reports/cash-close/${sessionId}`); + const data = await api.get(`/api/pos/reports/cash-close/${sessionId}`); setReport(data); - } catch { + } catch (err) { setReport(null); + setReportError(err instanceof Error ? err.message : 'Error al cargar reporte de cierre'); } finally { setLoadingReport(false); } @@ -108,7 +119,7 @@ export default function ReportingClosuresPage() { if (selectedStore) void loadSessions(); }, [selectedStore, filterDays, loadSessions]); - const diff = report?.differenceCents ?? 0; + const diff = report?.financial.differenceCents ?? 0; const diffClass = diff > 0 ? 'text-green-600' : diff < 0 ? 'text-red-600' : 'text-gray-600'; return ( @@ -163,7 +174,7 @@ export default function ReportingClosuresPage() { type="button" onClick={() => void loadReport(s.id)} className={`w-full text-left rounded-xl border p-3 text-sm transition-colors ${ - report?.id === s.id + report?.session.id === s.id ? 'border-[#2D6A4F] bg-[#2D6A4F]/5' : 'border-gray-200 hover:border-[#2D6A4F] hover:bg-gray-50' }`} @@ -193,14 +204,14 @@ export default function ReportingClosuresPage() { {/* Report detail */}
- {!report ? ( -
- Selecciona una sesión para ver el reporte -
- ) : loadingReport ? ( + {loadingReport ? (
Cargando reporte…
+ ) : !report ? ( +
+ {reportError || 'Selecciona una sesión para ver el reporte'} +
) : (
{/* Financial summary */} @@ -208,9 +219,9 @@ export default function ReportingClosuresPage() {

📊 Resumen financiero

{[ - ['Saldo inicial', fmt(report.openingCashCents)], + ['Saldo inicial', fmt(report.financial.openingCashCents)], ['Ventas', fmt(report.sales.completedTotalCents)], - ['Saldo esperado', fmt(report.openingCashCents + report.sales.completedTotalCents)], + ['Saldo esperado', fmt(report.financial.expectedCashCents)], ].map(([label, value]) => (

{label}

@@ -219,7 +230,7 @@ export default function ReportingClosuresPage() { ))}

Efectivo real

-

{fmt(report.actualCashCents ?? 0)}

+

{fmt(report.financial.actualCashCents)}

Diferencia

@@ -257,7 +268,7 @@ export default function ReportingClosuresPage() {
{/* By payment method */} - {report.paymentsByMethod.length > 0 && ( + {report.payments.length > 0 && (

💳 Formas de pago

@@ -269,10 +280,10 @@ export default function ReportingClosuresPage() { - {report.paymentsByMethod.map(p => ( + {report.payments.map(p => ( - + ))} diff --git a/project/apps/admin/src/app/(dashboard)/reporting/dashboard/page.tsx b/project/apps/admin/src/app/(dashboard)/reporting/dashboard/page.tsx index 63d26f8..34abbb8 100644 --- a/project/apps/admin/src/app/(dashboard)/reporting/dashboard/page.tsx +++ b/project/apps/admin/src/app/(dashboard)/reporting/dashboard/page.tsx @@ -79,7 +79,7 @@ function TrendDashboard({ filters }: { filters: FilterState }) { const maxValue = Math.max(...points.map((p) => p.value), 1); - return ; + return ; } function ChannelDashboard({ filters }: { filters: FilterState }) { diff --git a/project/apps/admin/src/components/reporting/TrendChart.tsx b/project/apps/admin/src/components/reporting/TrendChart.tsx index df91799..69f62ed 100644 --- a/project/apps/admin/src/components/reporting/TrendChart.tsx +++ b/project/apps/admin/src/components/reporting/TrendChart.tsx @@ -19,14 +19,15 @@ export function TrendChart({ data, maxValue, height = 120 }: TrendChartProps) { const width = 100; // percentage-based SVG const barWidth = Math.min(3, (width * 0.9) / data.length); const gap = Math.max(0.2, (width - barWidth * data.length) / (data.length + 1)); - const chartHeight = height - 40; // leave room for labels + const chartHeight = height - 34; // leave room for labels return ( -
+
diff --git a/project/apps/pos/package-lock.json b/project/apps/pos/package-lock.json index 2e5182e..67c436f 100644 --- a/project/apps/pos/package-lock.json +++ b/project/apps/pos/package-lock.json @@ -1,12 +1,12 @@ { "name": "mercadodevida-pos", - "version": "0.2.1", + "version": "0.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mercadodevida-pos", - "version": "0.2.1", + "version": "0.2.2", "dependencies": { "next": "^16.3.1", "react": "^19.2.8", diff --git a/project/apps/pos/package.json b/project/apps/pos/package.json index fa230b1..0364b48 100644 --- a/project/apps/pos/package.json +++ b/project/apps/pos/package.json @@ -1,6 +1,6 @@ { "name": "mercadodevida-pos", - "version": "0.2.1", + "version": "0.2.2", "private": true, "scripts": { "dev": "next dev --port 3002", diff --git a/project/frontend/package-lock.json b/project/frontend/package-lock.json index b01a1d1..5c4bb3a 100644 --- a/project/frontend/package-lock.json +++ b/project/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "frontend", - "version": "0.2.1", + "version": "0.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "frontend", - "version": "0.2.1", + "version": "0.2.2", "dependencies": { "next": "16.3.1", "react": "19.2.8", diff --git a/project/frontend/package.json b/project/frontend/package.json index 166848b..5b3615f 100644 --- a/project/frontend/package.json +++ b/project/frontend/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "0.2.1", + "version": "0.2.2", "private": true, "scripts": { "dev": "next dev", diff --git a/project/package-lock.json b/project/package-lock.json index a170cde..ae38743 100644 --- a/project/package-lock.json +++ b/project/package-lock.json @@ -1,12 +1,12 @@ { "name": "mercadodevida-backend", - "version": "0.2.1", + "version": "0.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mercadodevida-backend", - "version": "0.2.1", + "version": "0.2.2", "dependencies": { "@fastify/cookie": "^11.1.2", "@fastify/cors": "^11.3.0", diff --git a/project/package.json b/project/package.json index 85991a1..7cb6934 100644 --- a/project/package.json +++ b/project/package.json @@ -1,6 +1,6 @@ { "name": "mercadodevida-backend", - "version": "0.2.1", + "version": "0.2.2", "private": true, "type": "module", "description": "mercadodevida vNext backend - modular monolith skeleton", diff --git a/project/src/modules/pos/api/pos.routes.ts b/project/src/modules/pos/api/pos.routes.ts index ee4d2fc..20aacb0 100644 --- a/project/src/modules/pos/api/pos.routes.ts +++ b/project/src/modules/pos/api/pos.routes.ts @@ -699,13 +699,11 @@ export async function registerPosRoutes(app: FastifyInstance, deps: PosRouteDeps ), pool.query<{ method_code: string; method_name: string; total: string; count: string }>( `SELECT pm.code AS method_code, pm.label AS method_name, - COALESCE(SUM(pt.amount_cents), 0)::bigint AS total, + COALESCE(SUM(rpl.amount_cents), 0)::bigint AS total, COUNT(*)::int AS count - FROM payments_transactions pt - JOIN orders_orders o ON o.id = pt.order_id - LEFT JOIN pos_payment_methods pm ON pm.id::text = pt.provider_event_id - AND pm.store_id = o.store_id - WHERE o.cash_session_id = $1 AND o.source = 'pos' AND pt.status = 'succeeded' + FROM reporting_payment_lines rpl + LEFT JOIN pos_payment_methods pm ON pm.id = rpl.payment_method_id + WHERE rpl.cash_session_id = $1 AND rpl.status = 'payment' GROUP BY pm.code, pm.label`, [id], ), @@ -771,13 +769,11 @@ export async function registerPosRoutes(app: FastifyInstance, deps: PosRouteDeps ), pool.query<{ method_code: string; method_name: string; total: string; count: string }>( `SELECT pm.code AS method_code, pm.label AS method_name, - COALESCE(SUM(pt.amount_cents), 0)::bigint AS total, + COALESCE(SUM(rpl.amount_cents), 0)::bigint AS total, COUNT(*)::int AS count - FROM payments_transactions pt - JOIN orders_orders o ON o.id = pt.order_id - LEFT JOIN pos_payment_methods pm ON pm.id::text = pt.provider_event_id - AND pm.store_id = o.store_id - WHERE o.cash_session_id = $1 AND o.source = 'pos' AND pt.status = 'succeeded' + FROM reporting_payment_lines rpl + LEFT JOIN pos_payment_methods pm ON pm.id = rpl.payment_method_id + WHERE rpl.cash_session_id = $1 AND rpl.status = 'payment' GROUP BY pm.code, pm.label`, [id], ), diff --git a/project/storefront/package-lock.json b/project/storefront/package-lock.json index 91ce82a..9479f26 100644 --- a/project/storefront/package-lock.json +++ b/project/storefront/package-lock.json @@ -1,12 +1,12 @@ { "name": "mercadodevida-storefront", - "version": "0.2.1", + "version": "0.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mercadodevida-storefront", - "version": "0.2.1", + "version": "0.2.2", "dependencies": { "@tailwindcss/postcss": "^4.1.17", "next": "^16.0.5", diff --git a/project/storefront/package.json b/project/storefront/package.json index 76f87ab..f85cdae 100644 --- a/project/storefront/package.json +++ b/project/storefront/package.json @@ -1,6 +1,6 @@ { "name": "mercadodevida-storefront", - "version": "0.2.1", + "version": "0.2.2", "private": true, "type": "module", "description": "mercadodevida customer storefront shell",
{p.methodName}{p.count}{p.transactionCount} {fmt(p.totalCents)}