@voyant-travel/finance 0.120.2 → 0.121.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts
CHANGED
|
@@ -35,6 +35,7 @@ export { type DocumentDownloadEnvelope, type DocumentDownloadResolution, type Do
|
|
|
35
35
|
export { createInvoiceFxHonoExtension, createInvoiceFxRoutes, createVoyantDataFxExchangeRateResolver, type InvoiceExchangeRateResolution, type InvoiceFxContext, type InvoiceFxOptions, type InvoiceFxRouteOptions, type InvoiceFxSettings, mountInvoiceFxRoutes, type ResolvedInvoiceFxSettings, type ResolveInvoiceExchangeRate, type ResolveInvoiceExchangeRateInput, type ResolveInvoiceFxSettings, resolveInvoiceFxContext, resolveInvoiceFxSettingsOrDefault, type UpdateInvoiceFxSettings, type VoyantDataFxResolverOptions, } from "./invoice-fx.js";
|
|
36
36
|
export type { ComputedScheduleEntry, ComputeScheduleInput, DepositKind, DepositRule, PaymentPolicy, PaymentPolicyCascadeLayers, PaymentPolicySource, PaymentScheduleEntryType, ResolvedPaymentPolicy, } from "./payment-policy.js";
|
|
37
37
|
export { computePaymentSchedule, isPaymentPolicyEmpty, noDepositPolicy, policyShouldRequireFullPayment, resolveEffectivePaymentPolicy, } from "./payment-policy.js";
|
|
38
|
+
export { type BookingScheduleRoutesOptions, createBookingScheduleAdminRoutes, createPaymentPolicyPublicRoutes, generatePaymentScheduleForBooking, type PaymentPolicyEntityContext, } from "./payment-schedule/routes.js";
|
|
38
39
|
export { buildFinanceRouteRuntime, FINANCE_ROUTE_RUNTIME_CONTAINER_KEY, type FinanceRouteRuntime, type FinanceRuntimeOptions, } from "./route-runtime.js";
|
|
39
40
|
export { bookingsCreateExtension } from "./routes-booking-create.js";
|
|
40
41
|
export { createFinanceAdminDocumentRoutes, type FinanceDocumentRouteOptions, type InvoiceDocumentGenerator, } from "./routes-documents.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -89,6 +89,7 @@ export { computeBookingItemTaxLine, createBookingTaxHonoExtension, createBooking
|
|
|
89
89
|
export { resolveStoredDocumentDownload, } from "./document-download.js";
|
|
90
90
|
export { createInvoiceFxHonoExtension, createInvoiceFxRoutes, createVoyantDataFxExchangeRateResolver, mountInvoiceFxRoutes, resolveInvoiceFxContext, resolveInvoiceFxSettingsOrDefault, } from "./invoice-fx.js";
|
|
91
91
|
export { computePaymentSchedule, isPaymentPolicyEmpty, noDepositPolicy, policyShouldRequireFullPayment, resolveEffectivePaymentPolicy, } from "./payment-policy.js";
|
|
92
|
+
export { createBookingScheduleAdminRoutes, createPaymentPolicyPublicRoutes, generatePaymentScheduleForBooking, } from "./payment-schedule/routes.js";
|
|
92
93
|
export { buildFinanceRouteRuntime, FINANCE_ROUTE_RUNTIME_CONTAINER_KEY, } from "./route-runtime.js";
|
|
93
94
|
export { bookingsCreateExtension } from "./routes-booking-create.js";
|
|
94
95
|
export { createFinanceAdminDocumentRoutes, } from "./routes-documents.js";
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Booking payment-schedule route module — owned by `@voyant-travel/finance`.
|
|
3
|
+
*
|
|
4
|
+
* Hosts the admin + public payment-policy surface plus the schedule-generation
|
|
5
|
+
* orchestration that backs the `booking.confirmed` subscriber:
|
|
6
|
+
*
|
|
7
|
+
* POST /v1/admin/bookings/:bookingId/payment-schedule/regenerate
|
|
8
|
+
* POST /v1/public/payment-policy/resolve
|
|
9
|
+
*
|
|
10
|
+
* The policy cascade (booking → listing → category → supplier → operator
|
|
11
|
+
* default) is deployment-specific — the resolvers read across vertical modules
|
|
12
|
+
* (cruises / accommodations / products / suppliers / categories) that the
|
|
13
|
+
* finance package must not statically import. They are therefore INJECTED via
|
|
14
|
+
* {@link BookingScheduleRoutesOptions}, alongside the operator-default resolver.
|
|
15
|
+
*
|
|
16
|
+
* The bookings schema (`bookings`, `bookingActivityLog`) and the action-ledger
|
|
17
|
+
* appender are imported directly: `@voyant-travel/finance` already depends on
|
|
18
|
+
* both `@voyant-travel/bookings` and `@voyant-travel/action-ledger` acyclically
|
|
19
|
+
* (neither depends back on finance), so no injection is needed there.
|
|
20
|
+
*
|
|
21
|
+
* All handler behavior, cascade precedence, idempotency, and the activity-log
|
|
22
|
+
* entry are preserved byte-for-byte from the operator's previous
|
|
23
|
+
* `booking-schedule.ts`.
|
|
24
|
+
*/
|
|
25
|
+
import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
|
|
26
|
+
import { type Context, Hono } from "hono";
|
|
27
|
+
import { type PaymentPolicy, type PaymentPolicySource } from "../payment-policy.js";
|
|
28
|
+
/**
|
|
29
|
+
* Storefront-preview entity context passed to the per-entity cascade
|
|
30
|
+
* resolvers. Structural mirror of the operator's `PaymentPolicyEntityContext`
|
|
31
|
+
* — the resolvers walk these journey selections to find the listing/category/
|
|
32
|
+
* supplier policy without a persisted booking row.
|
|
33
|
+
*/
|
|
34
|
+
export interface PaymentPolicyEntityContext {
|
|
35
|
+
entityModule: string;
|
|
36
|
+
entityId: string;
|
|
37
|
+
/** Cruise journey selection — resolves cabin → sailing → cruise. */
|
|
38
|
+
sailingId?: string;
|
|
39
|
+
cabinCategoryId?: string;
|
|
40
|
+
/** Accommodation journey selection — resolves the rate plan's policy. */
|
|
41
|
+
ratePlanId?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Deployment-supplied options for the booking payment-schedule route module.
|
|
45
|
+
*
|
|
46
|
+
* The cascade resolvers + operator default are INJECTED because they read
|
|
47
|
+
* across vertical modules (cruises / accommodations / products / suppliers /
|
|
48
|
+
* product categories) that finance must not statically import. The bookings
|
|
49
|
+
* schema and action-ledger appender are NOT injected — finance already depends
|
|
50
|
+
* on both acyclically and imports them directly.
|
|
51
|
+
*/
|
|
52
|
+
export interface BookingScheduleRoutesOptions {
|
|
53
|
+
/** Resolve the per-request drizzle db from the Hono context (`c.get("db")`). */
|
|
54
|
+
resolveDb(c: Context): PostgresJsDatabase;
|
|
55
|
+
/** Operator-default payment policy (the cascade's last-resort layer). */
|
|
56
|
+
resolveOperatorDefaultPaymentPolicy(db: PostgresJsDatabase): Promise<PaymentPolicy | null>;
|
|
57
|
+
/** Phase 2: supplier-layer override keyed off the booking's supplier link. */
|
|
58
|
+
resolveSupplierPolicy(db: PostgresJsDatabase, bookingId: string): Promise<PaymentPolicy | null>;
|
|
59
|
+
/** Phase 3: product-category override (first category by sortOrder). */
|
|
60
|
+
resolveCategoryPolicy(db: PostgresJsDatabase, bookingId: string): Promise<PaymentPolicy | null>;
|
|
61
|
+
/** Phase 4: per-listing override (first booking-item product policy). */
|
|
62
|
+
resolveListingPolicy(db: PostgresJsDatabase, bookingId: string): Promise<PaymentPolicy | null>;
|
|
63
|
+
resolveListingPolicyForEntity(db: PostgresJsDatabase, ctx: PaymentPolicyEntityContext): Promise<PaymentPolicy | null>;
|
|
64
|
+
resolveCategoryPolicyForEntity(db: PostgresJsDatabase, ctx: PaymentPolicyEntityContext): Promise<PaymentPolicy | null>;
|
|
65
|
+
resolveSupplierPolicyForEntity(db: PostgresJsDatabase, ctx: PaymentPolicyEntityContext): Promise<PaymentPolicy | null>;
|
|
66
|
+
/** Persist the winning cascade source onto the booking's internalNotes. */
|
|
67
|
+
stampPolicySourceOnBooking(db: PostgresJsDatabase, bookingId: string, source: PaymentPolicySource): Promise<void>;
|
|
68
|
+
/** Read the stamped cascade source back off internalNotes (regenerate response). */
|
|
69
|
+
readPolicySourceFromInternalNotes(internalNotes: string): PaymentPolicySource | null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Generate (or regenerate) the payment schedule for a booking.
|
|
73
|
+
*
|
|
74
|
+
* Resolves the effective customer payment policy (cascade: booking → listing →
|
|
75
|
+
* category → supplier → operator default), runs {@link computePaymentSchedule},
|
|
76
|
+
* persists the rows via `financeService.applyComputedPaymentSchedule`, stamps
|
|
77
|
+
* the cascade source on the booking, and writes a `system_action` activity-log
|
|
78
|
+
* entry.
|
|
79
|
+
*
|
|
80
|
+
* Idempotent: when any schedule row already exists for the booking (in any
|
|
81
|
+
* status) it returns early so a re-fired `booking.confirmed` event doesn't wipe
|
|
82
|
+
* outstanding rows and double-bill the customer on paper.
|
|
83
|
+
*/
|
|
84
|
+
export declare function generatePaymentScheduleForBooking(db: PostgresJsDatabase, bookingId: string, options: BookingScheduleRoutesOptions): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Admin payment-schedule routes (relative paths; mount at `/v1/admin/bookings`).
|
|
87
|
+
*
|
|
88
|
+
* POST /:bookingId/payment-schedule/regenerate
|
|
89
|
+
*/
|
|
90
|
+
export declare function createBookingScheduleAdminRoutes(options: BookingScheduleRoutesOptions): Hono;
|
|
91
|
+
/**
|
|
92
|
+
* Public payment-policy routes (relative paths; mount at
|
|
93
|
+
* `/v1/public/payment-policy`).
|
|
94
|
+
*
|
|
95
|
+
* POST /resolve — anonymous storefront preview of the effective policy.
|
|
96
|
+
*/
|
|
97
|
+
export declare function createPaymentPolicyPublicRoutes(options: BookingScheduleRoutesOptions): Hono;
|
|
98
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/payment-schedule/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,KAAK,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAGzC,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,mBAAmB,EAEzB,MAAM,sBAAsB,CAAA;AAI7B;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,4BAA4B;IAC3C,gFAAgF;IAChF,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,kBAAkB,CAAA;IACzC,yEAAyE;IACzE,mCAAmC,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAG1F,8EAA8E;IAC9E,qBAAqB,CAAC,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAC/F,wEAAwE;IACxE,qBAAqB,CAAC,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAC/F,yEAAyE;IACzE,oBAAoB,CAAC,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAG9F,6BAA6B,CAC3B,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,0BAA0B,GAC9B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAChC,8BAA8B,CAC5B,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,0BAA0B,GAC9B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAChC,8BAA8B,CAC5B,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,0BAA0B,GAC9B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAGhC,2EAA2E;IAC3E,0BAA0B,CACxB,EAAE,EAAE,kBAAkB,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAAA;IAChB,oFAAoF;IACpF,iCAAiC,CAAC,aAAa,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAAA;CACrF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iCAAiC,CACrD,EAAE,EAAE,kBAAkB,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAuFf;AA6LD;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,4BAA4B,GAAG,IAAI,CAI5F;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,4BAA4B,GAAG,IAAI,CAI3F"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Booking payment-schedule route module — owned by `@voyant-travel/finance`.
|
|
3
|
+
*
|
|
4
|
+
* Hosts the admin + public payment-policy surface plus the schedule-generation
|
|
5
|
+
* orchestration that backs the `booking.confirmed` subscriber:
|
|
6
|
+
*
|
|
7
|
+
* POST /v1/admin/bookings/:bookingId/payment-schedule/regenerate
|
|
8
|
+
* POST /v1/public/payment-policy/resolve
|
|
9
|
+
*
|
|
10
|
+
* The policy cascade (booking → listing → category → supplier → operator
|
|
11
|
+
* default) is deployment-specific — the resolvers read across vertical modules
|
|
12
|
+
* (cruises / accommodations / products / suppliers / categories) that the
|
|
13
|
+
* finance package must not statically import. They are therefore INJECTED via
|
|
14
|
+
* {@link BookingScheduleRoutesOptions}, alongside the operator-default resolver.
|
|
15
|
+
*
|
|
16
|
+
* The bookings schema (`bookings`, `bookingActivityLog`) and the action-ledger
|
|
17
|
+
* appender are imported directly: `@voyant-travel/finance` already depends on
|
|
18
|
+
* both `@voyant-travel/bookings` and `@voyant-travel/action-ledger` acyclically
|
|
19
|
+
* (neither depends back on finance), so no injection is needed there.
|
|
20
|
+
*
|
|
21
|
+
* All handler behavior, cascade precedence, idempotency, and the activity-log
|
|
22
|
+
* entry are preserved byte-for-byte from the operator's previous
|
|
23
|
+
* `booking-schedule.ts`.
|
|
24
|
+
*/
|
|
25
|
+
import { appendActionLedgerMutation } from "@voyant-travel/action-ledger";
|
|
26
|
+
import { bookingActivityLog, bookings } from "@voyant-travel/bookings/schema";
|
|
27
|
+
import { parseJsonBody } from "@voyant-travel/hono";
|
|
28
|
+
import { asc, eq } from "drizzle-orm";
|
|
29
|
+
import { Hono } from "hono";
|
|
30
|
+
import { z } from "zod";
|
|
31
|
+
import { computePaymentSchedule, noDepositPolicy, resolveEffectivePaymentPolicy, } from "../payment-policy.js";
|
|
32
|
+
import { bookingPaymentSchedules } from "../schema/booking-billing.js";
|
|
33
|
+
import { financeService } from "../service.js";
|
|
34
|
+
/**
|
|
35
|
+
* Generate (or regenerate) the payment schedule for a booking.
|
|
36
|
+
*
|
|
37
|
+
* Resolves the effective customer payment policy (cascade: booking → listing →
|
|
38
|
+
* category → supplier → operator default), runs {@link computePaymentSchedule},
|
|
39
|
+
* persists the rows via `financeService.applyComputedPaymentSchedule`, stamps
|
|
40
|
+
* the cascade source on the booking, and writes a `system_action` activity-log
|
|
41
|
+
* entry.
|
|
42
|
+
*
|
|
43
|
+
* Idempotent: when any schedule row already exists for the booking (in any
|
|
44
|
+
* status) it returns early so a re-fired `booking.confirmed` event doesn't wipe
|
|
45
|
+
* outstanding rows and double-bill the customer on paper.
|
|
46
|
+
*/
|
|
47
|
+
export async function generatePaymentScheduleForBooking(db, bookingId, options) {
|
|
48
|
+
const [booking] = await db.select().from(bookings).where(eq(bookings.id, bookingId)).limit(1);
|
|
49
|
+
if (!booking)
|
|
50
|
+
return;
|
|
51
|
+
if (!booking.sellAmountCents || booking.sellAmountCents <= 0)
|
|
52
|
+
return;
|
|
53
|
+
// Idempotency: this subscriber fires on every `booking.confirmed`
|
|
54
|
+
// emission, which includes re-confirmations during the
|
|
55
|
+
// checkout-finalize workflow when an existing booking transitions
|
|
56
|
+
// to confirmed after a late payment. If a schedule already exists
|
|
57
|
+
// (in any status — pending/due/paid/etc.), regenerating would wipe
|
|
58
|
+
// the outstanding rows and insert a fresh full-amount plan as if
|
|
59
|
+
// the booking had never been touched, double-billing the customer
|
|
60
|
+
// on paper.
|
|
61
|
+
const [existingSchedule] = await db
|
|
62
|
+
.select({ id: bookingPaymentSchedules.id })
|
|
63
|
+
.from(bookingPaymentSchedules)
|
|
64
|
+
.where(eq(bookingPaymentSchedules.bookingId, bookingId))
|
|
65
|
+
.limit(1);
|
|
66
|
+
if (existingSchedule)
|
|
67
|
+
return;
|
|
68
|
+
const operatorDefault = (await options.resolveOperatorDefaultPaymentPolicy(db)) ?? noDepositPolicy;
|
|
69
|
+
// Phase 2: supplier-layer override. Falls back to operator
|
|
70
|
+
// default when the booking has no supplier link or the supplier
|
|
71
|
+
// hasn't configured a custom policy.
|
|
72
|
+
const supplierPolicy = await options.resolveSupplierPolicy(db, bookingId);
|
|
73
|
+
// Phase 3: product-category override. Walks the booking's
|
|
74
|
+
// products → categories and picks the first category (by
|
|
75
|
+
// productCategoryProducts.sortOrder ascending) that defines a
|
|
76
|
+
// policy. Wins over supplier per the cascade order.
|
|
77
|
+
const categoryPolicy = await options.resolveCategoryPolicy(db, bookingId);
|
|
78
|
+
// Phase 4: per-listing override. The first booking-item's product
|
|
79
|
+
// with a non-null customerPaymentPolicy wins. Most specific catalog
|
|
80
|
+
// layer — beats category, supplier, and operator default.
|
|
81
|
+
const listingPolicy = await options.resolveListingPolicy(db, bookingId);
|
|
82
|
+
// Phase 5: booking-level override. The booking's own
|
|
83
|
+
// customerPaymentPolicy column wins over every catalog layer.
|
|
84
|
+
// Reserved for ops adjustments — most bookings leave this null.
|
|
85
|
+
const bookingPolicy = booking.customerPaymentPolicy ?? null;
|
|
86
|
+
const { policy, source } = resolveEffectivePaymentPolicy({
|
|
87
|
+
bookingPolicy,
|
|
88
|
+
listingPolicy,
|
|
89
|
+
categoryPolicy,
|
|
90
|
+
supplierPolicy,
|
|
91
|
+
operatorDefault,
|
|
92
|
+
});
|
|
93
|
+
const entries = computePaymentSchedule({
|
|
94
|
+
totalCents: booking.sellAmountCents,
|
|
95
|
+
currency: booking.sellCurrency,
|
|
96
|
+
departureDate: booking.startDate,
|
|
97
|
+
}, policy);
|
|
98
|
+
await financeService.applyComputedPaymentSchedule(db, bookingId, entries, { replace: true });
|
|
99
|
+
// Stash the source on the booking's internalNotes so the contract
|
|
100
|
+
// resolver can echo it via `booking.paymentPolicy.source`. The
|
|
101
|
+
// source enum is small (booking | listing | category | supplier |
|
|
102
|
+
// operator_default) so a single marker line is enough.
|
|
103
|
+
await options.stampPolicySourceOnBooking(db, bookingId, source);
|
|
104
|
+
// Audit trail — record what cascade layer applied, which policy
|
|
105
|
+
// was used, and the resulting schedule snapshot. Lets ops trace
|
|
106
|
+
// why a particular schedule was generated. The structured metadata
|
|
107
|
+
// (`kind: payment_schedule_regenerated`) distinguishes this row
|
|
108
|
+
// from other system-issued activity entries.
|
|
109
|
+
await db.insert(bookingActivityLog).values({
|
|
110
|
+
bookingId,
|
|
111
|
+
actorId: "system",
|
|
112
|
+
activityType: "system_action",
|
|
113
|
+
description: `Payment schedule regenerated from ${source} policy (${entries.length} row${entries.length === 1 ? "" : "s"})`,
|
|
114
|
+
metadata: {
|
|
115
|
+
kind: "payment_schedule_regenerated",
|
|
116
|
+
policySource: source,
|
|
117
|
+
policy,
|
|
118
|
+
entries,
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// ─────────────────────────────────────────────────────────────────
|
|
123
|
+
// Admin route: update booking-level policy + regenerate schedule
|
|
124
|
+
// ─────────────────────────────────────────────────────────────────
|
|
125
|
+
const depositRuleApiSchema = z.object({
|
|
126
|
+
kind: z.enum(["none", "percent", "fixed_cents"]),
|
|
127
|
+
percent: z.number().min(0).max(100).optional(),
|
|
128
|
+
amountCents: z.number().int().min(0).optional(),
|
|
129
|
+
});
|
|
130
|
+
const policyApiSchema = z.object({
|
|
131
|
+
deposit: depositRuleApiSchema,
|
|
132
|
+
minDaysBeforeDepartureForDeposit: z.number().int().min(0),
|
|
133
|
+
balanceDueDaysBeforeDeparture: z.number().int().min(0),
|
|
134
|
+
balanceDueMinDaysFromNow: z.number().int().min(0),
|
|
135
|
+
});
|
|
136
|
+
const regenerateScheduleBodySchema = z.object({
|
|
137
|
+
/**
|
|
138
|
+
* Optional booking-level override. When provided, persists onto
|
|
139
|
+
* `bookings.customerPaymentPolicy` before running the resolver.
|
|
140
|
+
* Pass `null` to clear an existing override (cascade falls back
|
|
141
|
+
* to listing/category/supplier/operator default).
|
|
142
|
+
*/
|
|
143
|
+
customerPaymentPolicy: policyApiSchema.nullable().optional(),
|
|
144
|
+
});
|
|
145
|
+
async function handleRegenerateSchedule(c, options) {
|
|
146
|
+
const db = options.resolveDb(c);
|
|
147
|
+
const bookingId = c.req.param("bookingId");
|
|
148
|
+
if (!bookingId) {
|
|
149
|
+
return c.json({ error: "missing_booking_id" }, 400);
|
|
150
|
+
}
|
|
151
|
+
let body;
|
|
152
|
+
try {
|
|
153
|
+
body = await parseJsonBody(c, regenerateScheduleBodySchema);
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
return c.json({ error: err instanceof Error ? err.message : "invalid_body" }, 400);
|
|
157
|
+
}
|
|
158
|
+
// Persist the override (or clear it) before running the resolver.
|
|
159
|
+
if (Object.hasOwn(body, "customerPaymentPolicy")) {
|
|
160
|
+
const [before] = await db
|
|
161
|
+
.select({ customerPaymentPolicy: bookings.customerPaymentPolicy })
|
|
162
|
+
.from(bookings)
|
|
163
|
+
.where(eq(bookings.id, bookingId))
|
|
164
|
+
.limit(1);
|
|
165
|
+
await db
|
|
166
|
+
.update(bookings)
|
|
167
|
+
.set({
|
|
168
|
+
customerPaymentPolicy: (body.customerPaymentPolicy ?? null),
|
|
169
|
+
updatedAt: new Date(),
|
|
170
|
+
})
|
|
171
|
+
.where(eq(bookings.id, bookingId));
|
|
172
|
+
const overrideChanged = JSON.stringify(before?.customerPaymentPolicy ?? null) !==
|
|
173
|
+
JSON.stringify(body.customerPaymentPolicy ?? null);
|
|
174
|
+
if (overrideChanged) {
|
|
175
|
+
await appendActionLedgerMutation(db, {
|
|
176
|
+
context: getPaymentScheduleActionLedgerRequestContext(c),
|
|
177
|
+
actionName: "booking.payment_policy.override",
|
|
178
|
+
actionVersion: "v1",
|
|
179
|
+
actionKind: "update",
|
|
180
|
+
evaluatedRisk: "high",
|
|
181
|
+
targetType: "booking",
|
|
182
|
+
targetId: bookingId,
|
|
183
|
+
routeOrToolName: "bookings.payment-schedule.regenerate",
|
|
184
|
+
authorizationSource: "operator.booking-schedule.route",
|
|
185
|
+
mutationDetail: {
|
|
186
|
+
summary: body.customerPaymentPolicy === null
|
|
187
|
+
? "Cleared booking payment policy override"
|
|
188
|
+
: "Updated booking payment policy override",
|
|
189
|
+
reversalKind: "none",
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
await generatePaymentScheduleForBooking(db, bookingId, options);
|
|
195
|
+
const rows = await db
|
|
196
|
+
.select()
|
|
197
|
+
.from(bookingPaymentSchedules)
|
|
198
|
+
.where(eq(bookingPaymentSchedules.bookingId, bookingId))
|
|
199
|
+
.orderBy(asc(bookingPaymentSchedules.dueDate), asc(bookingPaymentSchedules.createdAt));
|
|
200
|
+
const [updatedBooking] = await db
|
|
201
|
+
.select({
|
|
202
|
+
customerPaymentPolicy: bookings.customerPaymentPolicy,
|
|
203
|
+
internalNotes: bookings.internalNotes,
|
|
204
|
+
})
|
|
205
|
+
.from(bookings)
|
|
206
|
+
.where(eq(bookings.id, bookingId))
|
|
207
|
+
.limit(1);
|
|
208
|
+
return c.json({
|
|
209
|
+
data: {
|
|
210
|
+
schedule: rows,
|
|
211
|
+
bookingPolicy: updatedBooking?.customerPaymentPolicy ?? null,
|
|
212
|
+
cascadeSource: options.readPolicySourceFromInternalNotes(updatedBooking?.internalNotes ?? "") ??
|
|
213
|
+
"operator_default",
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
function getPaymentScheduleActionLedgerRequestContext(c) {
|
|
218
|
+
return {
|
|
219
|
+
userId: c.get("userId") ?? null,
|
|
220
|
+
agentId: c.get("agentId") ?? null,
|
|
221
|
+
workflowPrincipalId: c.get("workflowPrincipalId") ?? null,
|
|
222
|
+
principalSubtype: c.get("principalSubtype") ?? null,
|
|
223
|
+
sessionId: c.get("sessionId") ?? null,
|
|
224
|
+
apiTokenId: c.get("apiTokenId") ?? c.get("apiKeyId") ?? null,
|
|
225
|
+
callerType: c.get("callerType") ?? null,
|
|
226
|
+
actor: c.get("actor") ?? null,
|
|
227
|
+
isInternalRequest: c.get("isInternalRequest") ?? false,
|
|
228
|
+
organizationId: c.get("organizationId") ?? null,
|
|
229
|
+
workflowRunId: c.get("workflowRunId") ?? null,
|
|
230
|
+
workflowStepId: c.get("workflowStepId") ?? null,
|
|
231
|
+
correlationId: c.req.header("x-correlation-id") ?? c.req.header("x-request-id") ?? null,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
// ─────────────────────────────────────────────────────────────────
|
|
235
|
+
// Public route: resolve policy for an entity (storefront preview)
|
|
236
|
+
// ─────────────────────────────────────────────────────────────────
|
|
237
|
+
const resolvePolicyBodySchema = z.object({
|
|
238
|
+
entityModule: z.string(),
|
|
239
|
+
entityId: z.string(),
|
|
240
|
+
/** Cruise journey selections — resolver walks cabin → sailing →
|
|
241
|
+
* cruise once these are picked. Optional because the customer
|
|
242
|
+
* may not have selected a cabin yet. */
|
|
243
|
+
sailingId: z.string().optional(),
|
|
244
|
+
cabinCategoryId: z.string().optional(),
|
|
245
|
+
/** Accommodation journey selection — resolver picks the rate plan's
|
|
246
|
+
* policy when present. */
|
|
247
|
+
ratePlanId: z.string().optional(),
|
|
248
|
+
});
|
|
249
|
+
async function handleResolvePolicy(c, options) {
|
|
250
|
+
const db = options.resolveDb(c);
|
|
251
|
+
let body;
|
|
252
|
+
try {
|
|
253
|
+
body = await parseJsonBody(c, resolvePolicyBodySchema);
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
return c.json({ error: err instanceof Error ? err.message : "invalid_body" }, 400);
|
|
257
|
+
}
|
|
258
|
+
const operatorDefault = (await options.resolveOperatorDefaultPaymentPolicy(db)) ?? noDepositPolicy;
|
|
259
|
+
// Vertical-specific listing lookups — same source-of-truth queries
|
|
260
|
+
// as the booking-confirmed path, just keyed off the journey
|
|
261
|
+
// selections instead of a persisted booking_items row.
|
|
262
|
+
const listingPolicy = await options.resolveListingPolicyForEntity(db, body);
|
|
263
|
+
const categoryPolicy = await options.resolveCategoryPolicyForEntity(db, body);
|
|
264
|
+
const supplierPolicy = await options.resolveSupplierPolicyForEntity(db, body);
|
|
265
|
+
const { policy, source } = resolveEffectivePaymentPolicy({
|
|
266
|
+
listingPolicy,
|
|
267
|
+
categoryPolicy,
|
|
268
|
+
supplierPolicy,
|
|
269
|
+
operatorDefault,
|
|
270
|
+
});
|
|
271
|
+
return c.json({
|
|
272
|
+
data: {
|
|
273
|
+
policy,
|
|
274
|
+
source,
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Admin payment-schedule routes (relative paths; mount at `/v1/admin/bookings`).
|
|
280
|
+
*
|
|
281
|
+
* POST /:bookingId/payment-schedule/regenerate
|
|
282
|
+
*/
|
|
283
|
+
export function createBookingScheduleAdminRoutes(options) {
|
|
284
|
+
const hono = new Hono();
|
|
285
|
+
hono.post("/:bookingId/payment-schedule/regenerate", (c) => handleRegenerateSchedule(c, options));
|
|
286
|
+
return hono;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Public payment-policy routes (relative paths; mount at
|
|
290
|
+
* `/v1/public/payment-policy`).
|
|
291
|
+
*
|
|
292
|
+
* POST /resolve — anonymous storefront preview of the effective policy.
|
|
293
|
+
*/
|
|
294
|
+
export function createPaymentPolicyPublicRoutes(options) {
|
|
295
|
+
const hono = new Hono();
|
|
296
|
+
hono.post("/resolve", (c) => handleResolvePolicy(c, options));
|
|
297
|
+
return hono;
|
|
298
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyant-travel/finance",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.121.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -76,19 +76,17 @@
|
|
|
76
76
|
"fflate": "^0.8.2",
|
|
77
77
|
"hono": "^4.12.10",
|
|
78
78
|
"zod": "^4.3.6",
|
|
79
|
-
"@voyant-travel/action-ledger": "^0.
|
|
80
|
-
"@voyant-travel/bookings": "^0.
|
|
79
|
+
"@voyant-travel/action-ledger": "^0.105.0",
|
|
80
|
+
"@voyant-travel/bookings": "^0.121.0",
|
|
81
81
|
"@voyant-travel/core": "^0.109.0",
|
|
82
82
|
"@voyant-travel/db": "^0.108.1",
|
|
83
83
|
"@voyant-travel/finance-contracts": "^0.104.5",
|
|
84
|
-
"@voyant-travel/hono": "^0.
|
|
85
|
-
"@voyant-travel/storage": "^0.
|
|
84
|
+
"@voyant-travel/hono": "^0.111.0",
|
|
85
|
+
"@voyant-travel/storage": "^0.105.0",
|
|
86
86
|
"@voyant-travel/utils": "^0.105.2"
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
89
89
|
"typescript": "^6.0.2",
|
|
90
|
-
"@voyant-travel/operations": "^0.1.0",
|
|
91
|
-
"@voyant-travel/inventory": "^0.2.0",
|
|
92
90
|
"@voyant-travel/voyant-typescript-config": "^0.1.0"
|
|
93
91
|
},
|
|
94
92
|
"files": [
|