@dainamite/billing 0.20.0 → 0.22.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/CHANGELOG.md +103 -0
- package/dist/modules/billing/acl.js +13 -1
- package/dist/modules/billing/acl.js.map +2 -2
- package/dist/modules/billing/api/accounts/[id]/summary/route.js +52 -0
- package/dist/modules/billing/api/accounts/[id]/summary/route.js.map +7 -0
- package/dist/modules/billing/api/accounts/route.js +47 -4
- package/dist/modules/billing/api/accounts/route.js.map +2 -2
- package/dist/modules/billing/api/export/account/[id]/route.js +11 -7
- package/dist/modules/billing/api/export/account/[id]/route.js.map +2 -2
- package/dist/modules/billing/api/invoices/[id]/memos/route.js +54 -0
- package/dist/modules/billing/api/invoices/[id]/memos/route.js.map +7 -0
- package/dist/modules/billing/api/invoices/[id]/pdf/route.js +70 -0
- package/dist/modules/billing/api/invoices/[id]/pdf/route.js.map +7 -0
- package/dist/modules/billing/api/invoices/[id]/route.js +44 -24
- package/dist/modules/billing/api/invoices/[id]/route.js.map +2 -2
- package/dist/modules/billing/api/invoices/[id]/send/route.js +107 -0
- package/dist/modules/billing/api/invoices/[id]/send/route.js.map +7 -0
- package/dist/modules/billing/api/invoices/add-line/route.js +2 -2
- package/dist/modules/billing/api/invoices/add-line/route.js.map +2 -2
- package/dist/modules/billing/api/invoices/delete-draft/route.js +33 -0
- package/dist/modules/billing/api/invoices/delete-draft/route.js.map +7 -0
- package/dist/modules/billing/api/invoices/edit-line/route.js +2 -2
- package/dist/modules/billing/api/invoices/edit-line/route.js.map +2 -2
- package/dist/modules/billing/api/invoices/post/route.js +2 -2
- package/dist/modules/billing/api/invoices/post/route.js.map +2 -2
- package/dist/modules/billing/api/invoices/remove-line/route.js +2 -2
- package/dist/modules/billing/api/invoices/remove-line/route.js.map +2 -2
- package/dist/modules/billing/api/invoices/route.js +45 -46
- package/dist/modules/billing/api/invoices/route.js.map +2 -2
- package/dist/modules/billing/api/items/bulk/route.js +1 -1
- package/dist/modules/billing/api/items/bulk/route.js.map +2 -2
- package/dist/modules/billing/api/items/change-price/route.js +44 -0
- package/dist/modules/billing/api/items/change-price/route.js.map +7 -0
- package/dist/modules/billing/api/items/route.js +19 -7
- package/dist/modules/billing/api/items/route.js.map +2 -2
- package/dist/modules/billing/api/payment-imports/[id]/route.js +49 -0
- package/dist/modules/billing/api/payment-imports/[id]/route.js.map +7 -0
- package/dist/modules/billing/api/payment-imports/route.js +57 -0
- package/dist/modules/billing/api/payment-imports/route.js.map +7 -0
- package/dist/modules/billing/api/payments/[id]/route.js +60 -0
- package/dist/modules/billing/api/payments/[id]/route.js.map +7 -0
- package/dist/modules/billing/api/payments/allocate/route.js +35 -0
- package/dist/modules/billing/api/payments/allocate/route.js.map +7 -0
- package/dist/modules/billing/api/payments/assign/route.js +36 -0
- package/dist/modules/billing/api/payments/assign/route.js.map +7 -0
- package/dist/modules/billing/api/payments/convert-to-topup/route.js +35 -0
- package/dist/modules/billing/api/payments/convert-to-topup/route.js.map +7 -0
- package/dist/modules/billing/api/payments/ignore/route.js +35 -0
- package/dist/modules/billing/api/payments/ignore/route.js.map +7 -0
- package/dist/modules/billing/api/payments/import/route.js +63 -0
- package/dist/modules/billing/api/payments/import/route.js.map +7 -0
- package/dist/modules/billing/api/payments/restore/route.js +35 -0
- package/dist/modules/billing/api/payments/restore/route.js.map +7 -0
- package/dist/modules/billing/api/payments/route.js +114 -0
- package/dist/modules/billing/api/payments/route.js.map +7 -0
- package/dist/modules/billing/api/payments/unallocate/route.js +35 -0
- package/dist/modules/billing/api/payments/unallocate/route.js.map +7 -0
- package/dist/modules/billing/api/payments/unassign/route.js +35 -0
- package/dist/modules/billing/api/payments/unassign/route.js.map +7 -0
- package/dist/modules/billing/api/run-outcomes/route.js +43 -6
- package/dist/modules/billing/api/run-outcomes/route.js.map +2 -2
- package/dist/modules/billing/api/runs/[id]/post-drafts/route.js +61 -0
- package/dist/modules/billing/api/runs/[id]/post-drafts/route.js.map +7 -0
- package/dist/modules/billing/api/runs/[id]/route.js +53 -0
- package/dist/modules/billing/api/runs/[id]/route.js.map +7 -0
- package/dist/modules/billing/api/runs/retry-failed/route.js +1 -1
- package/dist/modules/billing/api/runs/retry-failed/route.js.map +2 -2
- package/dist/modules/billing/api/runs/route.js +9 -3
- package/dist/modules/billing/api/runs/route.js.map +2 -2
- package/dist/modules/billing/api/settings/number-preview/route.js +42 -0
- package/dist/modules/billing/api/settings/number-preview/route.js.map +7 -0
- package/dist/modules/billing/api/settings/route.js +92 -0
- package/dist/modules/billing/api/settings/route.js.map +7 -0
- package/dist/modules/billing/api/statements/route.js +3 -0
- package/dist/modules/billing/api/statements/route.js.map +2 -2
- package/dist/modules/billing/api/test-invoices/wipe/route.js +2 -2
- package/dist/modules/billing/api/test-invoices/wipe/route.js.map +2 -2
- package/dist/modules/billing/backend/billing/accounts/[id]/page.js +121 -232
- package/dist/modules/billing/backend/billing/accounts/[id]/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/accounts/create/page.js +6 -0
- package/dist/modules/billing/backend/billing/accounts/create/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/accounts/page.js +63 -4
- package/dist/modules/billing/backend/billing/accounts/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/invoices/[id]/page.js +297 -65
- package/dist/modules/billing/backend/billing/invoices/[id]/page.js.map +3 -3
- package/dist/modules/billing/backend/billing/invoices/page.js +6 -172
- package/dist/modules/billing/backend/billing/invoices/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/items/[id]/page.js +51 -7
- package/dist/modules/billing/backend/billing/items/[id]/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/items/create/page.js +9 -6
- package/dist/modules/billing/backend/billing/items/create/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/items/page.js +8 -2
- package/dist/modules/billing/backend/billing/items/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/payments/[id]/page.js +297 -0
- package/dist/modules/billing/backend/billing/payments/[id]/page.js.map +7 -0
- package/dist/modules/billing/backend/billing/payments/[id]/page.meta.js +21 -0
- package/dist/modules/billing/backend/billing/payments/[id]/page.meta.js.map +7 -0
- package/dist/modules/billing/backend/billing/payments/imports/[id]/page.js +74 -0
- package/dist/modules/billing/backend/billing/payments/imports/[id]/page.js.map +7 -0
- package/dist/modules/billing/backend/billing/payments/imports/[id]/page.meta.js +21 -0
- package/dist/modules/billing/backend/billing/payments/imports/[id]/page.meta.js.map +7 -0
- package/dist/modules/billing/backend/billing/payments/page.js +58 -0
- package/dist/modules/billing/backend/billing/payments/page.js.map +7 -0
- package/dist/modules/billing/backend/billing/payments/page.meta.js +18 -0
- package/dist/modules/billing/backend/billing/payments/page.meta.js.map +7 -0
- package/dist/modules/billing/backend/billing/runs/[id]/page.js +49 -14
- package/dist/modules/billing/backend/billing/runs/[id]/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/runs/page.js +58 -7
- package/dist/modules/billing/backend/billing/runs/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/statements/[id]/page.js +61 -6
- package/dist/modules/billing/backend/billing/statements/[id]/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/statements/page.js +1 -1
- package/dist/modules/billing/backend/billing/statements/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/topups/page.js +1 -1
- package/dist/modules/billing/backend/billing/topups/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/transactions/page.js +1 -1
- package/dist/modules/billing/backend/billing/transactions/page.js.map +2 -2
- package/dist/modules/billing/backend/billing/usage/create/page.js +3 -2
- package/dist/modules/billing/backend/billing/usage/create/page.js.map +2 -2
- package/dist/modules/billing/backend/config/billing/page.js +472 -0
- package/dist/modules/billing/backend/config/billing/page.js.map +7 -0
- package/dist/modules/billing/backend/config/billing/page.meta.js +19 -0
- package/dist/modules/billing/backend/config/billing/page.meta.js.map +7 -0
- package/dist/modules/billing/cli.js +22 -1
- package/dist/modules/billing/cli.js.map +2 -2
- package/dist/modules/billing/commands/accounts.js +6 -0
- package/dist/modules/billing/commands/accounts.js.map +2 -2
- package/dist/modules/billing/commands/index.js +3 -0
- package/dist/modules/billing/commands/index.js.map +2 -2
- package/dist/modules/billing/commands/invoices.js +269 -167
- package/dist/modules/billing/commands/invoices.js.map +2 -2
- package/dist/modules/billing/commands/items.js +108 -0
- package/dist/modules/billing/commands/items.js.map +2 -2
- package/dist/modules/billing/commands/memos.js +179 -0
- package/dist/modules/billing/commands/memos.js.map +7 -0
- package/dist/modules/billing/commands/payments.js +379 -0
- package/dist/modules/billing/commands/payments.js.map +7 -0
- package/dist/modules/billing/commands/runs.js +151 -4
- package/dist/modules/billing/commands/runs.js.map +2 -2
- package/dist/modules/billing/commands/settings.js +59 -0
- package/dist/modules/billing/commands/settings.js.map +7 -0
- package/dist/modules/billing/commands/topups.js +9 -2
- package/dist/modules/billing/commands/topups.js.map +2 -2
- package/dist/modules/billing/commands/transactions.js +2 -2
- package/dist/modules/billing/commands/transactions.js.map +2 -2
- package/dist/modules/billing/components/AccountForm.js +149 -42
- package/dist/modules/billing/components/AccountForm.js.map +2 -2
- package/dist/modules/billing/components/AccountInvoicesSection.js +64 -0
- package/dist/modules/billing/components/AccountInvoicesSection.js.map +7 -0
- package/dist/modules/billing/components/AccountPaymentsSection.js +43 -0
- package/dist/modules/billing/components/AccountPaymentsSection.js.map +7 -0
- package/dist/modules/billing/components/AccountPicker.js +56 -0
- package/dist/modules/billing/components/AccountPicker.js.map +7 -0
- package/dist/modules/billing/components/AllocatePaymentDialog.js +134 -0
- package/dist/modules/billing/components/AllocatePaymentDialog.js.map +7 -0
- package/dist/modules/billing/components/BillingDataTable.js +21 -0
- package/dist/modules/billing/components/BillingDataTable.js.map +7 -0
- package/dist/modules/billing/components/BillingSettingsLink.js +19 -0
- package/dist/modules/billing/components/BillingSettingsLink.js.map +7 -0
- package/dist/modules/billing/components/ChangeItemPriceDialog.js +158 -0
- package/dist/modules/billing/components/ChangeItemPriceDialog.js.map +7 -0
- package/dist/modules/billing/components/CreateMemoDialog.js +200 -0
- package/dist/modules/billing/components/CreateMemoDialog.js.map +7 -0
- package/dist/modules/billing/components/CustomerLabel.js +33 -0
- package/dist/modules/billing/components/CustomerLabel.js.map +7 -0
- package/dist/modules/billing/components/InvoicesTable.js +270 -0
- package/dist/modules/billing/components/InvoicesTable.js.map +7 -0
- package/dist/modules/billing/components/ItemForm.js +176 -44
- package/dist/modules/billing/components/ItemForm.js.map +2 -2
- package/dist/modules/billing/components/ItemPriceField.js +46 -0
- package/dist/modules/billing/components/ItemPriceField.js.map +7 -0
- package/dist/modules/billing/components/LineFormDialog.js +25 -2
- package/dist/modules/billing/components/LineFormDialog.js.map +2 -2
- package/dist/modules/billing/components/ManualPaymentDialog.js +122 -0
- package/dist/modules/billing/components/ManualPaymentDialog.js.map +7 -0
- package/dist/modules/billing/components/MoneyInput.js +14 -0
- package/dist/modules/billing/components/MoneyInput.js.map +7 -0
- package/dist/modules/billing/components/PaymentUploadDialog.js +115 -0
- package/dist/modules/billing/components/PaymentUploadDialog.js.map +7 -0
- package/dist/modules/billing/components/PaymentsTable.js +171 -0
- package/dist/modules/billing/components/PaymentsTable.js.map +7 -0
- package/dist/modules/billing/components/PostRunDraftsButton.js +105 -0
- package/dist/modules/billing/components/PostRunDraftsButton.js.map +7 -0
- package/dist/modules/billing/components/PrepaidPanel.js +14 -4
- package/dist/modules/billing/components/PrepaidPanel.js.map +2 -2
- package/dist/modules/billing/components/RunCyclesSection.js +209 -0
- package/dist/modules/billing/components/RunCyclesSection.js.map +7 -0
- package/dist/modules/billing/components/TestRunActions.js +127 -0
- package/dist/modules/billing/components/TestRunActions.js.map +7 -0
- package/dist/modules/billing/components/account/AccountItemsTab.js +157 -0
- package/dist/modules/billing/components/account/AccountItemsTab.js.map +7 -0
- package/dist/modules/billing/components/account/AccountRunBillingDialog.js +122 -0
- package/dist/modules/billing/components/account/AccountRunBillingDialog.js.map +7 -0
- package/dist/modules/billing/components/account/AccountRunsTab.js +152 -0
- package/dist/modules/billing/components/account/AccountRunsTab.js.map +7 -0
- package/dist/modules/billing/components/account/AccountStatementsTab.js +98 -0
- package/dist/modules/billing/components/account/AccountStatementsTab.js.map +7 -0
- package/dist/modules/billing/components/account/AccountSummaryCards.js +125 -0
- package/dist/modules/billing/components/account/AccountSummaryCards.js.map +7 -0
- package/dist/modules/billing/components/account/AccountUsageTab.js +91 -0
- package/dist/modules/billing/components/account/AccountUsageTab.js.map +7 -0
- package/dist/modules/billing/components/account/AccountView.js +73 -0
- package/dist/modules/billing/components/account/AccountView.js.map +7 -0
- package/dist/modules/billing/components/account/accountRow.js +39 -0
- package/dist/modules/billing/components/account/accountRow.js.map +7 -0
- package/dist/modules/billing/components/customerNames.js +42 -0
- package/dist/modules/billing/components/customerNames.js.map +7 -0
- package/dist/modules/billing/data/entities.js +560 -4
- package/dist/modules/billing/data/entities.js.map +2 -2
- package/dist/modules/billing/data/entityIds.js +10 -1
- package/dist/modules/billing/data/entityIds.js.map +2 -2
- package/dist/modules/billing/data/validators.js +269 -15
- package/dist/modules/billing/data/validators.js.map +2 -2
- package/dist/modules/billing/events.js +50 -0
- package/dist/modules/billing/events.js.map +2 -2
- package/dist/modules/billing/i18n/de.json +880 -0
- package/dist/modules/billing/i18n/en.json +457 -21
- package/dist/modules/billing/i18n/es.json +880 -0
- package/dist/modules/billing/i18n/pl.json +458 -22
- package/dist/modules/billing/index.js +6 -2
- package/dist/modules/billing/index.js.map +2 -2
- package/dist/modules/billing/lib/accountFinancials.js +58 -0
- package/dist/modules/billing/lib/accountFinancials.js.map +7 -0
- package/dist/modules/billing/lib/accountLock.js +14 -0
- package/dist/modules/billing/lib/accountLock.js.map +7 -0
- package/dist/modules/billing/lib/accountStatus.js +9 -7
- package/dist/modules/billing/lib/accountStatus.js.map +2 -2
- package/dist/modules/billing/lib/accountSummary.js +106 -0
- package/dist/modules/billing/lib/accountSummary.js.map +7 -0
- package/dist/modules/billing/lib/allocation.js +356 -0
- package/dist/modules/billing/lib/allocation.js.map +7 -0
- package/dist/modules/billing/lib/allocationEvents.js +22 -0
- package/dist/modules/billing/lib/allocationEvents.js.map +7 -0
- package/dist/modules/billing/lib/billPeriod.js +15 -1
- package/dist/modules/billing/lib/billPeriod.js.map +2 -2
- package/dist/modules/billing/lib/billRunEngine.js +237 -102
- package/dist/modules/billing/lib/billRunEngine.js.map +2 -2
- package/dist/modules/billing/lib/billingSettings.js +116 -0
- package/dist/modules/billing/lib/billingSettings.js.map +7 -0
- package/dist/modules/billing/lib/commandRoute.js +81 -0
- package/dist/modules/billing/lib/commandRoute.js.map +7 -0
- package/dist/modules/billing/lib/customerLookup.js +97 -0
- package/dist/modules/billing/lib/customerLookup.js.map +7 -0
- package/dist/modules/billing/lib/dateOnly.js +13 -0
- package/dist/modules/billing/lib/dateOnly.js.map +7 -0
- package/dist/modules/billing/lib/documentParties.js +16 -0
- package/dist/modules/billing/lib/documentParties.js.map +7 -0
- package/dist/modules/billing/lib/documentTypes.js +27 -0
- package/dist/modules/billing/lib/documentTypes.js.map +7 -0
- package/dist/modules/billing/lib/dueDate.js +18 -0
- package/dist/modules/billing/lib/dueDate.js.map +7 -0
- package/dist/modules/billing/lib/iban.js +29 -0
- package/dist/modules/billing/lib/iban.js.map +7 -0
- package/dist/modules/billing/lib/invoiceDelivery.js +133 -0
- package/dist/modules/billing/lib/invoiceDelivery.js.map +7 -0
- package/dist/modules/billing/lib/invoiceLanguages.js +28 -0
- package/dist/modules/billing/lib/invoiceLanguages.js.map +7 -0
- package/dist/modules/billing/lib/invoiceWriter.js +107 -99
- package/dist/modules/billing/lib/invoiceWriter.js.map +2 -2
- package/dist/modules/billing/lib/itemBillingState.js +27 -0
- package/dist/modules/billing/lib/itemBillingState.js.map +7 -0
- package/dist/modules/billing/lib/itemPriceChange.js +18 -0
- package/dist/modules/billing/lib/itemPriceChange.js.map +7 -0
- package/dist/modules/billing/lib/itemSelector.js.map +2 -2
- package/dist/modules/billing/lib/lineAmounts.js +32 -0
- package/dist/modules/billing/lib/lineAmounts.js.map +7 -0
- package/dist/modules/billing/lib/memoGuards.js +25 -0
- package/dist/modules/billing/lib/memoGuards.js.map +7 -0
- package/dist/modules/billing/lib/navigation.js +48 -0
- package/dist/modules/billing/lib/navigation.js.map +7 -0
- package/dist/modules/billing/lib/numbering.js +120 -0
- package/dist/modules/billing/lib/numbering.js.map +7 -0
- package/dist/modules/billing/lib/overdue.js +36 -0
- package/dist/modules/billing/lib/overdue.js.map +7 -0
- package/dist/modules/billing/lib/paymentCsv.js +125 -0
- package/dist/modules/billing/lib/paymentCsv.js.map +7 -0
- package/dist/modules/billing/lib/paymentGateway.js +15 -0
- package/dist/modules/billing/lib/paymentGateway.js.map +7 -0
- package/dist/modules/billing/lib/paymentImport.js +164 -0
- package/dist/modules/billing/lib/paymentImport.js.map +7 -0
- package/dist/modules/billing/lib/paymentMatcher.js +36 -0
- package/dist/modules/billing/lib/paymentMatcher.js.map +7 -0
- package/dist/modules/billing/lib/pdf/attachmentStore.js +46 -0
- package/dist/modules/billing/lib/pdf/attachmentStore.js.map +7 -0
- package/dist/modules/billing/lib/pdf/fonts/embeddedFonts.js +7 -0
- package/dist/modules/billing/lib/pdf/fonts/embeddedFonts.js.map +7 -0
- package/dist/modules/billing/lib/pdf/invoiceModel.js +194 -0
- package/dist/modules/billing/lib/pdf/invoiceModel.js.map +7 -0
- package/dist/modules/billing/lib/pdf/invoicePdf.js +165 -0
- package/dist/modules/billing/lib/pdf/invoicePdf.js.map +7 -0
- package/dist/modules/billing/lib/pdf/invoiceTemplate.js +276 -0
- package/dist/modules/billing/lib/pdf/invoiceTemplate.js.map +7 -0
- package/dist/modules/billing/lib/prepaidConfig.js +17 -25
- package/dist/modules/billing/lib/prepaidConfig.js.map +2 -2
- package/dist/modules/billing/lib/prepaidConsume.js +26 -7
- package/dist/modules/billing/lib/prepaidConsume.js.map +2 -2
- package/dist/modules/billing/lib/prepaidPeriodClose.js +277 -158
- package/dist/modules/billing/lib/prepaidPeriodClose.js.map +2 -2
- package/dist/modules/billing/lib/prepaidTaxPoint.js +37 -0
- package/dist/modules/billing/lib/prepaidTaxPoint.js.map +7 -0
- package/dist/modules/billing/lib/seeds/demo.js +51 -3
- package/dist/modules/billing/lib/seeds/demo.js.map +2 -2
- package/dist/modules/billing/lib/seeds/paymentsSample.js +93 -0
- package/dist/modules/billing/lib/seeds/paymentsSample.js.map +7 -0
- package/dist/modules/billing/lib/seeds/sellerSettings.js +41 -0
- package/dist/modules/billing/lib/seeds/sellerSettings.js.map +7 -0
- package/dist/modules/billing/lib/servicePeriods.js +121 -0
- package/dist/modules/billing/lib/servicePeriods.js.map +7 -0
- package/dist/modules/billing/lib/testRunCleanup.js +24 -0
- package/dist/modules/billing/lib/testRunCleanup.js.map +7 -0
- package/dist/modules/billing/lib/topupCapture.js +2 -2
- package/dist/modules/billing/lib/topupCapture.js.map +2 -2
- package/dist/modules/billing/lib/topupReceipt.js +58 -79
- package/dist/modules/billing/lib/topupReceipt.js.map +2 -2
- package/dist/modules/billing/lib/usageRater.js.map +1 -1
- package/dist/modules/billing/lib/usageRunner.js +14 -6
- package/dist/modules/billing/lib/usageRunner.js.map +2 -2
- package/dist/modules/billing/lib/vat.js +39 -0
- package/dist/modules/billing/lib/vat.js.map +7 -0
- package/dist/modules/billing/migrations/Migration20261114000000_billing_customer_kind.js +15 -0
- package/dist/modules/billing/migrations/Migration20261114000000_billing_customer_kind.js.map +7 -0
- package/dist/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.js +25 -0
- package/dist/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.js.map +7 -0
- package/dist/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.js +115 -0
- package/dist/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.js.map +7 -0
- package/dist/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.js +47 -0
- package/dist/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.js.map +7 -0
- package/dist/modules/billing/migrations/Migration20261117000000_billing_payments.js +89 -0
- package/dist/modules/billing/migrations/Migration20261117000000_billing_payments.js.map +7 -0
- package/dist/modules/billing/migrations/Migration20261118000000_billing_memos.js +17 -0
- package/dist/modules/billing/migrations/Migration20261118000000_billing_memos.js.map +7 -0
- package/dist/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.js +27 -0
- package/dist/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.js.map +7 -0
- package/dist/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.js +29 -0
- package/dist/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.js.map +7 -0
- package/dist/modules/billing/setup.js +7 -184
- package/dist/modules/billing/setup.js.map +2 -2
- package/dist/modules/billing/subscribers/credit-memo-auto-send.js +16 -0
- package/dist/modules/billing/subscribers/credit-memo-auto-send.js.map +7 -0
- package/dist/modules/billing/subscribers/debit-memo-apply-credit.js +16 -0
- package/dist/modules/billing/subscribers/debit-memo-apply-credit.js.map +7 -0
- package/dist/modules/billing/subscribers/debit-memo-auto-send.js +16 -0
- package/dist/modules/billing/subscribers/debit-memo-auto-send.js.map +7 -0
- package/dist/modules/billing/subscribers/invoice-apply-credit.js +34 -0
- package/dist/modules/billing/subscribers/invoice-apply-credit.js.map +7 -0
- package/dist/modules/billing/subscribers/invoice-auto-send.js +30 -0
- package/dist/modules/billing/subscribers/invoice-auto-send.js.map +7 -0
- package/dist/modules/billing/subscribers/payment-captured-to-paid.js +69 -33
- package/dist/modules/billing/subscribers/payment-captured-to-paid.js.map +2 -2
- package/dist/modules/billing/subscribers/prepaid-topup-captured.js +4 -6
- package/dist/modules/billing/subscribers/prepaid-topup-captured.js.map +2 -2
- package/generated/entities/billing_account/index.ts +3 -0
- package/generated/entities/billing_allocation/index.ts +18 -0
- package/generated/entities/billing_document_sequence/index.ts +11 -0
- package/generated/entities/billing_invoice/index.ts +38 -0
- package/generated/entities/billing_invoice_line/index.ts +24 -0
- package/generated/entities/billing_item/index.ts +4 -0
- package/generated/entities/billing_payment/index.ts +25 -0
- package/generated/entities/billing_payment_import/index.ts +14 -0
- package/generated/entities/billing_run/index.ts +0 -1
- package/generated/entities/billing_run_outcome/index.ts +1 -0
- package/generated/entities/billing_settings/index.ts +26 -0
- package/generated/entities/billing_statement/index.ts +1 -0
- package/generated/entities.ids.generated.ts +7 -0
- package/package.json +5 -1
- package/src/modules/billing/__integration__/TC-BILL-004.spec.ts +171 -0
- package/src/modules/billing/__integration__/TC-BILL-005.spec.ts +134 -0
- package/src/modules/billing/__integration__/TC-BILL-006.spec.ts +101 -0
- package/src/modules/billing/__integration__/TC-BILL-007.spec.ts +140 -0
- package/src/modules/billing/__integration__/TC-BILL-008.spec.ts +108 -0
- package/src/modules/billing/__integration__/TC-BILL-009.spec.ts +113 -0
- package/src/modules/billing/__integration__/TC-BILL-010.spec.ts +118 -0
- package/src/modules/billing/__integration__/TC-BILL-011.spec.ts +142 -0
- package/src/modules/billing/__integration__/TC-BILL-012.spec.ts +115 -0
- package/src/modules/billing/__integration__/TC-BILL-013.spec.ts +118 -0
- package/src/modules/billing/__integration__/sellerSettings.ts +24 -0
- package/src/modules/billing/__tests__/commands/invoices.test.ts +436 -354
- package/src/modules/billing/__tests__/commands/itemsBulk.test.ts +33 -0
- package/src/modules/billing/__tests__/commands/memos.test.ts +205 -0
- package/src/modules/billing/__tests__/commands/payments.test.ts +241 -0
- package/src/modules/billing/__tests__/commands/runsDelete.test.ts +146 -0
- package/src/modules/billing/__tests__/commands/runsPostDrafts.test.ts +106 -0
- package/src/modules/billing/__tests__/commands/topups.test.ts +11 -0
- package/src/modules/billing/__tests__/entityRegistry.test.ts +8 -1
- package/src/modules/billing/__tests__/helpers/prepaidMockEm.ts +28 -11
- package/src/modules/billing/__tests__/i18n/dictionaries.test.ts +64 -0
- package/src/modules/billing/__tests__/lib/accountFinancials.test.ts +53 -0
- package/src/modules/billing/__tests__/lib/accountSummary.test.ts +97 -0
- package/src/modules/billing/__tests__/lib/allocation.test.ts +319 -0
- package/src/modules/billing/__tests__/lib/billRunEngine.test.ts +228 -17
- package/src/modules/billing/__tests__/lib/billingSettings.test.ts +109 -0
- package/src/modules/billing/__tests__/lib/customerLookup.test.ts +156 -0
- package/src/modules/billing/__tests__/lib/dueDate.test.ts +35 -0
- package/src/modules/billing/__tests__/lib/iban.test.ts +38 -0
- package/src/modules/billing/__tests__/lib/invoiceDelivery.test.ts +206 -0
- package/src/modules/billing/__tests__/lib/invoiceLanguages.test.ts +49 -0
- package/src/modules/billing/__tests__/lib/invoiceWriter.test.ts +212 -10
- package/src/modules/billing/__tests__/lib/itemBillingState.test.ts +42 -0
- package/src/modules/billing/__tests__/lib/itemPriceChange.test.ts +165 -0
- package/src/modules/billing/__tests__/lib/lineAmounts.test.ts +86 -0
- package/src/modules/billing/__tests__/lib/navigation.test.ts +71 -0
- package/src/modules/billing/__tests__/lib/numbering.test.ts +91 -0
- package/src/modules/billing/__tests__/lib/overdue.test.ts +36 -0
- package/src/modules/billing/__tests__/lib/paymentCsv.test.ts +148 -0
- package/src/modules/billing/__tests__/lib/paymentImport.test.ts +113 -0
- package/src/modules/billing/__tests__/lib/paymentsSample.test.ts +73 -0
- package/src/modules/billing/__tests__/lib/pdf/invoicePdf.test.ts +269 -0
- package/src/modules/billing/__tests__/lib/pdf/invoicePdfService.test.ts +147 -0
- package/src/modules/billing/__tests__/lib/prepaidPeriodClose.test.ts +374 -98
- package/src/modules/billing/__tests__/lib/prepaidTaxPoint.test.ts +118 -0
- package/src/modules/billing/__tests__/lib/seedsDemo.test.ts +53 -2
- package/src/modules/billing/__tests__/lib/sellerSettings.test.ts +28 -0
- package/src/modules/billing/__tests__/lib/servicePeriods.test.ts +190 -0
- package/src/modules/billing/__tests__/lib/topupCapture.test.ts +6 -28
- package/src/modules/billing/__tests__/lib/topupReceipt.test.ts +21 -52
- package/src/modules/billing/__tests__/lib/vat.test.ts +51 -0
- package/src/modules/billing/__tests__/package-isolation.test.ts +22 -8
- package/src/modules/billing/__tests__/setup.test.ts +13 -4
- package/src/modules/billing/__tests__/validators.test.ts +197 -3
- package/src/modules/billing/acl.ts +12 -0
- package/src/modules/billing/api/accounts/[id]/summary/route.ts +62 -0
- package/src/modules/billing/api/accounts/route.ts +59 -4
- package/src/modules/billing/api/export/account/[id]/route.ts +13 -11
- package/src/modules/billing/api/invoices/[id]/memos/route.ts +63 -0
- package/src/modules/billing/api/invoices/[id]/pdf/route.ts +80 -0
- package/src/modules/billing/api/invoices/[id]/route.ts +57 -70
- package/src/modules/billing/api/invoices/[id]/send/route.ts +127 -0
- package/src/modules/billing/api/invoices/add-line/route.ts +2 -2
- package/src/modules/billing/api/invoices/delete-draft/route.ts +33 -0
- package/src/modules/billing/api/invoices/edit-line/route.ts +2 -2
- package/src/modules/billing/api/invoices/post/route.ts +7 -6
- package/src/modules/billing/api/invoices/remove-line/route.ts +2 -2
- package/src/modules/billing/api/invoices/route.ts +81 -86
- package/src/modules/billing/api/items/bulk/route.ts +2 -1
- package/src/modules/billing/api/items/change-price/route.ts +54 -0
- package/src/modules/billing/api/items/route.ts +23 -7
- package/src/modules/billing/api/payment-imports/[id]/route.ts +49 -0
- package/src/modules/billing/api/payment-imports/route.ts +57 -0
- package/src/modules/billing/api/payments/[id]/route.ts +63 -0
- package/src/modules/billing/api/payments/allocate/route.ts +35 -0
- package/src/modules/billing/api/payments/assign/route.ts +36 -0
- package/src/modules/billing/api/payments/convert-to-topup/route.ts +35 -0
- package/src/modules/billing/api/payments/ignore/route.ts +35 -0
- package/src/modules/billing/api/payments/import/route.ts +72 -0
- package/src/modules/billing/api/payments/restore/route.ts +35 -0
- package/src/modules/billing/api/payments/route.ts +147 -0
- package/src/modules/billing/api/payments/unallocate/route.ts +35 -0
- package/src/modules/billing/api/payments/unassign/route.ts +35 -0
- package/src/modules/billing/api/run-outcomes/route.ts +49 -6
- package/src/modules/billing/api/runs/[id]/post-drafts/route.ts +71 -0
- package/src/modules/billing/api/runs/[id]/route.ts +59 -0
- package/src/modules/billing/api/runs/retry-failed/route.ts +2 -1
- package/src/modules/billing/api/runs/route.ts +15 -7
- package/src/modules/billing/api/settings/number-preview/route.ts +46 -0
- package/src/modules/billing/api/settings/route.ts +116 -0
- package/src/modules/billing/api/statements/route.ts +5 -0
- package/src/modules/billing/api/test-invoices/wipe/route.ts +2 -2
- package/src/modules/billing/backend/billing/accounts/[id]/page.tsx +151 -372
- package/src/modules/billing/backend/billing/accounts/create/page.tsx +6 -0
- package/src/modules/billing/backend/billing/accounts/page.tsx +70 -4
- package/src/modules/billing/backend/billing/invoices/[id]/page.tsx +444 -95
- package/src/modules/billing/backend/billing/invoices/page.tsx +8 -227
- package/src/modules/billing/backend/billing/items/[id]/page.tsx +75 -6
- package/src/modules/billing/backend/billing/items/create/page.tsx +13 -8
- package/src/modules/billing/backend/billing/items/page.tsx +18 -2
- package/src/modules/billing/backend/billing/payments/[id]/page.meta.ts +19 -0
- package/src/modules/billing/backend/billing/payments/[id]/page.tsx +415 -0
- package/src/modules/billing/backend/billing/payments/imports/[id]/page.meta.ts +19 -0
- package/src/modules/billing/backend/billing/payments/imports/[id]/page.tsx +106 -0
- package/src/modules/billing/backend/billing/payments/page.meta.ts +16 -0
- package/src/modules/billing/backend/billing/payments/page.tsx +56 -0
- package/src/modules/billing/backend/billing/runs/[id]/page.tsx +49 -18
- package/src/modules/billing/backend/billing/runs/page.tsx +59 -8
- package/src/modules/billing/backend/billing/statements/[id]/page.tsx +86 -5
- package/src/modules/billing/backend/billing/statements/page.tsx +1 -1
- package/src/modules/billing/backend/billing/topups/page.tsx +1 -1
- package/src/modules/billing/backend/billing/transactions/page.tsx +1 -1
- package/src/modules/billing/backend/billing/usage/create/page.tsx +3 -2
- package/src/modules/billing/backend/config/billing/page.meta.ts +21 -0
- package/src/modules/billing/backend/config/billing/page.tsx +549 -0
- package/src/modules/billing/cli.ts +31 -1
- package/src/modules/billing/commands/accounts.ts +6 -0
- package/src/modules/billing/commands/index.ts +3 -0
- package/src/modules/billing/commands/invoices.ts +364 -231
- package/src/modules/billing/commands/items.ts +143 -0
- package/src/modules/billing/commands/memos.ts +218 -0
- package/src/modules/billing/commands/payments.ts +428 -0
- package/src/modules/billing/commands/runs.ts +205 -3
- package/src/modules/billing/commands/settings.ts +77 -0
- package/src/modules/billing/commands/topups.ts +12 -3
- package/src/modules/billing/commands/transactions.ts +2 -2
- package/src/modules/billing/components/AccountForm.tsx +199 -53
- package/src/modules/billing/components/AccountInvoicesSection.tsx +75 -0
- package/src/modules/billing/components/AccountPaymentsSection.tsx +42 -0
- package/src/modules/billing/components/AccountPicker.tsx +70 -0
- package/src/modules/billing/components/AllocatePaymentDialog.tsx +167 -0
- package/src/modules/billing/components/BillingDataTable.tsx +34 -0
- package/src/modules/billing/components/BillingSettingsLink.tsx +25 -0
- package/src/modules/billing/components/ChangeItemPriceDialog.tsx +180 -0
- package/src/modules/billing/components/CreateMemoDialog.tsx +232 -0
- package/src/modules/billing/components/CustomerLabel.tsx +53 -0
- package/src/modules/billing/components/InvoicesTable.tsx +344 -0
- package/src/modules/billing/components/ItemForm.tsx +233 -44
- package/src/modules/billing/components/ItemPriceField.tsx +81 -0
- package/src/modules/billing/components/LineFormDialog.tsx +25 -1
- package/src/modules/billing/components/ManualPaymentDialog.tsx +140 -0
- package/src/modules/billing/components/MoneyInput.tsx +26 -0
- package/src/modules/billing/components/PaymentUploadDialog.tsx +148 -0
- package/src/modules/billing/components/PaymentsTable.tsx +213 -0
- package/src/modules/billing/components/PostRunDraftsButton.tsx +129 -0
- package/src/modules/billing/components/PrepaidPanel.tsx +19 -6
- package/src/modules/billing/components/RunCyclesSection.tsx +298 -0
- package/src/modules/billing/components/TestRunActions.tsx +152 -0
- package/src/modules/billing/components/account/AccountItemsTab.tsx +192 -0
- package/src/modules/billing/components/account/AccountRunBillingDialog.tsx +147 -0
- package/src/modules/billing/components/account/AccountRunsTab.tsx +201 -0
- package/src/modules/billing/components/account/AccountStatementsTab.tsx +120 -0
- package/src/modules/billing/components/account/AccountSummaryCards.tsx +153 -0
- package/src/modules/billing/components/account/AccountUsageTab.tsx +122 -0
- package/src/modules/billing/components/account/AccountView.tsx +101 -0
- package/src/modules/billing/components/account/accountRow.ts +70 -0
- package/src/modules/billing/components/customerNames.ts +62 -0
- package/src/modules/billing/data/entities.ts +656 -6
- package/src/modules/billing/data/entityIds.ts +9 -0
- package/src/modules/billing/data/validators.ts +388 -8
- package/src/modules/billing/events.ts +56 -3
- package/src/modules/billing/i18n/de.json +880 -0
- package/src/modules/billing/i18n/en.json +457 -21
- package/src/modules/billing/i18n/es.json +880 -0
- package/src/modules/billing/i18n/pl.json +458 -22
- package/src/modules/billing/index.ts +6 -2
- package/src/modules/billing/lib/accountFinancials.ts +84 -0
- package/src/modules/billing/lib/accountLock.ts +32 -0
- package/src/modules/billing/lib/accountStatus.ts +11 -9
- package/src/modules/billing/lib/accountSummary.ts +172 -0
- package/src/modules/billing/lib/allocation.ts +515 -0
- package/src/modules/billing/lib/allocationEvents.ts +26 -0
- package/src/modules/billing/lib/billPeriod.ts +19 -0
- package/src/modules/billing/lib/billRunEngine.ts +350 -150
- package/src/modules/billing/lib/billingSettings.ts +145 -0
- package/src/modules/billing/lib/commandRoute.ts +112 -0
- package/src/modules/billing/lib/customerLookup.ts +157 -0
- package/src/modules/billing/lib/dateOnly.ts +22 -0
- package/src/modules/billing/lib/documentParties.ts +23 -0
- package/src/modules/billing/lib/documentTypes.ts +37 -0
- package/src/modules/billing/lib/dueDate.ts +26 -0
- package/src/modules/billing/lib/iban.ts +36 -0
- package/src/modules/billing/lib/invoiceDelivery.ts +196 -0
- package/src/modules/billing/lib/invoiceLanguages.ts +57 -0
- package/src/modules/billing/lib/invoiceWriter.ts +162 -148
- package/src/modules/billing/lib/itemBillingState.ts +67 -0
- package/src/modules/billing/lib/itemPriceChange.ts +56 -0
- package/src/modules/billing/lib/itemSelector.ts +4 -1
- package/src/modules/billing/lib/lineAmounts.ts +61 -0
- package/src/modules/billing/lib/memoGuards.ts +41 -0
- package/src/modules/billing/lib/navigation.ts +64 -0
- package/src/modules/billing/lib/numbering.ts +174 -0
- package/src/modules/billing/lib/overdue.ts +60 -0
- package/src/modules/billing/lib/paymentCsv.ts +171 -0
- package/src/modules/billing/lib/paymentGateway.ts +52 -0
- package/src/modules/billing/lib/paymentImport.ts +228 -0
- package/src/modules/billing/lib/paymentMatcher.ts +88 -0
- package/src/modules/billing/lib/pdf/attachmentStore.ts +60 -0
- package/src/modules/billing/lib/pdf/fonts/NotoSans-Bold.ttf +0 -0
- package/src/modules/billing/lib/pdf/fonts/NotoSans-Regular.ttf +0 -0
- package/src/modules/billing/lib/pdf/fonts/OFL.txt +93 -0
- package/src/modules/billing/lib/pdf/fonts/embeddedFonts.ts +9 -0
- package/src/modules/billing/lib/pdf/invoiceModel.ts +329 -0
- package/src/modules/billing/lib/pdf/invoicePdf.ts +220 -0
- package/src/modules/billing/lib/pdf/invoiceTemplate.ts +338 -0
- package/src/modules/billing/lib/prepaidConfig.ts +27 -36
- package/src/modules/billing/lib/prepaidConsume.ts +29 -6
- package/src/modules/billing/lib/prepaidPeriodClose.ts +407 -239
- package/src/modules/billing/lib/prepaidTaxPoint.ts +76 -0
- package/src/modules/billing/lib/seeds/demo.ts +79 -6
- package/src/modules/billing/lib/seeds/paymentsSample.ts +136 -0
- package/src/modules/billing/lib/seeds/sellerSettings.ts +78 -0
- package/src/modules/billing/lib/servicePeriods.ts +226 -0
- package/src/modules/billing/lib/testRunCleanup.ts +42 -0
- package/src/modules/billing/lib/topupCapture.ts +3 -4
- package/src/modules/billing/lib/topupReceipt.ts +70 -103
- package/src/modules/billing/lib/usageRater.ts +1 -1
- package/src/modules/billing/lib/usageRunner.ts +17 -5
- package/src/modules/billing/lib/vat.ts +56 -0
- package/src/modules/billing/migrations/Migration20261114000000_billing_customer_kind.ts +25 -0
- package/src/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.ts +37 -0
- package/src/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.ts +132 -0
- package/src/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.ts +58 -0
- package/src/modules/billing/migrations/Migration20261117000000_billing_payments.ts +97 -0
- package/src/modules/billing/migrations/Migration20261118000000_billing_memos.ts +21 -0
- package/src/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.ts +39 -0
- package/src/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.ts +35 -0
- package/src/modules/billing/setup.ts +11 -237
- package/src/modules/billing/subscribers/credit-memo-auto-send.ts +15 -0
- package/src/modules/billing/subscribers/debit-memo-apply-credit.ts +15 -0
- package/src/modules/billing/subscribers/debit-memo-auto-send.ts +15 -0
- package/src/modules/billing/subscribers/invoice-apply-credit.ts +39 -0
- package/src/modules/billing/subscribers/invoice-auto-send.ts +46 -0
- package/src/modules/billing/subscribers/payment-captured-to-paid.ts +84 -62
- package/src/modules/billing/subscribers/prepaid-topup-captured.ts +4 -8
- package/dist/modules/billing/lib/invoiceStatus.js +0 -38
- package/dist/modules/billing/lib/invoiceStatus.js.map +0 -7
- package/src/modules/billing/__tests__/lib/invoiceStatus.test.ts +0 -97
- package/src/modules/billing/lib/invoiceStatus.ts +0 -61
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/billing/lib/pdf/fonts/embeddedFonts.ts"],
|
|
4
|
+
"sourcesContent": ["// GENERATED by scripts/embed-pdf-fonts.mjs \u2014 do not edit.\n// Noto Sans (subset: Latin, Latin-1, Latin Extended-A, punctuation, \u20AC).\n// Copyright 2022 The Noto Project Authors. SIL Open Font License 1.1 (OFL.txt).\n\nexport const NOTO_SANS_REGULAR_BASE64 =\n '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A6IADAJKAAQCNgAAAjwAJgFJAFABdAAKAUkAGQI8ACYBvP/+ARkAKAIxAC4CZwBVAeAANwJnADcCNAA3AVgADwJnADcCagBVAQIATgEC/8kCFgBVAQIAVQOnAFUCagBVAl0ANwJnAFUCZwA3AZ0AVQHfADMBaQAQAmoATwH8AAADEgALAhEAEgH+AAEB1gAnAXwAHAInAO8BfAAgAjwAMgEEAAABDQBIAjwAWwI8ACACPAA7AjwADgInAO8CAQA7AkQAlQNAADEBZQAgAf0AKAI8ADIBQgAoA0AAMQH0//0BrAA3AjwAMgFeABgBXgARARkAKAJvAFUCjwA3AQwASADhAA4BXgAlAXgAIAH9ACcC6QAiAwMAFgMNAA8BsgAYAn8AAAJ/AAACfwAAAn8AAAJ/AAACfwAAA3H//wJ4AD0CLABhAiwAYQIsAGECLABhAVMAKAFTACgBUwABAVMAHgLaAB4C+ABhAw0APQMNAD0DDQA9Aw0APQMNAD0CPABAAw0APQLbAFoC2wBaAtsAWgLbAFoCNgAAAl0AYQJ3AFUCMQAuAjEALgIxAC4CMQAuAjEALgIxAC4DYAAuAeAANwI0ADcCNAA3AjQANwI0ADcBAv//AQIATAEC/9gBAv/1Al0ANwJqAFUCXQA3Al0ANwJdADcCXQA3Al0ANwI8ADICXQA3AmoATwJqAE8CagBPAmoATwH+AAECZwBVAf4AAQJ/AAACMQAuAn8AAAIxAC4CfwAAAjEALgJ4AD0B4AA3AngAPQHgADcCeAA9AeAANwJ4AD0B4AA3AtoAYQJnADcC2gAeAmkANwIsAGECNAA3AiwAYQI0ADcCLABhAjQANwIsAGECNAA3AiwAYQI0ADcC2AA9AmcANwLYAD0CZwA3AtgAPQJnADcC2AA9AmcANwLlAGECav/ZAuUAAAJqAAkBU//zAQL/ygFTABUBAv/sAVMADgEC/+UBUwAoAQIAGwFTACgCZAAoAgQATgER/7IBAv/JAmsAYQIWAFUCFgBVAgwAVwECAEwCDABhAQIAQQIMAGEBAgBVAgwAYQEMAFUCDAANAQL/9wL4AGECagBVAvgAYQJqAFUC+ABhAmoAVQKwAAEC+ABhAmoAVQMNAD0CXQA3Aw0APQJdADcDDQA9Al0ANwOgAD0DsgA2Am4AYQGdAFUCbgBhAZ0APgJuAGEBnQBH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AAAAAAAAAAAAAAAAAAAAMgAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAA/+wAAAAAAAD/9gAAAAD/4v/sAAD/7AAAAAAAAAAAAAAAAP+wAAAAAAAAAAAAAAAAAAAAAP/s//b/9v/s/9gAAAAAAAAAAAAAAAAAAP/O//b/9gAAAAAAAAAAAAAAAAAAAAD/4v/2AAAAAP/EAAD/4v/Y/7oAAAAAAAAACgAUAAAAFAAA/+L/4gAAAAAAAAAAAAAAAP+wAAAAAAAAAAAAAP+6/+z/zv+w/7oAAP/sAAAAAAAAAAAAFP/E/7r/xAAAAAD/2AAA/9gAAAAAAAD/xP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAA/84AAAAAAAD/7AAAAAD/xP/EAAD/ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAP/sAAAAAAAAAAAAAAAAAAAAAP9g//YAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/84AAAAAAAAAAAAAAAAAAP9+AAAAAAAA//YAAAAAAAAAAP/iAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAAWgAAAAAAAAAAAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAA8AAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4v/2AAD/4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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'\n\nexport const NOTO_SANS_BOLD_BASE64 =\n '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AnIAAAJDABgBSwBGAZ8ABgFLABkCPAAXAZv//gFtACgCVwAoAngASQIEAC8CeAAvAlUALwGDABQCeAAvAooASQErAEQBKv/LAmwATgEqAEkDzwBJAooASQJxAC8CeABJAngALwG/AEkB9gAuAbIAFwKKAEYCOwAAA1gACgJCAAUCOwAAAe0AHgGKAA8CJwDeAYoAKAI8ACsBBAAAAR4AOQI8AEYCPAAoAjgANAI8AAMCJwDeAeYANAJRAH0DQAAxAX0AGwJmACYCPAArAUAAHANAADEB9P/9AagAKAI8ACsBewAXAXwAGgFtACgCjQBJAogANAEZADYBBwATAXwAIAGCABsCZgAmAz4AFgNqABYDTQAsAd0AFAK0AAACtAAAArQAAAK0AAACtAAAArQAAAO4AAACggA3AjAAWgIwAFoCMABaAjAAWgGFAAsBhQAgAYX/9gGFABAC3AAVAyUAWgMXADcDFwA3AxcANwMXADcDFwA3AjwAPwMXADcC9ABVAvQAVQL0AFUC9ABVAnIAAAJ0AFoCwABJAlcAKAJXACgCVwAoAlcAKAJXACgCVwAoA5UAKgIEAC8CVQAvAlUALwJVAC8CVQAvASv//AErAEUBK//NASv/5QJzADACigBJAnEALwJxAC8CcQAvAnEALwJxAC8CPAArAmsALQKKAEYCigBGAooARgKKAEYCOwAAAngASQI7AAACtAAAAlcAKAK0AAACVwAoArQAAAJXACgCggA3AgQALwKCADcCBAAvAoIANwIEAC8CggA3AgQALwLcAFUCeAAvAtwAFQKFAC8CMABaAlUALwIwAFoCVQAvAjAAWgJVAC8CMABaAk8ALwIwAFoCVQAvAtQAOgJ4AC8C1AA6AngALwLUADoCeAAvAtQAOgJ4AC8C/QBaAor/zgL+AAACkQACAYX/3gEr/9EBhQAcASv/8AGFAAsBK//gAYUAIAErACkBhQAgAtIAIAJiAEQBS/+2ASr/ywKUAFoCbABOAmwATgIvAE0BKgBEAi8AVQEqAEECLwBVASoASQIvAFUBcQBJAjUAAQEx//QDJQBaAooASQMlAFoCigBJAyUAWgKKAEkDB//9Ay0AWgKKAEkDFwA3AnEALwMXADcCcQAvAxcANwJxAC8DzQA6A9IALQKQAFUBvwBJApAAVQG/AEECkABVAb8ALgInAC4B9gAu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AAAAAAAAADIAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAP/sAAAAAAAA//YAAAAA/+L/7AAA/+wAAAAAAAAAAAAAAAD/sAAAAAAAAAAAAAAAAAAAAAD/7P/2//b/7P/YAAAAAAAAAAAAAAAAAAD/zv/2//YAAAAAAAAAAAAAAAAAAAAA/+L/9gAAAAD/xAAA/+L/2P+6AAAAAAAAAAoAFAAAABQAAP/i/+IAAAAAAAAAAAAAAAD/sAAAAAAAAAAAAAD/uv/s/87/sP+6AAD/7AAAAAAAAAAAABT/xP+6/8QAAAAA/9gAAP/YAAAAAAAA/8T/4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAP/OAAAAAAAA/+wAAAAA/8T/xAAA/7oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAD/7AAAAAAAAAAAAAAAAAAAAAD/YP/2AAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/OAAAAAAAAAAAAAAAAAAD/fgAAAAAAAP/2AAAAAAAAAAD/4gAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAaQAAAJEAAAAAAAAAAABdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAPAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+L/9gAA/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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'\n"],
|
|
5
|
+
"mappings": "AAIO,MAAM,2BACX;AAEK,MAAM,wBACX;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { invoiceIntlLocale } from "../invoiceLanguages.js";
|
|
2
|
+
function documentLocale(language) {
|
|
3
|
+
return invoiceIntlLocale(language);
|
|
4
|
+
}
|
|
5
|
+
function toDate(value) {
|
|
6
|
+
if (!value) return null;
|
|
7
|
+
const date = typeof value === "string" ? new Date(value.length === 10 ? `${value}T00:00:00Z` : value) : value;
|
|
8
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
9
|
+
}
|
|
10
|
+
function formatDocumentDate(value, locale) {
|
|
11
|
+
const date = toDate(value);
|
|
12
|
+
if (!date) return "\u2014";
|
|
13
|
+
return new Intl.DateTimeFormat(locale, { year: "numeric", month: "2-digit", day: "2-digit", timeZone: "UTC" }).format(
|
|
14
|
+
date
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
function formatDocumentMoney(value, currency, locale) {
|
|
18
|
+
const n = typeof value === "number" ? value : Number.parseFloat(value);
|
|
19
|
+
const safe = Number.isFinite(n) ? n : 0;
|
|
20
|
+
try {
|
|
21
|
+
return new Intl.NumberFormat(locale, { style: "currency", currency, minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(safe);
|
|
22
|
+
} catch {
|
|
23
|
+
return `${safe.toFixed(2)} ${currency}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function formatNumber(value, locale, maxFraction = 4) {
|
|
27
|
+
const n = typeof value === "number" ? value : Number.parseFloat(value);
|
|
28
|
+
return new Intl.NumberFormat(locale, { minimumFractionDigits: 0, maximumFractionDigits: maxFraction }).format(
|
|
29
|
+
Number.isFinite(n) ? n : 0
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
function formatPercent(rate, locale) {
|
|
33
|
+
return `${formatNumber(rate, locale, 2)} %`;
|
|
34
|
+
}
|
|
35
|
+
function plain(text) {
|
|
36
|
+
return text.replace(/[ ]/g, " ");
|
|
37
|
+
}
|
|
38
|
+
function addressLines(address) {
|
|
39
|
+
if (!address) return [];
|
|
40
|
+
const cityLine = [address.postal_code, address.city].filter(Boolean).join(" ");
|
|
41
|
+
return [address.line1, address.line2, cityLine, address.country].filter(
|
|
42
|
+
(part) => typeof part === "string" && part.trim() !== ""
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
function titleFor(doc, t) {
|
|
46
|
+
switch (doc.documentType) {
|
|
47
|
+
case "credit_memo":
|
|
48
|
+
return t("billing.pdf.title.credit_memo", "Credit memo");
|
|
49
|
+
case "debit_memo":
|
|
50
|
+
return t("billing.pdf.title.debit_memo", "Debit memo");
|
|
51
|
+
case "receipt":
|
|
52
|
+
return t("billing.pdf.title.receipt", "Receipt");
|
|
53
|
+
default:
|
|
54
|
+
return t("billing.pdf.title.invoice", "VAT invoice");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function buildInvoiceDocumentModel(params) {
|
|
58
|
+
const { invoice, lines, seller, buyer, translate: t } = params;
|
|
59
|
+
const locale = documentLocale(params.language);
|
|
60
|
+
const money = (value) => plain(formatDocumentMoney(value, invoice.currencyCode, locale));
|
|
61
|
+
const date = (value) => plain(formatDocumentDate(value, locale));
|
|
62
|
+
const isDraft = invoice.status === "draft";
|
|
63
|
+
const meta = [
|
|
64
|
+
[t("billing.pdf.meta.number", "Number"), invoice.number],
|
|
65
|
+
[t("billing.pdf.meta.issue_date", "Issue date"), isDraft ? "\u2014" : date(invoice.issueDate)]
|
|
66
|
+
];
|
|
67
|
+
if (invoice.documentType !== "receipt") {
|
|
68
|
+
meta.push([t("billing.pdf.meta.due_date", "Due date"), isDraft ? "\u2014" : date(invoice.dueDate)]);
|
|
69
|
+
}
|
|
70
|
+
if (invoice.periodStart && invoice.periodEnd) {
|
|
71
|
+
meta.push([
|
|
72
|
+
t("billing.pdf.meta.service_period", "Service period"),
|
|
73
|
+
`${date(invoice.periodStart)} \u2013 ${date(invoice.periodEnd)}`
|
|
74
|
+
]);
|
|
75
|
+
}
|
|
76
|
+
if (invoice.correctsNumber) {
|
|
77
|
+
meta.push([
|
|
78
|
+
t("billing.pdf.meta.corrects", "Corrects"),
|
|
79
|
+
invoice.correctsIssueDate ? `${invoice.correctsNumber} ${t("billing.pdf.meta.of", "of")} ${date(invoice.correctsIssueDate)}` : invoice.correctsNumber
|
|
80
|
+
]);
|
|
81
|
+
}
|
|
82
|
+
if (invoice.correctionReason) {
|
|
83
|
+
meta.push([t("billing.pdf.meta.reason", "Reason"), invoice.correctionReason]);
|
|
84
|
+
}
|
|
85
|
+
const sellerLines = [
|
|
86
|
+
seller.legalName ?? "",
|
|
87
|
+
...addressLines(seller.address),
|
|
88
|
+
seller.taxId ? `${t("billing.pdf.tax_id", "Tax ID")}: ${seller.taxId}` : ""
|
|
89
|
+
].filter((line) => line !== "");
|
|
90
|
+
const buyerLines = [
|
|
91
|
+
buyer.name,
|
|
92
|
+
...addressLines(buyer.address),
|
|
93
|
+
buyer.taxId ? `${t("billing.pdf.tax_id", "Tax ID")}: ${buyer.taxId}` : ""
|
|
94
|
+
].filter((line) => line !== "");
|
|
95
|
+
const rows = lines.map((line, index) => {
|
|
96
|
+
const start = line.servicePeriodStart;
|
|
97
|
+
const end = line.servicePeriodEnd;
|
|
98
|
+
const description = start && end && !line.description.includes(" \u2013 ") ? `${line.description} (${date(start)} \u2013 ${date(end)})` : line.description;
|
|
99
|
+
return [
|
|
100
|
+
String(index + 1),
|
|
101
|
+
description,
|
|
102
|
+
plain(formatNumber(line.quantity, locale)),
|
|
103
|
+
money(line.unitPriceNet),
|
|
104
|
+
plain(formatPercent(line.taxRate, locale)),
|
|
105
|
+
money(line.netAmount),
|
|
106
|
+
money(line.taxAmount),
|
|
107
|
+
money(line.grossAmount)
|
|
108
|
+
];
|
|
109
|
+
});
|
|
110
|
+
const byRate = /* @__PURE__ */ new Map();
|
|
111
|
+
for (const line of lines) {
|
|
112
|
+
const rate = Number.parseFloat(line.taxRate) || 0;
|
|
113
|
+
const bucket = byRate.get(rate) ?? { net: 0, tax: 0, gross: 0 };
|
|
114
|
+
bucket.net += Number.parseFloat(line.netAmount) || 0;
|
|
115
|
+
bucket.tax += Number.parseFloat(line.taxAmount) || 0;
|
|
116
|
+
bucket.gross += Number.parseFloat(line.grossAmount) || 0;
|
|
117
|
+
byRate.set(rate, bucket);
|
|
118
|
+
}
|
|
119
|
+
const vatRows = [...byRate.entries()].sort(([a], [b]) => b - a).map(([rate, sums]) => [plain(formatPercent(rate, locale)), money(sums.net), money(sums.tax), money(sums.gross)]);
|
|
120
|
+
const isCredit = invoice.documentType === "credit_memo";
|
|
121
|
+
const totals = [
|
|
122
|
+
[t("billing.pdf.totals.net", "Total net"), money(invoice.subtotalNet)],
|
|
123
|
+
[t("billing.pdf.totals.tax", "Total VAT"), money(invoice.taxTotal)],
|
|
124
|
+
isCredit ? [t("billing.pdf.totals.credited", "Total credited"), money(invoice.totalGross)] : [t("billing.pdf.totals.gross", "Total due"), money(invoice.totalGross)]
|
|
125
|
+
];
|
|
126
|
+
const payable = invoice.documentType === "invoice" || invoice.documentType === "debit_memo";
|
|
127
|
+
const payment = payable && seller.iban ? {
|
|
128
|
+
heading: t("billing.pdf.payment.heading", "Payment"),
|
|
129
|
+
lines: [
|
|
130
|
+
`${t("billing.pdf.payment.amount", "Amount")}: ${money(invoice.totalGross)}`,
|
|
131
|
+
`${t("billing.pdf.payment.due", "Due by")}: ${isDraft ? "\u2014" : date(invoice.dueDate)}`,
|
|
132
|
+
seller.bankName ? `${t("billing.pdf.payment.bank", "Bank")}: ${seller.bankName}` : "",
|
|
133
|
+
`IBAN: ${seller.iban.replace(/(.{4})/g, "$1 ").trim()}`,
|
|
134
|
+
seller.bic ? `BIC: ${seller.bic}` : "",
|
|
135
|
+
// Spec C's matcher finds the invoice number in the transfer title.
|
|
136
|
+
`${t("billing.pdf.payment.title", "Transfer title")}: ${invoice.number}`
|
|
137
|
+
].filter((line) => line !== "")
|
|
138
|
+
} : isCredit ? {
|
|
139
|
+
// A credit memo is not paid: it settles the corrected invoice and
|
|
140
|
+
// any remainder stays as credit on the customer's account (D-D10).
|
|
141
|
+
heading: t("billing.pdf.memo.settlement", "Settlement"),
|
|
142
|
+
lines: [
|
|
143
|
+
`${t("billing.pdf.memo.amount_credited", "Amount credited")}: ${money(invoice.totalGross)}`,
|
|
144
|
+
invoice.correctsNumber ? t("billing.pdf.memo.settled_against", "Settled against invoice {number}; any remainder is credited to your account.").replace(
|
|
145
|
+
"{number}",
|
|
146
|
+
invoice.correctsNumber
|
|
147
|
+
) : t("billing.pdf.memo.credited_to_account", "The amount is credited to your account.")
|
|
148
|
+
]
|
|
149
|
+
} : null;
|
|
150
|
+
return {
|
|
151
|
+
language: params.language,
|
|
152
|
+
title: titleFor(invoice, t),
|
|
153
|
+
number: invoice.number,
|
|
154
|
+
watermark: invoice.testRun ? t("billing.pdf.watermark.test", "TEST") : isDraft ? t("billing.pdf.watermark.draft", "DRAFT") : null,
|
|
155
|
+
meta,
|
|
156
|
+
seller: { heading: t("billing.pdf.seller", "Seller"), lines: sellerLines },
|
|
157
|
+
buyer: { heading: t("billing.pdf.buyer", "Buyer"), lines: buyerLines },
|
|
158
|
+
table: {
|
|
159
|
+
headers: [
|
|
160
|
+
"#",
|
|
161
|
+
t("billing.pdf.columns.description", "Description"),
|
|
162
|
+
t("billing.pdf.columns.quantity", "Qty"),
|
|
163
|
+
t("billing.pdf.columns.unit_net", "Unit net"),
|
|
164
|
+
t("billing.pdf.columns.tax_rate", "VAT %"),
|
|
165
|
+
t("billing.pdf.columns.net", "Net"),
|
|
166
|
+
t("billing.pdf.columns.tax", "VAT"),
|
|
167
|
+
t("billing.pdf.columns.gross", "Gross")
|
|
168
|
+
],
|
|
169
|
+
align: ["right", "left", "right", "right", "right", "right", "right", "right"],
|
|
170
|
+
rows
|
|
171
|
+
},
|
|
172
|
+
vatSummary: {
|
|
173
|
+
heading: t("billing.pdf.vat_summary", "VAT summary"),
|
|
174
|
+
headers: [
|
|
175
|
+
t("billing.pdf.columns.tax_rate", "VAT %"),
|
|
176
|
+
t("billing.pdf.columns.net", "Net"),
|
|
177
|
+
t("billing.pdf.columns.tax", "VAT"),
|
|
178
|
+
t("billing.pdf.columns.gross", "Gross")
|
|
179
|
+
],
|
|
180
|
+
rows: vatRows
|
|
181
|
+
},
|
|
182
|
+
totals,
|
|
183
|
+
payment,
|
|
184
|
+
footer: (seller.footer ?? "").split(/\r?\n/).map((line) => line.trim()).filter(Boolean),
|
|
185
|
+
pageLabel: (page, pages) => t("billing.pdf.page", "Page {page} of {pages}").replace("{page}", String(page)).replace("{pages}", String(pages))
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
export {
|
|
189
|
+
buildInvoiceDocumentModel,
|
|
190
|
+
documentLocale,
|
|
191
|
+
formatDocumentDate,
|
|
192
|
+
formatDocumentMoney
|
|
193
|
+
};
|
|
194
|
+
//# sourceMappingURL=invoiceModel.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/billing/lib/pdf/invoiceModel.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Invoice document model (Spec B) \u2014 pure.\n *\n * Turns a billing document + its lines + the frozen seller / buyer blocks\n * into the exact strings the PDF prints, in the document language. The\n * renderer (`invoiceTemplate.ts`) only lays this model out, so everything a\n * reader can check (labels, formatting, VAT summary, payment title) is\n * asserted here without parsing a PDF. Same shape as core forms'\n * \"build model, then lay out with pdf-lib\" snapshot pipeline.\n *\n * Credit / debit memos (Spec D) reuse it: only the title changes and a\n * \"corrects\" row is added to the header.\n */\n\nimport { invoiceIntlLocale } from '../invoiceLanguages'\n\nexport type DocumentTranslate =(key: string, fallback: string) => string\n\nexport type PdfAddress = {\n line1?: string | null\n line2?: string | null\n city?: string | null\n postal_code?: string | null\n country?: string | null\n}\n\nexport type PdfSeller = {\n legalName: string | null\n address: PdfAddress | null\n taxId: string | null\n bankName: string | null\n iban: string | null\n bic: string | null\n footer: string | null\n}\n\nexport type PdfBuyer = {\n name: string\n address: PdfAddress | null\n taxId: string | null\n}\n\nexport type PdfInvoice = {\n number: string\n documentType: 'invoice' | 'credit_memo' | 'debit_memo' | 'receipt'\n status: string\n testRun: boolean\n issueDate: Date | string | null\n dueDate: Date | string | null\n billDate: Date | string | null\n periodStart: Date | string | null\n periodEnd: Date | string | null\n currencyCode: string\n subtotalNet: string\n taxTotal: string\n totalGross: string\n correctsNumber?: string | null\n /** Spec D: issue date of the corrected document and the correction reason. */\n correctsIssueDate?: Date | string | null\n correctionReason?: string | null\n}\n\nexport type PdfLine = {\n description: string\n quantity: string\n unitPriceNet: string\n taxRate: string\n netAmount: string\n taxAmount: string\n grossAmount: string\n servicePeriodStart: Date | string | null\n servicePeriodEnd: Date | string | null\n}\n\nexport type InvoiceDocumentModel = {\n language: string\n title: string\n number: string\n watermark: string | null\n meta: Array<[string, string]>\n seller: { heading: string; lines: string[] }\n buyer: { heading: string; lines: string[] }\n table: {\n headers: string[]\n /** Column alignment: description left, numbers right. */\n align: Array<'left' | 'right'>\n rows: string[][]\n }\n vatSummary: { heading: string; headers: string[]; rows: string[][] }\n totals: Array<[string, string]>\n payment: { heading: string; lines: string[] } | null\n footer: string[]\n pageLabel: (page: number, pages: number) => string\n}\n\n/** `Intl` locale for a document language \u2014 derived from the language registry. */\nexport function documentLocale(language: string): string {\n return invoiceIntlLocale(language)\n}\n\nfunction toDate(value: Date | string | null | undefined): Date | null {\n if (!value) return null\n const date = typeof value === 'string' ? new Date(value.length === 10 ? `${value}T00:00:00Z` : value) : value\n return Number.isNaN(date.getTime()) ? null : date\n}\n\nexport function formatDocumentDate(value: Date | string | null | undefined, locale: string): string {\n const date = toDate(value)\n if (!date) return '\u2014'\n return new Intl.DateTimeFormat(locale, { year: 'numeric', month: '2-digit', day: '2-digit', timeZone: 'UTC' }).format(\n date,\n )\n}\n\nexport function formatDocumentMoney(value: string | number, currency: string, locale: string): string {\n const n = typeof value === 'number' ? value : Number.parseFloat(value)\n const safe = Number.isFinite(n) ? n : 0\n try {\n return new Intl.NumberFormat(locale, { style: 'currency', currency, minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(safe)\n } catch {\n return `${safe.toFixed(2)} ${currency}`\n }\n}\n\nfunction formatNumber(value: string | number, locale: string, maxFraction = 4): string {\n const n = typeof value === 'number' ? value : Number.parseFloat(value)\n return new Intl.NumberFormat(locale, { minimumFractionDigits: 0, maximumFractionDigits: maxFraction }).format(\n Number.isFinite(n) ? n : 0,\n )\n}\n\nfunction formatPercent(rate: string | number, locale: string): string {\n return `${formatNumber(rate, locale, 2)} %`\n}\n\n/** Normalizes Intl's narrow / regular no-break spaces to plain ones (safe for any embedded font). */\nfunction plain(text: string): string {\n return text.replace(/[\u00A0\u202F]/g, ' ')\n}\n\nfunction addressLines(address: PdfAddress | null | undefined): string[] {\n if (!address) return []\n const cityLine = [address.postal_code, address.city].filter(Boolean).join(' ')\n return [address.line1, address.line2, cityLine, address.country].filter(\n (part): part is string => typeof part === 'string' && part.trim() !== '',\n )\n}\n\nfunction titleFor(doc: PdfInvoice, t: DocumentTranslate): string {\n switch (doc.documentType) {\n case 'credit_memo':\n return t('billing.pdf.title.credit_memo', 'Credit memo')\n case 'debit_memo':\n return t('billing.pdf.title.debit_memo', 'Debit memo')\n case 'receipt':\n return t('billing.pdf.title.receipt', 'Receipt')\n default:\n return t('billing.pdf.title.invoice', 'VAT invoice')\n }\n}\n\nexport function buildInvoiceDocumentModel(params: {\n invoice: PdfInvoice\n lines: PdfLine[]\n seller: PdfSeller\n buyer: PdfBuyer\n language: string\n translate: DocumentTranslate\n}): InvoiceDocumentModel {\n const { invoice, lines, seller, buyer, translate: t } = params\n const locale = documentLocale(params.language)\n const money = (value: string | number) => plain(formatDocumentMoney(value, invoice.currencyCode, locale))\n const date = (value: Date | string | null | undefined) => plain(formatDocumentDate(value, locale))\n const isDraft = invoice.status === 'draft'\n\n const meta: Array<[string, string]> = [\n [t('billing.pdf.meta.number', 'Number'), invoice.number],\n [t('billing.pdf.meta.issue_date', 'Issue date'), isDraft ? '\u2014' : date(invoice.issueDate)],\n ]\n if (invoice.documentType !== 'receipt') {\n meta.push([t('billing.pdf.meta.due_date', 'Due date'), isDraft ? '\u2014' : date(invoice.dueDate)])\n }\n if (invoice.periodStart && invoice.periodEnd) {\n meta.push([\n t('billing.pdf.meta.service_period', 'Service period'),\n `${date(invoice.periodStart)} \u2013 ${date(invoice.periodEnd)}`,\n ])\n }\n if (invoice.correctsNumber) {\n meta.push([\n t('billing.pdf.meta.corrects', 'Corrects'),\n invoice.correctsIssueDate\n ? `${invoice.correctsNumber} ${t('billing.pdf.meta.of', 'of')} ${date(invoice.correctsIssueDate)}`\n : invoice.correctsNumber,\n ])\n }\n if (invoice.correctionReason) {\n meta.push([t('billing.pdf.meta.reason', 'Reason'), invoice.correctionReason])\n }\n\n const sellerLines = [\n seller.legalName ?? '',\n ...addressLines(seller.address),\n seller.taxId ? `${t('billing.pdf.tax_id', 'Tax ID')}: ${seller.taxId}` : '',\n ].filter((line) => line !== '')\n const buyerLines = [\n buyer.name,\n ...addressLines(buyer.address),\n buyer.taxId ? `${t('billing.pdf.tax_id', 'Tax ID')}: ${buyer.taxId}` : '',\n ].filter((line) => line !== '')\n\n const rows = lines.map((line, index) => {\n const start = line.servicePeriodStart\n const end = line.servicePeriodEnd\n const description =\n start && end && !line.description.includes(' \u2013 ')\n ? `${line.description} (${date(start)} \u2013 ${date(end)})`\n : line.description\n return [\n String(index + 1),\n description,\n plain(formatNumber(line.quantity, locale)),\n money(line.unitPriceNet),\n plain(formatPercent(line.taxRate, locale)),\n money(line.netAmount),\n money(line.taxAmount),\n money(line.grossAmount),\n ]\n })\n\n // VAT summary: sums of the (already rounded) line amounts per rate, so the\n // summary always adds up to the document totals (B-D2).\n const byRate = new Map<number, { net: number; tax: number; gross: number }>()\n for (const line of lines) {\n const rate = Number.parseFloat(line.taxRate) || 0\n const bucket = byRate.get(rate) ?? { net: 0, tax: 0, gross: 0 }\n bucket.net += Number.parseFloat(line.netAmount) || 0\n bucket.tax += Number.parseFloat(line.taxAmount) || 0\n bucket.gross += Number.parseFloat(line.grossAmount) || 0\n byRate.set(rate, bucket)\n }\n const vatRows = [...byRate.entries()]\n .sort(([a], [b]) => b - a)\n .map(([rate, sums]) => [plain(formatPercent(rate, locale)), money(sums.net), money(sums.tax), money(sums.gross)])\n\n const isCredit = invoice.documentType === 'credit_memo'\n const totals: Array<[string, string]> = [\n [t('billing.pdf.totals.net', 'Total net'), money(invoice.subtotalNet)],\n [t('billing.pdf.totals.tax', 'Total VAT'), money(invoice.taxTotal)],\n isCredit\n ? [t('billing.pdf.totals.credited', 'Total credited'), money(invoice.totalGross)]\n : [t('billing.pdf.totals.gross', 'Total due'), money(invoice.totalGross)],\n ]\n\n const payable = invoice.documentType === 'invoice' || invoice.documentType === 'debit_memo'\n const payment =\n payable && seller.iban\n ? {\n heading: t('billing.pdf.payment.heading', 'Payment'),\n lines: [\n `${t('billing.pdf.payment.amount', 'Amount')}: ${money(invoice.totalGross)}`,\n `${t('billing.pdf.payment.due', 'Due by')}: ${isDraft ? '\u2014' : date(invoice.dueDate)}`,\n seller.bankName ? `${t('billing.pdf.payment.bank', 'Bank')}: ${seller.bankName}` : '',\n `IBAN: ${seller.iban.replace(/(.{4})/g, '$1 ').trim()}`,\n seller.bic ? `BIC: ${seller.bic}` : '',\n // Spec C's matcher finds the invoice number in the transfer title.\n `${t('billing.pdf.payment.title', 'Transfer title')}: ${invoice.number}`,\n ].filter((line) => line !== ''),\n }\n : isCredit\n ? {\n // A credit memo is not paid: it settles the corrected invoice and\n // any remainder stays as credit on the customer's account (D-D10).\n heading: t('billing.pdf.memo.settlement', 'Settlement'),\n lines: [\n `${t('billing.pdf.memo.amount_credited', 'Amount credited')}: ${money(invoice.totalGross)}`,\n invoice.correctsNumber\n ? t('billing.pdf.memo.settled_against', 'Settled against invoice {number}; any remainder is credited to your account.').replace(\n '{number}',\n invoice.correctsNumber,\n )\n : t('billing.pdf.memo.credited_to_account', 'The amount is credited to your account.'),\n ],\n }\n : null\n\n return {\n language: params.language,\n title: titleFor(invoice, t),\n number: invoice.number,\n watermark: invoice.testRun\n ? t('billing.pdf.watermark.test', 'TEST')\n : isDraft\n ? t('billing.pdf.watermark.draft', 'DRAFT')\n : null,\n meta,\n seller: { heading: t('billing.pdf.seller', 'Seller'), lines: sellerLines },\n buyer: { heading: t('billing.pdf.buyer', 'Buyer'), lines: buyerLines },\n table: {\n headers: [\n '#',\n t('billing.pdf.columns.description', 'Description'),\n t('billing.pdf.columns.quantity', 'Qty'),\n t('billing.pdf.columns.unit_net', 'Unit net'),\n t('billing.pdf.columns.tax_rate', 'VAT %'),\n t('billing.pdf.columns.net', 'Net'),\n t('billing.pdf.columns.tax', 'VAT'),\n t('billing.pdf.columns.gross', 'Gross'),\n ],\n align: ['right', 'left', 'right', 'right', 'right', 'right', 'right', 'right'],\n rows,\n },\n vatSummary: {\n heading: t('billing.pdf.vat_summary', 'VAT summary'),\n headers: [\n t('billing.pdf.columns.tax_rate', 'VAT %'),\n t('billing.pdf.columns.net', 'Net'),\n t('billing.pdf.columns.tax', 'VAT'),\n t('billing.pdf.columns.gross', 'Gross'),\n ],\n rows: vatRows,\n },\n totals,\n payment,\n footer: (seller.footer ?? '').split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean),\n pageLabel: (page, pages) =>\n t('billing.pdf.page', 'Page {page} of {pages}').replace('{page}', String(page)).replace('{pages}', String(pages)),\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { BillingAccount, BillingInvoice, BillingInvoiceLine } from "../../data/entities.js";
|
|
2
|
+
import { billingEntityIds } from "../../data/entityIds.js";
|
|
3
|
+
import { buildSellerSnapshot, getBillingSettings } from "../billingSettings.js";
|
|
4
|
+
import { buildBuyerSnapshot } from "../documentParties.js";
|
|
5
|
+
import { resolveInvoiceLanguage } from "../invoiceLanguages.js";
|
|
6
|
+
import { buildInvoiceDocumentModel } from "./invoiceModel.js";
|
|
7
|
+
import { renderInvoicePdf } from "./invoiceTemplate.js";
|
|
8
|
+
import { attachmentIdFromUrl, readAttachment, storeAttachment } from "./attachmentStore.js";
|
|
9
|
+
const loadDocumentTranslator = async (language) => {
|
|
10
|
+
const { loadDictionary } = await import("@open-mercato/shared/lib/i18n/server");
|
|
11
|
+
const { createFallbackTranslator } = await import("@open-mercato/shared/lib/i18n/translate");
|
|
12
|
+
const locale = resolveInvoiceLanguage(language);
|
|
13
|
+
const translate = createFallbackTranslator(await loadDictionary(locale));
|
|
14
|
+
return (key, fallback) => translate(key, fallback);
|
|
15
|
+
};
|
|
16
|
+
function str(value) {
|
|
17
|
+
return typeof value === "string" && value.trim() !== "" ? value : null;
|
|
18
|
+
}
|
|
19
|
+
function address(value) {
|
|
20
|
+
return value && typeof value === "object" ? value : null;
|
|
21
|
+
}
|
|
22
|
+
function pdfFileName(invoice) {
|
|
23
|
+
return `${invoice.number.replace(/[^A-Za-z0-9._-]+/g, "-")}.pdf`;
|
|
24
|
+
}
|
|
25
|
+
function isFrozenDocument(invoice) {
|
|
26
|
+
return invoice.status !== "draft" && !invoice.testRun;
|
|
27
|
+
}
|
|
28
|
+
async function resolveParties(em, invoice) {
|
|
29
|
+
const scope = { tenantId: invoice.tenantId, organizationId: invoice.organizationId };
|
|
30
|
+
let seller = isFrozenDocument(invoice) ? invoice.sellerSnapshot ?? null : null;
|
|
31
|
+
let buyer = isFrozenDocument(invoice) ? invoice.buyerSnapshot ?? null : null;
|
|
32
|
+
if (!seller || !("legal_name" in seller)) seller = buildSellerSnapshot(await getBillingSettings(em, scope));
|
|
33
|
+
if (!buyer) {
|
|
34
|
+
const account = await em.findOne(BillingAccount, { id: invoice.billAccountId, ...scope });
|
|
35
|
+
buyer = account ? buildBuyerSnapshot(account) : { name: "" };
|
|
36
|
+
}
|
|
37
|
+
return { seller, buyer };
|
|
38
|
+
}
|
|
39
|
+
async function resolveLogo(em, invoice, seller) {
|
|
40
|
+
const scope = { tenantId: invoice.tenantId, organizationId: invoice.organizationId };
|
|
41
|
+
let attachmentId = str(seller.logo_attachment_id);
|
|
42
|
+
if (!attachmentId) {
|
|
43
|
+
const rows = await em.execute(`SELECT logo_url FROM organizations WHERE id = ? LIMIT 1`, [
|
|
44
|
+
invoice.organizationId
|
|
45
|
+
]);
|
|
46
|
+
attachmentId = attachmentIdFromUrl(rows?.[0]?.logo_url);
|
|
47
|
+
}
|
|
48
|
+
if (!attachmentId) return null;
|
|
49
|
+
const file = await readAttachment(em, scope, attachmentId);
|
|
50
|
+
return file ? { bytes: file.bytes, mimeType: file.mimeType } : null;
|
|
51
|
+
}
|
|
52
|
+
async function renderBillingDocument(em, invoice, deps = {}) {
|
|
53
|
+
const scope = { tenantId: invoice.tenantId, organizationId: invoice.organizationId };
|
|
54
|
+
const lines = await em.find(
|
|
55
|
+
BillingInvoiceLine,
|
|
56
|
+
{ invoiceId: invoice.id, ...scope, deletedAt: null },
|
|
57
|
+
{ orderBy: { lineNumber: "asc" } }
|
|
58
|
+
);
|
|
59
|
+
const { seller, buyer } = await resolveParties(em, invoice);
|
|
60
|
+
const language = resolveInvoiceLanguage(str(buyer.invoice_language));
|
|
61
|
+
const translate = await (deps.loadTranslator ?? loadDocumentTranslator)(language);
|
|
62
|
+
let correctsNumber = null;
|
|
63
|
+
if (invoice.correctsInvoiceId) {
|
|
64
|
+
const corrected = await em.findOne(BillingInvoice, { id: invoice.correctsInvoiceId, ...scope });
|
|
65
|
+
correctsNumber = corrected?.number ?? null;
|
|
66
|
+
}
|
|
67
|
+
const model = buildInvoiceDocumentModel({
|
|
68
|
+
invoice: {
|
|
69
|
+
number: invoice.number,
|
|
70
|
+
documentType: invoice.documentType,
|
|
71
|
+
status: invoice.status,
|
|
72
|
+
testRun: invoice.testRun,
|
|
73
|
+
issueDate: invoice.issueDate ?? null,
|
|
74
|
+
dueDate: invoice.dueDate ?? null,
|
|
75
|
+
billDate: invoice.billDate ?? null,
|
|
76
|
+
periodStart: invoice.periodStart ?? null,
|
|
77
|
+
periodEnd: invoice.periodEnd ?? null,
|
|
78
|
+
currencyCode: invoice.currencyCode,
|
|
79
|
+
subtotalNet: invoice.subtotalNet,
|
|
80
|
+
taxTotal: invoice.taxTotal,
|
|
81
|
+
totalGross: invoice.totalGross,
|
|
82
|
+
correctsNumber: invoice.correctsInvoiceNumber ?? correctsNumber,
|
|
83
|
+
correctsIssueDate: invoice.correctsIssueDate ?? null,
|
|
84
|
+
correctionReason: invoice.correctionReason ?? null
|
|
85
|
+
},
|
|
86
|
+
lines: lines.map((line) => ({
|
|
87
|
+
description: line.description,
|
|
88
|
+
quantity: line.quantity,
|
|
89
|
+
unitPriceNet: line.unitPriceNet,
|
|
90
|
+
taxRate: line.taxRate,
|
|
91
|
+
netAmount: line.netAmount,
|
|
92
|
+
taxAmount: line.taxAmount,
|
|
93
|
+
grossAmount: line.grossAmount,
|
|
94
|
+
servicePeriodStart: line.servicePeriodStart ?? null,
|
|
95
|
+
servicePeriodEnd: line.servicePeriodEnd ?? null
|
|
96
|
+
})),
|
|
97
|
+
seller: {
|
|
98
|
+
legalName: str(seller.legal_name),
|
|
99
|
+
address: address(seller.address),
|
|
100
|
+
taxId: str(seller.tax_id),
|
|
101
|
+
bankName: str(seller.bank_name),
|
|
102
|
+
iban: str(seller.iban),
|
|
103
|
+
bic: str(seller.bic),
|
|
104
|
+
footer: str(seller.invoice_footer)
|
|
105
|
+
},
|
|
106
|
+
buyer: {
|
|
107
|
+
name: str(buyer.name) ?? "",
|
|
108
|
+
address: address(buyer.invoice_address),
|
|
109
|
+
taxId: str(buyer.tax_id)
|
|
110
|
+
},
|
|
111
|
+
language,
|
|
112
|
+
translate
|
|
113
|
+
});
|
|
114
|
+
return renderInvoicePdf(model, { logo: await resolveLogo(em, invoice, seller) });
|
|
115
|
+
}
|
|
116
|
+
async function freezeInvoicePdf(em, invoice, deps = {}) {
|
|
117
|
+
if (invoice.pdfAttachmentId) return { attachmentId: invoice.pdfAttachmentId, bytes: null };
|
|
118
|
+
if (!isFrozenDocument(invoice)) throw new Error("Only posted, non-test documents are frozen");
|
|
119
|
+
const bytes = await renderBillingDocument(em, invoice, deps);
|
|
120
|
+
const scope = { tenantId: invoice.tenantId, organizationId: invoice.organizationId };
|
|
121
|
+
const attachmentId = await storeAttachment(em, scope, {
|
|
122
|
+
entityId: billingEntityIds.invoice,
|
|
123
|
+
recordId: invoice.id,
|
|
124
|
+
fileName: pdfFileName(invoice),
|
|
125
|
+
mimeType: "application/pdf",
|
|
126
|
+
bytes
|
|
127
|
+
});
|
|
128
|
+
await em.nativeUpdate(
|
|
129
|
+
BillingInvoice,
|
|
130
|
+
{ id: invoice.id, ...scope, pdfAttachmentId: null },
|
|
131
|
+
{ pdfAttachmentId: attachmentId }
|
|
132
|
+
);
|
|
133
|
+
invoice.pdfAttachmentId = attachmentId;
|
|
134
|
+
return { attachmentId, bytes };
|
|
135
|
+
}
|
|
136
|
+
async function getInvoicePdf(em, invoice, deps = {}) {
|
|
137
|
+
const fileName = pdfFileName(invoice);
|
|
138
|
+
if (!isFrozenDocument(invoice)) {
|
|
139
|
+
return { bytes: await renderBillingDocument(em, invoice, deps), fileName, frozen: false };
|
|
140
|
+
}
|
|
141
|
+
if (invoice.pdfAttachmentId) {
|
|
142
|
+
const stored = await readAttachment(
|
|
143
|
+
em,
|
|
144
|
+
{ tenantId: invoice.tenantId, organizationId: invoice.organizationId },
|
|
145
|
+
invoice.pdfAttachmentId
|
|
146
|
+
);
|
|
147
|
+
if (stored) return { bytes: stored.bytes, fileName, frozen: true };
|
|
148
|
+
console.warn("[billing.pdf] frozen PDF unreadable, rendering from snapshots", invoice.id);
|
|
149
|
+
return { bytes: await renderBillingDocument(em, invoice, deps), fileName, frozen: true };
|
|
150
|
+
}
|
|
151
|
+
const frozen = await freezeInvoicePdf(em, invoice, deps);
|
|
152
|
+
return {
|
|
153
|
+
bytes: frozen.bytes ?? await renderBillingDocument(em, invoice, deps),
|
|
154
|
+
fileName,
|
|
155
|
+
frozen: true
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
export {
|
|
159
|
+
freezeInvoicePdf,
|
|
160
|
+
getInvoicePdf,
|
|
161
|
+
loadDocumentTranslator,
|
|
162
|
+
pdfFileName,
|
|
163
|
+
renderBillingDocument
|
|
164
|
+
};
|
|
165
|
+
//# sourceMappingURL=invoicePdf.js.map
|