fix: reference type in payment and billing

This commit is contained in:
Nathnael
2026-06-29 09:50:29 +00:00
parent 4be4286fbf
commit 2551f76f8a
4 changed files with 72 additions and 11 deletions

View File

@@ -40,6 +40,10 @@ import {
export interface InitiateIntentInput {
/** Opaque domain reference (booking id, …). */
referenceId: string;
/** Invoice source that owns the intent ('booking', …) — stored on the projection. */
source: string;
/** Gateway reference type the intent is opened with (caller's domain decides it). */
referenceType: PaymentReferenceType;
/** Human-readable order ref shown on provider pages. */
orderRef: string;
/** Authoritative amount in minor units, computed by the caller. */
@@ -194,7 +198,7 @@ export class PaymentService {
async initiate(input: InitiateIntentInput): Promise<InitiateIntentResult> {
const snapshot = await this.paymentClient.initiate({
service: PaymentServiceEnum.FREIGHT,
referenceType: PaymentReferenceType.SHIPMENT,
referenceType: input.referenceType,
referenceId: input.referenceId,
orderRef: input.orderRef,
amountMinor: input.amountMinor,
@@ -240,7 +244,6 @@ export class PaymentService {
): Promise<PaymentEntity> {
const existing = await this.paymentRepo.findOneBy({
refId: input.referenceId,
type: "booking",
});
const method: PaymentEntity["method"] =
@@ -270,7 +273,8 @@ export class PaymentService {
return this.paymentRepo.create({
refId: input.referenceId,
type: "booking",
type: input.source,
referenceType: input.referenceType,
amount: input.amountMinor,
currency: input.currency as PaymentEntity["currency"],
reason: input.reason ?? `Payment for ${input.orderRef}`,
@@ -287,12 +291,12 @@ export class PaymentService {
* (the booking id, but this service does not load it).
*/
async getIntentByBookingId(referenceId: string): Promise<IntentStatusDto> {
const local = await this.paymentRepo.findOneBy({ refId: referenceId, type: "booking" });
const local = await this.paymentRepo.findOneBy({ refId: referenceId });
let snapshot: PaymentIntentSnapshot | null = null;
try {
snapshot = await this.paymentClient.getIntentByReference(
PaymentReferenceType.SHIPMENT,
(local?.referenceType as PaymentReferenceType) ?? PaymentReferenceType.SHIPMENT,
referenceId,
);
} catch (err) {
@@ -423,7 +427,7 @@ export class PaymentService {
}
findBookingById(id: string) {
return this.paymentRepo.findOneBy({ refId: id, type: "booking" });
return this.paymentRepo.findOneBy({ refId: id });
}
formatIntentResponse(intent: PaymentEntity): InitiateResponseDto {
@@ -459,7 +463,7 @@ export class PaymentService {
failureMessage?: string;
}): Promise<{ processed: boolean; alreadyFinalized?: boolean; reason?: string }> {
if (event.eventType === "payment.succeeded") {
const intent = await this.paymentRepo.findOneBy({ refId: event.referenceId, type: "booking" });
const intent = await this.paymentRepo.findOneBy({ refId: event.referenceId });
if (!intent) {
return { processed: false, reason: `No local intent for reference ${event.referenceId}` };
}
@@ -472,7 +476,7 @@ export class PaymentService {
}
if (event.eventType === "payment.failed") {
const intent = await this.paymentRepo.findOneBy({ refId: event.referenceId, type: "booking" });
const intent = await this.paymentRepo.findOneBy({ refId: event.referenceId });
if (!intent) {
return { processed: false, reason: `No local intent for reference ${event.referenceId}` };
}