From 0d9e866a57387dca00679b239c9400878859aec0 Mon Sep 17 00:00:00 2001 From: Alireza Hassani Date: Fri, 2 Oct 2026 22:15:10 +0330 Subject: [PATCH] Expose gateway tracking fields on order transactions. Include authority, track id, masked card, and paid-at from gateway meta for support and reconciliation. Co-authored-by: Cursor --- src/orders/orders.service.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/orders/orders.service.ts b/src/orders/orders.service.ts index ff72d5c..b57ddd6 100644 --- a/src/orders/orders.service.ts +++ b/src/orders/orders.service.ts @@ -29,6 +29,9 @@ import { } from './dto/order.dto'; import { ShippingAddressDto } from '../cart/dto/cart.dto'; +function isRecord(value: unknown): value is Record { + return typeof value === 'object' && value !== null && !Array.isArray(value); +} type OrderWithItems = Prisma.OrderGetPayload<{ include: typeof ORDER_RELATIONS_INCLUDE; }>; @@ -910,6 +913,18 @@ export class OrdersService { } private serializeTransaction(transaction: Transaction) { + const meta = isRecord(transaction.gatewayMeta) + ? transaction.gatewayMeta + : null; + const verify = meta && isRecord(meta.verify) ? meta.verify : null; + const cardPan = + (verify && typeof verify.cardPan === 'string' && verify.cardPan.trim()) || + (meta && typeof meta.cardPan === 'string' && meta.cardPan.trim()) || + null; + const completedAt = + (meta && typeof meta.completedAt === 'string' && meta.completedAt.trim()) || + null; + return { id: transaction.id.toString(), type: transaction.type, @@ -919,6 +934,8 @@ export class OrdersService { gatewayType: transaction.gatewayType, gatewayRef: transaction.gatewayRef ?? null, gatewayTrackId: transaction.gatewayTrackId ?? null, + cardPan, + paidAt: completedAt, transferAccount: transaction.transferAccount, transferRefNumber: transaction.transferRefNumber, notes: transaction.notes,