@voyantjs/finance 0.19.0 → 0.21.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.
Files changed (38) hide show
  1. package/dist/index.d.ts +8 -4
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +14 -4
  4. package/dist/payment-policy.d.ts +113 -0
  5. package/dist/payment-policy.d.ts.map +1 -0
  6. package/dist/payment-policy.js +193 -0
  7. package/dist/routes-documents.d.ts +2 -2
  8. package/dist/routes-public.d.ts +28 -20
  9. package/dist/routes-public.d.ts.map +1 -1
  10. package/dist/routes.d.ts +542 -43
  11. package/dist/routes.d.ts.map +1 -1
  12. package/dist/routes.js +120 -5
  13. package/dist/schema.d.ts +541 -9
  14. package/dist/schema.d.ts.map +1 -1
  15. package/dist/schema.js +85 -0
  16. package/dist/service-documents.d.ts +1 -1
  17. package/dist/service-documents.d.ts.map +1 -1
  18. package/dist/service-issue.d.ts +108 -0
  19. package/dist/service-issue.d.ts.map +1 -0
  20. package/dist/service-issue.js +57 -0
  21. package/dist/service-public.d.ts +13 -9
  22. package/dist/service-public.d.ts.map +1 -1
  23. package/dist/service-public.js +1 -0
  24. package/dist/service.d.ts +269 -49
  25. package/dist/service.d.ts.map +1 -1
  26. package/dist/service.js +278 -20
  27. package/dist/validation-billing.d.ts +109 -0
  28. package/dist/validation-billing.d.ts.map +1 -1
  29. package/dist/validation-billing.js +58 -0
  30. package/dist/validation-payments.d.ts +19 -16
  31. package/dist/validation-payments.d.ts.map +1 -1
  32. package/dist/validation-public.d.ts +5 -3
  33. package/dist/validation-public.d.ts.map +1 -1
  34. package/dist/validation-public.js +7 -0
  35. package/dist/validation-shared.d.ts +6 -5
  36. package/dist/validation-shared.d.ts.map +1 -1
  37. package/dist/validation-shared.js +1 -0
  38. package/package.json +7 -7
package/dist/index.d.ts CHANGED
@@ -19,13 +19,15 @@ export interface FinanceHonoModuleOptions extends FinanceRuntimeOptions, PublicF
19
19
  }
20
20
  export declare function createFinanceHonoModule(options?: FinanceHonoModuleOptions): HonoModule;
21
21
  export declare const financeHonoModule: HonoModule;
22
+ export type { ComputedScheduleEntry, ComputeScheduleInput, DepositKind, DepositRule, PaymentPolicy, PaymentPolicyCascadeLayers, PaymentPolicySource, PaymentScheduleEntryType, ResolvedPaymentPolicy, } from "./payment-policy.js";
23
+ export { computePaymentSchedule, isPaymentPolicyEmpty, noDepositPolicy, policyShouldRequireFullPayment, resolveEffectivePaymentPolicy, } from "./payment-policy.js";
22
24
  export { buildFinanceRouteRuntime, FINANCE_ROUTE_RUNTIME_CONTAINER_KEY, type FinanceRouteRuntime, type FinanceRuntimeOptions, } from "./route-runtime.js";
23
25
  export { bookingsQuickCreateExtension } from "./routes-bookings-quick-create.js";
24
26
  export { createFinanceAdminDocumentRoutes, type FinanceDocumentRouteOptions, type InvoiceDocumentGenerator, } from "./routes-documents.js";
25
27
  export { createFinanceAdminSettlementRoutes, type FinanceSettlementRouteOptions, type InvoiceSettlementPoller, } from "./routes-settlement.js";
26
- export type { BookingGuarantee, BookingItemCommission, BookingItemTaxLine, BookingPaymentSchedule, CreditNote, CreditNoteLineItem, FinanceNote, Invoice, InvoiceExternalRef, InvoiceLineItem, InvoiceNumberSeries, InvoiceRendition, InvoiceTemplate, NewBookingGuarantee, NewBookingItemCommission, NewBookingItemTaxLine, NewBookingPaymentSchedule, NewCreditNote, NewCreditNoteLineItem, NewFinanceNote, NewInvoice, NewInvoiceExternalRef, NewInvoiceLineItem, NewInvoiceNumberSeries, NewInvoiceRendition, NewInvoiceTemplate, NewPayment, NewPaymentAuthorization, NewPaymentCapture, NewPaymentInstrument, NewPaymentSession, NewSupplierPayment, NewTaxRegime, NewVoucher, NewVoucherRedemption, Payment, PaymentAuthorization, PaymentCapture, PaymentInstrument, PaymentSession, SupplierPayment, TaxRegime, Voucher, VoucherRedemption, } from "./schema.js";
27
- export { bookingGuarantees, bookingItemCommissions, bookingItemTaxLines, bookingPaymentSchedules, creditNoteLineItems, creditNotes, financeNotes, invoiceExternalRefs, invoiceLineItems, invoiceNumberSeries, invoiceRenditions, invoices, invoiceTemplates, paymentAuthorizations, paymentCaptures, paymentInstruments, paymentSessions, payments, supplierPayments, taxRegimes, voucherRedemptions, voucherSourceTypeEnum, voucherStatusEnum, vouchers, } from "./schema.js";
28
- export type { InvoiceFromBookingData } from "./service.js";
28
+ export type { BookingGuarantee, BookingItemCommission, BookingItemTaxLine, BookingPaymentSchedule, CreditNote, CreditNoteLineItem, FinanceNote, Invoice, InvoiceExternalRef, InvoiceLineItem, InvoiceNumberSeries, InvoiceRendition, InvoiceTemplate, NewBookingGuarantee, NewBookingItemCommission, NewBookingItemTaxLine, NewBookingPaymentSchedule, NewCreditNote, NewCreditNoteLineItem, NewFinanceNote, NewInvoice, NewInvoiceExternalRef, NewInvoiceLineItem, NewInvoiceNumberSeries, NewInvoiceRendition, NewInvoiceTemplate, NewPayment, NewPaymentAuthorization, NewPaymentCapture, NewPaymentInstrument, NewPaymentSession, NewSupplierPayment, NewTaxClass, NewTaxRegime, NewVoucher, NewVoucherRedemption, Payment, PaymentAuthorization, PaymentCapture, PaymentInstrument, PaymentSession, SupplierPayment, TaxClass, TaxRegime, Voucher, VoucherRedemption, } from "./schema.js";
29
+ export { bookingGuarantees, bookingItemCommissions, bookingItemTaxLines, bookingPaymentSchedules, creditNoteLineItems, creditNotes, financeNotes, invoiceExternalRefs, invoiceLineItems, invoiceNumberSeries, invoiceRenditions, invoices, invoiceTemplates, paymentAuthorizations, paymentCaptures, paymentInstruments, paymentSessions, payments, supplierPayments, taxClasses, taxPolicyProfiles, taxPolicyRules, taxRegimes, voucherRedemptions, voucherSourceTypeEnum, voucherStatusEnum, vouchers, } from "./schema.js";
30
+ export type { CreateInvoiceFromBookingInput, InvoiceFromBookingData } from "./service.js";
29
31
  export { financeService, renderInvoiceBody } from "./service.js";
30
32
  export type { BookingDualCreatedEvent, DualCreateBookingInput, DualCreateBookingOutcome, DualCreateBookingResult, DualCreateBookingRuntime, } from "./service-bookings-dual-create.js";
31
33
  export { dualCreateBooking, dualCreateBookingSchema, } from "./service-bookings-dual-create.js";
@@ -33,12 +35,14 @@ export type { BookingQuickCreatedEvent, BookingQuickCreateRuntime, QuickCreateBo
33
35
  export { quickCreateBooking, quickCreateBookingSchema, } from "./service-bookings-quick-create.js";
34
36
  export type { GeneratedInvoiceDocumentRecord, GeneratedInvoiceRenditionArtifact, InvoiceDocumentGeneratedEvent, InvoiceDocumentGeneratorContext, InvoiceDocumentRuntimeOptions, StorageBackedInvoiceDocumentGeneratorOptions, StorageBackedInvoiceDocumentSerializer, StorageBackedInvoiceDocumentUpload, } from "./service-documents.js";
35
37
  export { createPdfInvoiceDocumentGenerator, createStorageBackedInvoiceDocumentGenerator, defaultPdfInvoiceDocumentSerializer, defaultStorageBackedInvoiceDocumentSerializer, financeDocumentsService, } from "./service-documents.js";
38
+ export type { InvoiceIssuedEvent, InvoiceIssueRuntime } from "./service-issue.js";
39
+ export { issueInvoiceFromBooking, issueProformaFromBooking } from "./service-issue.js";
36
40
  export type { FinanceSettlementRuntimeOptions, InvoiceSettledEvent, InvoiceSettlementPollerContext, InvoiceSettlementPollerResult, } from "./service-settlement.js";
37
41
  export { financeSettlementService } from "./service-settlement.js";
38
42
  export { VoucherServiceError, vouchersService } from "./service-vouchers.js";
39
43
  export { migrateVouchersFromPaymentInstruments, type VoucherMigrationOptions, type VoucherMigrationResult, type VoucherMigrationSkip, } from "./service-vouchers-migration.js";
40
44
  export type { GeneratedInvoiceDocumentResult, GenerateInvoiceDocumentInput, PolledInvoiceSettlementResult, PollInvoiceSettlementInput, } from "./validation.js";
41
- export { agingReportQuerySchema, allocateInvoiceNumberInputSchema, applyDefaultBookingPaymentPlanSchema, cancelPaymentSessionSchema, completePaymentSessionSchema, createPaymentSessionFromGuaranteeSchema, createPaymentSessionFromInvoiceSchema, createPaymentSessionFromScheduleSchema, expirePaymentSessionSchema, failPaymentSessionSchema, generatedInvoiceDocumentResultSchema, generateInvoiceDocumentInputSchema, insertBookingGuaranteeSchema, insertBookingItemCommissionSchema, insertBookingItemTaxLineSchema, insertBookingPaymentScheduleSchema, insertCreditNoteLineItemSchema, insertCreditNoteSchema, insertFinanceNoteSchema, insertInvoiceExternalRefSchema, insertInvoiceLineItemSchema, insertInvoiceNumberSeriesSchema, insertInvoiceRenditionSchema, insertInvoiceSchema, insertInvoiceTemplateSchema, insertPaymentAuthorizationSchema, insertPaymentCaptureSchema, insertPaymentInstrumentSchema, insertPaymentSchema, insertPaymentSessionSchema, insertSupplierPaymentSchema, insertTaxRegimeSchema, invoiceFromBookingSchema, invoiceListQuerySchema, invoiceNumberSeriesListQuerySchema, invoiceTemplateListQuerySchema, markPaymentSessionRequiresRedirectSchema, paymentAuthorizationListQuerySchema, paymentCaptureListQuerySchema, paymentInstrumentListQuerySchema, paymentSessionListQuerySchema, polledInvoiceSettlementProviderResultSchema, polledInvoiceSettlementResultSchema, pollInvoiceSettlementInputSchema, profitabilityQuerySchema, renderInvoiceInputSchema, revenueReportQuerySchema, supplierPaymentListQuerySchema, taxRegimeListQuerySchema, updateBookingGuaranteeSchema, updateBookingItemCommissionSchema, updateBookingItemTaxLineSchema, updateBookingPaymentScheduleSchema, updateCreditNoteLineItemSchema, updateCreditNoteSchema, updateInvoiceExternalRefSchema, updateInvoiceLineItemSchema, updateInvoiceNumberSeriesSchema, updateInvoiceRenditionSchema, updateInvoiceSchema, updateInvoiceTemplateSchema, updatePaymentAuthorizationSchema, updatePaymentCaptureSchema, updatePaymentInstrumentSchema, updatePaymentSchema, updatePaymentSessionSchema, updateSupplierPaymentSchema, updateTaxRegimeSchema, } from "./validation.js";
45
+ export { agingReportQuerySchema, allocateInvoiceNumberInputSchema, applyDefaultBookingPaymentPlanSchema, cancelPaymentSessionSchema, completePaymentSessionSchema, createPaymentSessionFromGuaranteeSchema, createPaymentSessionFromInvoiceSchema, createPaymentSessionFromScheduleSchema, expirePaymentSessionSchema, failPaymentSessionSchema, generatedInvoiceDocumentResultSchema, generateInvoiceDocumentInputSchema, insertBookingGuaranteeSchema, insertBookingItemCommissionSchema, insertBookingItemTaxLineSchema, insertBookingPaymentScheduleSchema, insertCreditNoteLineItemSchema, insertCreditNoteSchema, insertFinanceNoteSchema, insertInvoiceExternalRefSchema, insertInvoiceLineItemSchema, insertInvoiceNumberSeriesSchema, insertInvoiceRenditionSchema, insertInvoiceSchema, insertInvoiceTemplateSchema, insertPaymentAuthorizationSchema, insertPaymentCaptureSchema, insertPaymentInstrumentSchema, insertPaymentSchema, insertPaymentSessionSchema, insertSupplierPaymentSchema, insertTaxClassSchema, insertTaxPolicyProfileSchema, insertTaxPolicyRuleSchema, insertTaxRegimeSchema, invoiceFromBookingSchema, invoiceListQuerySchema, invoiceNumberSeriesListQuerySchema, invoiceTemplateListQuerySchema, markPaymentSessionRequiresRedirectSchema, paymentAuthorizationListQuerySchema, paymentCaptureListQuerySchema, paymentInstrumentListQuerySchema, paymentSessionListQuerySchema, polledInvoiceSettlementProviderResultSchema, polledInvoiceSettlementResultSchema, pollInvoiceSettlementInputSchema, profitabilityQuerySchema, renderInvoiceInputSchema, revenueReportQuerySchema, supplierPaymentListQuerySchema, taxClassListQuerySchema, taxPolicyProfileListQuerySchema, taxPolicyRuleListQuerySchema, taxRegimeListQuerySchema, updateBookingGuaranteeSchema, updateBookingItemCommissionSchema, updateBookingItemTaxLineSchema, updateBookingPaymentScheduleSchema, updateCreditNoteLineItemSchema, updateCreditNoteSchema, updateInvoiceExternalRefSchema, updateInvoiceLineItemSchema, updateInvoiceNumberSeriesSchema, updateInvoiceRenditionSchema, updateInvoiceSchema, updateInvoiceTemplateSchema, updatePaymentAuthorizationSchema, updatePaymentCaptureSchema, updatePaymentInstrumentSchema, updatePaymentSchema, updatePaymentSessionSchema, updateSupplierPaymentSchema, updateTaxClassSchema, updateTaxPolicyProfileSchema, updateTaxPolicyRuleSchema, updateTaxRegimeSchema, } from "./validation.js";
42
46
  export type { PublicBookingFinanceDocuments, PublicBookingFinancePayments, PublicBookingPaymentOptions, PublicFinanceBookingDocument, PublicFinanceBookingPayment, PublicFinanceDocumentLookup, PublicFinanceDocumentLookupQuery, PublicPaymentOptionsQuery, PublicPaymentSession, PublicStartPaymentSessionInput, PublicValidateVoucherInput, PublicVoucherValidationResult, } from "./validation-public.js";
43
47
  export { publicBookingFinanceDocumentsSchema, publicBookingFinancePaymentsSchema, publicBookingPaymentOptionsSchema, publicFinanceBookingDocumentSchema, publicFinanceBookingPaymentSchema, publicFinanceDocumentAvailabilitySchema, publicFinanceDocumentFormatSchema, publicFinanceDocumentLookupQuerySchema, publicFinanceDocumentLookupSchema, publicFinanceInvoiceTypeSchema, publicPaymentOptionsQuerySchema, publicPaymentSessionSchema, publicStartPaymentSessionSchema, publicValidateVoucherSchema, publicVoucherValidationSchema, } from "./validation-public.js";
44
48
  //# sourceMappingURL=index.d.ts.map
@@ -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
@@ -40,8 +40,16 @@ export function createFinanceHonoModule(options = {}) {
40
40
  .route("/", createFinanceAdminSettlementRoutes(options));
41
41
  const module = {
42
42
  ...financeModule,
43
- bootstrap: ({ bindings, container }) => {
44
- container.register(FINANCE_ROUTE_RUNTIME_CONTAINER_KEY, buildFinanceRouteRuntime(bindings, options));
43
+ bootstrap: ({ bindings, container, eventBus }) => {
44
+ const runtime = buildFinanceRouteRuntime(bindings, options);
45
+ // Wire the framework's eventBus into the route runtime so subscribers
46
+ // (notably the storefront's checkout-finalize workflow on
47
+ // `payment.completed`) actually receive emissions from
48
+ // `financeService.completePaymentSession`. Without this, the Netopia
49
+ // webhook silently no-ops because the runtime has no bus attached.
50
+ if (!runtime.eventBus && eventBus)
51
+ runtime.eventBus = eventBus;
52
+ container.register(FINANCE_ROUTE_RUNTIME_CONTAINER_KEY, runtime);
45
53
  },
46
54
  };
47
55
  return {
@@ -52,17 +60,19 @@ export function createFinanceHonoModule(options = {}) {
52
60
  };
53
61
  }
54
62
  export const financeHonoModule = createFinanceHonoModule();
63
+ export { computePaymentSchedule, isPaymentPolicyEmpty, noDepositPolicy, policyShouldRequireFullPayment, resolveEffectivePaymentPolicy, } from "./payment-policy.js";
55
64
  export { buildFinanceRouteRuntime, FINANCE_ROUTE_RUNTIME_CONTAINER_KEY, } from "./route-runtime.js";
56
65
  export { bookingsQuickCreateExtension } from "./routes-bookings-quick-create.js";
57
66
  export { createFinanceAdminDocumentRoutes, } from "./routes-documents.js";
58
67
  export { createFinanceAdminSettlementRoutes, } from "./routes-settlement.js";
59
- export { bookingGuarantees, bookingItemCommissions, bookingItemTaxLines, bookingPaymentSchedules, creditNoteLineItems, creditNotes, financeNotes, invoiceExternalRefs, invoiceLineItems, invoiceNumberSeries, invoiceRenditions, invoices, invoiceTemplates, paymentAuthorizations, paymentCaptures, paymentInstruments, paymentSessions, payments, supplierPayments, taxRegimes, voucherRedemptions, voucherSourceTypeEnum, voucherStatusEnum, vouchers, } from "./schema.js";
68
+ export { bookingGuarantees, bookingItemCommissions, bookingItemTaxLines, bookingPaymentSchedules, creditNoteLineItems, creditNotes, financeNotes, invoiceExternalRefs, invoiceLineItems, invoiceNumberSeries, invoiceRenditions, invoices, invoiceTemplates, paymentAuthorizations, paymentCaptures, paymentInstruments, paymentSessions, payments, supplierPayments, taxClasses, taxPolicyProfiles, taxPolicyRules, taxRegimes, voucherRedemptions, voucherSourceTypeEnum, voucherStatusEnum, vouchers, } from "./schema.js";
60
69
  export { financeService, renderInvoiceBody } from "./service.js";
61
70
  export { dualCreateBooking, dualCreateBookingSchema, } from "./service-bookings-dual-create.js";
62
71
  export { quickCreateBooking, quickCreateBookingSchema, } from "./service-bookings-quick-create.js";
63
72
  export { createPdfInvoiceDocumentGenerator, createStorageBackedInvoiceDocumentGenerator, defaultPdfInvoiceDocumentSerializer, defaultStorageBackedInvoiceDocumentSerializer, financeDocumentsService, } from "./service-documents.js";
73
+ export { issueInvoiceFromBooking, issueProformaFromBooking } from "./service-issue.js";
64
74
  export { financeSettlementService } from "./service-settlement.js";
65
75
  export { VoucherServiceError, vouchersService } from "./service-vouchers.js";
66
76
  export { migrateVouchersFromPaymentInstruments, } from "./service-vouchers-migration.js";
67
- export { agingReportQuerySchema, allocateInvoiceNumberInputSchema, applyDefaultBookingPaymentPlanSchema, cancelPaymentSessionSchema, completePaymentSessionSchema, createPaymentSessionFromGuaranteeSchema, createPaymentSessionFromInvoiceSchema, createPaymentSessionFromScheduleSchema, expirePaymentSessionSchema, failPaymentSessionSchema, generatedInvoiceDocumentResultSchema, generateInvoiceDocumentInputSchema, insertBookingGuaranteeSchema, insertBookingItemCommissionSchema, insertBookingItemTaxLineSchema, insertBookingPaymentScheduleSchema, insertCreditNoteLineItemSchema, insertCreditNoteSchema, insertFinanceNoteSchema, insertInvoiceExternalRefSchema, insertInvoiceLineItemSchema, insertInvoiceNumberSeriesSchema, insertInvoiceRenditionSchema, insertInvoiceSchema, insertInvoiceTemplateSchema, insertPaymentAuthorizationSchema, insertPaymentCaptureSchema, insertPaymentInstrumentSchema, insertPaymentSchema, insertPaymentSessionSchema, insertSupplierPaymentSchema, insertTaxRegimeSchema, invoiceFromBookingSchema, invoiceListQuerySchema, invoiceNumberSeriesListQuerySchema, invoiceTemplateListQuerySchema, markPaymentSessionRequiresRedirectSchema, paymentAuthorizationListQuerySchema, paymentCaptureListQuerySchema, paymentInstrumentListQuerySchema, paymentSessionListQuerySchema, polledInvoiceSettlementProviderResultSchema, polledInvoiceSettlementResultSchema, pollInvoiceSettlementInputSchema, profitabilityQuerySchema, renderInvoiceInputSchema, revenueReportQuerySchema, supplierPaymentListQuerySchema, taxRegimeListQuerySchema, updateBookingGuaranteeSchema, updateBookingItemCommissionSchema, updateBookingItemTaxLineSchema, updateBookingPaymentScheduleSchema, updateCreditNoteLineItemSchema, updateCreditNoteSchema, updateInvoiceExternalRefSchema, updateInvoiceLineItemSchema, updateInvoiceNumberSeriesSchema, updateInvoiceRenditionSchema, updateInvoiceSchema, updateInvoiceTemplateSchema, updatePaymentAuthorizationSchema, updatePaymentCaptureSchema, updatePaymentInstrumentSchema, updatePaymentSchema, updatePaymentSessionSchema, updateSupplierPaymentSchema, updateTaxRegimeSchema, } from "./validation.js";
77
+ export { agingReportQuerySchema, allocateInvoiceNumberInputSchema, applyDefaultBookingPaymentPlanSchema, cancelPaymentSessionSchema, completePaymentSessionSchema, createPaymentSessionFromGuaranteeSchema, createPaymentSessionFromInvoiceSchema, createPaymentSessionFromScheduleSchema, expirePaymentSessionSchema, failPaymentSessionSchema, generatedInvoiceDocumentResultSchema, generateInvoiceDocumentInputSchema, insertBookingGuaranteeSchema, insertBookingItemCommissionSchema, insertBookingItemTaxLineSchema, insertBookingPaymentScheduleSchema, insertCreditNoteLineItemSchema, insertCreditNoteSchema, insertFinanceNoteSchema, insertInvoiceExternalRefSchema, insertInvoiceLineItemSchema, insertInvoiceNumberSeriesSchema, insertInvoiceRenditionSchema, insertInvoiceSchema, insertInvoiceTemplateSchema, insertPaymentAuthorizationSchema, insertPaymentCaptureSchema, insertPaymentInstrumentSchema, insertPaymentSchema, insertPaymentSessionSchema, insertSupplierPaymentSchema, insertTaxClassSchema, insertTaxPolicyProfileSchema, insertTaxPolicyRuleSchema, insertTaxRegimeSchema, invoiceFromBookingSchema, invoiceListQuerySchema, invoiceNumberSeriesListQuerySchema, invoiceTemplateListQuerySchema, markPaymentSessionRequiresRedirectSchema, paymentAuthorizationListQuerySchema, paymentCaptureListQuerySchema, paymentInstrumentListQuerySchema, paymentSessionListQuerySchema, polledInvoiceSettlementProviderResultSchema, polledInvoiceSettlementResultSchema, pollInvoiceSettlementInputSchema, profitabilityQuerySchema, renderInvoiceInputSchema, revenueReportQuerySchema, supplierPaymentListQuerySchema, taxClassListQuerySchema, taxPolicyProfileListQuerySchema, taxPolicyRuleListQuerySchema, taxRegimeListQuerySchema, updateBookingGuaranteeSchema, updateBookingItemCommissionSchema, updateBookingItemTaxLineSchema, updateBookingPaymentScheduleSchema, updateCreditNoteLineItemSchema, updateCreditNoteSchema, updateInvoiceExternalRefSchema, updateInvoiceLineItemSchema, updateInvoiceNumberSeriesSchema, updateInvoiceRenditionSchema, updateInvoiceSchema, updateInvoiceTemplateSchema, updatePaymentAuthorizationSchema, updatePaymentCaptureSchema, updatePaymentInstrumentSchema, updatePaymentSchema, updatePaymentSessionSchema, updateSupplierPaymentSchema, updateTaxClassSchema, updateTaxPolicyProfileSchema, updateTaxPolicyRuleSchema, updateTaxRegimeSchema, } from "./validation.js";
68
78
  export { publicBookingFinanceDocumentsSchema, publicBookingFinancePaymentsSchema, publicBookingPaymentOptionsSchema, publicFinanceBookingDocumentSchema, publicFinanceBookingPaymentSchema, publicFinanceDocumentAvailabilitySchema, publicFinanceDocumentFormatSchema, publicFinanceDocumentLookupQuerySchema, publicFinanceDocumentLookupSchema, publicFinanceInvoiceTypeSchema, publicPaymentOptionsQuerySchema, publicPaymentSessionSchema, publicStartPaymentSessionSchema, publicValidateVoucherSchema, publicVoucherValidationSchema, } from "./validation-public.js";
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Customer-facing payment policy primitive.
3
+ *
4
+ * Decides how to split a booking total into a payment schedule: full
5
+ * payment up-front, or a deposit now + balance due before departure.
6
+ * Pure function — no DB, no IO. Two policies in (the operator default
7
+ * + any per-supplier / per-category / per-listing override) plus the
8
+ * booking total + departure date, schedule rows out.
9
+ *
10
+ * Behaviour:
11
+ *
12
+ * 1. If `policy.deposit.kind === "none"` → one row, full total, due
13
+ * immediately. Skips the rest of the rules.
14
+ * 2. If departure is too close (`< minDaysBeforeDepartureForDeposit`
15
+ * from today) → also full payment now. The agency doesn't have
16
+ * time to chase a balance.
17
+ * 3. Otherwise → two rows:
18
+ * - deposit row, due today, amount = percent × total OR fixed
19
+ * cents (capped at total).
20
+ * - balance row, amount = total − deposit, due
21
+ * `balanceDueDaysBeforeDeparture` before departure, but never
22
+ * sooner than `balanceDueMinDaysFromNow` days from now.
23
+ *
24
+ * Cascade resolution lives in {@link resolveEffectivePaymentPolicy}:
25
+ * the most-specific layer that defines a policy wins (booking >
26
+ * listing > category > supplier > operator default), no field-level
27
+ * merging — so the audit trail is "this whole policy applied".
28
+ */
29
+ export type DepositKind = "none" | "percent" | "fixed_cents";
30
+ export interface DepositRule {
31
+ kind: DepositKind;
32
+ /** Required when `kind === "percent"`. 0–100 inclusive. */
33
+ percent?: number;
34
+ /** Required when `kind === "fixed_cents"`. Capped at total. */
35
+ amountCents?: number;
36
+ }
37
+ export interface PaymentPolicy {
38
+ deposit: DepositRule;
39
+ /** Below this many days before departure, deposits are rejected and
40
+ * the booking is invoiced for the full amount up-front. */
41
+ minDaysBeforeDepartureForDeposit: number;
42
+ /** When the balance is due (days BEFORE departure). */
43
+ balanceDueDaysBeforeDeparture: number;
44
+ /** Floor on the balance due date so it's never sooner than this
45
+ * many days from "now". Protects the customer from a tight squeeze
46
+ * when departure is barely outside the deposit window. */
47
+ balanceDueMinDaysFromNow: number;
48
+ }
49
+ /** Default policy: 100% up-front, no deposit. Safe fallback for
50
+ * agencies that haven't configured anything yet. */
51
+ export declare const noDepositPolicy: PaymentPolicy;
52
+ export type PaymentScheduleEntryType = "deposit" | "balance" | "full";
53
+ export interface ComputedScheduleEntry {
54
+ scheduleType: PaymentScheduleEntryType;
55
+ amountCents: number;
56
+ currency: string;
57
+ /** ISO `YYYY-MM-DD`. */
58
+ dueDate: string;
59
+ }
60
+ export interface ComputeScheduleInput {
61
+ totalCents: number;
62
+ currency: string;
63
+ /** ISO `YYYY-MM-DD` (or full ISO string — we only look at the date). */
64
+ departureDate: string | null | undefined;
65
+ /** Defaults to `new Date()`. Injectable for deterministic tests. */
66
+ today?: Date;
67
+ }
68
+ /**
69
+ * Compute the customer-facing payment schedule for a booking.
70
+ *
71
+ * Always returns at least one row. When the policy resolves to no
72
+ * deposit (or the gate denies one), the single row is a `full`
73
+ * scheduled for today.
74
+ */
75
+ export declare function computePaymentSchedule(input: ComputeScheduleInput, policy: PaymentPolicy): ComputedScheduleEntry[];
76
+ /** True when this policy is empty / "inherit from parent". */
77
+ export declare function isPaymentPolicyEmpty(policy: PaymentPolicy | null | undefined): boolean;
78
+ export type PaymentPolicySource = "booking" | "listing" | "category" | "supplier" | "operator_default";
79
+ export interface PaymentPolicyCascadeLayers {
80
+ bookingPolicy?: PaymentPolicy | null;
81
+ listingPolicy?: PaymentPolicy | null;
82
+ categoryPolicy?: PaymentPolicy | null;
83
+ supplierPolicy?: PaymentPolicy | null;
84
+ operatorDefault: PaymentPolicy;
85
+ }
86
+ export interface ResolvedPaymentPolicy {
87
+ policy: PaymentPolicy;
88
+ source: PaymentPolicySource;
89
+ }
90
+ /**
91
+ * Most-specific-wins cascade. Returns both the policy and which
92
+ * layer it came from so contracts and ops UIs can show the trace.
93
+ *
94
+ * A layer is "set" when it's not null/undefined AND not effectively
95
+ * empty (deposit kind === "none" with no other meaningful fields).
96
+ * That way operators who declare an explicit "no deposit" policy on
97
+ * a supplier override their parent's "50% deposit" — they pass an
98
+ * explicit `deposit: { kind: "none" }` AND set non-zero day fields
99
+ * to mark the layer as intentional.
100
+ *
101
+ * For v1 we rely on null/undefined to mean "inherit". The settings
102
+ * API stores `null` for "use parent". An explicit "none" policy
103
+ * needs to be modeled with a different deposit kind later if it
104
+ * proves useful.
105
+ */
106
+ export declare function resolveEffectivePaymentPolicy(layers: PaymentPolicyCascadeLayers): ResolvedPaymentPolicy;
107
+ /**
108
+ * Predicate the storefront UI uses to decide whether to surface the
109
+ * "deposit + balance" copy or just "pay full now". Returns true when
110
+ * the policy + departure date resolve to a single full-payment row.
111
+ */
112
+ export declare function policyShouldRequireFullPayment(policy: PaymentPolicy, departureDate: string | null | undefined, today?: Date): boolean;
113
+ //# sourceMappingURL=payment-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-policy.d.ts","sourceRoot":"","sources":["../src/payment-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,CAAA;AAE5D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAA;IACjB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,CAAA;IACpB;gEAC4D;IAC5D,gCAAgC,EAAE,MAAM,CAAA;IACxC,uDAAuD;IACvD,6BAA6B,EAAE,MAAM,CAAA;IACrC;;+DAE2D;IAC3D,wBAAwB,EAAE,MAAM,CAAA;CACjC;AAED;qDACqD;AACrD,eAAO,MAAM,eAAe,EAAE,aAK7B,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;AAErE,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,wBAAwB,CAAA;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,wEAAwE;IACxE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACxC,oEAAoE;IACpE,KAAK,CAAC,EAAE,IAAI,CAAA;CACb;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,aAAa,GACpB,qBAAqB,EAAE,CA8DzB;AAaD,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAgBtF;AAED,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,SAAS,GACT,UAAU,GACV,UAAU,GACV,kBAAkB,CAAA;AAEtB,MAAM,WAAW,0BAA0B;IACzC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IACpC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IACpC,cAAc,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IACrC,cAAc,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IACrC,eAAe,EAAE,aAAa,CAAA;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,aAAa,CAAA;IACrB,MAAM,EAAE,mBAAmB,CAAA;CAC5B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,0BAA0B,GACjC,qBAAqB,CAMvB;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,KAAK,GAAE,IAAiB,GACvB,OAAO,CAKT"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Customer-facing payment policy primitive.
3
+ *
4
+ * Decides how to split a booking total into a payment schedule: full
5
+ * payment up-front, or a deposit now + balance due before departure.
6
+ * Pure function — no DB, no IO. Two policies in (the operator default
7
+ * + any per-supplier / per-category / per-listing override) plus the
8
+ * booking total + departure date, schedule rows out.
9
+ *
10
+ * Behaviour:
11
+ *
12
+ * 1. If `policy.deposit.kind === "none"` → one row, full total, due
13
+ * immediately. Skips the rest of the rules.
14
+ * 2. If departure is too close (`< minDaysBeforeDepartureForDeposit`
15
+ * from today) → also full payment now. The agency doesn't have
16
+ * time to chase a balance.
17
+ * 3. Otherwise → two rows:
18
+ * - deposit row, due today, amount = percent × total OR fixed
19
+ * cents (capped at total).
20
+ * - balance row, amount = total − deposit, due
21
+ * `balanceDueDaysBeforeDeparture` before departure, but never
22
+ * sooner than `balanceDueMinDaysFromNow` days from now.
23
+ *
24
+ * Cascade resolution lives in {@link resolveEffectivePaymentPolicy}:
25
+ * the most-specific layer that defines a policy wins (booking >
26
+ * listing > category > supplier > operator default), no field-level
27
+ * merging — so the audit trail is "this whole policy applied".
28
+ */
29
+ /** Default policy: 100% up-front, no deposit. Safe fallback for
30
+ * agencies that haven't configured anything yet. */
31
+ export const noDepositPolicy = {
32
+ deposit: { kind: "none" },
33
+ minDaysBeforeDepartureForDeposit: 0,
34
+ balanceDueDaysBeforeDeparture: 0,
35
+ balanceDueMinDaysFromNow: 0,
36
+ };
37
+ /**
38
+ * Compute the customer-facing payment schedule for a booking.
39
+ *
40
+ * Always returns at least one row. When the policy resolves to no
41
+ * deposit (or the gate denies one), the single row is a `full`
42
+ * scheduled for today.
43
+ */
44
+ export function computePaymentSchedule(input, policy) {
45
+ const total = Math.max(0, Math.round(input.totalCents));
46
+ const today = input.today ?? new Date();
47
+ const todayIso = isoDate(today);
48
+ if (total === 0) {
49
+ return [{ scheduleType: "full", amountCents: 0, currency: input.currency, dueDate: todayIso }];
50
+ }
51
+ if (policy.deposit.kind === "none") {
52
+ return [
53
+ { scheduleType: "full", amountCents: total, currency: input.currency, dueDate: todayIso },
54
+ ];
55
+ }
56
+ const departure = parseIsoDate(input.departureDate);
57
+ if (!departure) {
58
+ // Without a departure date we can't anchor the balance, so fall
59
+ // back to full upfront — the operator can still split manually
60
+ // via a booking-level override later.
61
+ return [
62
+ { scheduleType: "full", amountCents: total, currency: input.currency, dueDate: todayIso },
63
+ ];
64
+ }
65
+ const daysUntilDeparture = wholeDaysBetween(today, departure);
66
+ if (daysUntilDeparture < policy.minDaysBeforeDepartureForDeposit) {
67
+ return [
68
+ { scheduleType: "full", amountCents: total, currency: input.currency, dueDate: todayIso },
69
+ ];
70
+ }
71
+ const depositCents = clampCents(computeDepositCents(total, policy.deposit), 0, total);
72
+ const balanceCents = total - depositCents;
73
+ if (depositCents <= 0 || balanceCents <= 0) {
74
+ // Edge: a policy that resolves to 0% deposit or 100% deposit
75
+ // collapses to a single row rather than emitting a zero-cent
76
+ // partner.
77
+ return [
78
+ { scheduleType: "full", amountCents: total, currency: input.currency, dueDate: todayIso },
79
+ ];
80
+ }
81
+ const rawBalanceDue = addDays(departure, -policy.balanceDueDaysBeforeDeparture);
82
+ const earliestBalanceDue = addDays(today, policy.balanceDueMinDaysFromNow);
83
+ const balanceDue = rawBalanceDue.getTime() > earliestBalanceDue.getTime() ? rawBalanceDue : earliestBalanceDue;
84
+ return [
85
+ {
86
+ scheduleType: "deposit",
87
+ amountCents: depositCents,
88
+ currency: input.currency,
89
+ dueDate: todayIso,
90
+ },
91
+ {
92
+ scheduleType: "balance",
93
+ amountCents: balanceCents,
94
+ currency: input.currency,
95
+ dueDate: isoDate(balanceDue),
96
+ },
97
+ ];
98
+ }
99
+ function computeDepositCents(total, rule) {
100
+ if (rule.kind === "percent") {
101
+ const pct = clampNumber(rule.percent ?? 0, 0, 100);
102
+ return Math.round((total * pct) / 100);
103
+ }
104
+ if (rule.kind === "fixed_cents") {
105
+ return Math.max(0, Math.round(rule.amountCents ?? 0));
106
+ }
107
+ return 0;
108
+ }
109
+ /** True when this policy is empty / "inherit from parent". */
110
+ export function isPaymentPolicyEmpty(policy) {
111
+ if (!policy)
112
+ return true;
113
+ if (policy.deposit.kind === "none")
114
+ return true;
115
+ if (policy.deposit.kind === "percent" &&
116
+ (policy.deposit.percent === undefined || policy.deposit.percent === 0)) {
117
+ return true;
118
+ }
119
+ if (policy.deposit.kind === "fixed_cents" &&
120
+ (policy.deposit.amountCents === undefined || policy.deposit.amountCents === 0)) {
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+ /**
126
+ * Most-specific-wins cascade. Returns both the policy and which
127
+ * layer it came from so contracts and ops UIs can show the trace.
128
+ *
129
+ * A layer is "set" when it's not null/undefined AND not effectively
130
+ * empty (deposit kind === "none" with no other meaningful fields).
131
+ * That way operators who declare an explicit "no deposit" policy on
132
+ * a supplier override their parent's "50% deposit" — they pass an
133
+ * explicit `deposit: { kind: "none" }` AND set non-zero day fields
134
+ * to mark the layer as intentional.
135
+ *
136
+ * For v1 we rely on null/undefined to mean "inherit". The settings
137
+ * API stores `null` for "use parent". An explicit "none" policy
138
+ * needs to be modeled with a different deposit kind later if it
139
+ * proves useful.
140
+ */
141
+ export function resolveEffectivePaymentPolicy(layers) {
142
+ if (layers.bookingPolicy)
143
+ return { policy: layers.bookingPolicy, source: "booking" };
144
+ if (layers.listingPolicy)
145
+ return { policy: layers.listingPolicy, source: "listing" };
146
+ if (layers.categoryPolicy)
147
+ return { policy: layers.categoryPolicy, source: "category" };
148
+ if (layers.supplierPolicy)
149
+ return { policy: layers.supplierPolicy, source: "supplier" };
150
+ return { policy: layers.operatorDefault, source: "operator_default" };
151
+ }
152
+ /**
153
+ * Predicate the storefront UI uses to decide whether to surface the
154
+ * "deposit + balance" copy or just "pay full now". Returns true when
155
+ * the policy + departure date resolve to a single full-payment row.
156
+ */
157
+ export function policyShouldRequireFullPayment(policy, departureDate, today = new Date()) {
158
+ if (policy.deposit.kind === "none")
159
+ return true;
160
+ const departure = parseIsoDate(departureDate);
161
+ if (!departure)
162
+ return true;
163
+ return wholeDaysBetween(today, departure) < policy.minDaysBeforeDepartureForDeposit;
164
+ }
165
+ // ─────────────────────────────────────────────────────────────────
166
+ // Helpers
167
+ // ─────────────────────────────────────────────────────────────────
168
+ function parseIsoDate(value) {
169
+ if (!value)
170
+ return null;
171
+ const trimmed = value.length >= 10 ? value.slice(0, 10) : value;
172
+ const parsed = new Date(`${trimmed}T00:00:00Z`);
173
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
174
+ }
175
+ function isoDate(d) {
176
+ return d.toISOString().slice(0, 10);
177
+ }
178
+ function wholeDaysBetween(from, to) {
179
+ const fromMs = Date.UTC(from.getUTCFullYear(), from.getUTCMonth(), from.getUTCDate());
180
+ const toMs = Date.UTC(to.getUTCFullYear(), to.getUTCMonth(), to.getUTCDate());
181
+ return Math.floor((toMs - fromMs) / (24 * 60 * 60 * 1000));
182
+ }
183
+ function addDays(d, days) {
184
+ const next = new Date(d.getTime());
185
+ next.setUTCDate(next.getUTCDate() + days);
186
+ return next;
187
+ }
188
+ function clampCents(value, min, max) {
189
+ return Math.max(min, Math.min(max, Math.round(value)));
190
+ }
191
+ function clampNumber(value, min, max) {
192
+ return Math.max(min, Math.min(max, value));
193
+ }
@@ -73,13 +73,13 @@ export declare function createFinanceAdminDocumentRoutes(options?: FinanceDocume
73
73
  updatedAt: string;
74
74
  status: "pending" | "failed" | "ready" | "stale";
75
75
  format: "json" | "pdf" | "html" | "xml";
76
+ errorMessage: string | null;
76
77
  templateId: string | null;
77
78
  language: string | null;
78
79
  invoiceId: string;
79
80
  storageKey: string | null;
80
81
  fileSize: number | null;
81
82
  checksum: string | null;
82
- errorMessage: string | null;
83
83
  generatedAt: string | null;
84
84
  };
85
85
  };
@@ -144,13 +144,13 @@ export declare function createFinanceAdminDocumentRoutes(options?: FinanceDocume
144
144
  updatedAt: string;
145
145
  status: "pending" | "failed" | "ready" | "stale";
146
146
  format: "json" | "pdf" | "html" | "xml";
147
+ errorMessage: string | null;
147
148
  templateId: string | null;
148
149
  language: string | null;
149
150
  invoiceId: string;
150
151
  storageKey: string | null;
151
152
  fileSize: number | null;
152
153
  checksum: string | null;
153
- errorMessage: string | null;
154
154
  generatedAt: string | null;
155
155
  };
156
156
  };