@voyantjs/finance 0.2.0 → 0.3.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,219 @@
1
+ import { z } from "zod";
2
+ import { commissionModelSchema, commissionRecipientTypeSchema, commissionStatusSchema, creditNoteStatusSchema, invoiceStatusSchema, paginationSchema, taxScopeSchema, } from "./validation-shared.js";
3
+ const bookingItemTaxLineCoreSchema = z.object({
4
+ code: z.string().max(100).optional().nullable(),
5
+ name: z.string().min(1).max(255),
6
+ jurisdiction: z.string().max(255).optional().nullable(),
7
+ scope: taxScopeSchema.default("excluded"),
8
+ currency: z.string().min(3).max(3),
9
+ amountCents: z.number().int(),
10
+ rateBasisPoints: z.number().int().min(0).optional().nullable(),
11
+ includedInPrice: z.boolean().default(false),
12
+ remittanceParty: z.string().max(255).optional().nullable(),
13
+ sortOrder: z.number().int().min(0).default(0),
14
+ });
15
+ export const insertBookingItemTaxLineSchema = bookingItemTaxLineCoreSchema;
16
+ export const updateBookingItemTaxLineSchema = bookingItemTaxLineCoreSchema.partial();
17
+ const bookingItemCommissionCoreSchema = z.object({
18
+ channelId: z.string().optional().nullable(),
19
+ recipientType: commissionRecipientTypeSchema,
20
+ commissionModel: commissionModelSchema.default("percentage"),
21
+ currency: z.string().min(3).max(3).optional().nullable(),
22
+ amountCents: z.number().int().optional().nullable(),
23
+ rateBasisPoints: z.number().int().min(0).optional().nullable(),
24
+ status: commissionStatusSchema.default("pending"),
25
+ payableAt: z.string().optional().nullable(),
26
+ paidAt: z.string().optional().nullable(),
27
+ notes: z.string().optional().nullable(),
28
+ });
29
+ export const insertBookingItemCommissionSchema = bookingItemCommissionCoreSchema;
30
+ export const updateBookingItemCommissionSchema = bookingItemCommissionCoreSchema.partial();
31
+ const invoiceCoreSchema = z.object({
32
+ invoiceNumber: z.string().min(1).max(50),
33
+ bookingId: z.string().min(1),
34
+ personId: z.string().optional().nullable(),
35
+ organizationId: z.string().optional().nullable(),
36
+ status: invoiceStatusSchema.default("draft"),
37
+ currency: z.string().min(3).max(3),
38
+ baseCurrency: z.string().min(3).max(3).optional().nullable(),
39
+ fxRateSetId: z.string().optional().nullable(),
40
+ subtotalCents: z.number().int().min(0).default(0),
41
+ baseSubtotalCents: z.number().int().min(0).optional().nullable(),
42
+ taxCents: z.number().int().min(0).default(0),
43
+ baseTaxCents: z.number().int().min(0).optional().nullable(),
44
+ totalCents: z.number().int().min(0).default(0),
45
+ baseTotalCents: z.number().int().min(0).optional().nullable(),
46
+ paidCents: z.number().int().min(0).default(0),
47
+ basePaidCents: z.number().int().min(0).optional().nullable(),
48
+ balanceDueCents: z.number().int().min(0).default(0),
49
+ baseBalanceDueCents: z.number().int().min(0).optional().nullable(),
50
+ commissionPercent: z.number().int().min(0).max(100).optional().nullable(),
51
+ commissionAmountCents: z.number().int().min(0).optional().nullable(),
52
+ issueDate: z.string().min(1),
53
+ dueDate: z.string().min(1),
54
+ notes: z.string().optional().nullable(),
55
+ });
56
+ export const insertInvoiceSchema = invoiceCoreSchema;
57
+ export const updateInvoiceSchema = invoiceCoreSchema.partial();
58
+ export const invoiceListQuerySchema = z.object({
59
+ status: invoiceStatusSchema.optional(),
60
+ bookingId: z.string().optional(),
61
+ search: z.string().optional(),
62
+ limit: z.coerce.number().int().min(1).max(100).default(50),
63
+ offset: z.coerce.number().int().min(0).default(0),
64
+ });
65
+ export const invoiceFromBookingSchema = z.object({
66
+ bookingId: z.string().min(1),
67
+ invoiceNumber: z.string().min(1).max(50),
68
+ issueDate: z.string().min(1),
69
+ dueDate: z.string().min(1),
70
+ notes: z.string().optional().nullable(),
71
+ });
72
+ const lineItemCoreSchema = z.object({
73
+ bookingItemId: z.string().optional().nullable(),
74
+ description: z.string().min(1).max(1000),
75
+ quantity: z.number().int().min(1).default(1),
76
+ unitPriceCents: z.number().int().min(0),
77
+ totalCents: z.number().int().min(0),
78
+ taxRate: z.number().int().min(0).optional().nullable(),
79
+ sortOrder: z.number().int().min(0).default(0),
80
+ });
81
+ export const insertInvoiceLineItemSchema = lineItemCoreSchema;
82
+ export const updateInvoiceLineItemSchema = lineItemCoreSchema.partial();
83
+ const creditNoteCoreSchema = z.object({
84
+ creditNoteNumber: z.string().min(1).max(50),
85
+ status: creditNoteStatusSchema.default("draft"),
86
+ amountCents: z.number().int().min(1),
87
+ currency: z.string().min(3).max(3),
88
+ baseCurrency: z.string().min(3).max(3).optional().nullable(),
89
+ baseAmountCents: z.number().int().min(0).optional().nullable(),
90
+ fxRateSetId: z.string().optional().nullable(),
91
+ reason: z.string().min(1).max(1000),
92
+ notes: z.string().optional().nullable(),
93
+ });
94
+ export const insertCreditNoteSchema = creditNoteCoreSchema;
95
+ export const updateCreditNoteSchema = creditNoteCoreSchema.partial();
96
+ const creditNoteLineItemCoreSchema = z.object({
97
+ description: z.string().min(1).max(1000),
98
+ quantity: z.number().int().min(1).default(1),
99
+ unitPriceCents: z.number().int().min(0),
100
+ totalCents: z.number().int().min(0),
101
+ sortOrder: z.number().int().min(0).default(0),
102
+ });
103
+ export const insertCreditNoteLineItemSchema = creditNoteLineItemCoreSchema;
104
+ export const updateCreditNoteLineItemSchema = creditNoteLineItemCoreSchema.partial();
105
+ export const insertFinanceNoteSchema = z.object({
106
+ content: z.string().min(1).max(10000),
107
+ });
108
+ export const revenueReportQuerySchema = z.object({ from: z.string().min(1), to: z.string().min(1) });
109
+ export const agingReportQuerySchema = z.object({ asOf: z.string().optional() });
110
+ export const profitabilityQuerySchema = z.object({
111
+ from: z.string().optional(),
112
+ to: z.string().optional(),
113
+ });
114
+ const invoiceNumberResetStrategySchema = z.enum(["never", "annual", "monthly"]);
115
+ const invoiceNumberSeriesScopeSchema = z.enum(["invoice", "proforma", "credit_note"]);
116
+ const invoiceNumberSeriesCoreSchema = z.object({
117
+ code: z.string().min(1).max(100),
118
+ name: z.string().min(1).max(255),
119
+ prefix: z.string().max(50).default(""),
120
+ separator: z.string().max(10).default(""),
121
+ padLength: z.number().int().min(0).max(20).default(4),
122
+ currentSequence: z.number().int().min(0).default(0),
123
+ resetStrategy: invoiceNumberResetStrategySchema.default("never"),
124
+ resetAt: z.string().optional().nullable(),
125
+ scope: invoiceNumberSeriesScopeSchema.default("invoice"),
126
+ active: z.boolean().default(true),
127
+ });
128
+ export const insertInvoiceNumberSeriesSchema = invoiceNumberSeriesCoreSchema;
129
+ export const updateInvoiceNumberSeriesSchema = invoiceNumberSeriesCoreSchema.partial();
130
+ export const invoiceNumberSeriesListQuerySchema = paginationSchema.extend({
131
+ scope: invoiceNumberSeriesScopeSchema.optional(),
132
+ active: z.coerce.boolean().optional(),
133
+ });
134
+ export const allocateInvoiceNumberInputSchema = z.object({ seriesId: z.string().min(1) });
135
+ const invoiceTemplateBodyFormatSchema = z.enum(["html", "markdown", "lexical_json"]);
136
+ const invoiceTemplateCoreSchema = z.object({
137
+ name: z.string().min(1).max(255),
138
+ slug: z
139
+ .string()
140
+ .min(1)
141
+ .max(100)
142
+ .regex(/^[a-z0-9-]+$/, "slug must be kebab-case"),
143
+ language: z.string().min(2).max(10).default("en"),
144
+ jurisdiction: z.string().max(10).optional().nullable(),
145
+ bodyFormat: invoiceTemplateBodyFormatSchema.default("html"),
146
+ body: z.string().min(1),
147
+ cssStyles: z.string().optional().nullable(),
148
+ isDefault: z.boolean().default(false),
149
+ active: z.boolean().default(true),
150
+ metadata: z.record(z.string(), z.unknown()).optional().nullable(),
151
+ });
152
+ export const insertInvoiceTemplateSchema = invoiceTemplateCoreSchema;
153
+ export const updateInvoiceTemplateSchema = invoiceTemplateCoreSchema.partial();
154
+ export const invoiceTemplateListQuerySchema = paginationSchema.extend({
155
+ language: z.string().optional(),
156
+ jurisdiction: z.string().optional(),
157
+ active: z.coerce.boolean().optional(),
158
+ search: z.string().optional(),
159
+ });
160
+ const invoiceRenditionFormatSchema = z.enum(["html", "pdf", "xml", "json"]);
161
+ const invoiceRenditionStatusSchema = z.enum(["pending", "ready", "failed", "stale"]);
162
+ const invoiceRenditionCoreSchema = z.object({
163
+ templateId: z.string().optional().nullable(),
164
+ format: invoiceRenditionFormatSchema.default("pdf"),
165
+ status: invoiceRenditionStatusSchema.default("pending"),
166
+ storageKey: z.string().optional().nullable(),
167
+ fileSize: z.number().int().min(0).optional().nullable(),
168
+ checksum: z.string().optional().nullable(),
169
+ language: z.string().optional().nullable(),
170
+ errorMessage: z.string().optional().nullable(),
171
+ generatedAt: z.string().optional().nullable(),
172
+ metadata: z.record(z.string(), z.unknown()).optional().nullable(),
173
+ });
174
+ export const insertInvoiceRenditionSchema = invoiceRenditionCoreSchema;
175
+ export const updateInvoiceRenditionSchema = invoiceRenditionCoreSchema.partial();
176
+ const taxRegimeCodeSchema = z.enum([
177
+ "standard",
178
+ "reduced",
179
+ "exempt",
180
+ "reverse_charge",
181
+ "margin_scheme_art311",
182
+ "zero_rated",
183
+ "out_of_scope",
184
+ "other",
185
+ ]);
186
+ const taxRegimeCoreSchema = z.object({
187
+ code: taxRegimeCodeSchema,
188
+ name: z.string().min(1).max(255),
189
+ jurisdiction: z.string().max(10).optional().nullable(),
190
+ ratePercent: z.number().int().min(0).max(10000).optional().nullable(),
191
+ description: z.string().max(2000).optional().nullable(),
192
+ legalReference: z.string().max(500).optional().nullable(),
193
+ active: z.boolean().default(true),
194
+ metadata: z.record(z.string(), z.unknown()).optional().nullable(),
195
+ });
196
+ export const insertTaxRegimeSchema = taxRegimeCoreSchema;
197
+ export const updateTaxRegimeSchema = taxRegimeCoreSchema.partial();
198
+ export const taxRegimeListQuerySchema = paginationSchema.extend({
199
+ code: taxRegimeCodeSchema.optional(),
200
+ jurisdiction: z.string().optional(),
201
+ active: z.coerce.boolean().optional(),
202
+ });
203
+ const invoiceExternalRefCoreSchema = z.object({
204
+ provider: z.string().min(1).max(100),
205
+ externalId: z.string().max(255).optional().nullable(),
206
+ externalNumber: z.string().max(255).optional().nullable(),
207
+ externalUrl: z.string().max(1000).optional().nullable(),
208
+ status: z.string().max(100).optional().nullable(),
209
+ metadata: z.record(z.string(), z.unknown()).optional().nullable(),
210
+ syncedAt: z.string().optional().nullable(),
211
+ syncError: z.string().optional().nullable(),
212
+ });
213
+ export const insertInvoiceExternalRefSchema = invoiceExternalRefCoreSchema;
214
+ export const updateInvoiceExternalRefSchema = invoiceExternalRefCoreSchema.partial();
215
+ export const renderInvoiceInputSchema = z.object({
216
+ templateId: z.string().optional().nullable(),
217
+ format: invoiceRenditionFormatSchema.default("pdf"),
218
+ language: z.string().optional().nullable(),
219
+ });