@getpeppr/sdk 0.1.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,530 @@
1
+ /**
2
+ * UBL XML Builder
3
+ *
4
+ * Converts our clean JSON invoice format to Peppol BIS 3.0 compliant UBL 2.1 XML.
5
+ * This is the core abstraction that hides XML complexity from developers.
6
+ *
7
+ * Reference: https://docs.peppol.eu/poacc/billing/3.0/
8
+ */
9
+ const UBL_NS = "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2";
10
+ const CAC_NS = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2";
11
+ const CBC_NS = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2";
12
+ const CREDIT_NOTE_NS = "urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2";
13
+ // Peppol BIS 3.0 customization and profile IDs
14
+ const PEPPOL_CUSTOMIZATION_ID = "urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0";
15
+ const PEPPOL_PROFILE_ID = "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0";
16
+ /** Default unit of measure */
17
+ const DEFAULT_UNIT = "EA";
18
+ /** Default payment means code (30 = credit transfer) */
19
+ const DEFAULT_PAYMENT_MEANS = 30;
20
+ /** Map human-readable unit names to UN/ECE Recommendation 20 codes */
21
+ const UNIT_CODE_MAP = {
22
+ each: "EA", piece: "EA", pieces: "EA",
23
+ hour: "HUR", hours: "HUR",
24
+ day: "DAY", days: "DAY",
25
+ week: "WEE", weeks: "WEE",
26
+ month: "MON", months: "MON",
27
+ year: "ANN", years: "ANN",
28
+ kilogram: "KGM", kg: "KGM",
29
+ meter: "MTR", metre: "MTR",
30
+ liter: "LTR", litre: "LTR",
31
+ unit: "C62", units: "C62",
32
+ set: "SET", sets: "SET",
33
+ pack: "PK", packs: "PK",
34
+ };
35
+ /**
36
+ * Resolve a human-readable unit name to its UN/ECE Recommendation 20 code.
37
+ * If already a valid UBL code (2-3 uppercase chars) or unknown, passes through unchanged.
38
+ */
39
+ function resolveUnitCode(unit) {
40
+ return UNIT_CODE_MAP[unit.toLowerCase()] ?? unit;
41
+ }
42
+ function escapeXml(str) {
43
+ return str
44
+ .replace(/&/g, "&")
45
+ .replace(/</g, "&lt;")
46
+ .replace(/>/g, "&gt;")
47
+ .replace(/"/g, "&quot;")
48
+ .replace(/'/g, "&apos;");
49
+ }
50
+ function formatDate(dateStr) {
51
+ if (!dateStr) {
52
+ return new Date().toISOString().split("T")[0];
53
+ }
54
+ // Accept ISO 8601 date or datetime
55
+ return dateStr.split("T")[0];
56
+ }
57
+ function formatAmount(amount) {
58
+ return amount.toFixed(2);
59
+ }
60
+ function parsePeppolId(peppolId) {
61
+ const scheme = peppolId.split(":")[0];
62
+ const id = peppolId.split(":").slice(1).join(":");
63
+ return { scheme, id };
64
+ }
65
+ function buildPartyXml(party, role) {
66
+ const { scheme: endpointScheme, id: endpointId } = parsePeppolId(party.peppolId);
67
+ return `
68
+ <cac:${role}>
69
+ <cac:Party>
70
+ <cbc:EndpointID schemeID="${escapeXml(endpointScheme)}">${escapeXml(endpointId)}</cbc:EndpointID>
71
+ <cac:PartyIdentification>
72
+ <cbc:ID schemeID="${escapeXml(endpointScheme)}">${escapeXml(endpointId)}</cbc:ID>
73
+ </cac:PartyIdentification>
74
+ <cac:PartyName>
75
+ <cbc:Name>${escapeXml(party.name)}</cbc:Name>
76
+ </cac:PartyName>
77
+ <cac:PostalAddress>
78
+ ${party.street ? `<cbc:StreetName>${escapeXml(party.street)}</cbc:StreetName>` : ""}
79
+ ${party.city ? `<cbc:CityName>${escapeXml(party.city)}</cbc:CityName>` : ""}
80
+ ${party.postalCode ? `<cbc:PostalZone>${escapeXml(party.postalCode)}</cbc:PostalZone>` : ""}
81
+ <cac:Country>
82
+ <cbc:IdentificationCode>${escapeXml(party.country)}</cbc:IdentificationCode>
83
+ </cac:Country>
84
+ </cac:PostalAddress>
85
+ ${party.vatNumber
86
+ ? `<cac:PartyTaxScheme>
87
+ <cbc:CompanyID>${escapeXml(party.vatNumber)}</cbc:CompanyID>
88
+ <cac:TaxScheme>
89
+ <cbc:ID>VAT</cbc:ID>
90
+ </cac:TaxScheme>
91
+ </cac:PartyTaxScheme>`
92
+ : ""}
93
+ <cac:PartyLegalEntity>
94
+ <cbc:RegistrationName>${escapeXml(party.name)}</cbc:RegistrationName>
95
+ ${party.companyId ? `<cbc:CompanyID>${escapeXml(party.companyId)}</cbc:CompanyID>` : ""}
96
+ </cac:PartyLegalEntity>
97
+ ${(party.contactName || party.phone || party.email)
98
+ ? `<cac:Contact>
99
+ ${party.contactName ? `<cbc:Name>${escapeXml(party.contactName)}</cbc:Name>` : ""}
100
+ ${party.phone ? `<cbc:Telephone>${escapeXml(party.phone)}</cbc:Telephone>` : ""}
101
+ ${party.email ? `<cbc:ElectronicMail>${escapeXml(party.email)}</cbc:ElectronicMail>` : ""}
102
+ </cac:Contact>`
103
+ : ""}
104
+ </cac:Party>
105
+ </cac:${role}>`;
106
+ }
107
+ function buildPayeePartyXml(party) {
108
+ const { scheme, id } = parsePeppolId(party.peppolId);
109
+ return `
110
+ <cac:PayeeParty>
111
+ <cac:PartyIdentification>
112
+ <cbc:ID schemeID="${escapeXml(scheme)}">${escapeXml(id)}</cbc:ID>
113
+ </cac:PartyIdentification>
114
+ <cac:PartyName>
115
+ <cbc:Name>${escapeXml(party.name)}</cbc:Name>
116
+ </cac:PartyName>
117
+ ${party.companyId
118
+ ? `<cac:PartyLegalEntity>
119
+ <cbc:RegistrationName>${escapeXml(party.name)}</cbc:RegistrationName>
120
+ <cbc:CompanyID>${escapeXml(party.companyId)}</cbc:CompanyID>
121
+ </cac:PartyLegalEntity>`
122
+ : ""}
123
+ </cac:PayeeParty>`;
124
+ }
125
+ function buildTaxRepresentativePartyXml(party) {
126
+ const parts = [
127
+ " <cac:TaxRepresentativeParty>",
128
+ " <cac:PartyName>",
129
+ ` <cbc:Name>${escapeXml(party.name)}</cbc:Name>`,
130
+ " </cac:PartyName>",
131
+ ];
132
+ // PostalAddress
133
+ parts.push(" <cac:PostalAddress>");
134
+ if (party.street) {
135
+ parts.push(` <cbc:StreetName>${escapeXml(party.street)}</cbc:StreetName>`);
136
+ }
137
+ if (party.city) {
138
+ parts.push(` <cbc:CityName>${escapeXml(party.city)}</cbc:CityName>`);
139
+ }
140
+ if (party.postalCode) {
141
+ parts.push(` <cbc:PostalZone>${escapeXml(party.postalCode)}</cbc:PostalZone>`);
142
+ }
143
+ parts.push(" <cac:Country>");
144
+ parts.push(` <cbc:IdentificationCode>${escapeXml(party.country)}</cbc:IdentificationCode>`);
145
+ parts.push(" </cac:Country>");
146
+ parts.push(" </cac:PostalAddress>");
147
+ // PartyTaxScheme (vatNumber → CompanyID)
148
+ if (party.vatNumber) {
149
+ parts.push(" <cac:PartyTaxScheme>");
150
+ parts.push(` <cbc:CompanyID>${escapeXml(party.vatNumber)}</cbc:CompanyID>`);
151
+ parts.push(" <cac:TaxScheme>");
152
+ parts.push(" <cbc:ID>VAT</cbc:ID>");
153
+ parts.push(" </cac:TaxScheme>");
154
+ parts.push(" </cac:PartyTaxScheme>");
155
+ }
156
+ parts.push(" </cac:TaxRepresentativeParty>");
157
+ return parts.join("\n");
158
+ }
159
+ function buildAttachmentXml(attachment) {
160
+ const parts = [
161
+ "<cac:AdditionalDocumentReference>",
162
+ ` <cbc:ID>${escapeXml(attachment.id)}</cbc:ID>`,
163
+ ];
164
+ if (attachment.description) {
165
+ parts.push(` <cbc:DocumentDescription>${escapeXml(attachment.description)}</cbc:DocumentDescription>`);
166
+ }
167
+ if (attachment.content || attachment.url) {
168
+ parts.push(" <cac:Attachment>");
169
+ if (attachment.content && attachment.mimeType && attachment.filename) {
170
+ parts.push(` <cbc:EmbeddedDocumentBinaryObject mimeCode="${escapeXml(attachment.mimeType)}" filename="${escapeXml(attachment.filename)}">${attachment.content}</cbc:EmbeddedDocumentBinaryObject>`);
171
+ }
172
+ else if (attachment.url) {
173
+ parts.push(` <cac:ExternalReference>\n <cbc:URI>${escapeXml(attachment.url)}</cbc:URI>\n </cac:ExternalReference>`);
174
+ }
175
+ parts.push(" </cac:Attachment>");
176
+ }
177
+ parts.push("</cac:AdditionalDocumentReference>");
178
+ return parts.join("\n ");
179
+ }
180
+ function buildInvoicePeriodXml(period) {
181
+ const parts = ["<cac:InvoicePeriod>"];
182
+ if (period.startDate) {
183
+ parts.push(` <cbc:StartDate>${formatDate(period.startDate)}</cbc:StartDate>`);
184
+ }
185
+ if (period.endDate) {
186
+ parts.push(` <cbc:EndDate>${formatDate(period.endDate)}</cbc:EndDate>`);
187
+ }
188
+ parts.push("</cac:InvoicePeriod>");
189
+ return parts.join("\n ");
190
+ }
191
+ function buildDeliveryXml(delivery) {
192
+ const parts = ["<cac:Delivery>"];
193
+ if (delivery.date) {
194
+ parts.push(` <cbc:ActualDeliveryDate>${formatDate(delivery.date)}</cbc:ActualDeliveryDate>`);
195
+ }
196
+ if (delivery.locationId || delivery.address) {
197
+ parts.push(" <cac:DeliveryLocation>");
198
+ if (delivery.locationId) {
199
+ parts.push(` <cbc:ID>${escapeXml(delivery.locationId)}</cbc:ID>`);
200
+ }
201
+ if (delivery.address) {
202
+ parts.push(" <cac:Address>");
203
+ if (delivery.address.street) {
204
+ parts.push(` <cbc:StreetName>${escapeXml(delivery.address.street)}</cbc:StreetName>`);
205
+ }
206
+ if (delivery.address.city) {
207
+ parts.push(` <cbc:CityName>${escapeXml(delivery.address.city)}</cbc:CityName>`);
208
+ }
209
+ if (delivery.address.postalCode) {
210
+ parts.push(` <cbc:PostalZone>${escapeXml(delivery.address.postalCode)}</cbc:PostalZone>`);
211
+ }
212
+ parts.push(` <cac:Country>\n <cbc:IdentificationCode>${escapeXml(delivery.address.country)}</cbc:IdentificationCode>\n </cac:Country>`);
213
+ parts.push(" </cac:Address>");
214
+ }
215
+ parts.push(" </cac:DeliveryLocation>");
216
+ }
217
+ parts.push("</cac:Delivery>");
218
+ return parts.join("\n ");
219
+ }
220
+ function buildDocumentAllowanceChargeXml(item, isCharge, currency) {
221
+ const vatCategory = item.vatCategory ?? "S";
222
+ return `
223
+ <cac:AllowanceCharge>
224
+ <cbc:ChargeIndicator>${isCharge}</cbc:ChargeIndicator>
225
+ <cbc:AllowanceChargeReason>${escapeXml(item.reason)}</cbc:AllowanceChargeReason>
226
+ <cbc:Amount currencyID="${escapeXml(currency)}">${formatAmount(item.amount)}</cbc:Amount>
227
+ <cac:TaxCategory>
228
+ <cbc:ID>${vatCategory}</cbc:ID>
229
+ <cbc:Percent>${item.vatRate}</cbc:Percent>
230
+ <cac:TaxScheme>
231
+ <cbc:ID>VAT</cbc:ID>
232
+ </cac:TaxScheme>
233
+ </cac:TaxCategory>
234
+ </cac:AllowanceCharge>`;
235
+ }
236
+ function buildLineAllowanceChargeXml(reason, amount, isCharge, currency) {
237
+ return `
238
+ <cac:AllowanceCharge>
239
+ <cbc:ChargeIndicator>${isCharge}</cbc:ChargeIndicator>
240
+ <cbc:AllowanceChargeReason>${escapeXml(reason)}</cbc:AllowanceChargeReason>
241
+ <cbc:Amount currencyID="${escapeXml(currency)}">${formatAmount(amount)}</cbc:Amount>
242
+ </cac:AllowanceCharge>`;
243
+ }
244
+ function calculateLineExtensionAmount(line) {
245
+ const base = line.quantity * line.unitPrice;
246
+ const lineAllowances = (line.allowances ?? []).reduce((sum, a) => sum + a.amount, 0);
247
+ const lineCharges = (line.charges ?? []).reduce((sum, c) => sum + c.amount, 0);
248
+ return base - lineAllowances + lineCharges;
249
+ }
250
+ function buildDocumentLineXml(line, index, currency, lineTag, qtyTag) {
251
+ const lineTotal = calculateLineExtensionAmount(line);
252
+ const unit = resolveUnitCode(line.unit ?? DEFAULT_UNIT);
253
+ const vatCategory = line.vatCategory ?? "S";
254
+ const lineAllowancesXml = (line.allowances ?? [])
255
+ .map((a) => buildLineAllowanceChargeXml(a.reason, a.amount, false, currency))
256
+ .join("");
257
+ const lineChargesXml = (line.charges ?? [])
258
+ .map((c) => buildLineAllowanceChargeXml(c.reason, c.amount, true, currency))
259
+ .join("");
260
+ return `
261
+ <cac:${lineTag}>
262
+ <cbc:ID>${index + 1}</cbc:ID>
263
+ ${line.accountingCost ? `<cbc:AccountingCost>${escapeXml(line.accountingCost)}</cbc:AccountingCost>` : ""}
264
+ <cbc:${qtyTag} unitCode="${escapeXml(unit)}">${line.quantity}</cbc:${qtyTag}>
265
+ <cbc:LineExtensionAmount currencyID="${escapeXml(currency)}">${formatAmount(lineTotal)}</cbc:LineExtensionAmount>
266
+ ${lineAllowancesXml}${lineChargesXml}
267
+ <cac:Item>
268
+ <cbc:Name>${escapeXml(line.description)}</cbc:Name>
269
+ ${line.itemId
270
+ ? `<cac:SellersItemIdentification>
271
+ <cbc:ID>${escapeXml(line.itemId)}</cbc:ID>
272
+ </cac:SellersItemIdentification>`
273
+ : ""}
274
+ <cac:ClassifiedTaxCategory>
275
+ <cbc:ID>${vatCategory}</cbc:ID>
276
+ <cbc:Percent>${line.vatRate}</cbc:Percent>
277
+ <cac:TaxScheme>
278
+ <cbc:ID>VAT</cbc:ID>
279
+ </cac:TaxScheme>
280
+ </cac:ClassifiedTaxCategory>
281
+ ${line.standardItemId
282
+ ? `<cac:StandardItemIdentification>
283
+ <cbc:ID schemeID="${escapeXml(line.standardItemScheme ?? "0160")}">${escapeXml(line.standardItemId)}</cbc:ID>
284
+ </cac:StandardItemIdentification>`
285
+ : ""}
286
+ ${line.commodityCode && line.commodityScheme
287
+ ? `<cac:CommodityClassification>
288
+ <cbc:ItemClassificationCode listID="${escapeXml(line.commodityScheme)}">${escapeXml(line.commodityCode)}</cbc:ItemClassificationCode>
289
+ </cac:CommodityClassification>`
290
+ : ""}
291
+ ${(line.properties ?? []).map((p) => `<cac:AdditionalItemProperty>
292
+ <cbc:Name>${escapeXml(p.name)}</cbc:Name>
293
+ <cbc:Value>${escapeXml(p.value)}</cbc:Value>
294
+ </cac:AdditionalItemProperty>`).join("\n ")}
295
+ </cac:Item>
296
+ <cac:Price>
297
+ <cbc:PriceAmount currencyID="${escapeXml(currency)}">${formatAmount(line.unitPrice)}</cbc:PriceAmount>
298
+ ${line.baseQuantity != null ? `<cbc:BaseQuantity unitCode="${escapeXml(resolveUnitCode(line.baseQuantityUnit ?? line.unit ?? DEFAULT_UNIT))}">${line.baseQuantity}</cbc:BaseQuantity>` : ""}
299
+ </cac:Price>
300
+ </cac:${lineTag}>`;
301
+ }
302
+ function buildInvoiceLineXml(line, index, currency) {
303
+ return buildDocumentLineXml(line, index, currency, "InvoiceLine", "InvoicedQuantity");
304
+ }
305
+ function calculateTaxSubtotals(lines, allowances, charges) {
306
+ const groups = new Map();
307
+ function addToGroup(vatCategory, vatRate, amount) {
308
+ const key = `${vatCategory}-${vatRate}`;
309
+ const existing = groups.get(key);
310
+ if (existing) {
311
+ existing.taxableAmount += amount;
312
+ existing.taxAmount += amount * (vatRate / 100);
313
+ }
314
+ else {
315
+ groups.set(key, {
316
+ vatRate,
317
+ vatCategory,
318
+ taxableAmount: amount,
319
+ taxAmount: amount * (vatRate / 100),
320
+ });
321
+ }
322
+ }
323
+ for (const line of lines) {
324
+ addToGroup(line.vatCategory ?? "S", line.vatRate, calculateLineExtensionAmount(line));
325
+ }
326
+ for (const a of allowances ?? []) {
327
+ addToGroup(a.vatCategory ?? "S", a.vatRate, -a.amount);
328
+ }
329
+ for (const c of charges ?? []) {
330
+ addToGroup(c.vatCategory ?? "S", c.vatRate, c.amount);
331
+ }
332
+ return Array.from(groups.values());
333
+ }
334
+ function calculateDocumentTotals(lines, allowances, charges) {
335
+ const taxSubtotals = calculateTaxSubtotals(lines, allowances, charges);
336
+ const lineExtensionAmount = lines.reduce((sum, line) => sum + calculateLineExtensionAmount(line), 0);
337
+ const allowanceTotalAmount = (allowances ?? []).reduce((sum, a) => sum + a.amount, 0);
338
+ const chargeTotalAmount = (charges ?? []).reduce((sum, c) => sum + c.amount, 0);
339
+ const taxExclusiveAmount = lineExtensionAmount - allowanceTotalAmount + chargeTotalAmount;
340
+ const totalTax = taxSubtotals.reduce((sum, st) => sum + st.taxAmount, 0);
341
+ const taxInclusiveAmount = taxExclusiveAmount + totalTax;
342
+ return {
343
+ lineExtensionAmount,
344
+ allowanceTotalAmount,
345
+ chargeTotalAmount,
346
+ taxExclusiveAmount,
347
+ totalTax,
348
+ taxInclusiveAmount,
349
+ payableAmount: taxInclusiveAmount,
350
+ taxSubtotals,
351
+ };
352
+ }
353
+ function buildTaxTotalXml(taxSubtotals, totalTax, currency) {
354
+ const subtotalsXml = taxSubtotals
355
+ .map((st) => `
356
+ <cac:TaxSubtotal>
357
+ <cbc:TaxableAmount currencyID="${escapeXml(currency)}">${formatAmount(st.taxableAmount)}</cbc:TaxableAmount>
358
+ <cbc:TaxAmount currencyID="${escapeXml(currency)}">${formatAmount(st.taxAmount)}</cbc:TaxAmount>
359
+ <cac:TaxCategory>
360
+ <cbc:ID>${st.vatCategory}</cbc:ID>
361
+ <cbc:Percent>${st.vatRate}</cbc:Percent>
362
+ <cac:TaxScheme>
363
+ <cbc:ID>VAT</cbc:ID>
364
+ </cac:TaxScheme>
365
+ </cac:TaxCategory>
366
+ </cac:TaxSubtotal>`)
367
+ .join("");
368
+ return `<cac:TaxTotal>
369
+ <cbc:TaxAmount currencyID="${escapeXml(currency)}">${formatAmount(totalTax)}</cbc:TaxAmount>
370
+ ${subtotalsXml}
371
+ </cac:TaxTotal>`;
372
+ }
373
+ function buildTaxCurrencyTotalXml(totalTax, taxCurrency, rate) {
374
+ const convertedAmount = Math.round(totalTax * rate * 100) / 100;
375
+ return `<cac:TaxTotal>
376
+ <cbc:TaxAmount currencyID="${escapeXml(taxCurrency)}">${formatAmount(convertedAmount)}</cbc:TaxAmount>
377
+ </cac:TaxTotal>`;
378
+ }
379
+ function buildLegalMonetaryTotalXml(totals, currency, options) {
380
+ const prepaid = options?.prepaidAmount;
381
+ const rounding = options?.roundingAmount;
382
+ const payableAmount = totals.taxInclusiveAmount - (prepaid ?? 0) + (rounding ?? 0);
383
+ return `<cac:LegalMonetaryTotal>
384
+ <cbc:LineExtensionAmount currencyID="${escapeXml(currency)}">${formatAmount(totals.lineExtensionAmount)}</cbc:LineExtensionAmount>
385
+ <cbc:TaxExclusiveAmount currencyID="${escapeXml(currency)}">${formatAmount(totals.taxExclusiveAmount)}</cbc:TaxExclusiveAmount>
386
+ <cbc:TaxInclusiveAmount currencyID="${escapeXml(currency)}">${formatAmount(totals.taxInclusiveAmount)}</cbc:TaxInclusiveAmount>
387
+ ${totals.allowanceTotalAmount > 0 ? `<cbc:AllowanceTotalAmount currencyID="${escapeXml(currency)}">${formatAmount(totals.allowanceTotalAmount)}</cbc:AllowanceTotalAmount>` : ""}
388
+ ${totals.chargeTotalAmount > 0 ? `<cbc:ChargeTotalAmount currencyID="${escapeXml(currency)}">${formatAmount(totals.chargeTotalAmount)}</cbc:ChargeTotalAmount>` : ""}
389
+ ${prepaid != null ? `<cbc:PrepaidAmount currencyID="${escapeXml(currency)}">${formatAmount(prepaid)}</cbc:PrepaidAmount>` : ""}
390
+ ${rounding != null ? `<cbc:PayableRoundingAmount currencyID="${escapeXml(currency)}">${formatAmount(rounding)}</cbc:PayableRoundingAmount>` : ""}
391
+ <cbc:PayableAmount currencyID="${escapeXml(currency)}">${formatAmount(payableAmount)}</cbc:PayableAmount>
392
+ </cac:LegalMonetaryTotal>`;
393
+ }
394
+ function buildPaymentMeansXml(input) {
395
+ const paymentMeans = input.paymentMeans ?? DEFAULT_PAYMENT_MEANS;
396
+ return `<cac:PaymentMeans>
397
+ <cbc:PaymentMeansCode>${paymentMeans}</cbc:PaymentMeansCode>
398
+ ${input.paymentReference ? `<cbc:PaymentID>${escapeXml(input.paymentReference)}</cbc:PaymentID>` : ""}
399
+ ${input.paymentIban
400
+ ? `<cac:PayeeFinancialAccount>
401
+ <cbc:ID>${escapeXml(input.paymentIban)}</cbc:ID>
402
+ ${input.paymentBic
403
+ ? `<cac:FinancialInstitutionBranch>
404
+ <cbc:ID>${escapeXml(input.paymentBic)}</cbc:ID>
405
+ </cac:FinancialInstitutionBranch>`
406
+ : ""}
407
+ </cac:PayeeFinancialAccount>`
408
+ : ""}
409
+ </cac:PaymentMeans>`;
410
+ }
411
+ function buildCreditNoteLineXml(line, index, currency) {
412
+ return buildDocumentLineXml(line, index, currency, "CreditNoteLine", "CreditedQuantity");
413
+ }
414
+ function buildOrderReferenceXml(orderReference, salesOrderReference) {
415
+ if (!orderReference && !salesOrderReference)
416
+ return "";
417
+ const parts = ["<cac:OrderReference>"];
418
+ if (orderReference) {
419
+ parts.push(`<cbc:ID>${escapeXml(orderReference)}</cbc:ID>`);
420
+ }
421
+ if (salesOrderReference) {
422
+ parts.push(`<cbc:SalesOrderID>${escapeXml(salesOrderReference)}</cbc:SalesOrderID>`);
423
+ }
424
+ parts.push("</cac:OrderReference>");
425
+ return parts.join("");
426
+ }
427
+ /**
428
+ * Build a Peppol BIS 3.0 compliant UBL 2.1 Invoice XML from a simple JSON input.
429
+ */
430
+ export function buildInvoiceXml(input) {
431
+ const currency = input.currency ?? "EUR";
432
+ const date = formatDate(input.date);
433
+ const dueDate = input.dueDate ? formatDate(input.dueDate) : undefined;
434
+ const hasTaxCurrency = input.taxCurrency && input.taxCurrency !== currency;
435
+ const totals = calculateDocumentTotals(input.lines, input.allowances, input.charges);
436
+ const linesXml = input.lines
437
+ .map((line, i) => buildInvoiceLineXml(line, i, currency))
438
+ .join("");
439
+ return `<?xml version="1.0" encoding="UTF-8"?>
440
+ <Invoice xmlns="${UBL_NS}"
441
+ xmlns:cac="${CAC_NS}"
442
+ xmlns:cbc="${CBC_NS}">
443
+ <cbc:CustomizationID>${PEPPOL_CUSTOMIZATION_ID}</cbc:CustomizationID>
444
+ <cbc:ProfileID>${PEPPOL_PROFILE_ID}</cbc:ProfileID>
445
+ <cbc:ID>${escapeXml(input.number)}</cbc:ID>
446
+ <cbc:IssueDate>${date}</cbc:IssueDate>
447
+ ${dueDate ? `<cbc:DueDate>${dueDate}</cbc:DueDate>` : ""}
448
+ ${input.taxPointDate ? `<cbc:TaxPointDate>${formatDate(input.taxPointDate)}</cbc:TaxPointDate>` : ""}
449
+ <cbc:InvoiceTypeCode>${input.invoiceTypeCode ?? 380}</cbc:InvoiceTypeCode>
450
+ ${input.note ? `<cbc:Note>${escapeXml(input.note)}</cbc:Note>` : ""}
451
+ ${input.accountingCost ? `<cbc:AccountingCost>${escapeXml(input.accountingCost)}</cbc:AccountingCost>` : ""}
452
+ <cbc:DocumentCurrencyCode>${escapeXml(currency)}</cbc:DocumentCurrencyCode>
453
+ ${hasTaxCurrency ? `<cbc:TaxCurrencyCode>${escapeXml(input.taxCurrency)}</cbc:TaxCurrencyCode>` : ""}
454
+ ${input.buyerReference ? `<cbc:BuyerReference>${escapeXml(input.buyerReference)}</cbc:BuyerReference>` : ""}
455
+ ${input.invoicePeriod ? buildInvoicePeriodXml(input.invoicePeriod) : ""}
456
+ ${buildOrderReferenceXml(input.orderReference, input.salesOrderReference)}
457
+ ${input.despatchReference ? `<cac:DespatchDocumentReference><cbc:ID>${escapeXml(input.despatchReference)}</cbc:ID></cac:DespatchDocumentReference>` : ""}
458
+ ${input.receiptReference ? `<cac:ReceiptDocumentReference><cbc:ID>${escapeXml(input.receiptReference)}</cbc:ID></cac:ReceiptDocumentReference>` : ""}
459
+ ${input.contractReference ? `<cac:ContractDocumentReference><cbc:ID>${escapeXml(input.contractReference)}</cbc:ID></cac:ContractDocumentReference>` : ""}
460
+ ${(input.attachments ?? []).map((a) => buildAttachmentXml(a)).join("\n ")}
461
+ ${input.projectReference ? `<cac:ProjectReference><cbc:ID>${escapeXml(input.projectReference)}</cbc:ID></cac:ProjectReference>` : ""}
462
+ ${input.from ? buildPartyXml(input.from, "AccountingSupplierParty") : ""}
463
+ ${buildPartyXml(input.to, "AccountingCustomerParty")}
464
+ ${input.payeeParty ? buildPayeePartyXml(input.payeeParty) : ""}
465
+ ${input.taxRepresentative ? buildTaxRepresentativePartyXml(input.taxRepresentative) : ""}
466
+ ${input.delivery ? buildDeliveryXml(input.delivery) : ""}
467
+ ${buildPaymentMeansXml(input)}
468
+ ${input.paymentTerms ? `<cac:PaymentTerms>\n <cbc:Note>${escapeXml(input.paymentTerms)}</cbc:Note>\n </cac:PaymentTerms>` : ""}
469
+ ${(input.allowances ?? []).map((a) => buildDocumentAllowanceChargeXml(a, false, currency)).join("")}
470
+ ${(input.charges ?? []).map((c) => buildDocumentAllowanceChargeXml(c, true, currency)).join("")}
471
+ ${hasTaxCurrency && input.taxCurrencyRate ? buildTaxCurrencyTotalXml(totals.totalTax, input.taxCurrency, input.taxCurrencyRate) : ""}
472
+ ${buildTaxTotalXml(totals.taxSubtotals, totals.totalTax, currency)}
473
+ ${buildLegalMonetaryTotalXml(totals, currency, { prepaidAmount: input.prepaidAmount, roundingAmount: input.roundingAmount })}
474
+ ${linesXml}
475
+ </Invoice>`;
476
+ }
477
+ /**
478
+ * Build a Peppol BIS 3.0 compliant UBL 2.1 Credit Note XML.
479
+ *
480
+ * Generates XML directly with correct CreditNote elements — no string replacement.
481
+ */
482
+ export function buildCreditNoteXml(input) {
483
+ const currency = input.currency ?? "EUR";
484
+ const date = formatDate(input.date);
485
+ const dueDate = input.dueDate ? formatDate(input.dueDate) : undefined;
486
+ const hasTaxCurrency = input.taxCurrency && input.taxCurrency !== currency;
487
+ const totals = calculateDocumentTotals(input.lines, input.allowances, input.charges);
488
+ const linesXml = input.lines
489
+ .map((line, i) => buildCreditNoteLineXml(line, i, currency))
490
+ .join("");
491
+ return `<?xml version="1.0" encoding="UTF-8"?>
492
+ <CreditNote xmlns="${CREDIT_NOTE_NS}"
493
+ xmlns:cac="${CAC_NS}"
494
+ xmlns:cbc="${CBC_NS}">
495
+ <cbc:CustomizationID>${PEPPOL_CUSTOMIZATION_ID}</cbc:CustomizationID>
496
+ <cbc:ProfileID>${PEPPOL_PROFILE_ID}</cbc:ProfileID>
497
+ <cbc:ID>${escapeXml(input.number)}</cbc:ID>
498
+ <cbc:IssueDate>${date}</cbc:IssueDate>
499
+ ${dueDate ? `<cbc:DueDate>${dueDate}</cbc:DueDate>` : ""}
500
+ ${input.taxPointDate ? `<cbc:TaxPointDate>${formatDate(input.taxPointDate)}</cbc:TaxPointDate>` : ""}
501
+ <cbc:CreditNoteTypeCode>${input.invoiceTypeCode ?? 381}</cbc:CreditNoteTypeCode>
502
+ ${input.note ? `<cbc:Note>${escapeXml(input.note)}</cbc:Note>` : ""}
503
+ ${input.accountingCost ? `<cbc:AccountingCost>${escapeXml(input.accountingCost)}</cbc:AccountingCost>` : ""}
504
+ <cbc:DocumentCurrencyCode>${escapeXml(currency)}</cbc:DocumentCurrencyCode>
505
+ ${hasTaxCurrency ? `<cbc:TaxCurrencyCode>${escapeXml(input.taxCurrency)}</cbc:TaxCurrencyCode>` : ""}
506
+ ${input.buyerReference ? `<cbc:BuyerReference>${escapeXml(input.buyerReference)}</cbc:BuyerReference>` : ""}
507
+ ${input.invoicePeriod ? buildInvoicePeriodXml(input.invoicePeriod) : ""}
508
+ ${buildOrderReferenceXml(input.orderReference, input.salesOrderReference)}
509
+ <cac:BillingReference><cac:InvoiceDocumentReference><cbc:ID>${escapeXml(input.invoiceReference)}</cbc:ID></cac:InvoiceDocumentReference></cac:BillingReference>
510
+ ${input.despatchReference ? `<cac:DespatchDocumentReference><cbc:ID>${escapeXml(input.despatchReference)}</cbc:ID></cac:DespatchDocumentReference>` : ""}
511
+ ${input.receiptReference ? `<cac:ReceiptDocumentReference><cbc:ID>${escapeXml(input.receiptReference)}</cbc:ID></cac:ReceiptDocumentReference>` : ""}
512
+ ${input.contractReference ? `<cac:ContractDocumentReference><cbc:ID>${escapeXml(input.contractReference)}</cbc:ID></cac:ContractDocumentReference>` : ""}
513
+ ${(input.attachments ?? []).map((a) => buildAttachmentXml(a)).join("\n ")}
514
+ ${input.projectReference ? `<cac:ProjectReference><cbc:ID>${escapeXml(input.projectReference)}</cbc:ID></cac:ProjectReference>` : ""}
515
+ ${input.from ? buildPartyXml(input.from, "AccountingSupplierParty") : ""}
516
+ ${buildPartyXml(input.to, "AccountingCustomerParty")}
517
+ ${input.payeeParty ? buildPayeePartyXml(input.payeeParty) : ""}
518
+ ${input.taxRepresentative ? buildTaxRepresentativePartyXml(input.taxRepresentative) : ""}
519
+ ${input.delivery ? buildDeliveryXml(input.delivery) : ""}
520
+ ${buildPaymentMeansXml(input)}
521
+ ${input.paymentTerms ? `<cac:PaymentTerms>\n <cbc:Note>${escapeXml(input.paymentTerms)}</cbc:Note>\n </cac:PaymentTerms>` : ""}
522
+ ${(input.allowances ?? []).map((a) => buildDocumentAllowanceChargeXml(a, false, currency)).join("")}
523
+ ${(input.charges ?? []).map((c) => buildDocumentAllowanceChargeXml(c, true, currency)).join("")}
524
+ ${hasTaxCurrency && input.taxCurrencyRate ? buildTaxCurrencyTotalXml(totals.totalTax, input.taxCurrency, input.taxCurrencyRate) : ""}
525
+ ${buildTaxTotalXml(totals.taxSubtotals, totals.totalTax, currency)}
526
+ ${buildLegalMonetaryTotalXml(totals, currency, { prepaidAmount: input.prepaidAmount, roundingAmount: input.roundingAmount })}
527
+ ${linesXml}
528
+ </CreditNote>`;
529
+ }
530
+ //# sourceMappingURL=ubl-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ubl-builder.js","sourceRoot":"","sources":["../../src/core/ubl-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Invoice Validator
3
+ *
4
+ * Validates invoice data BEFORE conversion to XML.
5
+ * Implements key Peppol BIS 3.0 business rules with human-readable error messages.
6
+ *
7
+ * Design principle: Errors tell you WHAT's wrong, WHERE it is, and HOW to fix it.
8
+ * No developer should need to Google a Peppol rule ID.
9
+ */
10
+ import type { InvoiceInput, ValidationResult } from "../types/invoice.js";
11
+ /**
12
+ * Validate an invoice input before sending.
13
+ * Returns human-readable errors with suggestions for fixes.
14
+ */
15
+ export declare function validateInvoice(input: InvoiceInput): ValidationResult;
16
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,YAAY,EAGZ,gBAAgB,EAGjB,MAAM,qBAAqB,CAAC;AA0G7B;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,gBAAgB,CAgOrE"}