@voyantjs/finance 0.75.7 → 0.76.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.
@@ -0,0 +1,22 @@
1
+ export interface DocumentDownloadEnvelope {
2
+ url: string;
3
+ expiresAt: string | null;
4
+ }
5
+ export type DocumentDownloadResolution = {
6
+ status: "ready";
7
+ download: DocumentDownloadEnvelope;
8
+ } | {
9
+ status: "resolver_not_configured";
10
+ } | {
11
+ status: "not_available";
12
+ };
13
+ export type DocumentDownloadResolver = (bindings: unknown, storageKey: string) => Promise<string | null> | string | null;
14
+ export interface StoredDocumentReference {
15
+ storageKey?: string | null;
16
+ metadata?: unknown;
17
+ }
18
+ export declare function resolveStoredDocumentDownload(reference: StoredDocumentReference, options: {
19
+ bindings: unknown;
20
+ resolveDocumentDownloadUrl?: DocumentDownloadResolver;
21
+ }): Promise<DocumentDownloadResolution>;
22
+ //# sourceMappingURL=document-download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-download.d.ts","sourceRoot":"","sources":["../src/document-download.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,wBAAwB,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,yBAAyB,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,eAAe,CAAA;CAAE,CAAA;AAE/B,MAAM,MAAM,wBAAwB,GAAG,CACrC,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAA;AAE3C,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAmCD,wBAAsB,6BAA6B,CACjD,SAAS,EAAE,uBAAuB,EAClC,OAAO,EAAE;IACP,QAAQ,EAAE,OAAO,CAAA;IACjB,0BAA0B,CAAC,EAAE,wBAAwB,CAAA;CACtD,GACA,OAAO,CAAC,0BAA0B,CAAC,CAuBrC"}
@@ -0,0 +1,48 @@
1
+ function getMetadataRecord(metadata) {
2
+ if (!metadata || typeof metadata !== "object" || Array.isArray(metadata)) {
3
+ return null;
4
+ }
5
+ return metadata;
6
+ }
7
+ function maybeUrl(value) {
8
+ return typeof value === "string" && /^https?:\/\//i.test(value) ? value : null;
9
+ }
10
+ function maybeIsoString(value) {
11
+ return typeof value === "string" && value.length > 0 ? value : null;
12
+ }
13
+ function getFallbackDownload(metadata) {
14
+ const record = getMetadataRecord(metadata);
15
+ if (!record) {
16
+ return null;
17
+ }
18
+ const url = maybeUrl(record.url) ?? maybeUrl(record.downloadUrl);
19
+ if (!url) {
20
+ return null;
21
+ }
22
+ return {
23
+ url,
24
+ expiresAt: maybeIsoString(record.expiresAt) ?? maybeIsoString(record.expires_at),
25
+ };
26
+ }
27
+ export async function resolveStoredDocumentDownload(reference, options) {
28
+ let needsResolver = false;
29
+ if (reference.storageKey) {
30
+ if (!options.resolveDocumentDownloadUrl) {
31
+ needsResolver = true;
32
+ }
33
+ else {
34
+ const url = await options.resolveDocumentDownloadUrl(options.bindings, reference.storageKey);
35
+ if (url) {
36
+ return { status: "ready", download: { url, expiresAt: null } };
37
+ }
38
+ }
39
+ }
40
+ const fallback = getFallbackDownload(reference.metadata);
41
+ if (fallback) {
42
+ return { status: "ready", download: fallback };
43
+ }
44
+ if (needsResolver) {
45
+ return { status: "resolver_not_configured" };
46
+ }
47
+ return { status: "not_available" };
48
+ }
package/dist/index.d.ts CHANGED
@@ -21,6 +21,7 @@ export interface FinanceHonoModuleOptions extends FinanceRuntimeOptions, PublicF
21
21
  export declare function createFinanceHonoModule(options?: FinanceHonoModuleOptions): HonoModule;
22
22
  export declare const financeHonoModule: HonoModule;
23
23
  export { type BookingTaxRouteOptions, type BookingTaxSettings, computeBookingItemTaxLine, createBookingTaxHonoExtension, createBookingTaxRoutes, loadProductTaxFacts, matchesTaxPolicyCondition, mountBookingTaxRoutes, type ProductTaxFacts, type ResolveBookingSellTaxRateOptions, type ResolveBookingTaxSettings, type ResolvedBookingSellTaxRate, resolveBookingSellTaxRate, type TaxPolicyCondition, type UpdateBookingTaxSettings, } from "./booking-tax.js";
24
+ export { type DocumentDownloadEnvelope, type DocumentDownloadResolution, type DocumentDownloadResolver, resolveStoredDocumentDownload, type StoredDocumentReference, } from "./document-download.js";
24
25
  export { createInvoiceFxHonoExtension, createInvoiceFxRoutes, createVoyantDataFxExchangeRateResolver, 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";
25
26
  export type { ComputedScheduleEntry, ComputeScheduleInput, DepositKind, DepositRule, PaymentPolicy, PaymentPolicyCascadeLayers, PaymentPolicySource, PaymentScheduleEntryType, ResolvedPaymentPolicy, } from "./payment-policy.js";
26
27
  export { computePaymentSchedule, isPaymentPolicyEmpty, noDepositPolicy, policyShouldRequireFullPayment, resolveEffectivePaymentPolicy, } from "./payment-policy.js";
@@ -41,6 +42,7 @@ export type { GeneratedInvoiceDocumentRecord, GeneratedInvoiceRenditionArtifact,
41
42
  export { createPdfInvoiceDocumentGenerator, createStorageBackedInvoiceDocumentGenerator, defaultPdfInvoiceDocumentSerializer, defaultStorageBackedInvoiceDocumentSerializer, financeDocumentsService, } from "./service-documents.js";
42
43
  export type { InvoiceIssuedEvent, InvoiceIssueRuntime } from "./service-issue.js";
43
44
  export { issueInvoiceFromBooking, issueProformaFromBooking } from "./service-issue.js";
45
+ export { getLatestInvoiceRendition, type InvoiceRenditionWaitMode, type WaitForInvoiceRenditionOptions, type WaitForInvoiceRenditionResult, waitForInvoiceRendition, waitFormatForMode, } from "./service-rendition-wait.js";
44
46
  export type { FinanceSettlementRuntimeOptions, InvoiceSettledEvent, InvoiceSettlementPollerContext, InvoiceSettlementPollerResult, } from "./service-settlement.js";
45
47
  export { financeSettlementService } from "./service-settlement.js";
46
48
  export { VoucherServiceError, vouchersService } from "./service-vouchers.js";
@@ -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
@@ -67,6 +67,7 @@ export function createFinanceHonoModule(options = {}) {
67
67
  }
68
68
  export const financeHonoModule = createFinanceHonoModule();
69
69
  export { computeBookingItemTaxLine, createBookingTaxHonoExtension, createBookingTaxRoutes, loadProductTaxFacts, matchesTaxPolicyCondition, mountBookingTaxRoutes, resolveBookingSellTaxRate, } from "./booking-tax.js";
70
+ export { resolveStoredDocumentDownload, } from "./document-download.js";
70
71
  export { createInvoiceFxHonoExtension, createInvoiceFxRoutes, createVoyantDataFxExchangeRateResolver, mountInvoiceFxRoutes, resolveInvoiceFxContext, resolveInvoiceFxSettingsOrDefault, } from "./invoice-fx.js";
71
72
  export { computePaymentSchedule, isPaymentPolicyEmpty, noDepositPolicy, policyShouldRequireFullPayment, resolveEffectivePaymentPolicy, } from "./payment-policy.js";
72
73
  export { buildFinanceRouteRuntime, FINANCE_ROUTE_RUNTIME_CONTAINER_KEY, } from "./route-runtime.js";
@@ -79,6 +80,7 @@ export { bookingCreateSchema, createBooking, } from "./service-booking-create.js
79
80
  export { dualCreateBooking, dualCreateBookingSchema, } from "./service-bookings-dual-create.js";
80
81
  export { createPdfInvoiceDocumentGenerator, createStorageBackedInvoiceDocumentGenerator, defaultPdfInvoiceDocumentSerializer, defaultStorageBackedInvoiceDocumentSerializer, financeDocumentsService, } from "./service-documents.js";
81
82
  export { issueInvoiceFromBooking, issueProformaFromBooking } from "./service-issue.js";
83
+ export { getLatestInvoiceRendition, waitForInvoiceRendition, waitFormatForMode, } from "./service-rendition-wait.js";
82
84
  export { financeSettlementService } from "./service-settlement.js";
83
85
  export { VoucherServiceError, vouchersService } from "./service-vouchers.js";
84
86
  export { migrateVouchersFromPaymentInstruments, } from "./service-vouchers-migration.js";
@@ -60,8 +60,6 @@ export declare function createFinanceAdminDocumentRoutes(options?: FinanceDocume
60
60
  };
61
61
  output: {
62
62
  data: {
63
- status: "not_found" | "generator_failed";
64
- } | {
65
63
  status: "generated";
66
64
  invoiceId: string;
67
65
  renderedBodyFormat: "html" | "markdown" | "lexical_json";
@@ -131,8 +129,6 @@ export declare function createFinanceAdminDocumentRoutes(options?: FinanceDocume
131
129
  };
132
130
  output: {
133
131
  data: {
134
- status: "not_found" | "generator_failed";
135
- } | {
136
132
  status: "generated";
137
133
  invoiceId: string;
138
134
  renderedBodyFormat: "html" | "markdown" | "lexical_json";
@@ -1 +1 @@
1
- {"version":3,"file":"routes-documents.d.ts","sourceRoot":"","sources":["../src/routes-documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAE/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AASjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAGhE,KAAK,GAAG,GAAG;IACT,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,SAAS,EAAE;QACT,SAAS,EAAE,eAAe,CAAA;QAC1B,EAAE,EAAE,kBAAkB,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAC/C,OAAO,uBAAuB,CAAC,uBAAuB,CACvD,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;AAEjB,MAAM,WAAW,2BAA2B;IAC1C,wBAAwB,CAAC,EAAE,wBAAwB,CAAA;IACnD,+BAA+B,CAAC,EAAE,CAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,wBAAwB,GAAG,SAAS,CAAA;IACzC,0BAA0B,CAAC,EAAE,CAC3B,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAA;IAC3C,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,QAAQ,GAAG,SAAS,CAAA;CAC9E;AAkCD,wBAAgB,gCAAgC,CAAC,OAAO,GAAE,2BAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAiEzF"}
1
+ {"version":3,"file":"routes-documents.d.ts","sourceRoot":"","sources":["../src/routes-documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAE/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAUjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAGhE,KAAK,GAAG,GAAG;IACT,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,SAAS,EAAE;QACT,SAAS,EAAE,eAAe,CAAA;QAC1B,EAAE,EAAE,kBAAkB,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAC/C,OAAO,uBAAuB,CAAC,uBAAuB,CACvD,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;AAEjB,MAAM,WAAW,2BAA2B;IAC1C,wBAAwB,CAAC,EAAE,wBAAwB,CAAA;IACnD,+BAA+B,CAAC,EAAE,CAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,wBAAwB,GAAG,SAAS,CAAA;IACzC,0BAA0B,CAAC,EAAE,CAC3B,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAA;IAC3C,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,QAAQ,GAAG,SAAS,CAAA;CAC9E;AAaD,wBAAgB,gCAAgC,CAAC,OAAO,GAAE,2BAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAsEzF"}
@@ -1,5 +1,6 @@
1
1
  import { parseOptionalJsonBody } from "@voyantjs/hono";
2
2
  import { Hono } from "hono";
3
+ import { resolveStoredDocumentDownload } from "./document-download.js";
3
4
  import { buildFinanceRouteRuntime, FINANCE_ROUTE_RUNTIME_CONTAINER_KEY, } from "./route-runtime.js";
4
5
  import { financeService } from "./service.js";
5
6
  import { financeDocumentsService } from "./service-documents.js";
@@ -8,22 +9,6 @@ function getRuntime(options, bindings, resolveFromContainer) {
8
9
  return (resolveFromContainer?.(FINANCE_ROUTE_RUNTIME_CONTAINER_KEY) ??
9
10
  buildFinanceRouteRuntime(bindings, options));
10
11
  }
11
- function getMetadataRecord(metadata) {
12
- if (!metadata || typeof metadata !== "object" || Array.isArray(metadata)) {
13
- return null;
14
- }
15
- return metadata;
16
- }
17
- function maybeUrl(value) {
18
- return typeof value === "string" && /^https?:\/\//i.test(value) ? value : null;
19
- }
20
- function getFallbackDownloadUrl(metadata) {
21
- const record = getMetadataRecord(metadata);
22
- if (!record) {
23
- return null;
24
- }
25
- return maybeUrl(record.url);
26
- }
27
12
  export function createFinanceAdminDocumentRoutes(options = {}) {
28
13
  return new Hono()
29
14
  .post("/invoices/:id/generate-document", async (c) => {
@@ -38,7 +23,10 @@ export function createFinanceAdminDocumentRoutes(options = {}) {
38
23
  if (result.status === "generator_failed") {
39
24
  return c.json({ error: "Invoice document generation failed" }, 502);
40
25
  }
41
- return c.json({ data: result }, 201);
26
+ if (!("rendition" in result)) {
27
+ return c.json({ error: "Invoice document generation failed" }, 502);
28
+ }
29
+ return c.json({ data: await attachDownloadEnvelope(c.env, runtime, result) }, 201);
42
30
  })
43
31
  .post("/invoices/:id/regenerate-document", async (c) => {
44
32
  const runtime = getRuntime(options, c.env, (key) => c.var.container?.resolve(key));
@@ -52,24 +40,34 @@ export function createFinanceAdminDocumentRoutes(options = {}) {
52
40
  if (result.status === "generator_failed") {
53
41
  return c.json({ error: "Invoice document generation failed" }, 502);
54
42
  }
55
- return c.json({ data: result });
43
+ if (!("rendition" in result)) {
44
+ return c.json({ error: "Invoice document generation failed" }, 502);
45
+ }
46
+ return c.json({ data: await attachDownloadEnvelope(c.env, runtime, result) });
56
47
  })
57
48
  .get("/invoice-renditions/:id/download", async (c) => {
49
+ const runtime = getRuntime(options, c.env, (key) => c.var.container?.resolve(key));
58
50
  const rendition = await financeService.getInvoiceRenditionById(c.get("db"), c.req.param("id"));
59
51
  if (!rendition) {
60
52
  return c.json({ error: "Invoice rendition not found" }, 404);
61
53
  }
62
- let location = null;
63
- if (rendition.storageKey) {
64
- if (!options.resolveDocumentDownloadUrl) {
65
- return c.json({ error: "Document download resolver is not configured" }, 501);
66
- }
67
- location = await options.resolveDocumentDownloadUrl(c.env, rendition.storageKey);
54
+ const download = await resolveStoredDocumentDownload(rendition, {
55
+ bindings: c.env,
56
+ resolveDocumentDownloadUrl: runtime.resolveDocumentDownloadUrl,
57
+ });
58
+ if (download.status === "resolver_not_configured") {
59
+ return c.json({ error: "Document download resolver is not configured" }, 501);
68
60
  }
69
- location ??= getFallbackDownloadUrl(rendition.metadata);
70
- if (!location) {
61
+ if (download.status !== "ready") {
71
62
  return c.json({ error: "Invoice document is not available" }, 404);
72
63
  }
73
- return c.redirect(location, 302);
64
+ return c.redirect(download.download.url, 302);
65
+ });
66
+ }
67
+ async function attachDownloadEnvelope(bindings, runtime, result) {
68
+ const download = await resolveStoredDocumentDownload(result.rendition, {
69
+ bindings,
70
+ resolveDocumentDownloadUrl: runtime.resolveDocumentDownloadUrl,
74
71
  });
72
+ return download.status === "ready" ? { ...result, download: download.download } : result;
75
73
  }
package/dist/routes.d.ts CHANGED
@@ -2491,6 +2491,128 @@ export declare const financeRoutes: import("hono/hono-base").HonoBase<Env, {
2491
2491
  };
2492
2492
  outputFormat: "json";
2493
2493
  status: 201;
2494
+ } | {
2495
+ input: {};
2496
+ output: {
2497
+ data: {
2498
+ invoice: {
2499
+ id: string;
2500
+ status: "draft" | "pending_external_allocation" | "sent" | "partially_paid" | "paid" | "overdue" | "void";
2501
+ organizationId: string | null;
2502
+ createdAt: string;
2503
+ currency: string;
2504
+ notes: string | null;
2505
+ updatedAt: string;
2506
+ bookingId: string;
2507
+ personId: string | null;
2508
+ invoiceNumber: string;
2509
+ invoiceType: "invoice" | "proforma" | "credit_note";
2510
+ convertedFromInvoiceId: string | null;
2511
+ seriesId: string | null;
2512
+ sequence: number | null;
2513
+ templateId: string | null;
2514
+ taxRegimeId: string | null;
2515
+ language: string | null;
2516
+ baseCurrency: string | null;
2517
+ fxRateSetId: string | null;
2518
+ subtotalCents: number;
2519
+ baseSubtotalCents: number | null;
2520
+ taxCents: number;
2521
+ baseTaxCents: number | null;
2522
+ totalCents: number;
2523
+ baseTotalCents: number | null;
2524
+ paidCents: number;
2525
+ basePaidCents: number | null;
2526
+ balanceDueCents: number;
2527
+ baseBalanceDueCents: number | null;
2528
+ commissionPercent: number | null;
2529
+ commissionAmountCents: number | null;
2530
+ issueDate: string;
2531
+ dueDate: string;
2532
+ };
2533
+ rendition: {
2534
+ format: "json" | "html" | "pdf" | "xml";
2535
+ id: string;
2536
+ status: "failed" | "pending" | "ready" | "stale";
2537
+ createdAt: string;
2538
+ updatedAt: string;
2539
+ metadata: import("hono/utils/types").JSONValue;
2540
+ templateId: string | null;
2541
+ language: string | null;
2542
+ invoiceId: string;
2543
+ storageKey: string | null;
2544
+ fileSize: number | null;
2545
+ checksum: string | null;
2546
+ errorMessage: string | null;
2547
+ generatedAt: string | null;
2548
+ } | null;
2549
+ };
2550
+ };
2551
+ outputFormat: "json";
2552
+ status: 202;
2553
+ } | {
2554
+ input: {};
2555
+ output: {
2556
+ data: {
2557
+ download: {
2558
+ url: string;
2559
+ expiresAt: string | null;
2560
+ };
2561
+ invoice: {
2562
+ id: string;
2563
+ status: "draft" | "pending_external_allocation" | "sent" | "partially_paid" | "paid" | "overdue" | "void";
2564
+ organizationId: string | null;
2565
+ createdAt: string;
2566
+ currency: string;
2567
+ notes: string | null;
2568
+ updatedAt: string;
2569
+ bookingId: string;
2570
+ personId: string | null;
2571
+ invoiceNumber: string;
2572
+ invoiceType: "invoice" | "proforma" | "credit_note";
2573
+ convertedFromInvoiceId: string | null;
2574
+ seriesId: string | null;
2575
+ sequence: number | null;
2576
+ templateId: string | null;
2577
+ taxRegimeId: string | null;
2578
+ language: string | null;
2579
+ baseCurrency: string | null;
2580
+ fxRateSetId: string | null;
2581
+ subtotalCents: number;
2582
+ baseSubtotalCents: number | null;
2583
+ taxCents: number;
2584
+ baseTaxCents: number | null;
2585
+ totalCents: number;
2586
+ baseTotalCents: number | null;
2587
+ paidCents: number;
2588
+ basePaidCents: number | null;
2589
+ balanceDueCents: number;
2590
+ baseBalanceDueCents: number | null;
2591
+ commissionPercent: number | null;
2592
+ commissionAmountCents: number | null;
2593
+ issueDate: string;
2594
+ dueDate: string;
2595
+ };
2596
+ rendition: {
2597
+ format: "json" | "html" | "pdf" | "xml";
2598
+ id: string;
2599
+ status: "failed" | "pending" | "ready" | "stale";
2600
+ createdAt: string;
2601
+ updatedAt: string;
2602
+ metadata: import("hono/utils/types").JSONValue;
2603
+ templateId: string | null;
2604
+ language: string | null;
2605
+ invoiceId: string;
2606
+ storageKey: string | null;
2607
+ fileSize: number | null;
2608
+ checksum: string | null;
2609
+ errorMessage: string | null;
2610
+ generatedAt: string | null;
2611
+ } | null;
2612
+ };
2613
+ };
2614
+ outputFormat: "json";
2615
+ status: 201;
2494
2616
  };
2495
2617
  };
2496
2618
  } & {
@@ -4448,6 +4570,66 @@ export declare const financeRoutes: import("hono/hono-base").HonoBase<Env, {
4448
4570
  };
4449
4571
  outputFormat: "json";
4450
4572
  status: 404;
4573
+ } | {
4574
+ input: {
4575
+ param: {
4576
+ id: string;
4577
+ };
4578
+ };
4579
+ output: {
4580
+ data: {
4581
+ rendition: {
4582
+ format: "json" | "html" | "pdf" | "xml";
4583
+ id: string;
4584
+ status: "failed" | "pending" | "ready" | "stale";
4585
+ createdAt: string;
4586
+ updatedAt: string;
4587
+ metadata: import("hono/utils/types").JSONValue;
4588
+ templateId: string | null;
4589
+ language: string | null;
4590
+ invoiceId: string;
4591
+ storageKey: string | null;
4592
+ fileSize: number | null;
4593
+ checksum: string | null;
4594
+ errorMessage: string | null;
4595
+ generatedAt: string | null;
4596
+ };
4597
+ };
4598
+ };
4599
+ outputFormat: "json";
4600
+ status: 202;
4601
+ } | {
4602
+ input: {
4603
+ param: {
4604
+ id: string;
4605
+ };
4606
+ };
4607
+ output: {
4608
+ data: {
4609
+ download: {
4610
+ url: string;
4611
+ expiresAt: string | null;
4612
+ };
4613
+ rendition: {
4614
+ format: "json" | "html" | "pdf" | "xml";
4615
+ id: string;
4616
+ status: "failed" | "pending" | "ready" | "stale";
4617
+ createdAt: string;
4618
+ updatedAt: string;
4619
+ metadata: import("hono/utils/types").JSONValue;
4620
+ templateId: string | null;
4621
+ language: string | null;
4622
+ invoiceId: string;
4623
+ storageKey: string | null;
4624
+ fileSize: number | null;
4625
+ checksum: string | null;
4626
+ errorMessage: string | null;
4627
+ generatedAt: string | null;
4628
+ };
4629
+ };
4630
+ };
4631
+ outputFormat: "json";
4632
+ status: 201;
4451
4633
  } | {
4452
4634
  input: {
4453
4635
  param: {
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AA+I7C,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCA+kDtB,CAAA;AAEJ,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAA;AAChD,MAAM,MAAM,mBAAmB,GAAG,OAAO,mBAAmB,CAAA"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AAuJ7C,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCAqnDtB,CAAA;AAEJ,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAA;AAChD,MAAM,MAAM,mBAAmB,GAAG,OAAO,mBAAmB,CAAA"}
package/dist/routes.js CHANGED
@@ -1,27 +1,27 @@
1
1
  import { parseJsonBody, parseQuery, requireUserId } from "@voyantjs/hono";
2
2
  import { Hono } from "hono";
3
+ import { resolveStoredDocumentDownload } from "./document-download.js";
3
4
  import { FINANCE_ROUTE_RUNTIME_CONTAINER_KEY } from "./route-runtime.js";
4
5
  import { financeService, InvoiceNumberAllocationError, PaymentValidationError } from "./service.js";
6
+ import { waitForInvoiceRendition, waitFormatForMode, } from "./service-rendition-wait.js";
5
7
  import { VoucherServiceError } from "./service-vouchers.js";
6
- import { agingReportQuerySchema, applyDefaultBookingPaymentPlanSchema, cancelPaymentSessionSchema, completePaymentSessionSchema, createPaymentSessionFromGuaranteeSchema, createPaymentSessionFromInvoiceSchema, createPaymentSessionFromScheduleSchema, expirePaymentSessionSchema, failPaymentSessionSchema, financeAggregatesQuerySchema, insertBookingGuaranteeSchema, insertBookingItemCommissionSchema, insertBookingItemTaxLineSchema, insertBookingPaymentScheduleSchema, insertCreditNoteLineItemSchema, insertCreditNoteSchema, insertFinanceNoteSchema, insertInvoiceAttachmentSchema, insertInvoiceExternalRefSchema, insertInvoiceLineItemSchema, insertInvoiceNumberSeriesSchema, insertInvoiceSchema, insertInvoiceTemplateSchema, insertPaymentAuthorizationSchema, insertPaymentCaptureSchema, insertPaymentInstrumentSchema, insertPaymentSchema, insertPaymentSessionSchema, insertSupplierPaymentSchema, insertTaxClassSchema, insertTaxPolicyProfileSchema, insertTaxPolicyRuleSchema, insertTaxRegimeSchema, insertVoucherSchema, invoiceFromBookingSchema, invoiceListQuerySchema, invoiceNumberSeriesListQuerySchema, invoiceTemplateListQuerySchema, markPaymentSessionRequiresRedirectSchema, paymentAuthorizationListQuerySchema, paymentCaptureListQuerySchema, paymentInstrumentListQuerySchema, paymentListQuerySchema, paymentSessionListQuerySchema, profitabilityQuerySchema, redeemVoucherSchema, renderInvoiceInputSchema, revenueReportQuerySchema, supplierPaymentListQuerySchema, taxClassListQuerySchema, taxPolicyProfileListQuerySchema, taxPolicyRuleListQuerySchema, taxRegimeListQuerySchema, updateBookingGuaranteeSchema, updateBookingItemCommissionSchema, updateBookingItemTaxLineSchema, updateBookingPaymentScheduleSchema, updateCreditNoteSchema, updateInvoiceAttachmentSchema, updateInvoiceLineItemSchema, updateInvoiceNumberSeriesSchema, updateInvoiceSchema, updateInvoiceTemplateSchema, updatePaymentAuthorizationSchema, updatePaymentCaptureSchema, updatePaymentInstrumentSchema, updatePaymentSessionSchema, updateSupplierPaymentSchema, updateTaxClassSchema, updateTaxPolicyProfileSchema, updateTaxPolicyRuleSchema, updateTaxRegimeSchema, updateVoucherSchema, voucherListQuerySchema, } from "./validation.js";
8
+ import { agingReportQuerySchema, applyDefaultBookingPaymentPlanSchema, cancelPaymentSessionSchema, completePaymentSessionSchema, createPaymentSessionFromGuaranteeSchema, createPaymentSessionFromInvoiceSchema, createPaymentSessionFromScheduleSchema, expirePaymentSessionSchema, failPaymentSessionSchema, financeAggregatesQuerySchema, insertBookingGuaranteeSchema, insertBookingItemCommissionSchema, insertBookingItemTaxLineSchema, insertBookingPaymentScheduleSchema, insertCreditNoteLineItemSchema, insertCreditNoteSchema, insertFinanceNoteSchema, insertInvoiceAttachmentSchema, insertInvoiceExternalRefSchema, insertInvoiceLineItemSchema, insertInvoiceNumberSeriesSchema, insertInvoiceSchema, insertInvoiceTemplateSchema, insertPaymentAuthorizationSchema, insertPaymentCaptureSchema, insertPaymentInstrumentSchema, insertPaymentSchema, insertPaymentSessionSchema, insertSupplierPaymentSchema, insertTaxClassSchema, insertTaxPolicyProfileSchema, insertTaxPolicyRuleSchema, insertTaxRegimeSchema, insertVoucherSchema, invoiceDocumentWaitQuerySchema, invoiceFromBookingSchema, invoiceListQuerySchema, invoiceNumberSeriesListQuerySchema, invoiceTemplateListQuerySchema, markPaymentSessionRequiresRedirectSchema, paymentAuthorizationListQuerySchema, paymentCaptureListQuerySchema, paymentInstrumentListQuerySchema, paymentListQuerySchema, paymentSessionListQuerySchema, profitabilityQuerySchema, redeemVoucherSchema, renderInvoiceInputSchema, revenueReportQuerySchema, supplierPaymentListQuerySchema, taxClassListQuerySchema, taxPolicyProfileListQuerySchema, taxPolicyRuleListQuerySchema, taxRegimeListQuerySchema, updateBookingGuaranteeSchema, updateBookingItemCommissionSchema, updateBookingItemTaxLineSchema, updateBookingPaymentScheduleSchema, updateCreditNoteSchema, updateInvoiceAttachmentSchema, updateInvoiceLineItemSchema, updateInvoiceNumberSeriesSchema, updateInvoiceSchema, updateInvoiceTemplateSchema, updatePaymentAuthorizationSchema, updatePaymentCaptureSchema, updatePaymentInstrumentSchema, updatePaymentSessionSchema, updateSupplierPaymentSchema, updateTaxClassSchema, updateTaxPolicyProfileSchema, updateTaxPolicyRuleSchema, updateTaxRegimeSchema, updateVoucherSchema, voucherListQuerySchema, } from "./validation.js";
7
9
  // ==========================================================================
8
10
  // Finance Routes — method-chained for Hono RPC type inference
9
11
  // ==========================================================================
10
- function getMetadataRecord(metadata) {
11
- if (!metadata || typeof metadata !== "object" || Array.isArray(metadata)) {
12
- return null;
13
- }
14
- return metadata;
15
- }
16
- function maybeUrl(value) {
17
- return typeof value === "string" && /^https?:\/\//i.test(value) ? value : null;
12
+ const DEFAULT_RENDITION_WAIT_TIMEOUT_MS = 30_000;
13
+ function resolveWaitRequest(body, query) {
14
+ return {
15
+ mode: query.wait ?? body.wait ?? "none",
16
+ timeoutMs: query.waitTimeoutMs ?? body.waitTimeoutMs ?? DEFAULT_RENDITION_WAIT_TIMEOUT_MS,
17
+ };
18
18
  }
19
- function getFallbackDownloadUrl(metadata) {
20
- const record = getMetadataRecord(metadata);
21
- if (!record) {
22
- return null;
23
- }
24
- return maybeUrl(record.url);
19
+ async function buildInlineDownload(c, reference) {
20
+ const runtime = getFinanceRouteRuntime(c);
21
+ return resolveStoredDocumentDownload(reference, {
22
+ bindings: c.env,
23
+ resolveDocumentDownloadUrl: runtime?.resolveDocumentDownloadUrl,
24
+ });
25
25
  }
26
26
  function getFinanceRouteRuntime(c) {
27
27
  try {
@@ -590,6 +590,7 @@ export const financeRoutes = new Hono()
590
590
  // POST /invoices/from-booking — Create + issue invoice (or proforma) from booking + booking items
591
591
  .post("/invoices/from-booking", async (c) => {
592
592
  const input = await parseJsonBody(c, invoiceFromBookingSchema);
593
+ const waitRequest = resolveWaitRequest(input, parseQuery(c, invoiceDocumentWaitQuerySchema));
593
594
  const db = c.get("db");
594
595
  const [{ bookingItems, bookings }, { eq }, { issueInvoiceFromBooking, issueProformaFromBooking },] = await Promise.all([
595
596
  import("@voyantjs/bookings/schema"),
@@ -647,7 +648,25 @@ export const financeRoutes = new Hono()
647
648
  }
648
649
  throw error;
649
650
  }
650
- return c.json({ data: row }, 201);
651
+ if (!row || waitRequest.mode === "none") {
652
+ return c.json({ data: row }, 201);
653
+ }
654
+ const waitResult = await waitForInvoiceRendition(db, row.id, {
655
+ format: waitFormatForMode(waitRequest.mode),
656
+ timeoutMs: waitRequest.timeoutMs,
657
+ });
658
+ const payload = {
659
+ invoice: row,
660
+ rendition: waitResult.rendition,
661
+ };
662
+ if (waitResult.status !== "ready") {
663
+ return c.json({ data: payload }, 202);
664
+ }
665
+ const download = await buildInlineDownload(c, waitResult.rendition);
666
+ if (download.status !== "ready") {
667
+ return c.json({ data: payload }, 202);
668
+ }
669
+ return c.json({ data: { ...payload, download: download.download } }, 201);
651
670
  })
652
671
  // POST /invoices/:id/convert-to-invoice — Convert a proforma into a final invoice
653
672
  .post("/invoices/:id/convert-to-invoice", async (c) => {
@@ -1094,19 +1113,14 @@ export const financeRoutes = new Hono()
1094
1113
  const attachment = await financeService.getInvoiceAttachmentById(c.get("db"), c.req.param("id"));
1095
1114
  if (!attachment)
1096
1115
  return c.json({ error: "Attachment not found" }, 404);
1097
- let location = null;
1098
- if (attachment.storageKey) {
1099
- const runtime = getFinanceRouteRuntime(c);
1100
- if (!runtime?.resolveDocumentDownloadUrl) {
1101
- return c.json({ error: "Document download resolver is not configured" }, 501);
1102
- }
1103
- location = await runtime.resolveDocumentDownloadUrl(c.env, attachment.storageKey);
1116
+ const download = await buildInlineDownload(c, attachment);
1117
+ if (download.status === "resolver_not_configured") {
1118
+ return c.json({ error: "Document download resolver is not configured" }, 501);
1104
1119
  }
1105
- location ??= getFallbackDownloadUrl(attachment.metadata);
1106
- if (!location) {
1120
+ if (download.status !== "ready") {
1107
1121
  return c.json({ error: "Attachment file is not available" }, 404);
1108
1122
  }
1109
- return c.redirect(location, 302);
1123
+ return c.redirect(download.download.url, 302);
1110
1124
  })
1111
1125
  .delete("/invoices/:id/attachments/:attachmentId", async (c) => {
1112
1126
  const row = await financeService.deleteInvoiceAttachment(c.get("db"), c.req.param("id"), c.req.param("attachmentId"));
@@ -1116,9 +1130,28 @@ export const financeRoutes = new Hono()
1116
1130
  })
1117
1131
  .post("/invoices/:id/render", async (c) => {
1118
1132
  const input = await parseJsonBody(c, renderInvoiceInputSchema);
1133
+ const waitRequest = resolveWaitRequest(input, parseQuery(c, invoiceDocumentWaitQuerySchema));
1119
1134
  const result = await financeService.renderInvoice(c.get("db"), c.req.param("id"), input);
1120
1135
  if (result.status === "not_found")
1121
1136
  return c.json({ error: "Invoice not found" }, 404);
1137
+ if (waitRequest.mode !== "none" && result.rendition) {
1138
+ const waitResult = await waitForInvoiceRendition(c.get("db"), c.req.param("id"), {
1139
+ renditionId: result.rendition.id,
1140
+ format: waitFormatForMode(waitRequest.mode),
1141
+ timeoutMs: waitRequest.timeoutMs,
1142
+ });
1143
+ const payload = {
1144
+ rendition: waitResult.rendition ?? result.rendition,
1145
+ };
1146
+ if (waitResult.status !== "ready") {
1147
+ return c.json({ data: payload }, 202);
1148
+ }
1149
+ const download = await buildInlineDownload(c, waitResult.rendition);
1150
+ if (download.status !== "ready") {
1151
+ return c.json({ data: payload }, 202);
1152
+ }
1153
+ return c.json({ data: { ...payload, download: download.download } }, 201);
1154
+ }
1122
1155
  return c.json({ data: result.rendition }, 201);
1123
1156
  })
1124
1157
  .get("/invoices/:id/external-refs", async (c) => {
@@ -0,0 +1,38 @@
1
+ import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
2
+ import { type InvoiceRendition } from "./schema.js";
3
+ export type InvoiceRenditionWaitMode = "none" | "pdf" | "any";
4
+ export interface WaitForInvoiceRenditionOptions {
5
+ format?: InvoiceRendition["format"];
6
+ renditionId?: string;
7
+ timeoutMs?: number;
8
+ intervalMs?: number;
9
+ }
10
+ export type WaitForInvoiceRenditionResult = {
11
+ status: "ready";
12
+ rendition: InvoiceRendition;
13
+ } | {
14
+ status: "failed";
15
+ rendition: InvoiceRendition;
16
+ } | {
17
+ status: "timeout";
18
+ rendition: InvoiceRendition | null;
19
+ };
20
+ export declare function getLatestInvoiceRendition(db: PostgresJsDatabase, invoiceId: string, options?: Pick<WaitForInvoiceRenditionOptions, "format" | "renditionId">): Promise<{
21
+ id: string;
22
+ invoiceId: string;
23
+ templateId: string | null;
24
+ format: "json" | "html" | "pdf" | "xml";
25
+ status: "failed" | "pending" | "ready" | "stale";
26
+ storageKey: string | null;
27
+ fileSize: number | null;
28
+ checksum: string | null;
29
+ language: string | null;
30
+ errorMessage: string | null;
31
+ generatedAt: Date | null;
32
+ metadata: unknown;
33
+ createdAt: Date;
34
+ updatedAt: Date;
35
+ } | null>;
36
+ export declare function waitForInvoiceRendition(db: PostgresJsDatabase, invoiceId: string, options?: WaitForInvoiceRenditionOptions): Promise<WaitForInvoiceRenditionResult>;
37
+ export declare function waitFormatForMode(mode: InvoiceRenditionWaitMode): "pdf" | undefined;
38
+ //# sourceMappingURL=service-rendition-wait.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-rendition-wait.d.ts","sourceRoot":"","sources":["../src/service-rendition-wait.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAEjE,OAAO,EAAE,KAAK,gBAAgB,EAAqB,MAAM,aAAa,CAAA;AAEtE,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAA;AAE7D,MAAM,WAAW,8BAA8B;IAC7C,MAAM,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IACnC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,MAAM,6BAA6B,GACrC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,gBAAgB,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,gBAAgB,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAA;CAAE,CAAA;AAoC7D,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,kBAAkB,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,IAAI,CAAC,8BAA8B,EAAE,QAAQ,GAAG,aAAa,CAAM;;;;;;;;;;;;;;;UAc7E;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,kBAAkB,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,8BAAmC,GAC3C,OAAO,CAAC,6BAA6B,CAAC,CAuBxC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,qBAE/D"}
@@ -0,0 +1,67 @@
1
+ import { and, desc, eq, inArray } from "drizzle-orm";
2
+ import { invoiceRenditions } from "./schema.js";
3
+ const DEFAULT_TIMEOUT_MS = 30_000;
4
+ const DEFAULT_INTERVAL_MS = 250;
5
+ function sleep(ms) {
6
+ return new Promise((resolve) => setTimeout(resolve, ms));
7
+ }
8
+ function clampWaitTimeout(timeoutMs) {
9
+ if (timeoutMs == null || Number.isNaN(timeoutMs))
10
+ return DEFAULT_TIMEOUT_MS;
11
+ return Math.max(0, Math.min(60_000, timeoutMs));
12
+ }
13
+ async function findTerminalRendition(db, invoiceId, options) {
14
+ const conditions = [
15
+ eq(invoiceRenditions.invoiceId, invoiceId),
16
+ inArray(invoiceRenditions.status, ["ready", "failed"]),
17
+ ];
18
+ if (options.renditionId)
19
+ conditions.push(eq(invoiceRenditions.id, options.renditionId));
20
+ if (options.format)
21
+ conditions.push(eq(invoiceRenditions.format, options.format));
22
+ const [row] = await db
23
+ .select()
24
+ .from(invoiceRenditions)
25
+ .where(and(...conditions))
26
+ .orderBy(desc(invoiceRenditions.createdAt))
27
+ .limit(1);
28
+ return row ?? null;
29
+ }
30
+ export async function getLatestInvoiceRendition(db, invoiceId, options = {}) {
31
+ const conditions = [eq(invoiceRenditions.invoiceId, invoiceId)];
32
+ if (options.renditionId)
33
+ conditions.push(eq(invoiceRenditions.id, options.renditionId));
34
+ if (options.format)
35
+ conditions.push(eq(invoiceRenditions.format, options.format));
36
+ const [row] = await db
37
+ .select()
38
+ .from(invoiceRenditions)
39
+ .where(and(...conditions))
40
+ .orderBy(desc(invoiceRenditions.createdAt))
41
+ .limit(1);
42
+ return row ?? null;
43
+ }
44
+ export async function waitForInvoiceRendition(db, invoiceId, options = {}) {
45
+ const timeoutMs = clampWaitTimeout(options.timeoutMs);
46
+ const intervalMs = Math.max(10, options.intervalMs ?? DEFAULT_INTERVAL_MS);
47
+ const deadline = Date.now() + timeoutMs;
48
+ while (true) {
49
+ const rendition = await findTerminalRendition(db, invoiceId, options);
50
+ if (rendition) {
51
+ return rendition.status === "ready"
52
+ ? { status: "ready", rendition }
53
+ : { status: "failed", rendition };
54
+ }
55
+ const remainingMs = deadline - Date.now();
56
+ if (remainingMs <= 0) {
57
+ return {
58
+ status: "timeout",
59
+ rendition: await getLatestInvoiceRendition(db, invoiceId, options),
60
+ };
61
+ }
62
+ await sleep(Math.min(intervalMs, remainingMs));
63
+ }
64
+ }
65
+ export function waitFormatForMode(mode) {
66
+ return mode === "pdf" ? "pdf" : undefined;
67
+ }
@@ -218,6 +218,12 @@ export declare const invoiceFromBookingSchema: z.ZodObject<{
218
218
  invoice: "invoice";
219
219
  proforma: "proforma";
220
220
  }>>;
221
+ wait: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodEnum<{
222
+ none: "none";
223
+ pdf: "pdf";
224
+ any: "any";
225
+ }>>>;
226
+ waitTimeoutMs: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
221
227
  }, z.core.$strip>;
222
228
  export declare const insertInvoiceLineItemSchema: z.ZodObject<{
223
229
  bookingItemId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
@@ -706,6 +712,12 @@ export declare const renderInvoiceInputSchema: z.ZodObject<{
706
712
  xml: "xml";
707
713
  }>>;
708
714
  language: z.ZodNullable<z.ZodOptional<z.ZodString>>;
715
+ wait: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodEnum<{
716
+ none: "none";
717
+ pdf: "pdf";
718
+ any: "any";
719
+ }>>>;
720
+ waitTimeoutMs: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
709
721
  }, z.core.$strip>;
710
722
  export declare const generateInvoiceDocumentInputSchema: z.ZodObject<{
711
723
  templateId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
@@ -716,8 +728,22 @@ export declare const generateInvoiceDocumentInputSchema: z.ZodObject<{
716
728
  xml: "xml";
717
729
  }>>;
718
730
  language: z.ZodNullable<z.ZodOptional<z.ZodString>>;
731
+ wait: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodEnum<{
732
+ none: "none";
733
+ pdf: "pdf";
734
+ any: "any";
735
+ }>>>;
736
+ waitTimeoutMs: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
719
737
  replaceExisting: z.ZodDefault<z.ZodBoolean>;
720
738
  }, z.core.$strip>;
739
+ export declare const invoiceDocumentWaitQuerySchema: z.ZodObject<{
740
+ wait: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodEnum<{
741
+ none: "none";
742
+ pdf: "pdf";
743
+ any: "any";
744
+ }>>>;
745
+ waitTimeoutMs: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
746
+ }, z.core.$strip>;
721
747
  export declare const generatedInvoiceDocumentResultSchema: z.ZodObject<{
722
748
  invoiceId: z.ZodString;
723
749
  renderedBodyFormat: z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"validation-billing.d.ts","sourceRoot":"","sources":["../src/validation-billing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation-billing.d.ts","sourceRoot":"","sources":["../src/validation-billing.ts"],"names":[],"mappings":"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"}
@@ -80,6 +80,17 @@ export const invoiceListQuerySchema = z.object({
80
80
  limit: z.coerce.number().int().min(1).max(100).default(50),
81
81
  offset: z.coerce.number().int().min(0).default(0),
82
82
  });
83
+ const invoiceDocumentWaitModeSchema = z.preprocess((value) => {
84
+ if (value === true || value === "true")
85
+ return "pdf";
86
+ if (value === false || value === "false")
87
+ return "none";
88
+ return value;
89
+ }, z.enum(["none", "pdf", "any"]));
90
+ const invoiceDocumentWaitFieldsSchema = z.object({
91
+ wait: invoiceDocumentWaitModeSchema.optional(),
92
+ waitTimeoutMs: z.coerce.number().int().min(0).max(60_000).optional(),
93
+ });
83
94
  export const invoiceFromBookingSchema = z.object({
84
95
  bookingId: z.string().min(1),
85
96
  invoiceNumber: z.string().min(1).max(50).optional(),
@@ -93,6 +104,8 @@ export const invoiceFromBookingSchema = z.object({
93
104
  * payment lands and a real invoice replaces it.
94
105
  */
95
106
  invoiceType: z.enum(["invoice", "proforma"]).default("invoice"),
107
+ wait: invoiceDocumentWaitModeSchema.optional(),
108
+ waitTimeoutMs: z.coerce.number().int().min(0).max(60_000).optional(),
96
109
  });
97
110
  const lineItemCoreSchema = z.object({
98
111
  bookingItemId: z.string().optional().nullable(),
@@ -337,10 +350,13 @@ export const renderInvoiceInputSchema = z.object({
337
350
  templateId: z.string().optional().nullable(),
338
351
  format: invoiceRenditionFormatSchema.default("pdf"),
339
352
  language: z.string().optional().nullable(),
353
+ wait: invoiceDocumentWaitModeSchema.optional(),
354
+ waitTimeoutMs: z.coerce.number().int().min(0).max(60_000).optional(),
340
355
  });
341
356
  export const generateInvoiceDocumentInputSchema = renderInvoiceInputSchema.extend({
342
357
  replaceExisting: z.boolean().default(true),
343
358
  });
359
+ export const invoiceDocumentWaitQuerySchema = invoiceDocumentWaitFieldsSchema;
344
360
  export const generatedInvoiceDocumentResultSchema = z.object({
345
361
  invoiceId: z.string(),
346
362
  renderedBodyFormat: invoiceTemplateBodyFormatSchema,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyantjs/finance",
3
- "version": "0.75.7",
3
+ "version": "0.76.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -59,14 +59,14 @@
59
59
  "drizzle-orm": "^0.45.2",
60
60
  "hono": "^4.12.10",
61
61
  "zod": "^4.3.6",
62
- "@voyantjs/action-ledger": "0.75.7",
63
- "@voyantjs/bookings": "0.75.7",
64
- "@voyantjs/core": "0.75.7",
65
- "@voyantjs/db": "0.75.7",
66
- "@voyantjs/hono": "0.75.7",
67
- "@voyantjs/products": "0.75.7",
68
- "@voyantjs/utils": "0.75.7",
69
- "@voyantjs/storage": "0.75.7"
62
+ "@voyantjs/action-ledger": "0.76.0",
63
+ "@voyantjs/bookings": "0.76.0",
64
+ "@voyantjs/core": "0.76.0",
65
+ "@voyantjs/db": "0.76.0",
66
+ "@voyantjs/hono": "0.76.0",
67
+ "@voyantjs/products": "0.76.0",
68
+ "@voyantjs/utils": "0.76.0",
69
+ "@voyantjs/storage": "0.76.0"
70
70
  },
71
71
  "devDependencies": {
72
72
  "typescript": "^6.0.2",