@dainamite/billing 0.19.0 → 0.21.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 +172 -0
- package/README.md +14 -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 +46 -4
- package/dist/modules/billing/api/accounts/route.js.map +2 -2
- package/dist/modules/billing/api/export/account/[id]/route.js +16 -12
- 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 +69 -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 +3 -3
- 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 +3 -3
- 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 +3 -3
- 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 +44 -7
- 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 +3 -3
- package/dist/modules/billing/api/runs/retry-failed/route.js.map +2 -2
- package/dist/modules/billing/api/runs/route.js +11 -5
- 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/ce.js.map +2 -2
- 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 +272 -170
- 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 +154 -7
- 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 +615 -59
- 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 +70 -0
- package/dist/modules/billing/events.js.map +2 -2
- package/dist/modules/billing/i18n/en.json +457 -21
- package/dist/modules/billing/i18n/pl.json +457 -21
- 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 +241 -106
- package/dist/modules/billing/lib/billRunEngine.js.map +2 -2
- package/dist/modules/billing/lib/billRunLabel.js.map +1 -1
- 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 +131 -0
- package/dist/modules/billing/lib/invoiceDelivery.js.map +7 -0
- package/dist/modules/billing/lib/invoiceLanguages.js +16 -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 +274 -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/tenantLock.js.map +1 -1
- 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/dist/modules/billing/workers/reap-stale-bill-runs.js +2 -2
- package/dist/modules/billing/workers/reap-stale-bill-runs.js.map +2 -2
- package/generated/entities/billing_account/index.ts +26 -0
- package/generated/entities/billing_account_balance/index.ts +13 -0
- package/generated/entities/billing_account_transaction/index.ts +21 -0
- package/generated/entities/billing_account_usage/index.ts +18 -0
- package/generated/entities/billing_allocation/index.ts +18 -0
- package/generated/entities/billing_document_sequence/index.ts +11 -0
- package/generated/entities/billing_draft_invoice_edit/index.ts +14 -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 +26 -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 +20 -0
- package/generated/entities/billing_run_outcome/index.ts +18 -0
- package/generated/entities/billing_settings/index.ts +26 -0
- package/generated/entities/billing_statement/index.ts +22 -0
- package/generated/entities/billing_topup/index.ts +20 -0
- package/generated/entities.ids.generated.ts +35 -0
- package/package.json +15 -10
- package/src/modules/billing/__integration__/TC-BILL-004.spec.ts +170 -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 +437 -355
- 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 +326 -0
- package/src/modules/billing/__tests__/events.test.ts +142 -0
- package/src/modules/billing/__tests__/helpers/prepaidMockEm.ts +28 -11
- 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 +231 -20
- 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 +189 -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 +199 -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 +193 -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 +58 -4
- package/src/modules/billing/api/export/account/[id]/route.ts +20 -18
- package/src/modules/billing/api/invoices/[id]/memos/route.ts +63 -0
- package/src/modules/billing/api/invoices/[id]/pdf/route.ts +79 -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 +3 -3
- package/src/modules/billing/api/invoices/delete-draft/route.ts +33 -0
- package/src/modules/billing/api/invoices/edit-line/route.ts +4 -4
- package/src/modules/billing/api/invoices/post/route.ts +7 -6
- package/src/modules/billing/api/invoices/remove-line/route.ts +3 -3
- 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 +50 -7
- 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 +4 -3
- package/src/modules/billing/api/runs/route.ts +17 -9
- 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 +71 -5
- package/src/modules/billing/backend/billing/invoices/[id]/page.tsx +445 -96
- 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 +19 -3
- 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 +50 -19
- package/src/modules/billing/backend/billing/runs/page.tsx +60 -9
- package/src/modules/billing/backend/billing/statements/[id]/page.tsx +87 -6
- package/src/modules/billing/backend/billing/statements/page.tsx +2 -2
- package/src/modules/billing/backend/billing/topups/page.tsx +2 -2
- package/src/modules/billing/backend/billing/transactions/page.tsx +2 -2
- 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/ce.ts +8 -7
- 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 +371 -238
- 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 +208 -6
- 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 +20 -7
- 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 +685 -15
- package/src/modules/billing/data/entityIds.ts +25 -11
- package/src/modules/billing/data/validators.ts +388 -8
- package/src/modules/billing/events.ts +82 -3
- package/src/modules/billing/i18n/en.json +457 -21
- package/src/modules/billing/i18n/pl.json +457 -21
- 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 +362 -162
- package/src/modules/billing/lib/billRunLabel.ts +1 -1
- 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 +197 -0
- package/src/modules/billing/lib/invoiceLanguages.ts +34 -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 +328 -0
- package/src/modules/billing/lib/pdf/invoicePdf.ts +216 -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 +410 -242
- 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/tenantLock.ts +1 -1
- 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/src/modules/billing/workers/reap-stale-bill-runs.ts +4 -4
- 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
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Canonical entity IDs for the billing module.
|
|
2
|
+
* Canonical entity IDs for the billing module — the single source of truth.
|
|
3
|
+
* Billing code (CRUD factory `entityId`, indexer `entityType`, response
|
|
4
|
+
* enricher `targetEntity`, …) imports from here; a package must not import
|
|
5
|
+
* the app's `#generated/entities.ids.generated`.
|
|
3
6
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* place that previously would have referenced `E.billing.*` (CRUD
|
|
10
|
-
* factory `entityId`, indexer `entityType`, response enricher
|
|
11
|
-
* `targetEntity`, etc.) imports from here instead.
|
|
7
|
+
* The build turns this object into the shipped registry
|
|
8
|
+
* `generated/entities.ids.generated.ts` (scripts/generate-entity-registry.mjs),
|
|
9
|
+
* which a consuming app's `mercato generate` reads to register these ids in
|
|
10
|
+
* its own `E.billing`. Without that, the query index rejects billing writes
|
|
11
|
+
* and `mercato entities install` treats the ids as virtual custom entities.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* Adding an entity: add it here, then `yarn workspace @dainamite/billing
|
|
14
|
+
* build` and commit `generated/`. The id suffix must be the snake_case of
|
|
15
|
+
* the entity class name (`billing_run` → `BillingRun`): that is how the
|
|
16
|
+
* framework maps an id to its table, and the build fails otherwise. Do not
|
|
17
|
+
* rely on its table-name fallback — on Open Mercato 0.9 with MikroORM 7 it
|
|
18
|
+
* never matches (it iterates `MetadataStorage.getAll()` as an array, but
|
|
19
|
+
* that returns a Map).
|
|
15
20
|
*/
|
|
16
21
|
export const billingEntityIds = {
|
|
17
22
|
account: 'billing:billing_account',
|
|
@@ -25,6 +30,15 @@ export const billingEntityIds = {
|
|
|
25
30
|
transaction: 'billing:billing_account_transaction',
|
|
26
31
|
topup: 'billing:billing_topup',
|
|
27
32
|
statement: 'billing:billing_statement',
|
|
33
|
+
// Spec 0 (standalone invoice ledger)
|
|
34
|
+
invoice: 'billing:billing_invoice',
|
|
35
|
+
invoiceLine: 'billing:billing_invoice_line',
|
|
36
|
+
documentSequence: 'billing:billing_document_sequence',
|
|
37
|
+
settings: 'billing:billing_settings',
|
|
38
|
+
// Spec C (payments)
|
|
39
|
+
payment: 'billing:billing_payment',
|
|
40
|
+
allocation: 'billing:billing_allocation',
|
|
41
|
+
paymentImport: 'billing:billing_payment_import',
|
|
28
42
|
} as const
|
|
29
43
|
|
|
30
44
|
export type BillingEntityId = (typeof billingEntityIds)[keyof typeof billingEntityIds]
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
|
+
import { DEFAULT_INVOICE_LANGUAGE, INVOICE_LANGUAGE_CODES } from '../lib/invoiceLanguages'
|
|
3
|
+
import { DOCUMENT_SERIES, validateMask } from '../lib/numbering'
|
|
4
|
+
import { isValidBic, isValidIban, normalizeIban } from '../lib/iban'
|
|
2
5
|
|
|
3
6
|
// ─── Enums ───────────────────────────────────────────────────────
|
|
4
7
|
|
|
@@ -8,6 +11,19 @@ export type BillingItemType = (typeof BILLING_ITEM_TYPES)[number]
|
|
|
8
11
|
export const BILL_CYCLES = ['weekly', 'monthly', 'quarterly', 'annually'] as const
|
|
9
12
|
export type BillCycle = (typeof BILL_CYCLES)[number]
|
|
10
13
|
|
|
14
|
+
// Spec A: when a recurring item is charged relative to the bill date —
|
|
15
|
+
// for the coming period (in advance, default) or the period just ended.
|
|
16
|
+
export const CHARGE_TIMINGS = ['in_advance', 'in_arrears'] as const
|
|
17
|
+
export type ChargeTiming = (typeof CHARGE_TIMINGS)[number]
|
|
18
|
+
|
|
19
|
+
// Spec F (F-D2): the basis the item price was entered on.
|
|
20
|
+
export const PRICE_BASES = ['net', 'gross'] as const
|
|
21
|
+
export type PriceBasis = (typeof PRICE_BASES)[number]
|
|
22
|
+
|
|
23
|
+
// Spec F (F-D3): where prepaid VAT is charged.
|
|
24
|
+
export const PREPAID_TAX_POINTS = ['topup', 'consumption'] as const
|
|
25
|
+
export type PrepaidTaxPoint = (typeof PREPAID_TAX_POINTS)[number]
|
|
26
|
+
|
|
11
27
|
export const BILL_RUN_TRIGGERS = ['schedule', 'manual'] as const
|
|
12
28
|
export type BillRunTrigger = (typeof BILL_RUN_TRIGGERS)[number]
|
|
13
29
|
|
|
@@ -28,9 +44,14 @@ export type BillRunOutcomeStatus = (typeof BILL_RUN_OUTCOME_STATUSES)[number]
|
|
|
28
44
|
export const DRAFT_INVOICE_EDIT_ACTIONS = ['line_added', 'line_removed', 'line_edited'] as const
|
|
29
45
|
export type DraftInvoiceEditAction = (typeof DRAFT_INVOICE_EDIT_ACTIONS)[number]
|
|
30
46
|
|
|
31
|
-
|
|
47
|
+
// Spec 0: billing-owned document statuses. No 'void' — a posted document is
|
|
48
|
+
// only neutralised by a credit memo ('credited'); drafts are deleted.
|
|
49
|
+
export const INVOICE_STATUSES = ['draft', 'posted', 'partially_paid', 'paid', 'credited'] as const
|
|
32
50
|
export type InvoiceStatus = (typeof INVOICE_STATUSES)[number]
|
|
33
51
|
|
|
52
|
+
export const DOCUMENT_TYPES = ['invoice', 'credit_memo', 'debit_memo', 'receipt'] as const
|
|
53
|
+
export type DocumentType = (typeof DOCUMENT_TYPES)[number]
|
|
54
|
+
|
|
34
55
|
// ─── Prepaid (SPEC-002) enums ────────────────────────────────────
|
|
35
56
|
|
|
36
57
|
export const BILLING_MODES = ['postpaid', 'prepaid'] as const
|
|
@@ -55,6 +76,13 @@ export const TOPUP_STATUSES = [
|
|
|
55
76
|
] as const
|
|
56
77
|
export type TopupStatus = (typeof TOPUP_STATUSES)[number]
|
|
57
78
|
|
|
79
|
+
// Spec E (B2C): a billing account belongs to a company or a person. Both
|
|
80
|
+
// live in the customers module under one `customer_entities` id space, so
|
|
81
|
+
// `customer_id` is kind-agnostic — `customer_kind` only drives the lookup
|
|
82
|
+
// and the label.
|
|
83
|
+
export const CUSTOMER_KINDS = ['company', 'person'] as const
|
|
84
|
+
export type CustomerKind = (typeof CUSTOMER_KINDS)[number]
|
|
85
|
+
|
|
58
86
|
export const STATEMENT_STATUSES = ['generated', 'sent'] as const
|
|
59
87
|
export type StatementStatus = (typeof STATEMENT_STATUSES)[number]
|
|
60
88
|
|
|
@@ -255,14 +283,24 @@ const listPaginationBase = {
|
|
|
255
283
|
// 4dp string at persist time.
|
|
256
284
|
const moneyNonNegative = z.number().finite().nonnegative()
|
|
257
285
|
|
|
286
|
+
// Invoice language must be one the document template supports (Spec E, D22).
|
|
287
|
+
// Case/whitespace-tolerant on input, canonical lowercase code on output.
|
|
288
|
+
// Spec B: payment terms in days (0 = due on issue).
|
|
289
|
+
const paymentTermsDaysSchema = z.coerce.number().int().min(0).max(365)
|
|
290
|
+
|
|
291
|
+
const invoiceLanguageSchema = z.string().trim().toLowerCase().pipe(z.enum(INVOICE_LANGUAGE_CODES))
|
|
292
|
+
|
|
258
293
|
export const billingAccountCreateSchema = scopedSchema.extend({
|
|
259
294
|
customerId: z.string().min(1).max(255),
|
|
295
|
+
// Immutable after create (like customerId). Default 'company' keeps
|
|
296
|
+
// existing callers (CPQ connector, seeds) unaffected.
|
|
297
|
+
customerKind: z.enum(CUSTOMER_KINDS).default('company'),
|
|
260
298
|
name: z.string().trim().min(1).max(255),
|
|
261
299
|
currencyCode: z.string().trim().toUpperCase().length(3),
|
|
262
300
|
billCycle: z.enum(BILL_CYCLES),
|
|
263
301
|
billCycleAnchor: billCycleAnchorSchema,
|
|
264
302
|
invoiceEmail: z.string().trim().email().max(320),
|
|
265
|
-
invoiceLanguage:
|
|
303
|
+
invoiceLanguage: invoiceLanguageSchema.default(DEFAULT_INVOICE_LANGUAGE),
|
|
266
304
|
// Nullable + optional — consistent with the update schema, and the
|
|
267
305
|
// cpq-billing-connector's shell-account seed sends `taxId: null`
|
|
268
306
|
// for customers with no tax id.
|
|
@@ -279,6 +317,9 @@ export const billingAccountCreateSchema = scopedSchema.extend({
|
|
|
279
317
|
// Initial low-balance threshold for a prepaid account's balance row.
|
|
280
318
|
// Null = resolve the tenant config default at read time.
|
|
281
319
|
lowBalanceThreshold: moneyNonNegative.nullable().optional(),
|
|
320
|
+
// Spec B: null/omitted = the organization default payment terms.
|
|
321
|
+
paymentTermsDays: paymentTermsDaysSchema.nullable().optional(),
|
|
322
|
+
autoSendInvoice: z.boolean().optional(),
|
|
282
323
|
})
|
|
283
324
|
|
|
284
325
|
export type BillingAccountCreateInput = z.infer<typeof billingAccountCreateSchema>
|
|
@@ -289,7 +330,7 @@ export const billingAccountUpdateSchema = scopedSchema.extend({
|
|
|
289
330
|
billCycle: z.enum(BILL_CYCLES).optional(),
|
|
290
331
|
billCycleAnchor: billCycleAnchorSchema.optional(),
|
|
291
332
|
invoiceEmail: z.string().trim().email().max(320).optional(),
|
|
292
|
-
invoiceLanguage:
|
|
333
|
+
invoiceLanguage: invoiceLanguageSchema.optional(),
|
|
293
334
|
taxId: z.string().trim().max(64).nullable().optional(),
|
|
294
335
|
invoiceAddress: invoiceAddressSchema.optional(),
|
|
295
336
|
nextBillDate: z.coerce.date().optional(),
|
|
@@ -302,10 +343,13 @@ export const billingAccountUpdateSchema = scopedSchema.extend({
|
|
|
302
343
|
// Editing the prepaid balance row's low-balance threshold. Null clears it
|
|
303
344
|
// back to the tenant config default.
|
|
304
345
|
lowBalanceThreshold: moneyNonNegative.nullable().optional(),
|
|
346
|
+
paymentTermsDays: paymentTermsDaysSchema.nullable().optional(),
|
|
347
|
+
autoSendInvoice: z.boolean().optional(),
|
|
305
348
|
// `currencyCode` is intentionally NOT updatable — currency is frozen at
|
|
306
349
|
// account create time so historical invoices keep their currency context.
|
|
307
350
|
// `customerId` is also immutable; create a new account if the customer
|
|
308
|
-
// FK changes.
|
|
351
|
+
// FK changes. `customerKind` follows `customerId` and is likewise not
|
|
352
|
+
// updatable.
|
|
309
353
|
})
|
|
310
354
|
|
|
311
355
|
export type BillingAccountUpdateInput = z.infer<typeof billingAccountUpdateSchema>
|
|
@@ -321,11 +365,17 @@ export const billingAccountListQuerySchema = z
|
|
|
321
365
|
...listPaginationBase,
|
|
322
366
|
id: z.string().uuid().optional(),
|
|
323
367
|
customerId: z.string().optional(),
|
|
368
|
+
customerKind: z.enum(CUSTOMER_KINDS).optional(),
|
|
324
369
|
currencyCode: z.string().optional(),
|
|
325
370
|
billCycle: z.enum(BILL_CYCLES).optional(),
|
|
326
371
|
billingMode: z.enum(BILLING_MODES).optional(),
|
|
327
372
|
isActive: z.coerce.boolean().optional(),
|
|
328
373
|
search: z.string().optional(),
|
|
374
|
+
// Spec F (F8): only accounts with at least one overdue receivable.
|
|
375
|
+
hasOverdue: z
|
|
376
|
+
.union([z.boolean(), z.enum(['true', 'false'])])
|
|
377
|
+
.transform((value) => value === true || value === 'true')
|
|
378
|
+
.optional(),
|
|
329
379
|
})
|
|
330
380
|
.passthrough()
|
|
331
381
|
|
|
@@ -333,6 +383,49 @@ export type BillingAccountListQuery = z.infer<typeof billingAccountListQuerySche
|
|
|
333
383
|
|
|
334
384
|
// ─── BillingItem payloads ────────────────────────────────────────
|
|
335
385
|
|
|
386
|
+
// Spec A: `chargeTiming` / `prorate` only mean something for recurring
|
|
387
|
+
// items. Omitted → the command applies the defaults (in_advance, true).
|
|
388
|
+
// Setting a non-default value on another type is a client mistake.
|
|
389
|
+
// Spec B (B-D1): VAT rate in percent. Omitted on create → the command fills
|
|
390
|
+
// the organization default; never re-filled on update.
|
|
391
|
+
const taxRateSchema = z.coerce.number().finite().min(0).max(100)
|
|
392
|
+
|
|
393
|
+
const chargeTimingFields = {
|
|
394
|
+
chargeTiming: z.enum(CHARGE_TIMINGS).optional(),
|
|
395
|
+
prorate: z.boolean().optional(),
|
|
396
|
+
// Spec F (F-D2). Omitted → 'net' on create; unchanged on update.
|
|
397
|
+
priceBasis: z.enum(PRICE_BASES).optional(),
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
export const GROSS_TIERED_UNSUPPORTED_MESSAGE = 'billing.item.gross_tiered_unsupported'
|
|
401
|
+
|
|
402
|
+
/** Tiered usage rates (`{ model, tiers }`) are always net (Spec F, P-D4). */
|
|
403
|
+
export function isTieredRate(rateJson: unknown): boolean {
|
|
404
|
+
return typeof rateJson === 'object' && rateJson !== null && 'model' in rateJson && 'tiers' in rateJson
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
function refinePriceBasis(val: { priceBasis?: PriceBasis; rateJson: unknown }, ctx: z.RefinementCtx): void {
|
|
408
|
+
if (val.priceBasis === 'gross' && isTieredRate(val.rateJson)) {
|
|
409
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ['priceBasis'], message: GROSS_TIERED_UNSUPPORTED_MESSAGE })
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
export const CHARGE_TIMING_RECURRING_ONLY_MESSAGE =
|
|
414
|
+
'chargeTiming / prorate can only be set on recurring items'
|
|
415
|
+
|
|
416
|
+
function refineChargeTiming(
|
|
417
|
+
val: { type: BillingItemType; chargeTiming?: ChargeTiming; prorate?: boolean },
|
|
418
|
+
ctx: z.RefinementCtx,
|
|
419
|
+
): void {
|
|
420
|
+
if (val.type === 'recurring') return
|
|
421
|
+
if (val.chargeTiming !== undefined && val.chargeTiming !== 'in_advance') {
|
|
422
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ['chargeTiming'], message: CHARGE_TIMING_RECURRING_ONLY_MESSAGE })
|
|
423
|
+
}
|
|
424
|
+
if (val.prorate === false) {
|
|
425
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ['prorate'], message: CHARGE_TIMING_RECURRING_ONLY_MESSAGE })
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
336
429
|
const ratePayloadByType = z
|
|
337
430
|
.object({
|
|
338
431
|
type: z.enum(BILLING_ITEM_TYPES),
|
|
@@ -363,10 +456,14 @@ export const billingItemCreateSchema = scopedSchema
|
|
|
363
456
|
subscriptionItemId: z.string().trim().max(255).optional(),
|
|
364
457
|
// `source_ref` is the idempotency key. NULL → no dedup, always create.
|
|
365
458
|
sourceRef: z.string().trim().min(1).max(255).optional(),
|
|
459
|
+
taxRate: taxRateSchema.optional(),
|
|
460
|
+
...chargeTimingFields,
|
|
366
461
|
// currency_mismatch and billed_to_date are system-managed, never set by
|
|
367
462
|
// clients on create.
|
|
368
463
|
})
|
|
369
464
|
.superRefine((val, ctx) => {
|
|
465
|
+
refineChargeTiming(val, ctx)
|
|
466
|
+
refinePriceBasis(val, ctx)
|
|
370
467
|
try {
|
|
371
468
|
validateRateJson(val.type, val.rateJson)
|
|
372
469
|
} catch (err) {
|
|
@@ -403,8 +500,12 @@ const billingItemBulkEntrySchema = z
|
|
|
403
500
|
subscriptionId: z.string().trim().max(255).optional(),
|
|
404
501
|
subscriptionItemId: z.string().trim().max(255).optional(),
|
|
405
502
|
sourceRef: z.string().trim().min(1).max(255).optional(),
|
|
503
|
+
taxRate: taxRateSchema.optional(),
|
|
504
|
+
...chargeTimingFields,
|
|
406
505
|
})
|
|
407
506
|
.superRefine((val, ctx) => {
|
|
507
|
+
refineChargeTiming(val, ctx)
|
|
508
|
+
refinePriceBasis(val, ctx)
|
|
408
509
|
try {
|
|
409
510
|
validateRateJson(val.type, val.rateJson)
|
|
410
511
|
} catch (err) {
|
|
@@ -445,10 +546,26 @@ export const billingItemUpdateSchema = scopedSchema.extend({
|
|
|
445
546
|
subscriptionItemId: z.string().trim().max(255).nullable().optional(),
|
|
446
547
|
// `source_ref` immutable — it's the idempotency identity of the item.
|
|
447
548
|
isActive: z.boolean().optional(),
|
|
549
|
+
// Affects future invoices only — posted lines keep their snapshot.
|
|
550
|
+
taxRate: taxRateSchema.optional(),
|
|
551
|
+
// Recurring only (enforced by the command, which knows the item type).
|
|
552
|
+
// Safe to change after billing: the `billed_to_date` watermark prevents
|
|
553
|
+
// any day from being billed twice.
|
|
554
|
+
...chargeTimingFields,
|
|
448
555
|
})
|
|
449
556
|
|
|
450
557
|
export type BillingItemUpdateInput = z.infer<typeof billingItemUpdateSchema>
|
|
451
558
|
|
|
559
|
+
// Change a recurring item's price from a date on: end the item the day
|
|
560
|
+
// before, start a copy with the new price (see lib/itemPriceChange.ts).
|
|
561
|
+
export const billingItemChangePriceSchema = scopedSchema.extend({
|
|
562
|
+
id: z.string().uuid(),
|
|
563
|
+
effectiveDate: z.coerce.date(),
|
|
564
|
+
unitPrice: z.coerce.number().finite().nonnegative(),
|
|
565
|
+
})
|
|
566
|
+
|
|
567
|
+
export type BillingItemChangePriceInput = z.infer<typeof billingItemChangePriceSchema>
|
|
568
|
+
|
|
452
569
|
export const billingItemDeleteSchema = scopedSchema.extend({
|
|
453
570
|
id: z.string().uuid(),
|
|
454
571
|
})
|
|
@@ -524,7 +641,9 @@ export const billingRunTriggerSchema = scopedSchema.extend({
|
|
|
524
641
|
mode: z.enum(BILL_RUN_MODES).default('real'),
|
|
525
642
|
asOfDate: z.coerce.date().optional(),
|
|
526
643
|
scopedAccountIds: z.array(z.string().uuid()).optional(),
|
|
527
|
-
|
|
644
|
+
// Spec A: there is no `catchUp` flag — every run bills all due cycles up
|
|
645
|
+
// to `asOfDate`. Old clients still sending it are not rejected: the
|
|
646
|
+
// object schema strips unknown keys.
|
|
528
647
|
})
|
|
529
648
|
|
|
530
649
|
export type BillingRunTriggerInput = z.infer<typeof billingRunTriggerSchema>
|
|
@@ -546,6 +665,8 @@ export const billingRunListQuerySchema = z
|
|
|
546
665
|
parentRunId: z.string().uuid().optional(),
|
|
547
666
|
asOfDateFrom: z.coerce.date().optional(),
|
|
548
667
|
asOfDateTo: z.coerce.date().optional(),
|
|
668
|
+
// Spec F (F1): narrow the list to one run mode.
|
|
669
|
+
mode: z.enum(['real', 'test', 'dry']).optional(),
|
|
549
670
|
})
|
|
550
671
|
.passthrough()
|
|
551
672
|
|
|
@@ -559,14 +680,20 @@ export const billingInvoicePostSchema = scopedSchema.extend({
|
|
|
559
680
|
|
|
560
681
|
export type BillingInvoicePostInput = z.infer<typeof billingInvoicePostSchema>
|
|
561
682
|
|
|
683
|
+
// Spec B — email a posted document (manual send / resend).
|
|
684
|
+
export const billingInvoiceSendSchema = scopedSchema.extend({
|
|
685
|
+
invoiceId: z.string().uuid(),
|
|
686
|
+
})
|
|
687
|
+
|
|
688
|
+
export type BillingInvoiceSendInput = z.infer<typeof billingInvoiceSendSchema>
|
|
689
|
+
|
|
562
690
|
// ─── Draft invoice edits (Phase 4b) ──────────────────────────────
|
|
563
691
|
|
|
564
692
|
/**
|
|
565
693
|
* Fields the operator may change on a draft invoice line. Per spec:
|
|
566
694
|
* "operator CAN: add lines, remove lines, edit line description /
|
|
567
|
-
* quantity / unit_price / amount". `taxRate`
|
|
568
|
-
*
|
|
569
|
-
* intentionally absent from this schema.
|
|
695
|
+
* quantity / unit_price / amount". Spec B adds `taxRate` (VAT % of the
|
|
696
|
+
* line). `currencyCode` is frozen at account create and intentionally absent.
|
|
570
697
|
*/
|
|
571
698
|
const lineEditableFields = z.object({
|
|
572
699
|
description: z.string().trim().min(1).max(500).optional(),
|
|
@@ -577,6 +704,7 @@ const lineEditableFields = z.object({
|
|
|
577
704
|
// credits or rounding fix-ups). When provided, it short-circuits
|
|
578
705
|
// the auto-compute path.
|
|
579
706
|
totalNetAmount: z.coerce.number().finite().optional(),
|
|
707
|
+
taxRate: taxRateSchema.optional(),
|
|
580
708
|
})
|
|
581
709
|
|
|
582
710
|
export const billingInvoiceEditLineSchema = scopedSchema.extend({
|
|
@@ -597,6 +725,8 @@ export const billingInvoiceAddLineSchema = scopedSchema.extend({
|
|
|
597
725
|
// Billing Item.
|
|
598
726
|
billingItemId: z.string().uuid().optional(),
|
|
599
727
|
billingType: z.enum(BILLING_ITEM_TYPES).optional(),
|
|
728
|
+
// Omitted → the organization default VAT rate.
|
|
729
|
+
taxRate: taxRateSchema.optional(),
|
|
600
730
|
})
|
|
601
731
|
|
|
602
732
|
export type BillingInvoiceAddLineInput = z.infer<typeof billingInvoiceAddLineSchema>
|
|
@@ -617,6 +747,24 @@ export const billingWipeTestInvoicesSchema = scopedSchema.extend({
|
|
|
617
747
|
|
|
618
748
|
export type BillingWipeTestInvoicesInput = z.infer<typeof billingWipeTestInvoicesSchema>
|
|
619
749
|
|
|
750
|
+
// Spec F (F-D1): test and dry runs can be deleted (real runs never).
|
|
751
|
+
export const billingRunDeleteSchema = scopedSchema.extend({
|
|
752
|
+
billRunId: z.string().uuid(),
|
|
753
|
+
})
|
|
754
|
+
|
|
755
|
+
export type BillingRunDeleteInput = z.infer<typeof billingRunDeleteSchema>
|
|
756
|
+
|
|
757
|
+
// Post the draft invoices of a REAL run, one bounded batch per call; the
|
|
758
|
+
// caller passes back `nextCursor` until `remaining` is 0.
|
|
759
|
+
export const billingRunPostDraftsSchema = scopedSchema.extend({
|
|
760
|
+
billRunId: z.string().uuid(),
|
|
761
|
+
/** Continue after this invoice id (ids are processed in ascending order). */
|
|
762
|
+
afterInvoiceId: z.string().uuid().optional(),
|
|
763
|
+
limit: z.coerce.number().int().min(1).max(100).optional(),
|
|
764
|
+
})
|
|
765
|
+
|
|
766
|
+
export type BillingRunPostDraftsInput = z.infer<typeof billingRunPostDraftsSchema>
|
|
767
|
+
|
|
620
768
|
// ─── Prepaid: top-ups (SPEC-002 P2) ──────────────────────────────
|
|
621
769
|
|
|
622
770
|
export const billingTopupCreateSchema = scopedSchema.extend({
|
|
@@ -704,3 +852,235 @@ export const billingStatementListQuerySchema = z
|
|
|
704
852
|
export type BillingStatementListQuery = z.infer<typeof billingStatementListQuerySchema>
|
|
705
853
|
|
|
706
854
|
|
|
855
|
+
|
|
856
|
+
// ─── Spec 0 — invoice ledger + billing settings ──────────────────
|
|
857
|
+
|
|
858
|
+
// Query-string boolean: only the literal strings count ("false" must NOT
|
|
859
|
+
// coerce to true the way z.coerce.boolean() would).
|
|
860
|
+
const queryBoolean = z.preprocess(
|
|
861
|
+
(value) => (value === 'true' || value === true ? true : value === 'false' || value === false ? false : undefined),
|
|
862
|
+
z.boolean().optional(),
|
|
863
|
+
)
|
|
864
|
+
|
|
865
|
+
export const billingInvoiceListQuerySchema = z
|
|
866
|
+
.object({
|
|
867
|
+
...listPaginationBase,
|
|
868
|
+
id: z.string().uuid().optional(),
|
|
869
|
+
status: z.enum(INVOICE_STATUSES).optional(),
|
|
870
|
+
documentType: z.enum(DOCUMENT_TYPES).optional(),
|
|
871
|
+
billRunId: z.string().uuid().optional(),
|
|
872
|
+
billAccountId: z.string().uuid().optional(),
|
|
873
|
+
testRun: queryBoolean,
|
|
874
|
+
search: z.string().trim().max(100).optional(),
|
|
875
|
+
// Spec B: computed overdue (B-D6) and due-date window.
|
|
876
|
+
overdue: queryBoolean,
|
|
877
|
+
dueFrom: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
878
|
+
dueTo: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
879
|
+
})
|
|
880
|
+
.passthrough()
|
|
881
|
+
|
|
882
|
+
export type BillingInvoiceListQuery = z.infer<typeof billingInvoiceListQuerySchema>
|
|
883
|
+
|
|
884
|
+
const numberMaskSchema = z
|
|
885
|
+
.string()
|
|
886
|
+
.trim()
|
|
887
|
+
.superRefine((mask, ctx) => {
|
|
888
|
+
for (const code of validateMask(mask)) {
|
|
889
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: code })
|
|
890
|
+
}
|
|
891
|
+
})
|
|
892
|
+
|
|
893
|
+
const moneyString = z.coerce.number().finite().nonnegative()
|
|
894
|
+
|
|
895
|
+
/** Trimmed optional text; '' → null (clears the field). */
|
|
896
|
+
function optionalText(max: number) {
|
|
897
|
+
return z
|
|
898
|
+
.string()
|
|
899
|
+
.trim()
|
|
900
|
+
.max(max)
|
|
901
|
+
.transform((value) => (value === '' ? null : value))
|
|
902
|
+
.nullable()
|
|
903
|
+
.optional()
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
// Seller address: same shape (and country rule) as the buyer's invoice address.
|
|
907
|
+
const sellerAddressSchema = invoiceAddressSchema
|
|
908
|
+
|
|
909
|
+
export const billingSettingsUpdateSchema = scopedSchema.extend({
|
|
910
|
+
lowBalanceThresholdDefault: moneyString.optional(),
|
|
911
|
+
nearLimitBufferDefault: moneyString.optional(),
|
|
912
|
+
statementEnabled: z.boolean().optional(),
|
|
913
|
+
topupTaxRate: z.coerce.number().finite().min(0).max(100).optional(),
|
|
914
|
+
topupProvider: z.string().trim().min(1).max(64).optional(),
|
|
915
|
+
numberMasks: z
|
|
916
|
+
.object(Object.fromEntries(DOCUMENT_SERIES.map((series) => [series, numberMaskSchema.optional()])) as Record<
|
|
917
|
+
(typeof DOCUMENT_SERIES)[number],
|
|
918
|
+
z.ZodOptional<typeof numberMaskSchema>
|
|
919
|
+
>)
|
|
920
|
+
.strict()
|
|
921
|
+
.optional(),
|
|
922
|
+
// Seller / payment / document fields (Spec B). Empty string clears.
|
|
923
|
+
legalName: optionalText(255),
|
|
924
|
+
sellerAddress: sellerAddressSchema.nullable().optional(),
|
|
925
|
+
taxId: optionalText(64),
|
|
926
|
+
bankName: optionalText(255),
|
|
927
|
+
iban: z
|
|
928
|
+
.string()
|
|
929
|
+
.transform(normalizeIban)
|
|
930
|
+
.refine((value) => value === '' || isValidIban(value), { message: 'billing.settings.error.iban_invalid' })
|
|
931
|
+
.transform((value) => (value === '' ? null : value))
|
|
932
|
+
.nullable()
|
|
933
|
+
.optional(),
|
|
934
|
+
bic: z
|
|
935
|
+
.string()
|
|
936
|
+
.trim()
|
|
937
|
+
.toUpperCase()
|
|
938
|
+
.refine((value) => value === '' || isValidBic(value), { message: 'billing.settings.error.bic_invalid' })
|
|
939
|
+
.transform((value) => (value === '' ? null : value))
|
|
940
|
+
.nullable()
|
|
941
|
+
.optional(),
|
|
942
|
+
invoiceFooter: optionalText(2000),
|
|
943
|
+
logoAttachmentId: z.string().uuid().nullable().optional(),
|
|
944
|
+
defaultPaymentTermsDays: paymentTermsDaysSchema.optional(),
|
|
945
|
+
defaultTaxRate: taxRateSchema.optional(),
|
|
946
|
+
// Spec F (F-D3).
|
|
947
|
+
prepaidTaxPoint: z.enum(PREPAID_TAX_POINTS).optional(),
|
|
948
|
+
})
|
|
949
|
+
|
|
950
|
+
export type BillingSettingsUpdateInput = z.infer<typeof billingSettingsUpdateSchema>
|
|
951
|
+
|
|
952
|
+
// ─── Spec C — payments ───────────────────────────────────────────
|
|
953
|
+
|
|
954
|
+
export const PAYMENT_STATUSES = [
|
|
955
|
+
'unmatched',
|
|
956
|
+
'matched',
|
|
957
|
+
'partially_allocated',
|
|
958
|
+
'allocated',
|
|
959
|
+
'ignored',
|
|
960
|
+
'converted_to_topup',
|
|
961
|
+
] as const
|
|
962
|
+
export type PaymentStatus = (typeof PAYMENT_STATUSES)[number]
|
|
963
|
+
|
|
964
|
+
export const PAYMENT_SOURCES = ['csv', 'manual', 'gateway'] as const
|
|
965
|
+
export type PaymentSource = (typeof PAYMENT_SOURCES)[number]
|
|
966
|
+
|
|
967
|
+
export const PAYMENT_MATCH_REASONS = [
|
|
968
|
+
'no_reference',
|
|
969
|
+
'currency_mismatch',
|
|
970
|
+
'invoice_already_paid',
|
|
971
|
+
'prepaid_account',
|
|
972
|
+
'manual',
|
|
973
|
+
] as const
|
|
974
|
+
export type PaymentMatchReason = (typeof PAYMENT_MATCH_REASONS)[number]
|
|
975
|
+
|
|
976
|
+
export const ALLOCATION_SOURCE_TYPES = ['payment', 'credit_memo'] as const
|
|
977
|
+
export type AllocationSourceType = (typeof ALLOCATION_SOURCE_TYPES)[number]
|
|
978
|
+
|
|
979
|
+
export const ALLOCATED_BY = ['auto', 'credit', 'user', 'gateway'] as const
|
|
980
|
+
export type AllocatedBy = (typeof ALLOCATED_BY)[number]
|
|
981
|
+
|
|
982
|
+
const isoDateString = z.string().regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
983
|
+
const positiveMoney = z.coerce.number().finite().positive()
|
|
984
|
+
|
|
985
|
+
export const billingPaymentCreateSchema = scopedSchema.extend({
|
|
986
|
+
receivedAt: isoDateString,
|
|
987
|
+
amount: positiveMoney,
|
|
988
|
+
currencyCode: z.string().trim().toUpperCase().length(3),
|
|
989
|
+
reference: z.string().trim().max(500).optional(),
|
|
990
|
+
payerName: z.string().trim().max(255).optional(),
|
|
991
|
+
payerAccount: z.string().trim().max(64).optional(),
|
|
992
|
+
// Known account → status `matched` and credit auto-apply; else `unmatched`.
|
|
993
|
+
billAccountId: z.string().uuid().optional(),
|
|
994
|
+
})
|
|
995
|
+
export type BillingPaymentCreateInput = z.infer<typeof billingPaymentCreateSchema>
|
|
996
|
+
|
|
997
|
+
export const billingPaymentAssignSchema = scopedSchema.extend({
|
|
998
|
+
paymentId: z.string().uuid(),
|
|
999
|
+
billAccountId: z.string().uuid(),
|
|
1000
|
+
})
|
|
1001
|
+
export type BillingPaymentAssignInput = z.infer<typeof billingPaymentAssignSchema>
|
|
1002
|
+
|
|
1003
|
+
export const billingPaymentAllocateSchema = scopedSchema.extend({
|
|
1004
|
+
paymentId: z.string().uuid(),
|
|
1005
|
+
allocations: z
|
|
1006
|
+
.array(z.object({ invoiceId: z.string().uuid(), amount: positiveMoney }))
|
|
1007
|
+
.min(1)
|
|
1008
|
+
.max(100),
|
|
1009
|
+
})
|
|
1010
|
+
export type BillingPaymentAllocateInput = z.infer<typeof billingPaymentAllocateSchema>
|
|
1011
|
+
|
|
1012
|
+
export const billingAllocationRemoveSchema = scopedSchema.extend({
|
|
1013
|
+
allocationId: z.string().uuid(),
|
|
1014
|
+
})
|
|
1015
|
+
export type BillingAllocationRemoveInput = z.infer<typeof billingAllocationRemoveSchema>
|
|
1016
|
+
|
|
1017
|
+
export const billingPaymentIdSchema = scopedSchema.extend({
|
|
1018
|
+
paymentId: z.string().uuid(),
|
|
1019
|
+
})
|
|
1020
|
+
export type BillingPaymentIdInput = z.infer<typeof billingPaymentIdSchema>
|
|
1021
|
+
|
|
1022
|
+
export const billingPaymentConvertSchema = scopedSchema.extend({
|
|
1023
|
+
paymentId: z.string().uuid(),
|
|
1024
|
+
billAccountId: z.string().uuid(),
|
|
1025
|
+
})
|
|
1026
|
+
export type BillingPaymentConvertInput = z.infer<typeof billingPaymentConvertSchema>
|
|
1027
|
+
|
|
1028
|
+
// CSV upload: 2 MB of text, ≤ 5,000 data rows (checked by the parser).
|
|
1029
|
+
export const PAYMENT_IMPORT_MAX_BYTES = 2 * 1024 * 1024
|
|
1030
|
+
export const PAYMENT_IMPORT_MAX_ROWS = 5000
|
|
1031
|
+
|
|
1032
|
+
export const billingPaymentImportSchema = scopedSchema.extend({
|
|
1033
|
+
fileName: z.string().trim().min(1).max(255),
|
|
1034
|
+
content: z.string().max(PAYMENT_IMPORT_MAX_BYTES),
|
|
1035
|
+
})
|
|
1036
|
+
export type BillingPaymentImportInput = z.infer<typeof billingPaymentImportSchema>
|
|
1037
|
+
|
|
1038
|
+
export const billingPaymentListQuerySchema = z
|
|
1039
|
+
.object({
|
|
1040
|
+
...listPaginationBase,
|
|
1041
|
+
id: z.string().uuid().optional(),
|
|
1042
|
+
status: z.enum(PAYMENT_STATUSES).optional(),
|
|
1043
|
+
billAccountId: z.string().uuid().optional(),
|
|
1044
|
+
importId: z.string().uuid().optional(),
|
|
1045
|
+
receivedFrom: isoDateString.optional(),
|
|
1046
|
+
receivedTo: isoDateString.optional(),
|
|
1047
|
+
search: z.string().trim().max(100).optional(),
|
|
1048
|
+
})
|
|
1049
|
+
.passthrough()
|
|
1050
|
+
export type BillingPaymentListQuery = z.infer<typeof billingPaymentListQuerySchema>
|
|
1051
|
+
|
|
1052
|
+
export const billingPaymentImportListQuerySchema = z
|
|
1053
|
+
.object({ ...listPaginationBase, id: z.string().uuid().optional() })
|
|
1054
|
+
.passthrough()
|
|
1055
|
+
export type BillingPaymentImportListQuery = z.infer<typeof billingPaymentImportListQuerySchema>
|
|
1056
|
+
|
|
1057
|
+
// ─── Spec D — credit / debit memos ───────────────────────────────
|
|
1058
|
+
|
|
1059
|
+
export const MEMO_TYPES = ['credit_memo', 'debit_memo'] as const
|
|
1060
|
+
export type MemoType = (typeof MEMO_TYPES)[number]
|
|
1061
|
+
|
|
1062
|
+
const memoLineSchema = z.object({
|
|
1063
|
+
// Copied from the original (credit prefill). The original line's VAT rate wins.
|
|
1064
|
+
correctsLineId: z.string().uuid().optional(),
|
|
1065
|
+
description: z.string().trim().min(1).max(500),
|
|
1066
|
+
quantity: z.coerce.number().finite().positive(),
|
|
1067
|
+
unitPriceNet: z.coerce.number().finite().nonnegative(),
|
|
1068
|
+
// New lines: omitted → organization default rate.
|
|
1069
|
+
taxRate: z.coerce.number().finite().min(0).max(100).optional(),
|
|
1070
|
+
})
|
|
1071
|
+
export type MemoLineInput = z.infer<typeof memoLineSchema>
|
|
1072
|
+
|
|
1073
|
+
export const billingMemoCreateSchema = scopedSchema.extend({
|
|
1074
|
+
invoiceId: z.string().uuid(),
|
|
1075
|
+
type: z.enum(MEMO_TYPES),
|
|
1076
|
+
reason: z.string().trim().min(1, 'billing.memo.error.reason_required').max(1000),
|
|
1077
|
+
// Credit memo without lines = full credit (all original lines). Debit memo
|
|
1078
|
+
// without lines = empty draft (lines are added on the draft).
|
|
1079
|
+
lines: z.array(memoLineSchema).max(200).optional(),
|
|
1080
|
+
})
|
|
1081
|
+
export type BillingMemoCreateInput = z.infer<typeof billingMemoCreateSchema>
|
|
1082
|
+
|
|
1083
|
+
export const billingDraftDeleteSchema = scopedSchema.extend({
|
|
1084
|
+
invoiceId: z.string().uuid(),
|
|
1085
|
+
})
|
|
1086
|
+
export type BillingDraftDeleteInput = z.infer<typeof billingDraftDeleteSchema>
|