@open-nav/invoicing 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.
Files changed (53) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +190 -0
  3. package/dist/color.d.ts +31 -0
  4. package/dist/color.d.ts.map +1 -0
  5. package/dist/color.js +150 -0
  6. package/dist/color.js.map +1 -0
  7. package/dist/export.d.ts +89 -0
  8. package/dist/export.d.ts.map +1 -0
  9. package/dist/export.js +115 -0
  10. package/dist/export.js.map +1 -0
  11. package/dist/format.d.ts +23 -0
  12. package/dist/format.d.ts.map +1 -0
  13. package/dist/format.js +52 -0
  14. package/dist/format.js.map +1 -0
  15. package/dist/html.d.ts +43 -0
  16. package/dist/html.d.ts.map +1 -0
  17. package/dist/html.js +355 -0
  18. package/dist/html.js.map +1 -0
  19. package/dist/index.d.ts +10 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +10 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/labels.d.ts +8 -0
  24. package/dist/labels.d.ts.map +1 -0
  25. package/dist/labels.js +199 -0
  26. package/dist/labels.js.map +1 -0
  27. package/dist/markings.d.ts +28 -0
  28. package/dist/markings.d.ts.map +1 -0
  29. package/dist/markings.js +69 -0
  30. package/dist/markings.js.map +1 -0
  31. package/dist/pdf-native.d.ts +32 -0
  32. package/dist/pdf-native.d.ts.map +1 -0
  33. package/dist/pdf-native.js +601 -0
  34. package/dist/pdf-native.js.map +1 -0
  35. package/dist/pdf.d.ts +92 -0
  36. package/dist/pdf.d.ts.map +1 -0
  37. package/dist/pdf.js +203 -0
  38. package/dist/pdf.js.map +1 -0
  39. package/dist/theme.d.ts +85 -0
  40. package/dist/theme.d.ts.map +1 -0
  41. package/dist/theme.js +210 -0
  42. package/dist/theme.js.map +1 -0
  43. package/package.json +54 -0
  44. package/src/color.ts +170 -0
  45. package/src/export.ts +204 -0
  46. package/src/format.ts +66 -0
  47. package/src/html.ts +446 -0
  48. package/src/index.ts +9 -0
  49. package/src/labels.ts +222 -0
  50. package/src/markings.ts +102 -0
  51. package/src/pdf-native.ts +754 -0
  52. package/src/pdf.ts +302 -0
  53. package/src/theme.ts +305 -0
package/dist/format.js ADDED
@@ -0,0 +1,52 @@
1
+ import { Decimal } from '@open-nav/core';
2
+ /**
3
+ * Format an exact decimal for display without going through a JavaScript
4
+ * number.
5
+ *
6
+ * The amounts on an invoice are exact decimal strings precisely so they do
7
+ * not lose precision; rendering them through `Number` to get thousands
8
+ * separators would throw that away at the top of NAV's 18 digit range.
9
+ */
10
+ export function formatAmount(value, language, fractionDigits = 2) {
11
+ const amount = Decimal.from(value).round(fractionDigits);
12
+ const text = amount.abs().toFixed(fractionDigits);
13
+ const [whole = '0', fraction = ''] = text.split('.');
14
+ // A non-breaking space, so a grouped amount never breaks across a line,
15
+ // which is the Hungarian typographic convention for thousands.
16
+ const groupSeparator = language === 'hu' ? '\u00a0' : ',';
17
+ const decimalSeparator = language === 'hu' ? ',' : '.';
18
+ const grouped = whole.replace(/\B(?=(\d{3})+(?!\d))/g, groupSeparator);
19
+ const sign = amount.isNegative() ? '-' : '';
20
+ return fraction === '' ? `${sign}${grouped}` : `${sign}${grouped}${decimalSeparator}${fraction}`;
21
+ }
22
+ /** Format a VAT rate like `0.27` as a percentage. */
23
+ export function formatPercentage(value, language) {
24
+ const percent = Decimal.from(value).multiply('100');
25
+ const trimmed = percent
26
+ .toString()
27
+ .replace(/\.0+$/, '')
28
+ .replace(/(\.\d*?)0+$/, '$1');
29
+ return `${language === 'hu' ? trimmed.replace('.', ',') : trimmed}%`;
30
+ }
31
+ /** Dates are ISO in the data; Hungarian documents write them with dots. */
32
+ export function formatDate(value, language) {
33
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(value))
34
+ return value;
35
+ if (language === 'en')
36
+ return value;
37
+ const [year, month, day] = value.split('-');
38
+ return `${year}. ${month}. ${day}.`;
39
+ }
40
+ /** Compose a tax number from its parts, in the written form. */
41
+ export function formatTaxNumber(parts) {
42
+ return [parts.taxpayerId, parts.vatCode, parts.countyCode].filter(Boolean).join('-');
43
+ }
44
+ /** Escape text for HTML. */
45
+ export function escapeHtml(value) {
46
+ return value
47
+ .replace(/&/g, '&')
48
+ .replace(/</g, '&lt;')
49
+ .replace(/>/g, '&gt;')
50
+ .replace(/"/g, '&quot;');
51
+ }
52
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAIzC;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,QAA0B,EAC1B,cAAc,GAAG,CAAC;IAElB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAErD,wEAAwE;IACxE,+DAA+D;IAC/D,MAAM,cAAc,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,MAAM,gBAAgB,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAC;IAEvE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,OAAO,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,gBAAgB,GAAG,QAAQ,EAAE,CAAC;AACnG,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,QAA0B;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO;SACpB,QAAQ,EAAE;SACV,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAChC,OAAO,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC;AACvE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAA0B;IAClE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,OAAO,GAAG,IAAI,KAAK,KAAK,KAAK,GAAG,GAAG,CAAC;AACtC,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,eAAe,CAAC,KAI/B;IACC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvF,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
package/dist/html.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ import type { InvoiceData } from '@open-nav/core';
2
+ import { type DocumentLanguage } from './format.js';
3
+ import { type InvoiceTheme } from './theme.js';
4
+ export interface RenderOptions {
5
+ /** Document language. Hungarian by default, as the law prescribes. */
6
+ language?: DocumentLanguage;
7
+ /** Extra note printed under the totals, e.g. payment instructions. */
8
+ note?: string;
9
+ /**
10
+ * Branding and layout: logo, colours, fonts, page setup, footer.
11
+ *
12
+ * See {@link InvoiceTheme}. Anything omitted falls back to a restrained
13
+ * default that prints well in black and white.
14
+ */
15
+ theme?: InvoiceTheme;
16
+ /**
17
+ * State that the document was rendered from reported data.
18
+ *
19
+ * On by default. An invoice's legal original is whatever the issuer issued;
20
+ * this rendering is a faithful presentation of the reported data, and
21
+ * saying so avoids passing it off as something it is not. Can also be set
22
+ * through the theme.
23
+ */
24
+ provenanceNote?: boolean;
25
+ }
26
+ /**
27
+ * Render an invoice as a self-contained, printable HTML document.
28
+ *
29
+ * HTML rather than PDF on purpose. A Hungarian invoice needs `ő` and `ű`,
30
+ * which are outside the WinAnsi encoding the PDF core fonts use, so a
31
+ * dependency-free PDF would need a bundled and licensed font to spell the
32
+ * language correctly. HTML gets the typography right, needs nothing bundled,
33
+ * and turns into a PDF with any browser:
34
+ *
35
+ * ```sh
36
+ * chromium --headless --print-to-pdf=invoice.pdf invoice.html
37
+ * ```
38
+ *
39
+ * The output carries no external references, so it renders identically
40
+ * offline and archives as a single file.
41
+ */
42
+ export declare function renderInvoiceHtml(document: InvoiceData, options?: RenderOptions): string;
43
+ //# sourceMappingURL=html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,WAAW,EAAsC,MAAM,gBAAgB,CAAC;AACnG,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAA6B,KAAK,YAAY,EAAsB,MAAM,YAAY,CAAC;AAE9F,MAAM,WAAW,aAAa;IAC5B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAuB5F"}
package/dist/html.js ADDED
@@ -0,0 +1,355 @@
1
+ import { escapeHtml, formatAmount, formatDate, formatPercentage, formatTaxNumber, } from './format.js';
2
+ import { documentTitle, label, paymentMethodLabel, unitLabel } from './labels.js';
3
+ import { deriveMarkings } from './markings.js';
4
+ import { buildStyles, resolveTheme } from './theme.js';
5
+ /**
6
+ * Render an invoice as a self-contained, printable HTML document.
7
+ *
8
+ * HTML rather than PDF on purpose. A Hungarian invoice needs `ő` and `ű`,
9
+ * which are outside the WinAnsi encoding the PDF core fonts use, so a
10
+ * dependency-free PDF would need a bundled and licensed font to spell the
11
+ * language correctly. HTML gets the typography right, needs nothing bundled,
12
+ * and turns into a PDF with any browser:
13
+ *
14
+ * ```sh
15
+ * chromium --headless --print-to-pdf=invoice.pdf invoice.html
16
+ * ```
17
+ *
18
+ * The output carries no external references, so it renders identically
19
+ * offline and archives as a single file.
20
+ */
21
+ export function renderInvoiceHtml(document, options = {}) {
22
+ const language = options.language ?? 'hu';
23
+ const theme = resolveTheme(options.theme);
24
+ const invoices = document.invoiceMain.invoice
25
+ ? [document.invoiceMain.invoice]
26
+ : (document.invoiceMain.batchInvoice ?? []).map((entry) => entry.invoice);
27
+ const body = invoices
28
+ .map((invoice) => renderInvoice(document, invoice, language, options, theme))
29
+ .join('\n<div class="page-break"></div>\n');
30
+ return `<!doctype html>
31
+ <html lang="${language}">
32
+ <head>
33
+ <meta charset="utf-8">
34
+ <title>${escapeHtml(document.invoiceNumber)}</title>
35
+ ${buildStyles(theme)}
36
+ </head>
37
+ <body>
38
+ ${body}
39
+ </body>
40
+ </html>
41
+ `;
42
+ }
43
+ function renderInvoice(document, invoice, language, options, theme) {
44
+ const detail = invoice.invoiceHead.invoiceDetail;
45
+ const currency = detail.currencyCode;
46
+ const isModification = invoice.invoiceReference !== undefined;
47
+ const lines = invoice.invoiceLines?.line ?? [];
48
+ const markings = deriveMarkings(invoice, language);
49
+ const metaRows = [
50
+ [label('invoiceNumber', language), document.invoiceNumber],
51
+ [label('issueDate', language), formatDate(document.invoiceIssueDate, language)],
52
+ ];
53
+ if (detail.invoiceDeliveryDate) {
54
+ metaRows.push([
55
+ label('deliveryDate', language),
56
+ formatDate(detail.invoiceDeliveryDate, language),
57
+ ]);
58
+ }
59
+ if (detail.invoiceDeliveryPeriodStart && detail.invoiceDeliveryPeriodEnd) {
60
+ metaRows.push([
61
+ label('deliveryPeriod', language),
62
+ `${formatDate(detail.invoiceDeliveryPeriodStart, language)} – ${formatDate(detail.invoiceDeliveryPeriodEnd, language)}`,
63
+ ]);
64
+ }
65
+ if (detail.paymentDate) {
66
+ metaRows.push([label('paymentDate', language), formatDate(detail.paymentDate, language)]);
67
+ }
68
+ if (detail.paymentMethod) {
69
+ metaRows.push([
70
+ label('paymentMethod', language),
71
+ paymentMethodLabel(detail.paymentMethod, language),
72
+ ]);
73
+ }
74
+ metaRows.push([label('currency', language), currency]);
75
+ if (detail.exchangeRate && currency !== 'HUF') {
76
+ metaRows.push([label('exchangeRate', language), `${detail.exchangeRate} HUF/${currency}`]);
77
+ }
78
+ if (invoice.invoiceReference) {
79
+ metaRows.push([
80
+ label('originalInvoiceNumber', language),
81
+ invoice.invoiceReference.originalInvoiceNumber,
82
+ ]);
83
+ }
84
+ const logo = theme.logo
85
+ ? `<img class="logo" src="${escapeHtml(theme.logo.src)}" alt="${escapeHtml(theme.logo.alt ?? invoice.invoiceHead.supplierInfo.supplierName)}"` +
86
+ `${theme.logo.width ? ` style="width:${escapeHtml(theme.logo.width)}"` : ''}>`
87
+ : '';
88
+ return `<article class="invoice">
89
+ <header>
90
+ <div class="brand">
91
+ ${logo}
92
+ <div>
93
+ <h1>${escapeHtml(documentTitle(detail.invoiceCategory, isModification, language))}</h1>
94
+ ${markings.length > 0 ? `<div class="subtitle">${markings.map((marking) => escapeHtml(marking.text)).join(' · ')}</div>` : ''}
95
+ </div>
96
+ </div>
97
+ <div class="meta">
98
+ ${metaRows
99
+ .map(([name, value]) => `<div>${escapeHtml(name)}: <span class="value">${escapeHtml(value)}</span></div>`)
100
+ .join('\n ')}
101
+ </div>
102
+ </header>
103
+
104
+ <section class="parties">
105
+ ${renderParty(label('supplier', language), supplierFields(invoice, language), theme.issuerContact)}
106
+ ${renderParty(label('customer', language), customerFields(invoice, language), [])}
107
+ </section>
108
+
109
+ ${renderLines(lines, currency, language)}
110
+ ${renderTotals(invoice, currency, language)}
111
+ ${renderVatSummary(invoice, currency, language)}
112
+ ${renderMarkings(markings, language)}
113
+ ${options.note ? `<div class="note">${escapeHtml(options.note)}</div>` : ''}
114
+ ${renderFooter(theme, options, language)}
115
+ </article>`;
116
+ }
117
+ function renderParty(heading, fields, contact) {
118
+ return `<div class="party">
119
+ <h2>${escapeHtml(heading)}</h2>
120
+ <div class="name">${escapeHtml(fields.name)}</div>
121
+ ${fields.address ? `<div class="address">${escapeHtml(fields.address)}</div>` : ''}
122
+ <dl>
123
+ ${fields.rows
124
+ .map(([key, value]) => `<dt>${escapeHtml(key)}</dt><dd>${escapeHtml(value)}</dd>`)
125
+ .join('\n ')}
126
+ </dl>
127
+ ${contact.length > 0
128
+ ? `<div class="contact">${contact.map((line) => escapeHtml(line)).join('<br>')}</div>`
129
+ : ''}
130
+ </div>`;
131
+ }
132
+ /**
133
+ * The footer carries the theme's own lines plus the provenance note.
134
+ *
135
+ * `provenanceNote` can be set on either the options or the theme; the option
136
+ * wins, so a single document can drop it without editing shared branding.
137
+ */
138
+ function renderFooter(theme, options, language) {
139
+ const showProvenance = options.provenanceNote ?? theme.provenanceNote;
140
+ const lines = [
141
+ ...theme.footerLines.map((line) => escapeHtml(line)),
142
+ ...(showProvenance ? [escapeHtml(label('notReported', language))] : []),
143
+ ];
144
+ if (lines.length === 0)
145
+ return '';
146
+ return `<footer>${lines.map((line) => `<div>${line}</div>`).join('')}</footer>`;
147
+ }
148
+ function formatAddress(address) {
149
+ if (!address)
150
+ return '';
151
+ if ('simpleAddress' in address && address.simpleAddress) {
152
+ const simple = address.simpleAddress;
153
+ return [simple.postalCode, simple.city, simple.additionalAddressDetail, simple.countryCode]
154
+ .filter(Boolean)
155
+ .join(', ');
156
+ }
157
+ if ('detailedAddress' in address && address.detailedAddress) {
158
+ const detailed = address.detailedAddress;
159
+ const street = [
160
+ detailed.streetName,
161
+ detailed.publicPlaceCategory,
162
+ detailed.number,
163
+ detailed.building,
164
+ detailed.floor,
165
+ detailed.door,
166
+ ]
167
+ .filter(Boolean)
168
+ .join(' ');
169
+ return [detailed.postalCode, detailed.city, street, detailed.countryCode]
170
+ .filter(Boolean)
171
+ .join(', ');
172
+ }
173
+ return '';
174
+ }
175
+ function supplierFields(invoice, language) {
176
+ const supplier = invoice.invoiceHead.supplierInfo;
177
+ const rows = [];
178
+ rows.push([label('taxNumber', language), formatTaxNumber(supplier.supplierTaxNumber)]);
179
+ if (supplier.groupMemberTaxNumber) {
180
+ rows.push([
181
+ label('groupMemberTaxNumber', language),
182
+ formatTaxNumber(supplier.groupMemberTaxNumber),
183
+ ]);
184
+ }
185
+ if (supplier.communityVatNumber) {
186
+ rows.push([label('communityVatNumber', language), supplier.communityVatNumber]);
187
+ }
188
+ if (supplier.supplierBankAccountNumber) {
189
+ rows.push([label('bankAccount', language), supplier.supplierBankAccountNumber]);
190
+ }
191
+ return {
192
+ name: supplier.supplierName,
193
+ address: formatAddress(supplier.supplierAddress),
194
+ rows,
195
+ };
196
+ }
197
+ function customerFields(invoice, language) {
198
+ const customer = invoice.invoiceHead.customerInfo;
199
+ if (!customer)
200
+ return { name: '—', address: '', rows: [] };
201
+ const rows = [];
202
+ const vatData = customer.customerVatData;
203
+ if (vatData?.customerTaxNumber) {
204
+ rows.push([label('taxNumber', language), formatTaxNumber(vatData.customerTaxNumber)]);
205
+ }
206
+ if (vatData?.communityVatNumber) {
207
+ rows.push([label('communityVatNumber', language), vatData.communityVatNumber]);
208
+ }
209
+ if (vatData?.thirdStateTaxId) {
210
+ rows.push([label('thirdStateTaxId', language), vatData.thirdStateTaxId]);
211
+ }
212
+ if (customer.customerBankAccountNumber) {
213
+ rows.push([label('bankAccount', language), customer.customerBankAccountNumber]);
214
+ }
215
+ // A private person is deliberately not named on the reported data.
216
+ const name = customer.customerName ?? (customer.customerVatStatus === 'PRIVATE_PERSON' ? '—' : '');
217
+ return { name, address: formatAddress(customer.customerAddress), rows };
218
+ }
219
+ function vatRateText(rate, language) {
220
+ if (!rate)
221
+ return '';
222
+ if (rate.vatPercentage !== undefined)
223
+ return formatPercentage(rate.vatPercentage, language);
224
+ if (rate.vatContent !== undefined)
225
+ return formatPercentage(rate.vatContent, language);
226
+ if (rate.vatExemption)
227
+ return `${label('exempt', language)} (${rate.vatExemption.case})`;
228
+ if (rate.vatOutOfScope)
229
+ return `${label('outOfScope', language)} (${rate.vatOutOfScope.case})`;
230
+ if (rate.vatDomesticReverseCharge)
231
+ return label('reverseCharge', language);
232
+ if (rate.marginSchemeIndicator)
233
+ return label('exempt', language);
234
+ return '';
235
+ }
236
+ function renderLines(lines, currency, language) {
237
+ if (lines.length === 0)
238
+ return '';
239
+ const rows = lines
240
+ .map((line) => {
241
+ const normal = line.lineAmountsNormal;
242
+ const simplified = line.lineAmountsSimplified;
243
+ const rate = normal?.lineVatRate ?? simplified?.lineVatRate;
244
+ const net = normal?.lineNetAmountData.lineNetAmount;
245
+ const vat = normal?.lineVatData?.lineVatAmount;
246
+ const gross = normal?.lineGrossAmountData?.lineGrossAmountNormal ?? simplified?.lineGrossAmountSimplified;
247
+ return `<tr>
248
+ <td class="num">${line.lineNumber}</td>
249
+ <td>${escapeHtml(line.lineDescription ?? '')}</td>
250
+ <td class="num">${line.quantity ? escapeHtml(formatAmount(line.quantity, language, decimalsOf(line.quantity))) : ''}</td>
251
+ <td>${escapeHtml(unitLabel(line.unitOfMeasure, line.unitOfMeasureOwn, language))}</td>
252
+ <td class="num">${line.unitPrice ? escapeHtml(formatAmount(line.unitPrice, language, decimalsOf(line.unitPrice))) : ''}</td>
253
+ <td class="num">${net ? escapeHtml(formatAmount(net, language)) : ''}</td>
254
+ <td class="num">${escapeHtml(vatRateText(rate, language))}</td>
255
+ <td class="num">${vat ? escapeHtml(formatAmount(vat, language)) : ''}</td>
256
+ <td class="num">${gross ? escapeHtml(formatAmount(gross, language)) : ''}</td>
257
+ </tr>`;
258
+ })
259
+ .join('\n ');
260
+ return `<table>
261
+ <thead>
262
+ <tr>
263
+ <th class="num">${escapeHtml(label('lineNumber', language))}</th>
264
+ <th>${escapeHtml(label('description', language))}</th>
265
+ <th class="num">${escapeHtml(label('quantity', language))}</th>
266
+ <th>${escapeHtml(label('unit', language))}</th>
267
+ <th class="num">${escapeHtml(label('unitPrice', language))}</th>
268
+ <th class="num">${escapeHtml(label('netAmount', language))} (${escapeHtml(currency)})</th>
269
+ <th class="num">${escapeHtml(label('vatRate', language))}</th>
270
+ <th class="num">${escapeHtml(label('vatAmount', language))}</th>
271
+ <th class="num">${escapeHtml(label('grossAmount', language))}</th>
272
+ </tr>
273
+ </thead>
274
+ <tbody>
275
+ ${rows}
276
+ </tbody>
277
+ </table>`;
278
+ }
279
+ /** Keep a quantity's own precision rather than forcing two decimals. */
280
+ function decimalsOf(value) {
281
+ const fraction = value.split('.')[1];
282
+ if (!fraction)
283
+ return 0;
284
+ return fraction.replace(/0+$/, '').length;
285
+ }
286
+ function renderTotals(invoice, currency, language) {
287
+ const summary = invoice.invoiceSummary;
288
+ const normal = summary.summaryNormal;
289
+ const gross = summary.summaryGrossData;
290
+ const rows = [];
291
+ if (normal) {
292
+ rows.push(row(label('totalNet', language), formatAmount(normal.invoiceNetAmount, language), currency), row(label('totalVat', language), formatAmount(normal.invoiceVatAmount, language), currency));
293
+ }
294
+ if (gross) {
295
+ rows.push(`<tr class="grand"><td>${escapeHtml(label('totalGross', language))}</td>` +
296
+ `<td class="num">${escapeHtml(formatAmount(gross.invoiceGrossAmount, language))}</td>` +
297
+ `<td class="num">${escapeHtml(currency)}</td></tr>`);
298
+ if (currency !== 'HUF') {
299
+ rows.push(row(label('inHuf', language), formatAmount(gross.invoiceGrossAmountHUF, language), 'HUF'));
300
+ }
301
+ }
302
+ if (rows.length === 0)
303
+ return '';
304
+ return `<div class="totals"><table><tbody>${rows.join('')}</tbody></table></div>`;
305
+ }
306
+ function row(name, value, currency) {
307
+ return (`<tr><td>${escapeHtml(name)}</td>` +
308
+ `<td class="num">${escapeHtml(value)}</td>` +
309
+ `<td class="num">${escapeHtml(currency)}</td></tr>`);
310
+ }
311
+ function renderVatSummary(invoice, currency, language) {
312
+ const byRate = invoice.invoiceSummary.summaryNormal?.summaryByVatRate ?? [];
313
+ if (byRate.length < 2)
314
+ return '';
315
+ const rows = byRate
316
+ .map((entry) => `<tr>
317
+ <td>${escapeHtml(vatRateText(entry.vatRate, language))}</td>
318
+ <td class="num">${escapeHtml(formatAmount(entry.vatRateNetData.vatRateNetAmount, language))}</td>
319
+ <td class="num">${escapeHtml(formatAmount(entry.vatRateVatData.vatRateVatAmount, language))}</td>
320
+ <td class="num">${entry.vatRateGrossData ? escapeHtml(formatAmount(entry.vatRateGrossData.vatRateGrossAmount, language)) : ''}</td>
321
+ </tr>`)
322
+ .join('\n ');
323
+ return `<section class="vat-summary">
324
+ <h2>${escapeHtml(label('summaryByVatRate', language))} (${escapeHtml(currency)})</h2>
325
+ <table>
326
+ <thead>
327
+ <tr>
328
+ <th>${escapeHtml(label('vatRate', language))}</th>
329
+ <th class="num">${escapeHtml(label('netAmount', language))}</th>
330
+ <th class="num">${escapeHtml(label('vatAmount', language))}</th>
331
+ <th class="num">${escapeHtml(label('grossAmount', language))}</th>
332
+ </tr>
333
+ </thead>
334
+ <tbody>
335
+ ${rows}
336
+ </tbody>
337
+ </table>
338
+ </section>`;
339
+ }
340
+ function renderMarkings(markings, language) {
341
+ if (markings.length === 0)
342
+ return '';
343
+ const items = markings
344
+ .map((marking) => `<li>${escapeHtml(marking.text)}` +
345
+ (marking.detail ? ` — ${escapeHtml(marking.detail)}` : '') +
346
+ ` <span class="reference">(${escapeHtml(marking.reference)})</span></li>`)
347
+ .join('\n ');
348
+ return `<section class="markings">
349
+ <h2>${escapeHtml(label('markings', language))}</h2>
350
+ <ul>
351
+ ${items}
352
+ </ul>
353
+ </section>`;
354
+ }
355
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export * from './format.js';
2
+ export * from './labels.js';
3
+ export * from './markings.js';
4
+ export * from './theme.js';
5
+ export * from './html.js';
6
+ export * from './color.js';
7
+ export * from './pdf-native.js';
8
+ export * from './pdf.js';
9
+ export * from './export.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export * from './format.js';
2
+ export * from './labels.js';
3
+ export * from './markings.js';
4
+ export * from './theme.js';
5
+ export * from './html.js';
6
+ export * from './color.js';
7
+ export * from './pdf-native.js';
8
+ export * from './pdf.js';
9
+ export * from './export.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { InvoiceCategoryType, MarginSchemeType, PaymentMethodType, UnitOfMeasureType } from '@open-nav/core';
2
+ import type { DocumentLanguage } from './format.js';
3
+ export declare function label(key: string, language: DocumentLanguage): string;
4
+ export declare function unitLabel(unit: UnitOfMeasureType | undefined, own: string | undefined, language: DocumentLanguage): string;
5
+ export declare function paymentMethodLabel(method: PaymentMethodType | undefined, language: DocumentLanguage): string;
6
+ export declare function documentTitle(category: InvoiceCategoryType | undefined, isModification: boolean, language: DocumentLanguage): string;
7
+ export declare function marginSchemeLabel(scheme: MarginSchemeType, language: DocumentLanguage): string;
8
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAqHpD,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAErE;AAyCD,wBAAgB,SAAS,CACvB,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,EAAE,gBAAgB,GACzB,MAAM,CAGR;AAmBD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,iBAAiB,GAAG,SAAS,EACrC,QAAQ,EAAE,gBAAgB,GACzB,MAAM,CAER;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,mBAAmB,GAAG,SAAS,EACzC,cAAc,EAAE,OAAO,EACvB,QAAQ,EAAE,gBAAgB,GACzB,MAAM,CAKR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAW9F"}