From 593ff202a38833f35292a901c1c2f6d82046d29b Mon Sep 17 00:00:00 2001 From: root Date: Fri, 15 May 2026 11:34:29 -0400 Subject: [PATCH] fix the contract view and edit --- apps/api/src/routes/auth.company.ts | 41 +- apps/api/src/routes/payments.ts | 55 ++ apps/api/src/routes/reservations.ts | 291 +++++++- .../public/vehicle-condition-template.png | Bin 0 -> 171122 bytes .../(dashboard)/dashboard/billing/page.tsx | 692 +++++++++++++++--- .../dashboard/contracts/[id]/page.tsx | 465 ++++++++---- .../dashboard/reservations/[id]/page.tsx | 418 ++++++++++- .../dashboard/reservations/page.tsx | 21 +- .../(dashboard)/dashboard/settings/page.tsx | 13 + .../src/app/sign-up/[[...sign-up]]/page.tsx | 474 ++++++++++-- .../dashboard/src/components/I18nProvider.tsx | 12 +- .../reservations/DamageInspectionCard.tsx | 120 ++- .../reservations/VehicleConditionSheet.tsx | 110 +++ 13 files changed, 2331 insertions(+), 381 deletions(-) create mode 100644 apps/dashboard/public/vehicle-condition-template.png create mode 100644 apps/dashboard/src/components/reservations/VehicleConditionSheet.tsx diff --git a/apps/api/src/routes/auth.company.ts b/apps/api/src/routes/auth.company.ts index 46ea4b5..2890441 100644 --- a/apps/api/src/routes/auth.company.ts +++ b/apps/api/src/routes/auth.company.ts @@ -12,9 +12,15 @@ const signupSchema = z.object({ email: z.string().email(), password: z.string().min(8).max(128), companyName: z.string().min(2).max(120), - companyPhone: z.string().optional(), - country: z.string().optional(), - city: z.string().optional(), + legalForm: z.string().min(1).max(80), + registrationNumber: z.string().min(1).max(120), + streetAddress: z.string().min(1).max(200), + city: z.string().min(1).max(120), + country: z.string().min(1).max(120), + zipCode: z.string().min(1).max(40), + companyPhone: z.string().min(1).max(80), + fax: z.string().max(80).optional(), + yearsActive: z.string().min(1).max(80), plan: z.enum(['STARTER', 'GROWTH', 'PRO']), billingPeriod: z.enum(['MONTHLY', 'ANNUAL']), currency: z.enum(['MAD', 'USD', 'EUR']), @@ -129,7 +135,17 @@ router.post('/signup', async (req, res, next) => { name: body.companyName, slug, email: body.email, - phone: body.companyPhone || null, + phone: body.companyPhone, + address: { + streetAddress: body.streetAddress, + city: body.city, + country: body.country, + zipCode: body.zipCode, + legalForm: body.legalForm, + managerName: `${body.firstName} ${body.lastName}`.trim(), + fax: body.fax || null, + yearsActive: body.yearsActive, + }, status: 'TRIALING', }, }) @@ -140,13 +156,22 @@ router.post('/signup', async (req, res, next) => { displayName: body.companyName, subdomain: slug, publicEmail: body.email, - publicPhone: body.companyPhone || null, - publicCountry: body.country || null, - publicCity: body.city || null, + publicPhone: body.companyPhone, + publicAddress: body.streetAddress, + publicCity: body.city, + publicCountry: body.country, defaultCurrency: body.currency, }, }) + await tx.contractSettings.create({ + data: { + companyId: company.id, + legalName: body.companyName, + registrationNumber: body.registrationNumber, + }, + }) + await tx.subscription.create({ data: { companyId: company.id, @@ -168,7 +193,7 @@ router.post('/signup', async (req, res, next) => { firstName: body.firstName, lastName: body.lastName, email: body.email, - phone: body.companyPhone || null, + phone: body.companyPhone, passwordHash, role: 'OWNER', isActive: true, diff --git a/apps/api/src/routes/payments.ts b/apps/api/src/routes/payments.ts index e83803a..16fedf7 100644 --- a/apps/api/src/routes/payments.ts +++ b/apps/api/src/routes/payments.ts @@ -99,6 +99,13 @@ const chargeSchema = z.object({ failureUrl: z.string().url(), }) +const manualPaymentSchema = z.object({ + amount: z.number().int().positive(), + currency: z.enum(['MAD', 'USD', 'EUR']).default('MAD'), + type: z.enum(['CHARGE', 'DEPOSIT']).default('CHARGE'), + paymentMethod: z.enum(['CASH', 'CHECK', 'BANK_TRANSFER', 'CARD', 'PAYPAL']), +}) + router.get('/company', async (req, res, next) => { try { const payments = await prisma.rentalPayment.findMany({ @@ -226,6 +233,51 @@ router.post('/reservations/:id/capture-paypal', async (req, res, next) => { } catch (err) { next(err) } }) +router.post('/reservations/:id/manual', async (req, res, next) => { + try { + const { amount, currency, type, paymentMethod } = manualPaymentSchema.parse(req.body) + + const reservation = await prisma.reservation.findFirstOrThrow({ + where: { id: req.params.id, companyId: req.companyId }, + }) + + const remainingBalance = Math.max(reservation.totalAmount - reservation.paidAmount, 0) + if (remainingBalance <= 0) { + return res.status(409).json({ error: 'already_paid', message: 'Reservation is already fully paid', statusCode: 409 }) + } + if (amount > remainingBalance) { + return res.status(400).json({ error: 'amount_exceeds_balance', message: 'Payment amount exceeds remaining balance', statusCode: 400 }) + } + + const payment = await prisma.rentalPayment.create({ + data: { + companyId: req.companyId, + reservationId: reservation.id, + amount, + currency, + status: 'SUCCEEDED', + type, + paymentProvider: paymentMethod === 'PAYPAL' ? 'PAYPAL' : 'AMANPAY', + paymentMethod, + paidAt: new Date(), + }, + }) + + const newPaidAmount = reservation.paidAmount + amount + const paymentStatus = newPaidAmount >= reservation.totalAmount ? 'PAID' : 'PARTIAL' + + await prisma.reservation.update({ + where: { id: reservation.id }, + data: { + paidAmount: newPaidAmount, + paymentStatus, + }, + }) + + res.json({ data: payment }) + } catch (err) { next(err) } +}) + router.post('/reservations/:reservationId/payments/:paymentId/refund', async (req, res, next) => { try { const { amount, reason } = z.object({ @@ -240,6 +292,9 @@ router.post('/reservations/:reservationId/payments/:paymentId/refund', async (re if (payment.status !== 'SUCCEEDED') { return res.status(400).json({ error: 'not_capturable', message: 'Only succeeded payments can be refunded', statusCode: 400 }) } + if (!payment.amanpayTransactionId && !payment.paypalCaptureId) { + return res.status(400).json({ error: 'manual_refund_unsupported', message: 'Manual payments must be refunded outside the online gateway flow', statusCode: 400 }) + } const refundAmount = amount ?? payment.amount diff --git a/apps/api/src/routes/reservations.ts b/apps/api/src/routes/reservations.ts index 08e91ee..d08ef70 100644 --- a/apps/api/src/routes/reservations.ts +++ b/apps/api/src/routes/reservations.ts @@ -62,6 +62,99 @@ const createSchema = z.object({ additionalDrivers: z.array(additionalDriverSchema).default([]), }) +const updateSchema = z.object({ + startDate: z.string().datetime().optional(), + endDate: z.string().datetime().optional(), + pickupLocation: z.string().optional().nullable(), + returnLocation: z.string().optional().nullable(), + depositAmount: z.number().int().min(0).optional(), + notes: z.string().optional().nullable(), + paymentMode: z.string().max(50).optional().nullable(), + damageChargeAmount: z.number().int().min(0).optional(), + damageChargeNote: z.string().optional().nullable(), +}) + +function parseReservationExtras(extras: unknown) { + if (!extras || typeof extras !== 'object' || Array.isArray(extras)) return {} as Record + return { ...(extras as Record) } +} + +function normalizeOptionalString(value: string | null | undefined) { + const next = typeof value === 'string' ? value.trim() : value + return next ? next : null +} + +function calculateUpdatedInsuranceCharge( + chargeType: 'PER_DAY' | 'PER_RENTAL' | 'PERCENTAGE_OF_RENTAL', + chargeValue: number, + totalDays: number, + baseRentalAmount: number, +) { + switch (chargeType) { + case 'PER_DAY': + return chargeValue * totalDays + case 'PER_RENTAL': + return chargeValue + case 'PERCENTAGE_OF_RENTAL': + return Math.round(baseRentalAmount * chargeValue / 100) + default: + return 0 + } +} + +function calculateUpdatedAdditionalDriverCharge( + chargeType: 'PER_DAY' | 'FLAT' | 'FREE', + chargeValue: number, + totalDays: number, +) { + switch (chargeType) { + case 'PER_DAY': + return chargeValue * totalDays + case 'FLAT': + return chargeValue + default: + return 0 + } +} + +function buildReservationWorkflow(reservation: { + status: string + contractNumber: string | null + invoiceNumber: string | null + extras: unknown +}) { + const extras = parseReservationExtras(reservation.extras) + const closedAt = typeof extras.reservationClosedAt === 'string' ? extras.reservationClosedAt : null + const closedBy = typeof extras.reservationClosedBy === 'string' ? extras.reservationClosedBy : null + const contractGenerated = Boolean(reservation.contractNumber || reservation.invoiceNumber) + const closed = Boolean(closedAt) + + return { + contractGenerated, + closed, + closedAt, + closedBy, + coreEditable: !closed && !contractGenerated && ['DRAFT', 'CONFIRMED'].includes(reservation.status), + returnEditable: !closed && reservation.status === 'COMPLETED', + checkInInspectionEditable: !closed && ['CONFIRMED', 'ACTIVE'].includes(reservation.status), + checkOutInspectionEditable: !closed && reservation.status === 'COMPLETED', + } +} + +function serializeReservationForDashboard(reservation: T) { + const extras = parseReservationExtras(reservation.extras) + return { + ...reservation, + paymentMode: typeof extras.paymentMode === 'string' ? extras.paymentMode : null, + workflow: buildReservationWorkflow(reservation), + } +} + function formatDocumentNumber(prefix: string, sequence: number) { return `${prefix}-${String(sequence).padStart(6, '0')}` } @@ -228,7 +321,13 @@ router.get('/', async (req, res, next) => { prisma.reservation.count({ where }), ]) - res.json({ data: reservations, total, page: parseInt(page), pageSize: parseInt(pageSize), totalPages: Math.ceil(total / parseInt(pageSize)) }) + res.json({ + data: reservations.map((reservation) => serializeReservationForDashboard(reservation)), + total, + page: parseInt(page), + pageSize: parseInt(pageSize), + totalPages: Math.ceil(total / parseInt(pageSize)), + }) } catch (err) { next(err) } }) @@ -317,7 +416,152 @@ router.get('/:id', async (req, res, next) => { where: { id: req.params.id, companyId: req.companyId }, include: { vehicle: true, customer: true, insurances: true, additionalDrivers: true, rentalPayments: true, damageReports: true }, }) - res.json({ data: reservation }) + res.json({ data: serializeReservationForDashboard(reservation) }) + } catch (err) { next(err) } +}) + +router.patch('/:id', async (req, res, next) => { + try { + const body = updateSchema.parse(req.body) + const reservation = await prisma.reservation.findFirstOrThrow({ + where: { id: req.params.id, companyId: req.companyId }, + include: { + insurances: true, + additionalDrivers: true, + }, + }) + + if (reservation.status === 'CANCELLED' || reservation.status === 'NO_SHOW') { + return res.status(400).json({ error: 'invalid_status', message: 'This reservation can no longer be edited', statusCode: 400 }) + } + + const workflow = buildReservationWorkflow(reservation) + const isReturnEdit = workflow.returnEditable + const requestedFields = Object.keys(body).filter((key) => body[key as keyof typeof body] !== undefined) + const bookingFields = ['startDate', 'endDate', 'pickupLocation', 'returnLocation', 'depositAmount', 'notes', 'paymentMode'] + const returnFields = ['returnLocation', 'damageChargeAmount', 'damageChargeNote'] + + if (!workflow.coreEditable && !isReturnEdit) { + return res.status(400).json({ error: 'reservation_locked', message: 'This reservation is locked for editing', statusCode: 400 }) + } + + if (workflow.coreEditable) { + const invalidFields = requestedFields.filter((field) => !bookingFields.includes(field)) + if (invalidFields.length > 0) { + return res.status(400).json({ error: 'invalid_fields', message: 'Only booking details can be edited at this stage', statusCode: 400 }) + } + + const nextStartDate = body.startDate ? new Date(body.startDate) : reservation.startDate + const nextEndDate = body.endDate ? new Date(body.endDate) : reservation.endDate + const totalDays = Math.ceil((nextEndDate.getTime() - nextStartDate.getTime()) / (1000 * 60 * 60 * 24)) + + if (nextEndDate <= nextStartDate || totalDays <= 0) { + return res.status(400).json({ error: 'invalid_dates', message: 'End date must be after start date', statusCode: 400 }) + } + + if (body.startDate || body.endDate) { + const conflict = await prisma.reservation.findFirst({ + where: { + id: { not: reservation.id }, + vehicleId: reservation.vehicleId, + status: { in: ['DRAFT', 'CONFIRMED', 'ACTIVE'] }, + startDate: { lt: nextEndDate }, + endDate: { gt: nextStartDate }, + }, + }) + + if (conflict) { + return res.status(409).json({ error: 'vehicle_unavailable', message: 'Vehicle is not available for the selected dates', statusCode: 409 }) + } + } + + const baseAmount = reservation.dailyRate * totalDays + const { applied, total: pricingRulesTotal } = await applyPricingRules( + req.companyId, + reservation.customerId, + reservation.additionalDrivers.map((driver) => ({ + dateOfBirth: driver.dateOfBirth, + licenseIssuedAt: driver.licenseIssuedAt, + })), + reservation.dailyRate, + totalDays, + ) + + const insuranceUpdates = reservation.insurances.map((insurance) => ({ + id: insurance.id, + totalCharge: calculateUpdatedInsuranceCharge(insurance.chargeType, insurance.chargeValue, totalDays, baseAmount), + })) + const additionalDriverUpdates = reservation.additionalDrivers.map((driver) => ({ + id: driver.id, + totalCharge: calculateUpdatedAdditionalDriverCharge(driver.chargeType, driver.chargeValue, totalDays), + })) + + const insuranceTotal = insuranceUpdates.reduce((sum, insurance) => sum + insurance.totalCharge, 0) + const additionalDriverTotal = additionalDriverUpdates.reduce((sum, driver) => sum + driver.totalCharge, 0) + const depositAmount = body.depositAmount ?? reservation.depositAmount + const totalAmount = baseAmount - reservation.discountAmount + pricingRulesTotal + insuranceTotal + additionalDriverTotal + depositAmount + + const extras = parseReservationExtras(reservation.extras) + if (body.paymentMode !== undefined) { + const nextPaymentMode = normalizeOptionalString(body.paymentMode) + if (nextPaymentMode) extras.paymentMode = nextPaymentMode + else delete extras.paymentMode + } + + await prisma.$transaction([ + prisma.reservation.update({ + where: { id: reservation.id }, + data: { + startDate: nextStartDate, + endDate: nextEndDate, + totalDays, + pickupLocation: body.pickupLocation !== undefined ? normalizeOptionalString(body.pickupLocation) : reservation.pickupLocation, + returnLocation: body.returnLocation !== undefined ? normalizeOptionalString(body.returnLocation) : reservation.returnLocation, + depositAmount, + notes: body.notes !== undefined ? normalizeOptionalString(body.notes) : reservation.notes, + pricingRulesApplied: applied, + pricingRulesTotal, + insuranceTotal, + additionalDriverTotal, + totalAmount, + extras: (Object.keys(extras).length > 0 ? extras : {}) as any, + }, + }), + ...insuranceUpdates.map((insurance) => + prisma.reservationInsurance.update({ + where: { id: insurance.id }, + data: { totalCharge: insurance.totalCharge }, + }) + ), + ...additionalDriverUpdates.map((driver) => + prisma.additionalDriver.update({ + where: { id: driver.id }, + data: { totalCharge: driver.totalCharge }, + }) + ), + ]) + } else { + const invalidFields = requestedFields.filter((field) => !returnFields.includes(field)) + if (invalidFields.length > 0) { + return res.status(400).json({ error: 'invalid_fields', message: 'Only return details can be edited after vehicle return', statusCode: 400 }) + } + + await prisma.reservation.update({ + where: { id: reservation.id }, + data: { + returnLocation: body.returnLocation !== undefined ? normalizeOptionalString(body.returnLocation) : reservation.returnLocation, + damageChargeAmount: body.damageChargeAmount !== undefined ? body.damageChargeAmount : reservation.damageChargeAmount, + damageChargeNote: body.damageChargeNote !== undefined ? normalizeOptionalString(body.damageChargeNote) : reservation.damageChargeNote, + }, + }) + } + + const updated = await prisma.reservation.findFirstOrThrow({ + where: { id: req.params.id, companyId: req.companyId }, + include: { vehicle: true, customer: true, insurances: true, additionalDrivers: true, rentalPayments: true, damageReports: true }, + }) + + res.json({ data: serializeReservationForDashboard(updated) }) } catch (err) { next(err) } }) @@ -385,6 +629,7 @@ router.get('/:id/contract', async (req, res, next) => { res.json({ data: { reservationId: reservation.id, + contractLocale: reservation.company.brand?.defaultLocale ?? 'en', contractNumber: reservation.contractNumber, invoiceNumber: reservation.invoiceNumber, generatedAt: new Date().toISOString(), @@ -571,6 +816,35 @@ router.post('/:id/checkout', async (req, res, next) => { } catch (err) { next(err) } }) +router.post('/:id/close', async (req, res, next) => { + try { + const reservation = await prisma.reservation.findFirstOrThrow({ + where: { id: req.params.id, companyId: req.companyId }, + }) + const workflow = buildReservationWorkflow(reservation) + + if (reservation.status !== 'COMPLETED') { + return res.status(400).json({ error: 'invalid_status', message: 'Only completed reservations can be closed', statusCode: 400 }) + } + + if (workflow.closed) { + return res.status(400).json({ error: 'already_closed', message: 'This reservation is already closed', statusCode: 400 }) + } + + const extras = parseReservationExtras(reservation.extras) + extras.reservationClosedAt = new Date().toISOString() + extras.reservationClosedBy = `${req.employee.firstName} ${req.employee.lastName}` + + const updated = await prisma.reservation.update({ + where: { id: reservation.id }, + data: { extras: extras as any }, + include: { vehicle: true, customer: true, insurances: true, additionalDrivers: true, rentalPayments: true, damageReports: true }, + }) + + res.json({ data: serializeReservationForDashboard(updated) }) + } catch (err) { next(err) } +}) + router.post('/:id/cancel', async (req, res, next) => { try { const { reason } = z.object({ reason: z.string().optional() }).parse(req.body) @@ -626,6 +900,19 @@ router.put('/:id/inspections/:type', async (req, res, next) => { where: { id: req.params.id, companyId: req.companyId }, include: { vehicle: true, customer: true }, }) + const workflow = buildReservationWorkflow(reservation) + + if (workflow.closed) { + return res.status(400).json({ error: 'reservation_closed', message: 'This reservation has already been closed', statusCode: 400 }) + } + + if (type === 'CHECKIN' && !workflow.checkInInspectionEditable) { + return res.status(400).json({ error: 'invalid_status', message: 'Check-in inspection is not editable at this stage', statusCode: 400 }) + } + + if (type === 'CHECKOUT' && !workflow.checkOutInspectionEditable) { + return res.status(400).json({ error: 'invalid_status', message: 'Check-out inspection is only editable after the vehicle is returned', statusCode: 400 }) + } const inspection = await prisma.damageInspection.upsert({ where: { reservationId_type: { reservationId: reservation.id, type } }, diff --git a/apps/dashboard/public/vehicle-condition-template.png b/apps/dashboard/public/vehicle-condition-template.png new file mode 100644 index 0000000000000000000000000000000000000000..acc4ce70dd2b8c14005c3bf2cbd9882d24a3fe6c GIT binary patch literal 171122 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�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

yQ!DtP=S5G*~>{gl!F z7MbEQZ`M3I4xJ}HtE2HP{9l5hW+P)3o-q_{w=8^fVbYpM0zCRSzIry~Zw8%sd66jv z(cB;vAViO&)6j7}Yudv}h$>zZCEEwRw_0Z8Pa90eHWFf_|K?`>V0Db9Z=3q_d$q7X zFUe4(76`+-_58gF7eH&GO}Hjl6dnbn9FA@`M_q#cxjhLk6h|$D8RT|2%waKYB>E>Pyzj-YeUNQ1_q}uoKZB?}+Cy{}C^h8DcW%zpE^O57KywNz?y z;*ea%aaM!8i#Gt0ADw&{=zfejnuaXA=ZFw;#-ZR-R@wy`+s`(?n?-}E-N)4J`@%6u zxr(kq3N;(y(Ne4Eu?L%Nw0DP_6MBx+;;5zIfd{;FRGxFrZ(C-!c{QLLX|8fO@WQew zD0duzLH&7zgxH0MQM;!>&aaF9(N{8c*|v(RSySyWA^HM^TOy{-&XS z`}vSm4cnR}ALWR0u%o(3R+-LPEzrq&2rk;omvf$v_UIxZ2bW z@GYza|C#;+{&VsaCr&lsYV_Y~4*31Tknr_xIU$8Qn68uc%D;K&_3~`P!`CqVV|@IW zFFUsbD?{doPWycvq(P1143FN-6-ISB=k5)USc2@e^^N3ObNfhYOuT4?4hsak?5cQ{ zzz13{(l1;V!lmxf1Yyz8XEQ9FqFCgtl@=H6*+25s@fsE^O&cw@K*GL=2v}z<$xru~ zLFbOv1xcW6sGk>S6VV4UG`LPmoC$`>ZCR?Rbu6fH3#nBj5cRF-c1T1~+SKpb!&dxR zzXk4CEym(158?!Bwr%vIS5BCemqSAurzU))#|;unrvFY0nHkL7~hCLlFC`T zK9N0c|J5dx)WYWM*YIrOy4TI3R7t<}B<*;J_UGFa3zSUbyT9yWPyXN)6>%%o+T83V zK24L+^OG^FgPm=KyU7HkNyI-wI>TXQig!h7jq4naHnWxs=e|ha1-{zlFv=9366BOA zkmVbR_@J9e)-soKxI(zZwz#emNND0B(X&PNlw-!nBROmTDJpwYGS_YB1r%ETKc}!- z|8D!aZ9I=m+nfGA!}Bta&8gY<1g@PAOrNWx^3z=2h_a_)=09)J9%yhk!w;ly^WudF z%;t3)p)DJ9N~#MpSR@>a0(CFHq+deP{nOhK}o;ee4lD>AwQRAf7}pW=HSRVefelbLJd~HbO9L0GQ^xAi$!wfXJbeJP&)q5blz+ z2*&HXOFZXlM6DoN8K`S}v)YB<7+rzbz}Ehe(~k*9RCdNn=6vXgbjV#Og~4HtXH?)t zHiMM}N7*nX3Fi`6Qln&a`FQ8ya(DfnQ9&}|7r6|8&E8(`$B)y>eTACvE^B&PO;CNh zLpwrTMHLzGE59uK3CwIOvD->WC_74QoWU!~ls1k+@4YAr+mbR0Gdh2qG#0H5Pqf}V zW>Dh(=4bbSu^;>3PK9uQ@pu;^QP8Y@dA&Y*x;U9*owI-Ty>%_Gm+;HIjL3J31wz^l z9?=h`^~02m)U*N)gl~g+o(o5V_&$+Ku5{nbE}SC}x@P#3HHesio7Fv{rUSK0b4;_a zql0mnBP(xWVZ_z@PbBJ&+?IKY)B5lXBk^%Z`cgx5hGMu^xlxlB2z32)v%>n$;ABQQ z?mtG@$ClrQ#}wUowS^obOc_da3WIwSHwN@OES4ns%2&k+Ej68t=$pyE9LX%a#UcRa zOL%xIsoxLBoPwiU9P!@T&KIyh>E%|%NWzJs z*n^+5;>G#=`$ec1fLU6AWie`LBL3UANyLLtF7e>}n4PHKr0No(%`}p9a*D89xq#0> zB}mkB%;2y;4Ehv)fJ5>b7$UZB&`L~O>-*sM?^dWh@CAOH4+^yWdJ}m6W|z+MX$c*{ zlb5|8Jre1tVcBK5O|)5M=D$X@1IV>d6ayYd4%vR@O~w@6mm0livMTR2vPG75+CW@< zuw|q;+cgPL9S*qcR>3~=YOMaAPaZ}j@J7cH%b6Co|M>DECc7#-jwEYsE5T>v3Ggow z_)I>GD|yHG*9)OFNG$10g(iiR)1uP`dV*u70q)`q{2+H3G%T_GBi`*;Qph?*&fV}V z`qR(SoWN_C-;88@kYq+RRJ9dgAkQ%{*2Gl;mO~izC5SRMPO*vMrv>dj5O%+OLb9a# z{~-YE9g6_n36CMGac_AO%k*81Hi8G%Oq55XaOLKAlY6+fda-`C43v3x8L_S!hc5D< z^(6<~bLEZS8oOfD$2JN8LMGuUYGBMbp@x0o|AQw0Eltq_9MdjQbFbllanVi?nsFFb z>9F`e*oz2_y>N{!xc-a1&d})g%sL;CJ)xo4f3O$2x-E)TT2>;6u^_j6Ri!ggC)eTk zpATw&3GDRb5arPS1I#kegs=E`nr8CGv@yE==}ZNB(vjtjvRqY+N{R@JAbg)dvIuT1@70k zx9h-Yzk7o7REyjD1eY6dsRYaVT$g6%<7ew7|64UwzhhDCSZUNFb2p)!Q7@^k5%XDdm$pB&GkfdspbN5ayQafZB>%aW#+9}e; z%;@zKpRyf9KmF0ps=5!%8@rH0+aky>-kn#;OWZ6I60)7klG9sLaGRcb8NL=4#rX%g zR7|Yy!baYnGr8eh{_?PUU>cz#L~qf#<3UP-A)uN|i~?>|pIm*fEiN~AVX@Qm4Ze&c z_%Is43;ue!yZ}vhx5jHwwpbGI!U$k!X}!p2!q=gH zVic=mL%KYoO)k+p)sNDBeJNW`G{uU3Kc2VrO7LNTXy0621l(W9hf{k@Z32TeT{Lo^ zduthz=GFTK_ey@tyOK>1iD@J1jp zg8N^MW=?=ZWgi;2ZG<&5&>VdpMo$j1+=QLx&{7-tY~|&kO^byUGSw?^t$2@XkbVws zXcMY0z3AS|3D3Sm9jqByS9SEWU@?!}|A}iZ8+wraPv&VZa}>+ztV5kWpk@)Q%)9o7 zd{p4(4_j`t+HzUqT~{B|^6dWx)Z zbUtM!kDePf^9G3?%hVYSeO{Acj(U9;eiO5!WNjfDrG7RfLkJjb1_&Q_GsrWiyN$H) ziO2O)CTbu!!JtCqWIe^U58Xi5tP0*(4sK-l?*E%Kg=wpDU0#*ea$$L3J}kRNbxAb#Y|D}v zjDg(4?}2;ETt*XYK@}t8ov8Jp)wP8E0#Vj@J%12g+<3J;yjQijpp|TR_FMZEjq>x6 zn63m(lYhxoz;v*(8@d{9n&$>Uqps*dk)6U}C14&WV!-0@Et;CzMAu!VEI=uSHC@|1^3r|FH7(Y~FtGj6UG=v1@S3v`_pwHHQxJk%{c*x#wkqRzntDk>WYPD5m?5kQ_9wn#JnqwFC0t zc_P%nWZp#7$%^OR)6YDyuHxuTAa7YRX%uj~nPOWEzMXBl)tf!`=}|J|_372f;Pn~H zp>cN-_DkvAaGzoE)3Zt|e~czmXGmxM74!9JCD)60%3fB5U$J6ofga-2K+Sw3AG)B? z*d1_wG=jI82;ooljP>DZjd-a={R$;bo0zaTP-aZ^Q75H5dPp^;LBXHiL=Qe)zhrbR z9uK4G0zD?`p4O5*IT6^zUmoNs)|__|wgtbdO52w#=U{mRXLWIo_ZxBSuq`>vX$QEN z1HtuyAH8ozY>lpGhBI%cGbPKCqZ8sD^B(PNe>_@MWPg!kMo3Zto-@B}~_nqP$aKESJzohukT zxJ|&&Tk|L^Ugmp}k^ki;dKlmAk7X)kD&XDW!7?hSAhdNPciDxSE`&z_mmM0IK*qU< zDC6y|_69T=X#RY16Wy(z%C7Iy!k~XRJmLPy(oR>o<_{9Wz#X4G=a@#gwACC$Q6q~_$^00J zpKuYQ+}hE6htKuwB2?t0pKmt&^>8foCWLGmSemBX4=o?98u#<3z>vV_tf4pP37-El z-t(eL#(%vR{Vt;ZmF716zpYI8Gvlq>%f99=rG7@|O5+uM7LPi zsr+tjSJgLjgKcN_Osjj;son=3KAE$+*phAG{3E@O)j=b%!1ZctzpP1G{U&*ygl3Q2 zsVhd+X|qJO-CW~5TV&@<9oDlGUQYcWu`&qA*wB2?>qu})CzYGRv;(t$yyE_3lou3Equ6Uid+Ir3IfoVGLj~E`gQ#Wd-=()}jRVR!^X*EUcK3tYPq6|D z$HUwu4Gmv?_W5>{`}uPFmC-%(zAXM{S@~sQQR{&?hXpE?z}2{NYnfYLKU!4s+2&lu zOqRnI$;-n(?3_PkKX4?i)S=b}xYq z!Z2B2#Td4?^_yb7h|W?e=JXW_!hW3Yp8d@yU-daIIIo}o33&1>XMd8s`}#w`1mx;q z-?1mXsp0yU{v(r1!=KoETq!Q~S8PVb`IpL%?t(Ubh=OX`txvyc+@De?^2y@qt>euJ zF|!ua);Ys;+@dKAhZ_ryKT1 z3^APU1FS)fg>$B^M6~>_@q+AGd$j95qSZD7RLiF|tu+!wXx#;xUE8%a;$t+TA!iH{ z^Vtx(452l`9Mmh^E~Z__4IArsN>Br}A33+33PEUn-3Dr`UQ0Tfk7%r(0kt2E4~ES| zv~+Tysol^DMrei2xr*)wPdR{R9t=PWzt6Blr)nXz!W#I% rZ7uM&ZyKm6J2PRm4?-)jTk+@r5|_d!OB_y@GXR07tDnm{r-UW|!2tTh literal 0 HcmV?d00001 diff --git a/apps/dashboard/src/app/(dashboard)/dashboard/billing/page.tsx b/apps/dashboard/src/app/(dashboard)/dashboard/billing/page.tsx index f6c8721..3dc1b5e 100644 --- a/apps/dashboard/src/app/(dashboard)/dashboard/billing/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/dashboard/billing/page.tsx @@ -1,166 +1,654 @@ 'use client' -import { useEffect, useState } from 'react' +import { useEffect, useMemo, useState } from 'react' import Link from 'next/link' import { formatCurrency } from '@rentaldrivego/types' import { apiFetch } from '@/lib/api' import { useDashboardI18n } from '@/components/I18nProvider' -type Currency = 'MAD' | 'USD' | 'EUR' +type ReservationRow = { + id: string + invoiceNumber: string | null + contractNumber: string | null + status: string + paymentStatus: string + startDate: string + endDate: string + totalAmount: number + depositAmount: number + paidAmount: number + customer: { firstName: string; lastName: string; email: string } + vehicle: { make: string; model: string; licensePlate: string } +} type PaymentRow = { id: string + reservationId: string amount: number - currency: Currency + currency: 'MAD' | 'USD' | 'EUR' status: string type: 'CHARGE' | 'DEPOSIT' paymentProvider: 'AMANPAY' | 'PAYPAL' + paymentMethod: string | null paidAt: string | null createdAt: string - reservation: { - id: string - customer: { firstName: string; lastName: string } - vehicle: { make: string; model: string; licensePlate: string } - } } -const STATUS_BADGE: Record = { +type BillingRow = ReservationRow & { + balanceDue: number + paymentCount: number + latestPayment: PaymentRow | null +} + +type ManualPaymentMethod = 'CASH' | 'CHECK' | 'BANK_TRANSFER' | 'CARD' | 'PAYPAL' + +const PAYMENT_STATUS_BADGE: Record = { + UNPAID: 'bg-rose-100 text-rose-700', + PAID: 'bg-emerald-100 text-emerald-700', + PARTIAL: 'bg-amber-100 text-amber-700', + PENDING: 'bg-sky-100 text-sky-700', + REFUNDED: 'bg-slate-100 text-slate-700', + FAILED: 'bg-rose-100 text-rose-700', + OVERDUE: 'bg-orange-100 text-orange-700', +} + +const PAYMENT_EVENT_BADGE: Record = { PENDING: 'bg-amber-100 text-amber-700', - SUCCEEDED: 'bg-green-100 text-green-700', - FAILED: 'bg-red-100 text-red-700', - REFUNDED: 'bg-slate-100 text-slate-600', - PARTIALLY_REFUNDED: 'bg-blue-100 text-blue-700', + SUCCEEDED: 'bg-emerald-100 text-emerald-700', + FAILED: 'bg-rose-100 text-rose-700', + REFUNDED: 'bg-slate-100 text-slate-700', + PARTIALLY_REFUNDED: 'bg-sky-100 text-sky-700', } -export default function RentCarBillingPage() { +export default function BillingPage() { const { language } = useDashboardI18n() + const localeCode = language === 'fr' ? 'fr-FR' : language === 'ar' ? 'ar-MA' : 'en-US' + const [reservations, setReservations] = useState([]) const [payments, setPayments] = useState([]) - const [loading, setLoading] = useState(true) + const [search, setSearch] = useState('') const [error, setError] = useState(null) + const [loading, setLoading] = useState(true) + const [paymentModalRow, setPaymentModalRow] = useState(null) + const [paymentMethod, setPaymentMethod] = useState('CASH') + const [paymentType, setPaymentType] = useState<'CHARGE' | 'DEPOSIT'>('CHARGE') + const [paymentCurrency, setPaymentCurrency] = useState<'MAD' | 'USD' | 'EUR'>('MAD') + const [paymentAmount, setPaymentAmount] = useState('') + const [submittingPayment, setSubmittingPayment] = useState(false) + const [paymentError, setPaymentError] = useState(null) const copy = { en: { - title: 'Rent Car Billing', - subtitle: 'Track rental payment transactions across all reservations.', - bookCar: 'Book car', - loading: 'Loading payments…', - empty: 'No rental payments yet.', - failed: 'Failed to load rental payments.', - reservation: 'Reservation', + heading: 'Customer Billing', + subtitle: 'Manage customer invoices, payment status, collected amounts, and remaining balances.', + search: 'Search by customer, invoice, contract, vehicle, or plate…', + totalBilled: 'Total billed', + totalCollected: 'Collected', + outstanding: 'Outstanding', + openInvoices: 'Open invoices', customer: 'Customer', vehicle: 'Vehicle', - type: 'Type', - provider: 'Provider', + invoice: 'Invoice', + rentalPeriod: 'Rental period', + total: 'Total', + paid: 'Paid', + balance: 'Balance', status: 'Status', - created: 'Created', - paidAt: 'Paid at', - amount: 'Amount', - charge: 'Charge', + payment: 'Payment', + paymentMethod: 'Payment method', + actions: 'Actions', + contract: 'Contract', deposit: 'Deposit', + acceptPayment: 'Accept payment', + paymentModalTitle: 'Accept customer payment', + paymentModalSubtitle: 'Record a payment received for this reservation. No online provider setup is required.', + paymentType: 'Payment type', + paymentCurrency: 'Payment currency', + paymentAmount: 'Payment amount', + cancel: 'Cancel', + savingPayment: 'Saving payment…', + savePayment: 'Save payment', + chargeHelp: 'Charge records a payment against the reservation balance.', + depositHelp: 'Deposit records money received for the refundable security deposit.', + invalidAmount: 'Enter a valid payment amount within the remaining balance.', + paymentActionDisabled: 'No balance due', + paymentsRecorded: (count: number) => `${count} payment(s)`, + none: '—', + loading: 'Loading customer billing…', + noRows: 'No customer bills found.', + failed: 'Failed to load customer billing.', + openContract: 'Open contract', + openBooking: 'Open booking', + charge: 'Charge', + depositType: 'Deposit', + unknownInvoice: 'Draft invoice', + paymentStatusLabels: { + UNPAID: 'Unpaid', + PAID: 'Paid', + PARTIAL: 'Partial', + PENDING: 'Pending', + REFUNDED: 'Refunded', + FAILED: 'Failed', + OVERDUE: 'Overdue', + } as Record, + paymentEventLabels: { + PENDING: 'Pending', + SUCCEEDED: 'Succeeded', + FAILED: 'Failed', + REFUNDED: 'Refunded', + PARTIALLY_REFUNDED: 'Partially refunded', + } as Record, + paymentProviderLabels: { + AMANPAY: 'AmanPay', + PAYPAL: 'PayPal', + } as Record, + paymentMethodLabels: { + CASH: 'Cash', + CHECK: 'Check', + BANK_TRANSFER: 'Bank transfer', + CARD: 'Card', + PAYPAL: 'PayPal', + STRIPE: 'Card', + CREDIT_CARD: 'Card', + DEBIT_CARD: 'Card', + } as Record, }, fr: { - title: 'Facturation location', - subtitle: 'Suivez les paiements de location sur toutes les réservations.', - bookCar: 'Réserver une voiture', - loading: 'Chargement des paiements…', - empty: 'Aucun paiement de location pour le moment.', - failed: 'Échec du chargement des paiements de location.', - reservation: 'Réservation', + heading: 'Facturation clients', + subtitle: 'Gérez les factures clients, le statut des paiements, les montants encaissés et les soldes restants.', + search: 'Rechercher par client, facture, contrat, véhicule ou plaque…', + totalBilled: 'Total facturé', + totalCollected: 'Encaissé', + outstanding: 'Solde restant', + openInvoices: 'Factures ouvertes', customer: 'Client', vehicle: 'Véhicule', - type: 'Type', - provider: 'Prestataire', + invoice: 'Facture', + rentalPeriod: 'Période', + total: 'Total', + paid: 'Payé', + balance: 'Solde', status: 'Statut', - created: 'Créé le', - paidAt: 'Payé le', - amount: 'Montant', - charge: 'Paiement', + payment: 'Paiement', + paymentMethod: 'Mode de paiement', + actions: 'Actions', + contract: 'Contrat', deposit: 'Dépôt', + acceptPayment: 'Encaisser', + paymentModalTitle: 'Encaisser un paiement client', + paymentModalSubtitle: 'Enregistrez un paiement reçu pour cette réservation. Aucune configuration de fournisseur en ligne n’est requise.', + paymentType: 'Type de paiement', + paymentCurrency: 'Devise du paiement', + paymentAmount: 'Montant du paiement', + cancel: 'Annuler', + savingPayment: 'Enregistrement…', + savePayment: 'Enregistrer le paiement', + chargeHelp: 'Paiement enregistre un règlement sur le solde de la réservation.', + depositHelp: 'Dépôt enregistre l’encaissement du dépôt de garantie remboursable.', + invalidAmount: 'Saisissez un montant valide dans la limite du solde restant.', + paymentActionDisabled: 'Aucun solde dû', + paymentsRecorded: (count: number) => `${count} paiement(s)`, + none: '—', + loading: 'Chargement de la facturation client…', + noRows: 'Aucune facture client trouvée.', + failed: 'Échec du chargement de la facturation client.', + openContract: 'Ouvrir le contrat', + openBooking: 'Ouvrir la réservation', + charge: 'Paiement', + depositType: 'Dépôt', + unknownInvoice: 'Facture brouillon', + paymentStatusLabels: { + UNPAID: 'Non payé', + PAID: 'Payé', + PARTIAL: 'Partiel', + PENDING: 'En attente', + REFUNDED: 'Remboursé', + FAILED: 'Échoué', + OVERDUE: 'En retard', + } as Record, + paymentEventLabels: { + PENDING: 'En attente', + SUCCEEDED: 'Réussi', + FAILED: 'Échoué', + REFUNDED: 'Remboursé', + PARTIALLY_REFUNDED: 'Partiellement remboursé', + } as Record, + paymentProviderLabels: { + AMANPAY: 'AmanPay', + PAYPAL: 'PayPal', + } as Record, + paymentMethodLabels: { + CASH: 'Espèces', + CHECK: 'Chèque', + BANK_TRANSFER: 'Virement bancaire', + CARD: 'Carte', + PAYPAL: 'PayPal', + STRIPE: 'Carte', + CREDIT_CARD: 'Carte', + DEBIT_CARD: 'Carte', + } as Record, }, ar: { - title: 'فوترة تأجير السيارات', - subtitle: 'تتبع معاملات دفع الإيجار عبر جميع الحجوزات.', - bookCar: 'حجز سيارة', - loading: 'جارٍ تحميل المدفوعات…', - empty: 'لا توجد مدفوعات تأجير حتى الآن.', - failed: 'فشل تحميل مدفوعات التأجير.', - reservation: 'الحجز', + heading: 'فوترة العملاء', + subtitle: 'إدارة فواتير العملاء وحالة الدفع والمبالغ المحصلة والأرصدة المتبقية.', + search: 'ابحث بالعميل أو الفاتورة أو العقد أو السيارة أو اللوحة…', + totalBilled: 'إجمالي الفواتير', + totalCollected: 'المحصّل', + outstanding: 'المتبقي', + openInvoices: 'الفواتير المفتوحة', customer: 'العميل', vehicle: 'المركبة', - type: 'النوع', - provider: 'المزوّد', + invoice: 'الفاتورة', + rentalPeriod: 'فترة الإيجار', + total: 'الإجمالي', + paid: 'المدفوع', + balance: 'الرصيد', status: 'الحالة', - created: 'تاريخ الإنشاء', - paidAt: 'تاريخ الدفع', - amount: 'المبلغ', + payment: 'الدفعة', + paymentMethod: 'طريقة الدفع', + actions: 'الإجراءات', + contract: 'العقد', + deposit: 'العربون', + acceptPayment: 'تحصيل دفعة', + paymentModalTitle: 'تحصيل دفعة من العميل', + paymentModalSubtitle: 'سجّل دفعة مستلمة لهذا الحجز. لا يتطلب ذلك إعداد مزود دفع عبر الإنترنت.', + paymentType: 'نوع الدفع', + paymentCurrency: 'عملة الدفع', + paymentAmount: 'مبلغ الدفعة', + cancel: 'إلغاء', + savingPayment: 'جارٍ الحفظ…', + savePayment: 'حفظ الدفعة', + chargeHelp: 'الدفعة تسجل مبلغاً مستلماً على رصيد الحجز.', + depositHelp: 'العربون يسجل مبلغ التأمين القابل للاسترداد المستلم.', + invalidAmount: 'أدخل مبلغاً صحيحاً ضمن الرصيد المتبقي.', + paymentActionDisabled: 'لا يوجد رصيد مستحق', + paymentsRecorded: (count: number) => `${count} دفعة`, + none: '—', + loading: 'جارٍ تحميل فوترة العملاء…', + noRows: 'لم يتم العثور على فواتير عملاء.', + failed: 'فشل تحميل فوترة العملاء.', + openContract: 'فتح العقد', + openBooking: 'فتح الحجز', charge: 'دفعة', - deposit: 'عربون', + depositType: 'عربون', + unknownInvoice: 'فاتورة مسودة', + paymentStatusLabels: { + UNPAID: 'غير مدفوع', + PAID: 'مدفوع', + PARTIAL: 'جزئي', + PENDING: 'قيد الانتظار', + REFUNDED: 'مسترد', + FAILED: 'فشل', + OVERDUE: 'متأخر', + } as Record, + paymentEventLabels: { + PENDING: 'قيد الانتظار', + SUCCEEDED: 'ناجح', + FAILED: 'فشل', + REFUNDED: 'مسترد', + PARTIALLY_REFUNDED: 'مسترد جزئياً', + } as Record, + paymentProviderLabels: { + AMANPAY: 'AmanPay', + PAYPAL: 'PayPal', + } as Record, + paymentMethodLabels: { + CASH: 'نقداً', + CHECK: 'شيك', + BANK_TRANSFER: 'تحويل بنكي', + CARD: 'بطاقة', + PAYPAL: 'PayPal', + STRIPE: 'بطاقة', + CREDIT_CARD: 'بطاقة', + DEBIT_CARD: 'بطاقة', + } as Record, }, }[language] + async function loadBillingData() { + const [reservationRows, paymentRows] = await Promise.all([ + apiFetch('/reservations?pageSize=100'), + apiFetch('/payments/company'), + ]) + setReservations(reservationRows ?? []) + setPayments(paymentRows ?? []) + } + useEffect(() => { - apiFetch('/payments/company') - .then((rows) => setPayments(rows ?? [])) + loadBillingData() .catch((err) => setError(err.message ?? copy.failed)) .finally(() => setLoading(false)) - }, []) + }, [copy.failed]) + + const billingRows = useMemo(() => { + const paymentsByReservation = new Map() + + for (const payment of payments) { + const existing = paymentsByReservation.get(payment.reservationId) ?? [] + existing.push(payment) + paymentsByReservation.set(payment.reservationId, existing) + } + + return reservations.map((reservation) => { + const reservationPayments = (paymentsByReservation.get(reservation.id) ?? []).sort((a, b) => + new Date(b.paidAt ?? b.createdAt).getTime() - new Date(a.paidAt ?? a.createdAt).getTime(), + ) + + return { + ...reservation, + balanceDue: Math.max(reservation.totalAmount - reservation.paidAmount, 0), + paymentCount: reservationPayments.length, + latestPayment: reservationPayments[0] ?? null, + } + }) + }, [payments, reservations]) + + const filteredRows = useMemo(() => { + const q = search.trim().toLowerCase() + if (!q) return billingRows + return billingRows.filter((row) => + `${row.customer.firstName} ${row.customer.lastName}`.toLowerCase().includes(q) || + row.customer.email.toLowerCase().includes(q) || + `${row.vehicle.make} ${row.vehicle.model}`.toLowerCase().includes(q) || + row.vehicle.licensePlate.toLowerCase().includes(q) || + (row.invoiceNumber ?? '').toLowerCase().includes(q) || + (row.contractNumber ?? '').toLowerCase().includes(q), + ) + }, [billingRows, search]) + + const totals = useMemo(() => { + return filteredRows.reduce( + (acc, row) => { + acc.totalBilled += row.totalAmount + acc.totalCollected += row.paidAmount + acc.outstanding += row.balanceDue + if (row.balanceDue > 0) acc.openInvoices += 1 + return acc + }, + { totalBilled: 0, totalCollected: 0, outstanding: 0, openInvoices: 0 }, + ) + }, [filteredRows]) + + function formatDate(value: string) { + return new Date(value).toLocaleDateString(localeCode, { + month: 'short', + day: 'numeric', + year: 'numeric', + }) + } + + function translateStatus(status: string, labels: Record) { + return labels[status] ?? status.replace(/_/g, ' ') + } + + function translatePaymentMethod(method: string | null) { + if (!method) return copy.none + return copy.paymentMethodLabels[method] ?? method.replace(/_/g, ' ') + } + + function canAcceptPayment(row: BillingRow) { + return row.balanceDue > 0 + } + + function openPaymentModal(row: BillingRow) { + setPaymentModalRow(row) + setPaymentMethod('CASH') + setPaymentType('CHARGE') + setPaymentCurrency('MAD') + setPaymentAmount(String((row.balanceDue / 100).toFixed(2))) + setPaymentError(null) + } + + async function handleAcceptPayment() { + if (!paymentModalRow) return + + const amount = Math.round(Number(paymentAmount) * 100) + if (!Number.isFinite(amount) || amount <= 0 || amount > paymentModalRow.balanceDue) { + setPaymentError(copy.invalidAmount) + return + } + + setSubmittingPayment(true) + setPaymentError(null) + + try { + await apiFetch(`/payments/reservations/${paymentModalRow.id}/manual`, { + method: 'POST', + body: JSON.stringify({ + amount, + type: paymentType, + currency: paymentCurrency, + paymentMethod, + }), + }) + await loadBillingData() + setPaymentModalRow(null) + } catch (err: any) { + setPaymentError(err.message ?? copy.failed) + } finally { + setSubmittingPayment(false) + } + } return (

-
+
-

{copy.title}

+

{copy.heading}

{copy.subtitle}

- - {copy.bookCar} - + setSearch(event.target.value)} + placeholder={copy.search} + className="input-field w-full lg:max-w-md" + />
- {error ?
{error}
: null} +
+ + + + +
-
- - - - - - - - - - - - - - - - {loading ? ( - - ) : payments.length === 0 ? ( - - ) : payments.map((row) => ( - - - - - - - - - - + {error ? ( +
{error}
+ ) : ( +
+
{copy.reservation}{copy.customer}{copy.vehicle}{copy.type}{copy.provider}{copy.status}{copy.created}{copy.paidAt}{copy.amount}
{copy.loading}
{copy.empty}
#{row.reservation.id.slice(0, 8)}{row.reservation.customer.firstName} {row.reservation.customer.lastName}{row.reservation.vehicle.make} {row.reservation.vehicle.model} · {row.reservation.vehicle.licensePlate}{row.type === 'DEPOSIT' ? copy.deposit : copy.charge}{row.paymentProvider} - - {row.status} - - {new Date(row.createdAt).toLocaleDateString()}{row.paidAt ? new Date(row.paidAt).toLocaleDateString() : '—'}{formatCurrency(row.amount, row.currency)}
+ + + + + + + + + + + + + - ))} - -
{copy.customer}{copy.vehicle}{copy.invoice}{copy.rentalPeriod}{copy.total}{copy.paid}{copy.balance}{copy.status}{copy.payment}{copy.paymentMethod}{copy.actions}
-
+ + + {loading ? ( + + {copy.loading} + + ) : filteredRows.length === 0 ? ( + + {copy.noRows} + + ) : filteredRows.map((row) => ( + + +

{row.customer.firstName} {row.customer.lastName}

+

{row.customer.email}

+ + +

{row.vehicle.make} {row.vehicle.model}

+

{row.vehicle.licensePlate}

+ + +

{row.invoiceNumber ?? copy.unknownInvoice}

+

{copy.contract}: {row.contractNumber ?? copy.none}

+ + +

{formatDate(row.startDate)}

+

{formatDate(row.endDate)}

+ + + {formatCurrency(row.totalAmount, 'MAD')} + {row.depositAmount > 0 ? ( +

{copy.deposit}: {formatCurrency(row.depositAmount, 'MAD')}

+ ) : null} + + {formatCurrency(row.paidAmount, 'MAD')} + {formatCurrency(row.balanceDue, 'MAD')} + + + {translateStatus(row.paymentStatus, copy.paymentStatusLabels)} + + + + {row.latestPayment ? ( +
+
+ + {translateStatus(row.latestPayment.status, copy.paymentEventLabels)} + + {copy.paymentProviderLabels[row.latestPayment.paymentProvider] ?? row.latestPayment.paymentProvider} +
+

+ {row.latestPayment.type === 'DEPOSIT' ? copy.depositType : copy.charge} · {formatCurrency(row.latestPayment.amount, row.latestPayment.currency)} +

+

{formatDate(row.latestPayment.paidAt ?? row.latestPayment.createdAt)} · {copy.paymentsRecorded(row.paymentCount)}

+
+ ) : ( + {copy.none} + )} + + + {row.latestPayment ? ( +
+

{translatePaymentMethod(row.latestPayment.paymentMethod)}

+

{copy.paymentProviderLabels[row.latestPayment.paymentProvider] ?? row.latestPayment.paymentProvider}

+
+ ) : ( + {copy.none} + )} + + +
+ {canAcceptPayment(row) ? ( + + ) : ( + {copy.paymentActionDisabled} + )} + + {copy.openContract} + + + {copy.openBooking} + +
+ + + ))} + + +
+ )}
+ + {paymentModalRow ? ( +
{ + if (event.target === event.currentTarget && !submittingPayment) setPaymentModalRow(null) + }}> +
+
+
+

{copy.paymentModalTitle}

+

{copy.paymentModalSubtitle}

+
+ +
+ +
+

{paymentModalRow.customer.firstName} {paymentModalRow.customer.lastName}

+

{paymentModalRow.vehicle.make} {paymentModalRow.vehicle.model} · {paymentModalRow.vehicle.licensePlate}

+

{copy.invoice}: {paymentModalRow.invoiceNumber ?? copy.unknownInvoice}

+

{copy.balance}: {formatCurrency(paymentModalRow.balanceDue, paymentCurrency)}

+
+ + {paymentError ? ( +
+ {paymentError} +
+ ) : null} + +
+
+ + +
+ +
+ + +

{paymentType === 'DEPOSIT' ? copy.depositHelp : copy.chargeHelp}

+
+ +
+ + +
+ +
+ + setPaymentAmount(event.target.value)} disabled={submittingPayment} /> +
+
+ +
+ + +
+
+
+ ) : null} +
+ ) +} + +function MetricCard({ label, value }: { label: string; value: string }) { + return ( +
+

{label}

+

{value}

) } diff --git a/apps/dashboard/src/app/(dashboard)/dashboard/contracts/[id]/page.tsx b/apps/dashboard/src/app/(dashboard)/dashboard/contracts/[id]/page.tsx index 5cdb198..272dc08 100644 --- a/apps/dashboard/src/app/(dashboard)/dashboard/contracts/[id]/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/dashboard/contracts/[id]/page.tsx @@ -7,9 +7,11 @@ import { useParams } from 'next/navigation' import { formatCurrency } from '@rentaldrivego/types' import { apiFetch } from '@/lib/api' import { useDashboardI18n } from '@/components/I18nProvider' +import VehicleConditionSheet from '@/components/reservations/VehicleConditionSheet' type DamagePoint = { id?: string + viewType?: 'TOP' | 'FRONT' | 'REAR' | 'LEFT' | 'RIGHT' x: number y: number damageType: 'SCRATCH' | 'DENT' | 'CRACK' | 'CHIP' | 'MISSING' | 'STAIN' | 'OTHER' @@ -19,6 +21,7 @@ type DamagePoint = { type ContractPayload = { reservationId: string + contractLocale: string contractNumber: string | null invoiceNumber: string | null generatedAt: string @@ -145,38 +148,6 @@ type ContractPayload = { } } -const severityColors: Record = { - MINOR: '#f59e0b', - MODERATE: '#f97316', - MAJOR: '#dc2626', -} - -function VehicleDamageDiagram({ points }: { points: DamagePoint[] }) { - return ( - - - - - - - - - - {points.map((point, index) => ( - - ))} - - ) -} - function formatAddress(address: string | Record | null, city: string | null, country: string | null) { const lines: string[] = [] if (typeof address === 'string' && address.trim()) lines.push(address.trim()) @@ -208,6 +179,161 @@ function splitTerms(text: string | null | undefined) { .filter(Boolean) } +type ConditionLanguage = 'en' | 'fr' | 'ar' + +type ConditionItem = { + title: string + body: string +} + +const FIXED_CONDITIONS: Record = { + en: [ + { + title: 'Article 1: Use of the vehicle', + body: 'The renter agrees that only the persons named in the contract may drive the vehicle.\n\nThe following are prohibited:\n- using the vehicle for unlawful purposes;\n- transporting prohibited goods;\n- towing;\n- transporting passengers for payment;\n- driving small vehicles on unpaved roads.', + }, + { + title: 'Article 2: Condition of the vehicle', + body: 'The vehicle is delivered in proper mechanical, electrical, tire, and cleanliness condition and must be returned in the same condition.\n\nThe authorized mileage is limited to 400 km per day. Any excess mileage is billed at 1.20 DH per additional kilometer.', + }, + { + title: 'Article 3: Maintenance and repair', + body: 'Any maintenance or repair work on the vehicle must be authorized by the rental agency, whether by fax or email.\n\nAny breakdown caused by the customer’s negligence is at the customer’s expense.', + }, + { + title: 'Article 4: Insurance', + body: '1. Full coverage insurance\nIf the renter is responsible for an accident, the renter must pay:\n- the deductible set by the insurance company;\n- immobilization costs during the repair period.\n\nThe renter must notify the agency immediately in the event of an accident.\n\n2. Standard insurance\nThe renter is solely responsible in the event of an accident and must pay:\n- all repair costs;\n- compensation for the period during which the vehicle is out of service.', + }, + { + title: 'Article 5: Rental extension', + body: 'Any extension must be authorized by the rental agency. Otherwise, the renter is responsible for all costs caused by negligence.\n\nIn case of extension, the renter must notify the agency one day in advance.\n\nThe vehicle must be returned at the scheduled time. Any delay exceeding two hours will result in an additional day being charged.\n\nThe company reserves the right to terminate the contract without justification or compensation if the renter does not comply with the contract conditions.\n\nNo refund will be made in case of early return.\n\nIn the event of an unauthorized extension, the customer must pay 100 dirhams per hour until the vehicle is returned.', + }, + { + title: 'Article 6: Vehicle documents', + body: 'In case of loss of the vehicle documents, all related costs remain the responsibility of the renter, including:\n- vehicle immobilization;\n- renewal of the documents.', + }, + { + title: 'Article 7: Liability', + body: 'The renter is responsible for:\n- fines;\n- violations;\n- official reports issued against the renter by the authorities.\n\nThe driver remains financially responsible for damage caused to the vehicle while driving under the influence of:\n- alcohol;\n- drugs;\n- medication prohibited while driving.\n\nThe renter must not abandon the vehicle for any reason.', + }, + { + title: 'Article 8: Cancellation of the renter’s rights', + body: 'All rights granted to the renter under this contract are cancelled if any clause of the contract is breached, without any compensation for the remaining rental period.', + }, + { + title: 'Article 9: Disputes', + body: 'Any dispute between the rental company and the renter falls under the exclusive jurisdiction of the competent courts at the registered office of the company.', + }, + ], + fr: [ + { + title: 'Article 1 : Utilisation de la voiture', + body: 'Le locataire s’engage à ne laisser conduire la voiture qu’aux personnes désignées dans le contrat.\n\nIl est interdit :\n- d’utiliser le véhicule à des fins illicites ;\n- de transporter des marchandises interdites ;\n- d’effectuer du remorquage ;\n- de transporter des personnes contre rémunération ;\n- d’utiliser les petites voitures sur des pistes non goudronnées.', + }, + { + title: 'Article 2 : État de la voiture', + body: 'Le véhicule est livré en parfait état de propreté mécanique, électrique et pneumatique. Il doit être rendu dans le même état.\n\nLe kilométrage autorisé est fixé à 400 km par jour. En cas de dépassement, le locataire devra payer 1,20 DH par kilomètre supplémentaire.', + }, + { + title: 'Article 3 : Entretien et réparation', + body: 'Toute opération d’entretien ou de réparation du véhicule doit être autorisée par l’agence de location, soit par fax, soit par email.\n\nToute panne causée par la négligence du client sera à sa charge.', + }, + { + title: 'Article 4 : Assurance', + body: '1. Assurance tous risques\nSi le locataire est responsable d’un accident, il devra payer :\n- la franchise fixée par la compagnie d’assurance ;\n- les frais d’immobilisation du véhicule pendant la période de réparation.\n\nLe locataire doit informer immédiatement l’agence en cas d’accident.\n\n2. Assurance normale\nLe locataire est l’unique responsable en cas d’accident et doit payer :\n- tous les frais de réparation ;\n- les jours d’immobilisation du véhicule.', + }, + { + title: 'Article 5 : Prolongation de location', + body: 'Toute prolongation doit être autorisée par l’agence de location. À défaut, le locataire sera responsable de tous les frais causés par sa négligence.\n\nEn cas de prolongation, le locataire doit prévenir l’agence un jour à l’avance.\n\nLe véhicule doit être rendu à l’heure prévue. Tout retard dépassant deux heures entraînera la facturation d’une journée supplémentaire.\n\nLa société se réserve le droit de mettre fin au contrat sans justification ni compensation si le locataire ne respecte pas les conditions du contrat.\n\nEn cas de retour anticipé, aucun remboursement ne sera effectué.\n\nEn cas de prolongation non autorisée, le client devra payer 100 dirhams par heure jusqu’à la restitution du véhicule.', + }, + { + title: 'Article 6 : Papiers de la voiture', + body: 'En cas de perte des papiers du véhicule, tous les frais restent à la charge du locataire, y compris :\n- immobilisation du véhicule ;\n- renouvellement des papiers.', + }, + { + title: 'Article 7 : Responsabilité', + body: 'Le locataire est responsable :\n- des amendes ;\n- des contraventions ;\n- des procès-verbaux établis contre lui par les autorités.\n\nLe conducteur restera financièrement responsable des dommages causés au véhicule en cas de conduite sous l’emprise :\n- de l’alcool ;\n- de drogues ;\n- de médicaments interdits pendant la conduite.\n\nLe locataire ne doit pas abandonner le véhicule, quelle qu’en soit la raison.', + }, + { + title: 'Article 8 : Annulation du droit du locataire', + body: 'Tous les droits accordés au locataire par ce contrat seront annulés en cas de non-respect d’une clause du contrat, sans aucune indemnisation pour la durée restante de la location.', + }, + { + title: 'Article 9 : Litiges', + body: 'Tout litige entre la société de location et le locataire relève exclusivement des tribunaux compétents du siège social de la société.', + }, + ], + ar: [ + { + title: 'البند 1 : استعمال السيارة', + body: 'لا يسمح بسياقة السيارة إلا من طرف الأشخاص المحددة أسماؤهم في العقد.\n\nيمنع:\n- استعمال السيارة لأغراض غير مشروعة؛\n- نقل البضائع الممنوعة؛\n- جر العربات؛\n- نقل الأشخاص بمقابل؛\n- استعمال السيارات الخفيفة في الطرق غير المعبدة.', + }, + { + title: 'البند 2 : حالة السيارة', + body: 'تُسلَّم السيارة في حالة جيدة من حيث النظافة والحالة الميكانيكية والكهربائية والعجلات، على أن تُعاد بنفس الحالة.\n\nالمسافة المسموح بها محددة في 400 كلم يومياً، وكل تجاوز لهذه المسافة يؤدي عنه المستأجر مبلغ 1.20 درهم عن كل كيلومتر إضافي.', + }, + { + title: 'البند 3 : الصيانة والإصلاح', + body: 'يجب الحصول على موافقة وكالة التأجير قبل القيام بأي عملية صيانة أو إصلاح، سواء عن طريق الفاكس أو البريد الإلكتروني.\n\nكل عطب ناتج عن إهمال المستأجر يتحمل هو مصاريفه.', + }, + { + title: 'البند 4 : التأمين', + body: '1. التأمين الشامل\nإذا ثبتت مسؤولية المستأجر في حادثة سير، فإنه يلتزم بأداء:\n- مبلغ التحمل المحدد من طرف شركة التأمين؛\n- المصاريف الناتجة عن توقف السيارة أثناء الإصلاح.\n\nويجب عليه إشعار وكالة التأجير فور وقوع الحادث.\n\n2. التأمين العادي\nيعتبر المستأجر المسؤول الوحيد عن حوادث السير، ويتحمل:\n- جميع مصاريف الإصلاح؛\n- تعويض فترة توقف السيارة عن العمل.', + }, + { + title: 'البند 5 : تمديد مدة الكراء', + body: 'لا يمكن تمديد مدة الكراء إلا بموافقة وكالة التأجير.\n\nيجب على المستأجر إشعار الوكالة قبل يوم واحد على الأقل من التمديد.\n\nفي حالة التأخير عن موعد إرجاع السيارة لأكثر من ساعتين، يُحتسب يوم إضافي.\n\nتحتفظ الشركة بحق فسخ العقد دون تعويض إذا أخلّ المستأجر بأي بند من بنوده.\n\nفي حالة الإرجاع المبكر، لا يحق للمكتري المطالبة بأي تعويض أو استرجاع.\n\nوفي حالة عدم تمديد العقد رسمياً، يلتزم المستأجر بأداء 100 درهم عن كل ساعة تأخير إلى حين استرجاع السيارة.', + }, + { + title: 'البند 6 : أوراق السيارة', + body: 'في حالة ضياع أوراق السيارة، يتحمل المستأجر جميع المصاريف المتعلقة بذلك، بما فيها:\n- مصاريف تجديد الوثائق؛\n- أيام توقف السيارة.', + }, + { + title: 'البند 7 : المسؤولية', + body: 'يتحمل المستأجر:\n- الغرامات؛\n- المخالفات؛\n- جميع المحاضر المحررة ضده من طرف السلطات المختصة.\n\nكما يتحمل المسؤولية المالية عن الأضرار الناتجة عن القيادة تحت تأثير:\n- الكحول؛\n- المخدرات؛\n- الأدوية الممنوعة أثناء السياقة.\n\nويتعهد بعدم التخلي عن السيارة مهما كانت أسباب توقفها.', + }, + { + title: 'البند 8 : سقوط حق المكتري', + body: 'تسقط كافة حقوق المكتري الممنوحة له بموجب هذا العقد في حالة عدم احترام أي بند من بنوده، دون المطالبة بأي تعويض عن المدة المتبقية.', + }, + { + title: 'البند 9 : المنازعات', + body: 'تخضع جميع النزاعات بين شركة التأجير والمستأجر للاختصاص الحصري للمحاكم التابعة لمقر الشركة.', + }, + ], +} + +function normalizeContractLocale(value: string | null | undefined, fallback: ConditionLanguage): 'en' | 'en-ar' | 'fr' | 'fr-ar' | 'ar' { + const normalized = String(value ?? '').trim().toLowerCase() + if (normalized === 'en' || normalized === 'en-ar' || normalized === 'fr' || normalized === 'fr-ar' || normalized === 'ar') { + return normalized + } + return fallback +} + +function getConditionLanguages(mode: 'en' | 'en-ar' | 'fr' | 'fr-ar' | 'ar'): ConditionLanguage[] { + if (mode === 'en' || mode === 'en-ar') return ['en', 'ar'] + if (mode === 'fr' || mode === 'fr-ar') return ['fr', 'ar'] + return ['ar'] +} + +function getConditionLanguageLabel(language: ConditionLanguage) { + if (language === 'fr') return 'Français' + if (language === 'ar') return 'العربية' + return 'English' +} + +function getAdditionalConditionTitle(language: ConditionLanguage, index: number) { + if (language === 'fr') return `Clause supplémentaire ${index + 1}` + if (language === 'ar') return `بند إضافي ${index + 1}` + return `Additional clause ${index + 1}` +} + +function splitConditionItems(items: ConditionItem[]) { + const midpoint = Math.ceil(items.length / 2) + return [items.slice(0, midpoint), items.slice(midpoint)] +} + function PaperField({ label, value, @@ -254,7 +380,7 @@ export default function ContractDetailPage() { const [contract, setContract] = useState(null) const [error, setError] = useState(null) - const copy = { + const copyByLanguage = { en: { back: 'Back to contracts', booking: 'Booking', @@ -313,8 +439,7 @@ export default function ContractDetailPage() { insuranceCondition: 'Insurance and vehicle condition', acknowledgementSignature: 'Driver acknowledgement and signature', vehicleInformation: 'Rental vehicle information', - rentalRate: 'Car rental rate', - billingSummary: 'Payment and billing summary', + chargesAndFees: 'Fees and charges', damageDiagram: 'Vehicle damage diagram', customerName: 'Customer name', homeAddress: 'Home address', @@ -445,8 +570,7 @@ export default function ContractDetailPage() { insuranceCondition: 'Assurance et état du véhicule', acknowledgementSignature: 'Reconnaissance et signature', vehicleInformation: 'Informations véhicule', - rentalRate: 'Tarification de location', - billingSummary: 'Résumé de facturation', + chargesAndFees: 'Frais et charges', damageDiagram: 'Schéma des dommages du véhicule', customerName: 'Nom du client', homeAddress: 'Adresse', @@ -577,8 +701,7 @@ export default function ContractDetailPage() { insuranceCondition: 'التأمين وحالة المركبة', acknowledgementSignature: 'إقرار السائق والتوقيع', vehicleInformation: 'معلومات مركبة التأجير', - rentalRate: 'سعر التأجير', - billingSummary: 'ملخص الفوترة', + chargesAndFees: 'الرسوم والتكاليف', damageDiagram: 'مخطط أضرار المركبة', customerName: 'اسم العميل', homeAddress: 'العنوان', @@ -651,7 +774,7 @@ export default function ContractDetailPage() { fuelLevelLabels: { FULL: 'ممتلئ', SEVEN_EIGHTHS: '7/8', THREE_QUARTERS: '3/4', FIVE_EIGHTHS: '5/8', HALF: '1/2', THREE_EIGHTHS: '3/8', QUARTER: '1/4', ONE_EIGHTH: '1/8', EMPTY: 'فارغ' }, paymentProviderLabels: { CASH: 'نقداً', STRIPE: 'Stripe', BANK_TRANSFER: 'تحويل بنكي', CHECK: 'شيك', PAYPAL: 'PayPal', CREDIT_CARD: 'بطاقة ائتمان', DEBIT_CARD: 'بطاقة خصم' }, }, - }[language] + } as const useEffect(() => { apiFetch(`/reservations/${id}/contract`) @@ -662,6 +785,8 @@ export default function ContractDetailPage() { .catch((err) => setError(err.message ?? 'Failed to load contract')) }, [id]) + const contractUiLanguage: ConditionLanguage = language + const copy = copyByLanguage[contractUiLanguage] const localeCode = language === 'fr' ? 'fr-FR' : language === 'ar' ? 'ar-MA' : 'en-US' const formatDateTime = (value: string | null | undefined) => value @@ -684,22 +809,29 @@ export default function ContractDetailPage() { const tl = (map: Record, key: string) => map[key] ?? key const damagePoints = contract.inspections.checkIn?.damagePoints ?? [] - const rentalLine = contract.invoice.lineItems.find((item) => item.category === 'RENTAL') ?? contract.invoice.lineItems[0] - const depositLine = contract.invoice.lineItems.find((item) => item.category === 'DEPOSIT') - const additionalDriverLine = contract.invoice.lineItems.filter((item) => item.category === 'ADDITIONAL_DRIVER') - const clauses = splitTerms(contract.terms.terms) - const vehicleLabel = `${contract.vehicle.year} ${contract.vehicle.make} ${contract.vehicle.model}` - const fallbackClauses = [ - copy.fallbackClauses.vehicleReservation(vehicleLabel), - copy.fallbackClauses.authorizedUse, - copy.fallbackClauses.fuel, - copy.fallbackClauses.damage, - copy.fallbackClauses.deposit, - copy.fallbackClauses.lateFees, - copy.fallbackClauses.paymentAuthorization(contract.company.name), - copy.fallbackClauses.general, - ] - const agreementClauses = clauses.length > 0 ? clauses : fallbackClauses + const customClauses = splitTerms(contract.terms.terms) + const contractLocaleMode = normalizeContractLocale(language, language) + const conditionLanguages = getConditionLanguages(contractLocaleMode) + const conditionColumns = conditionLanguages + .map((conditionLanguage) => ({ + language: conditionLanguage, + heading: getConditionLanguageLabel(conditionLanguage), + clauses: [ + ...FIXED_CONDITIONS[conditionLanguage], + ...customClauses.map((clause, index) => ({ + title: getAdditionalConditionTitle(conditionLanguage, index), + body: clause, + })), + ], + })) + .sort((a, b) => (a.language === 'ar' ? 1 : 0) - (b.language === 'ar' ? 1 : 0)) + const singleLanguageClauseColumns = conditionColumns.length === 1 + ? splitConditionItems(conditionColumns[0].clauses) + : [] + const isBilingual = conditionColumns.length === 2 + const arCopy = copyByLanguage.ar + const bl = (primary: string, ar: string) => isBilingual ? `${primary} / ${ar}` : primary + const roadsidePhone = contract.company.phone ?? copy.none const latestPayment = contract.invoice.payments.at(-1) const driverFullName = `${contract.driver.firstName} ${contract.driver.lastName}` @@ -750,27 +882,27 @@ export default function ContractDetailPage() { {contract.company.name}

- {contract.company.name} {copy.agreementTitle} + {contract.company.name} {bl(copy.agreementTitle, arCopy.agreementTitle)}

- {copy.agreementForReservation} {contract.contractNumber ?? contract.reservationId.slice(-8).toUpperCase()} + {bl(copy.agreementForReservation, arCopy.agreementForReservation)} {contract.contractNumber ?? contract.reservationId.slice(-8).toUpperCase()}

-

{copy.status}

+

{bl(copy.status, arCopy.status)}

{tl(copy.contractStatusLabels, contract.status)}

-

{copy.paymentStatus}

+

{bl(copy.paymentStatus, arCopy.paymentStatus)}

{tl(copy.paymentStatusLabels, contract.paymentStatus)}

-

{copy.contractNo}

+

{bl(copy.contractNo, arCopy.contractNo)}

{contract.contractNumber ?? '—'}

-

{copy.generated}

+

{bl(copy.generated, arCopy.generated)}

{formatDateTime(contract.generatedAt)}

@@ -779,61 +911,64 @@ export default function ContractDetailPage() {
- +
- - - - - - - - - + + + + + + + + +
- +
- - - - - - - + + + + + + +
- +
0 ? contract.insurance.policies.map((policy) => `${policy.name} (${tl(copy.chargeTypeLabels, policy.chargeType)})`).join(', ') : copy.noInsurance} className="bg-white" /> - - + +
- +

{copy.signatureAcknowledgement}

+ {isBilingual && ( +

{arCopy.signatureAcknowledgement}

+ )}

- {copy.signature}: {contract.terms.signatureRequired ? copy.yes : copy.no} + {bl(copy.signature, arCopy.signature)}: {contract.terms.signatureRequired ? copy.yes : copy.no}

- {copy.customerSignature} + {bl(copy.customerSignature, arCopy.customerSignature)}
- {copy.companyRepresentative} + {bl(copy.companyRepresentative, arCopy.companyRepresentative)}
@@ -841,43 +976,37 @@ export default function ContractDetailPage() {
- +
- - - - - -
-

{copy.damageDiagram}

-
- + + + + + +
+

{bl(copy.damageDiagram, arCopy.damageDiagram)}

+
+
-

+

{damagePoints.length > 0 ? copy.damageMarkersRecorded(damagePoints.length) : copy.noDamage}

- -
- - - - sum + item.total, 0), contract.invoice.currency)} className="bg-white" /> - - - 0 ? contract.invoice.taxes.map((tax) => `${tax.label} ${tax.rate}%`).join(', ') : copy.none} className="bg-white" /> - - - - -
-
- - +
+
+ + + + + +
+
+

{bl(copy.chargesAndFees, arCopy.chargesAndFees)}

+
{contract.invoice.lineItems.map((item, index) => (
@@ -887,9 +1016,39 @@ export default function ContractDetailPage() {

{formatCurrency(item.total, contract.invoice.currency)}

))} +
+
+ {bl(copy.subtotal, arCopy.subtotal)} + {formatCurrency(contract.invoice.subtotal, contract.invoice.currency)} +
+
+ {bl(copy.taxesLabel, arCopy.taxesLabel)} + + {contract.invoice.taxes.length > 0 + ? formatCurrency(contract.invoice.taxTotal, contract.invoice.currency) + : copy.none} + +
+
+ {bl(copy.totalChargeLabel, arCopy.totalChargeLabel)} + {formatCurrency(contract.invoice.total, contract.invoice.currency)} +
+
+ {bl(copy.amountPaidLabel, arCopy.amountPaidLabel)} + {formatCurrency(contract.invoice.amountPaid, contract.invoice.currency)} +
+
+ {bl(copy.balanceDueLabel, arCopy.balanceDueLabel)} + {formatCurrency(contract.invoice.balanceDue, contract.invoice.currency)} +
+
+ {bl(copy.paymentMode, arCopy.paymentMode)} + {contract.paymentMode ?? latestPayment?.paymentMethod ?? copy.none} +
+
{latestPayment ? (
- {copy.lastPayment}: {tl(copy.paymentProviderLabels, latestPayment.provider)} · {tl(copy.paymentStatusLabels, latestPayment.status)} · {formatDateTime(latestPayment.paidAt ?? latestPayment.createdAt)} + {bl(copy.lastPayment, arCopy.lastPayment)}: {tl(copy.paymentProviderLabels, latestPayment.provider)} · {tl(copy.paymentStatusLabels, latestPayment.status)} · {formatDateTime(latestPayment.paidAt ?? latestPayment.createdAt)}
) : null}
@@ -898,55 +1057,49 @@ export default function ContractDetailPage() {
- {copy.roadsideAssistance} {roadsidePhone} + {bl(copy.roadsideAssistance, arCopy.roadsideAssistance)} {roadsidePhone}
-

{copy.termsAndConditions}

+

{bl(copy.termsAndConditions, arCopy.termsAndConditions)}

{contract.company.name} · {contract.contractNumber ?? copy.draftAgreement}

-
- {agreementClauses.map((clause, index) => ( -
-

- {index + 1}. {copy.clauseHeadings[index] ?? copy.clauseHeadings[copy.clauseHeadings.length - 1]} -

-

{clause}

-
- ))} -
+ {conditionColumns.length === 2 ? ( +
+ {conditionColumns.map((column) => ( +
+
+

{column.heading}

+
+ {column.clauses.map((clause, index) => ( +
+

{clause.title}

+

{clause.body}

+
+ ))} +
+ ))} +
+ ) : ( +
+ {singleLanguageClauseColumns.map((columnClauses, columnIndex) => ( +
+ {columnClauses.map((clause, index) => ( +
+

{clause.title}

+

{clause.body}

+
+ ))} +
+ ))} +
+ )} -
- -
- - - 0 ? damagePoints.map((point) => `${tl(copy.damageTypeLabels, point.damageType)} (${tl(copy.severityLabels, point.severity)})`).join(', ') : copy.noDamage} className="bg-white" /> -
-
- - -
-
-

{copy.notes}

-

{contract.notes || copy.none}

-
-
-

{copy.footer}

-

{contract.terms.footerNote || copy.none}

-
-
-

{copy.payments}

-

{contract.invoice.payments.length > 0 ? copy.paymentsRecorded(contract.invoice.payments.length) : copy.noPayments}

-
-
-
-
diff --git a/apps/dashboard/src/app/(dashboard)/dashboard/reservations/[id]/page.tsx b/apps/dashboard/src/app/(dashboard)/dashboard/reservations/[id]/page.tsx index 7060940..16e5142 100644 --- a/apps/dashboard/src/app/(dashboard)/dashboard/reservations/[id]/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/dashboard/reservations/[id]/page.tsx @@ -2,7 +2,6 @@ import { useEffect, useState } from 'react' import { useParams } from 'next/navigation' -import Link from 'next/link' import { formatCurrency } from '@rentaldrivego/types' import { apiFetch } from '@/lib/api' import { useDashboardI18n } from '@/components/I18nProvider' @@ -20,6 +19,15 @@ interface ReservationDetail { additionalDriverTotal: number pricingRulesTotal: number paymentStatus: string + depositAmount: number + pickupLocation: string | null + returnLocation: string | null + paymentMode: string | null + notes: string | null + contractNumber: string | null + invoiceNumber: string | null + damageChargeAmount: number | null + damageChargeNote: string | null pricingRulesApplied: { name: string; amount: number; type: string }[] | null customer: { firstName: string @@ -46,16 +54,175 @@ interface ReservationDetail { approvedAt: string | null approvalNote: string | null }[] + workflow: { + contractGenerated: boolean + closed: boolean + closedAt: string | null + closedBy: string | null + coreEditable: boolean + returnEditable: boolean + checkInInspectionEditable: boolean + checkOutInspectionEditable: boolean + } +} + +type EditMode = 'booking' | 'return' | null + +type ReservationFormState = { + startDate: string + endDate: string + pickupLocation: string + returnLocation: string + depositAmount: string + paymentMode: string + notes: string + damageChargeAmount: string + damageChargeNote: string +} + +const detailCopy = { + en: { + editBooking: 'Edit booking', + saveBooking: 'Save booking', + editReturn: 'Edit return', + saveReturn: 'Save return', + cancelEdit: 'Cancel', + closeReservation: 'Close reservation', + bookingDetails: 'Booking details', + returnDetails: 'Return closing', + startLabel: 'Start date & time', + endLabel: 'End date & time', + pickupLabel: 'Pickup location', + returnLabel: 'Return location', + depositLabel: 'Deposit', + paymentModeLabel: 'Payment mode', + bookingNotesLabel: 'Booking notes', + returnChargeLabel: 'Damage charge', + returnChargeNoteLabel: 'Return note', + paymentModeEmpty: 'Not set', + noLocation: 'Not provided', + failedSave: 'Failed to save reservation', + failedClose: 'Failed to close reservation', + contractLockMessage: 'Contract generated. Booking details are locked and remain view-only until the vehicle is returned.', + activeLockMessage: 'Rental is in progress. Booking details are view-only until the vehicle is returned.', + returnLockMessage: 'Vehicle returned. Only the return section and the check-out inspection can still be edited before closing the reservation.', + closedLockMessage: 'Reservation closed. No further editing is allowed.', + closedMeta: 'Closed', + checkoutSummary: 'Check-out status', + checkoutPending: 'Waiting for return edits', + checkoutReady: 'Return section open', + checkoutClosed: 'Reservation closed', + checkInReadOnly: 'Check-in inspection is only editable after the reservation is confirmed and before return.', + checkOutReadOnly: 'Check-out inspection becomes editable once the vehicle is returned.', + inspectionClosed: 'This reservation is closed. Inspection edits are disabled.', + }, + fr: { + editBooking: 'Modifier la réservation', + saveBooking: 'Enregistrer la réservation', + editReturn: 'Modifier le retour', + saveReturn: 'Enregistrer le retour', + cancelEdit: 'Annuler', + closeReservation: 'Clôturer la réservation', + bookingDetails: 'Détails de la réservation', + returnDetails: 'Clôture du retour', + startLabel: 'Date et heure de départ', + endLabel: 'Date et heure de retour', + pickupLabel: 'Lieu de départ', + returnLabel: 'Lieu de retour', + depositLabel: 'Dépôt', + paymentModeLabel: 'Mode de paiement', + bookingNotesLabel: 'Notes de réservation', + returnChargeLabel: 'Frais de dommage', + returnChargeNoteLabel: 'Note de retour', + paymentModeEmpty: 'Non défini', + noLocation: 'Non renseigné', + failedSave: 'Échec de la sauvegarde de la réservation', + failedClose: 'Échec de la clôture de la réservation', + contractLockMessage: 'Le contrat a été généré. Les détails de la réservation sont verrouillés jusqu’au retour du véhicule.', + activeLockMessage: 'La location est en cours. Les détails de la réservation sont en lecture seule jusqu’au retour du véhicule.', + returnLockMessage: 'Le véhicule est de retour. Seule la section de retour et l’inspection de retour peuvent encore être modifiées avant la clôture.', + closedLockMessage: 'La réservation est clôturée. Aucune autre modification n’est autorisée.', + closedMeta: 'Clôturée', + checkoutSummary: 'Statut du retour', + checkoutPending: 'En attente des modifications de retour', + checkoutReady: 'Section retour ouverte', + checkoutClosed: 'Réservation clôturée', + checkInReadOnly: 'L’inspection de départ est modifiable après confirmation et avant le retour.', + checkOutReadOnly: 'L’inspection de retour devient modifiable une fois le véhicule retourné.', + inspectionClosed: 'Cette réservation est clôturée. Les modifications d’inspection sont désactivées.', + }, + ar: { + editBooking: 'تعديل الحجز', + saveBooking: 'حفظ الحجز', + editReturn: 'تعديل الإرجاع', + saveReturn: 'حفظ الإرجاع', + cancelEdit: 'إلغاء', + closeReservation: 'إغلاق الحجز', + bookingDetails: 'تفاصيل الحجز', + returnDetails: 'إقفال الإرجاع', + startLabel: 'تاريخ ووقت البداية', + endLabel: 'تاريخ ووقت النهاية', + pickupLabel: 'موقع الاستلام', + returnLabel: 'موقع الإرجاع', + depositLabel: 'العربون', + paymentModeLabel: 'طريقة الدفع', + bookingNotesLabel: 'ملاحظات الحجز', + returnChargeLabel: 'رسوم الأضرار', + returnChargeNoteLabel: 'ملاحظة الإرجاع', + paymentModeEmpty: 'غير محدد', + noLocation: 'غير متوفر', + failedSave: 'فشل حفظ الحجز', + failedClose: 'فشل إغلاق الحجز', + contractLockMessage: 'تم إنشاء العقد. تفاصيل الحجز مقفلة وتبقى للعرض فقط حتى عودة السيارة.', + activeLockMessage: 'التأجير قيد التنفيذ. تفاصيل الحجز للعرض فقط حتى عودة السيارة.', + returnLockMessage: 'تمت إعادة السيارة. يمكن تعديل قسم الإرجاع وفحص الإرجاع فقط قبل إغلاق الحجز.', + closedLockMessage: 'تم إغلاق الحجز. لا يُسمح بأي تعديل إضافي.', + closedMeta: 'مغلق', + checkoutSummary: 'حالة الإرجاع', + checkoutPending: 'بانتظار تعديلات الإرجاع', + checkoutReady: 'قسم الإرجاع مفتوح', + checkoutClosed: 'تم إغلاق الحجز', + checkInReadOnly: 'يمكن تعديل فحص الاستلام بعد تأكيد الحجز وقبل الإرجاع فقط.', + checkOutReadOnly: 'يصبح فحص الإرجاع قابلاً للتعديل بعد عودة السيارة.', + inspectionClosed: 'هذا الحجز مغلق. تم تعطيل تعديل الفحص.', + }, +} as const + +function toDateTimeInputValue(iso: string) { + const date = new Date(iso) + const offset = date.getTimezoneOffset() + return new Date(date.getTime() - offset * 60_000).toISOString().slice(0, 16) +} + +function toFormState(reservation: ReservationDetail): ReservationFormState { + return { + startDate: toDateTimeInputValue(reservation.startDate), + endDate: toDateTimeInputValue(reservation.endDate), + pickupLocation: reservation.pickupLocation ?? '', + returnLocation: reservation.returnLocation ?? '', + depositAmount: String(reservation.depositAmount ?? 0), + paymentMode: reservation.paymentMode ?? '', + notes: reservation.notes ?? '', + damageChargeAmount: reservation.damageChargeAmount !== null && reservation.damageChargeAmount !== undefined ? String(reservation.damageChargeAmount) : '', + damageChargeNote: reservation.damageChargeNote ?? '', + } +} + +function toIsoString(value: string) { + return new Date(value).toISOString() } export default function ReservationDetailPage() { const params = useParams<{ id: string }>() const { dict, language } = useDashboardI18n() const r = dict.reservations + const copy = detailCopy[language] const localeCode = language === 'fr' ? 'fr-FR' : language === 'ar' ? 'ar-MA' : 'en-US' const [reservation, setReservation] = useState(null) const [inspections, setInspections] = useState([]) + const [form, setForm] = useState(null) + const [editMode, setEditMode] = useState(null) const [error, setError] = useState(null) const [actionError, setActionError] = useState(null) const [acting, setActing] = useState(false) @@ -68,6 +235,8 @@ export default function ReservationDetailPage() { ]) setReservation(reservationData) setInspections(inspectionData) + setForm(toFormState(reservationData)) + setEditMode(null) setError(null) } catch (err: any) { setError(err.message ?? r.failedToLoad) @@ -95,6 +264,56 @@ export default function ReservationDetailPage() { } } + async function saveReservation(mode: Exclude) { + if (!form) return + + setActing(true) + setActionError(null) + try { + const payload = mode === 'booking' + ? { + startDate: toIsoString(form.startDate), + endDate: toIsoString(form.endDate), + pickupLocation: form.pickupLocation || null, + returnLocation: form.returnLocation || null, + depositAmount: Number(form.depositAmount || 0), + paymentMode: form.paymentMode || null, + notes: form.notes || null, + } + : { + returnLocation: form.returnLocation || null, + damageChargeAmount: form.damageChargeAmount ? Number(form.damageChargeAmount) : 0, + damageChargeNote: form.damageChargeNote || null, + } + + await apiFetch(`/reservations/${params.id}`, { + method: 'PATCH', + body: JSON.stringify(payload), + }) + await loadReservation() + } catch (err: any) { + setActionError(err.message ?? copy.failedSave) + } finally { + setActing(false) + } + } + + async function closeReservation() { + setActing(true) + setActionError(null) + try { + await apiFetch(`/reservations/${params.id}/close`, { + method: 'POST', + body: JSON.stringify({}), + }) + await loadReservation() + } catch (err: any) { + setActionError(err.message ?? copy.failedClose) + } finally { + setActing(false) + } + } + async function approveDriver(driverId: string) { setActing(true) setActionError(null) @@ -115,10 +334,25 @@ export default function ReservationDetailPage() { new Date(iso).toLocaleDateString(localeCode, { month: 'short', day: 'numeric', year: 'numeric' }) if (error) return
{error}
- if (!reservation) return
{r.loadingReservation}
+ if (!reservation || !form) return
{r.loadingReservation}
- const checkinInspection = inspections.find((i) => i.type === 'CHECKIN') - const checkoutInspection = inspections.find((i) => i.type === 'CHECKOUT') + const checkinInspection = inspections.find((inspection) => inspection.type === 'CHECKIN') + const checkoutInspection = inspections.find((inspection) => inspection.type === 'CHECKOUT') + const bookingInputsDisabled = editMode !== 'booking' + const returnInputsDisabled = editMode !== 'return' + + let workflowMessage = '' + if (reservation.workflow.closed) workflowMessage = copy.closedLockMessage + else if (reservation.workflow.returnEditable) workflowMessage = copy.returnLockMessage + else if (reservation.workflow.contractGenerated) workflowMessage = copy.contractLockMessage + else if (reservation.status === 'ACTIVE') workflowMessage = copy.activeLockMessage + + const checkInReadOnlyMessage = reservation.workflow.closed + ? copy.inspectionClosed + : copy.checkInReadOnly + const checkOutReadOnlyMessage = reservation.workflow.closed + ? copy.inspectionClosed + : copy.checkOutReadOnly return (
@@ -126,11 +360,48 @@ export default function ReservationDetailPage() {

Reservation {reservation.id.slice(-8).toUpperCase()}

{reservation.source} · {reservation.status} · {reservation.paymentStatus}

+ {reservation.workflow.closedAt && ( +

+ {copy.closedMeta} {formatDate(reservation.workflow.closedAt)}{reservation.workflow.closedBy ? ` · ${reservation.workflow.closedBy}` : ''} +

+ )}
- - {language === 'fr' ? 'Contrat' : language === 'ar' ? 'العقد' : 'Contract'} - + {editMode === null && reservation.workflow.coreEditable && ( + + )} + {editMode === 'booking' && ( + <> + + + + )} + {editMode === null && reservation.workflow.returnEditable && ( + <> + + + + )} + {editMode === 'return' && ( + <> + + + + )} {reservation.status === 'DRAFT' && (
+ {workflowMessage && ( +
+ {workflowMessage} +
+ )} + {actionError &&
{actionError}
}
@@ -172,12 +449,129 @@ export default function ReservationDetailPage() {

{reservation.vehicle.make} {reservation.vehicle.model}

{reservation.vehicle.licensePlate}

{formatDate(reservation.startDate)} - {formatDate(reservation.endDate)}

+

{copy.paymentModeLabel}: {reservation.paymentMode || copy.paymentModeEmpty}

+
+

{copy.bookingDetails}

+
+
+ + setForm((current) => current ? { ...current, startDate: e.target.value } : current)} + /> +
+
+ + setForm((current) => current ? { ...current, endDate: e.target.value } : current)} + /> +
+
+ + setForm((current) => current ? { ...current, pickupLocation: e.target.value } : current)} + /> +
+
+ + setForm((current) => current ? { ...current, returnLocation: e.target.value } : current)} + /> +
+
+ + setForm((current) => current ? { ...current, depositAmount: e.target.value } : current)} + /> +
+
+ + setForm((current) => current ? { ...current, paymentMode: e.target.value } : current)} + /> +
+
+
+ +