@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.
- package/README.md +463 -0
- package/dist/core/client.d.ts +523 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +1308 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/code-lists.d.ts +120 -0
- package/dist/core/code-lists.d.ts.map +1 -0
- package/dist/core/code-lists.js +247 -0
- package/dist/core/code-lists.js.map +1 -0
- package/dist/core/country-rules.d.ts +30 -0
- package/dist/core/country-rules.d.ts.map +1 -0
- package/dist/core/country-rules.js +128 -0
- package/dist/core/country-rules.js.map +1 -0
- package/dist/core/schematron.d.ts +59 -0
- package/dist/core/schematron.d.ts.map +1 -0
- package/dist/core/schematron.js +480 -0
- package/dist/core/schematron.js.map +1 -0
- package/dist/core/ubl-builder.d.ts +20 -0
- package/dist/core/ubl-builder.d.ts.map +1 -0
- package/dist/core/ubl-builder.js +530 -0
- package/dist/core/ubl-builder.js.map +1 -0
- package/dist/core/validator.d.ts +16 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +171 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/types/invoice.d.ts +635 -0
- package/dist/types/invoice.d.ts.map +1 -0
- package/dist/types/invoice.js +8 -0
- package/dist/types/invoice.js.map +1 -0
- package/package.json +53 -0
|
@@ -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, "<")
|
|
46
|
+
.replace(/>/g, ">")
|
|
47
|
+
.replace(/"/g, """)
|
|
48
|
+
.replace(/'/g, "'");
|
|
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"}
|