diff --git a/apps/edr-passenger-api/src/modules/reports/reports.service.ts b/apps/edr-passenger-api/src/modules/reports/reports.service.ts index 23aab566f..9460aa5a9 100644 --- a/apps/edr-passenger-api/src/modules/reports/reports.service.ts +++ b/apps/edr-passenger-api/src/modules/reports/reports.service.ts @@ -956,12 +956,12 @@ export class ReportsService { let rows = bookings.map(b => { const pi = b.paymentIntent!; const actualMinor = b.seats.reduce((s, seat) => s + (seat.fareMinor ?? 0), 0); - const paidMinor = Math.round(pi.amountMinor); - const varianceMinor = actualMinor - paidMinor; + // pi.amountMinor is a Float in full currency units — convert to cents once + const paidMinorCents = Math.round(pi.amountMinor * 100); const isPackage = !!(b as any).package; const effectiveActualMinor = isPackage ? actualMinor * 2 : actualMinor; - const effectiveVarianceMinor = effectiveActualMinor - paidMinor; + const effectiveVarianceMinor = effectiveActualMinor - paidMinorCents; const breakdown = b.seats.map(s => ({ passengerName: s.passengerName ?? '—', @@ -982,11 +982,11 @@ export class ReportsService { destination: b.schedule.destinationStation.name, phone: b.passenger?.user?.phone ?? (b as any).contactPhone ?? '—', actualMinor: effectiveActualMinor, - paidMinor, + paidMinor: paidMinorCents, varianceMinor: effectiveVarianceMinor, breakdown, }; - }).filter(r => r.varianceMinor > 0 && r.paidMinor > 0); + }).filter(r => r.varianceMinor > 0); if (params.search?.trim()) { const q = params.search.trim().toUpperCase(); diff --git a/apps/edr-passenger-web/backoffice/src/app/reports/payments/page.tsx b/apps/edr-passenger-web/backoffice/src/app/reports/payments/page.tsx index 7ff4e5247..0261b938a 100644 --- a/apps/edr-passenger-web/backoffice/src/app/reports/payments/page.tsx +++ b/apps/edr-passenger-web/backoffice/src/app/reports/payments/page.tsx @@ -86,9 +86,9 @@ function fmtMinor(minor: number) { return `ETB ${(minor / 100).toLocaleString('en-US', { minimumFractionDigits: 2 })}`; } -// paidMinor from PaymentIntent.amountMinor is a Float stored as full units (not cents) +// paidMinor from PaymentIntent.amountMinor is converted to cents server-side before being returned function fmtPaid(amount: number) { - return `ETB ${amount.toLocaleString('en-US', { minimumFractionDigits: 2 })}`; + return `ETB ${(amount / 100).toLocaleString('en-US', { minimumFractionDigits: 2 })}`; } function downloadCsv(csv: string, filename: string) { diff --git a/apps/edr-passenger-web/backoffice/src/components/layout/Sidebar.tsx b/apps/edr-passenger-web/backoffice/src/components/layout/Sidebar.tsx index 98f76cc18..54a96e330 100644 --- a/apps/edr-passenger-web/backoffice/src/components/layout/Sidebar.tsx +++ b/apps/edr-passenger-web/backoffice/src/components/layout/Sidebar.tsx @@ -66,7 +66,7 @@ const navigationSections: { title: string; items: NavItem[] }[] = [ { name: 'Tickets', href: '/tickets', icon: FileText, permission: PERMS.tickets.view }, { name: 'Boarding', href: '/boarding', icon: LogIn, permission: PERMS.tickets.view }, { name: 'Luggage', href: '/excess-baggage', icon: Banknote, permission: PERMS.bookings.view }, - { name: 'Discrepancy', href: '/discrepancy', icon: Layers, permission: PERMS.seats.manage }, + // { name: 'Discrepancy', href: '/discrepancy', icon: Layers, permission: PERMS.seats.manage }, ] }, {