@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,58 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Invoice documents (Spec B): VAT per item, payment terms, seller settings.
|
|
5
|
+
*
|
|
6
|
+
* - `billing_items.tax_rate` — existing items get 0 (P-D5: no back-fill, a
|
|
7
|
+
* default would silently re-price live subscriptions; demo data reseeds);
|
|
8
|
+
* - `billing_accounts.payment_terms_days` / `auto_send_invoice`;
|
|
9
|
+
* - `billing_settings` seller block, bank, footer, logo, default terms and
|
|
10
|
+
* default tax rate.
|
|
11
|
+
*
|
|
12
|
+
* Additive only. Hand-written like the package's earlier migrations (`yarn
|
|
13
|
+
* mercato db generate` only diffs `@app` modules); columns mirror
|
|
14
|
+
* `data/entities.ts` 1:1.
|
|
15
|
+
*/
|
|
16
|
+
export class Migration20261116000000_billing_invoice_documents extends Migration {
|
|
17
|
+
async up(): Promise<void> {
|
|
18
|
+
this.addSql(
|
|
19
|
+
`alter table "billing_items" add column if not exists "tax_rate" numeric(7, 4) not null default '0';`,
|
|
20
|
+
)
|
|
21
|
+
this.addSql(
|
|
22
|
+
`alter table "billing_accounts" add column if not exists "payment_terms_days" int null, add column if not exists "auto_send_invoice" boolean not null default false;`,
|
|
23
|
+
)
|
|
24
|
+
this.addSql(
|
|
25
|
+
`alter table "billing_settings"
|
|
26
|
+
add column if not exists "legal_name" text null,
|
|
27
|
+
add column if not exists "seller_address" jsonb null,
|
|
28
|
+
add column if not exists "tax_id" text null,
|
|
29
|
+
add column if not exists "bank_name" text null,
|
|
30
|
+
add column if not exists "iban" text null,
|
|
31
|
+
add column if not exists "bic" text null,
|
|
32
|
+
add column if not exists "invoice_footer" text null,
|
|
33
|
+
add column if not exists "logo_attachment_id" uuid null,
|
|
34
|
+
add column if not exists "default_payment_terms_days" int not null default 14,
|
|
35
|
+
add column if not exists "default_tax_rate" numeric(7, 4) not null default '23';`,
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async down(): Promise<void> {
|
|
40
|
+
this.addSql(
|
|
41
|
+
`alter table "billing_settings"
|
|
42
|
+
drop column if exists "legal_name",
|
|
43
|
+
drop column if exists "seller_address",
|
|
44
|
+
drop column if exists "tax_id",
|
|
45
|
+
drop column if exists "bank_name",
|
|
46
|
+
drop column if exists "iban",
|
|
47
|
+
drop column if exists "bic",
|
|
48
|
+
drop column if exists "invoice_footer",
|
|
49
|
+
drop column if exists "logo_attachment_id",
|
|
50
|
+
drop column if exists "default_payment_terms_days",
|
|
51
|
+
drop column if exists "default_tax_rate";`,
|
|
52
|
+
)
|
|
53
|
+
this.addSql(
|
|
54
|
+
`alter table "billing_accounts" drop column if exists "payment_terms_days", drop column if exists "auto_send_invoice";`,
|
|
55
|
+
)
|
|
56
|
+
this.addSql(`alter table "billing_items" drop column if exists "tax_rate";`)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Payments (Spec C): billing-owned payment register, source-typed
|
|
5
|
+
* allocations (payments now, credit memos in Spec D) and CSV import batches.
|
|
6
|
+
*
|
|
7
|
+
* Hand-written like the package's earlier migrations (`yarn mercato db
|
|
8
|
+
* generate` only diffs `@app` modules). Partial unique indexes cannot be
|
|
9
|
+
* expressed with decorators, so they live here only.
|
|
10
|
+
*/
|
|
11
|
+
export class Migration20261117000000_billing_payments extends Migration {
|
|
12
|
+
async up(): Promise<void> {
|
|
13
|
+
this.addSql(`create table if not exists "billing_payments" (
|
|
14
|
+
"id" uuid not null default gen_random_uuid(),
|
|
15
|
+
"organization_id" uuid not null,
|
|
16
|
+
"tenant_id" uuid not null,
|
|
17
|
+
"received_at" date not null,
|
|
18
|
+
"amount" numeric(18, 4) not null,
|
|
19
|
+
"currency_code" text not null,
|
|
20
|
+
"reference" text null,
|
|
21
|
+
"payer_name" text null,
|
|
22
|
+
"payer_account" text null,
|
|
23
|
+
"source" text not null,
|
|
24
|
+
"import_id" uuid null,
|
|
25
|
+
"bill_account_id" uuid null,
|
|
26
|
+
"status" text not null,
|
|
27
|
+
"unallocated_amount" numeric(18, 4) not null,
|
|
28
|
+
"match_reason" text null,
|
|
29
|
+
"source_ref" text not null,
|
|
30
|
+
"external_ref" text null,
|
|
31
|
+
"topup_id" uuid null,
|
|
32
|
+
"metadata" jsonb null,
|
|
33
|
+
"created_at" timestamptz not null,
|
|
34
|
+
"updated_at" timestamptz not null,
|
|
35
|
+
"deleted_at" timestamptz null,
|
|
36
|
+
constraint "billing_payments_pkey" primary key ("id"),
|
|
37
|
+
constraint "billing_payments_amount_positive" check ("amount" > 0),
|
|
38
|
+
constraint "billing_payments_unallocated_range" check ("unallocated_amount" >= 0 and "unallocated_amount" <= "amount")
|
|
39
|
+
);`)
|
|
40
|
+
this.addSql(`create index if not exists "billing_payments_status_idx" on "billing_payments" ("tenant_id", "organization_id", "status");`)
|
|
41
|
+
this.addSql(`create index if not exists "billing_payments_account_idx" on "billing_payments" ("bill_account_id", "status");`)
|
|
42
|
+
this.addSql(`create index if not exists "billing_payments_import_idx" on "billing_payments" ("import_id");`)
|
|
43
|
+
this.addSql(
|
|
44
|
+
`create unique index if not exists "billing_payments_source_ref_uq" on "billing_payments" ("tenant_id", "organization_id", "source_ref") where "deleted_at" is null;`,
|
|
45
|
+
)
|
|
46
|
+
this.addSql(
|
|
47
|
+
`create unique index if not exists "billing_payments_external_ref_uq" on "billing_payments" ("tenant_id", "organization_id", "external_ref") where "external_ref" is not null;`,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
this.addSql(`create table if not exists "billing_allocations" (
|
|
51
|
+
"id" uuid not null default gen_random_uuid(),
|
|
52
|
+
"organization_id" uuid not null,
|
|
53
|
+
"tenant_id" uuid not null,
|
|
54
|
+
"source_type" text not null,
|
|
55
|
+
"source_id" uuid not null,
|
|
56
|
+
"invoice_id" uuid not null,
|
|
57
|
+
"bill_account_id" uuid not null,
|
|
58
|
+
"amount" numeric(18, 4) not null,
|
|
59
|
+
"currency_code" text not null,
|
|
60
|
+
"allocated_by" text not null,
|
|
61
|
+
"user_id" uuid null,
|
|
62
|
+
"deallocated_by_user_id" uuid null,
|
|
63
|
+
"created_at" timestamptz not null,
|
|
64
|
+
"updated_at" timestamptz not null,
|
|
65
|
+
"deleted_at" timestamptz null,
|
|
66
|
+
constraint "billing_allocations_pkey" primary key ("id"),
|
|
67
|
+
constraint "billing_allocations_amount_positive" check ("amount" > 0)
|
|
68
|
+
);`)
|
|
69
|
+
this.addSql(`create index if not exists "billing_allocations_source_idx" on "billing_allocations" ("source_type", "source_id") where "deleted_at" is null;`)
|
|
70
|
+
this.addSql(`create index if not exists "billing_allocations_invoice_idx" on "billing_allocations" ("invoice_id") where "deleted_at" is null;`)
|
|
71
|
+
this.addSql(`create index if not exists "billing_allocations_account_idx" on "billing_allocations" ("bill_account_id") where "deleted_at" is null;`)
|
|
72
|
+
|
|
73
|
+
this.addSql(`create table if not exists "billing_payment_imports" (
|
|
74
|
+
"id" uuid not null default gen_random_uuid(),
|
|
75
|
+
"organization_id" uuid not null,
|
|
76
|
+
"tenant_id" uuid not null,
|
|
77
|
+
"file_name" text not null,
|
|
78
|
+
"row_count" int not null,
|
|
79
|
+
"counts" jsonb null,
|
|
80
|
+
"errors" jsonb null,
|
|
81
|
+
"user_id" uuid null,
|
|
82
|
+
"created_at" timestamptz not null,
|
|
83
|
+
"updated_at" timestamptz not null,
|
|
84
|
+
"deleted_at" timestamptz null,
|
|
85
|
+
constraint "billing_payment_imports_pkey" primary key ("id")
|
|
86
|
+
);`)
|
|
87
|
+
this.addSql(
|
|
88
|
+
`create index if not exists "billing_payment_imports_scope_idx" on "billing_payment_imports" ("tenant_id", "organization_id", "created_at");`,
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async down(): Promise<void> {
|
|
93
|
+
this.addSql(`drop table if exists "billing_payment_imports";`)
|
|
94
|
+
this.addSql(`drop table if exists "billing_allocations";`)
|
|
95
|
+
this.addSql(`drop table if exists "billing_payments";`)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Credit / debit memos (Spec D). Memo columns `document_type`,
|
|
5
|
+
* `corrects_invoice_id`, `correction_reason` and `credited_total` exist since
|
|
6
|
+
* Spec 0; this adds the snapshot of the corrected document printed on the
|
|
7
|
+
* memo. Additive, hand-written like the package's earlier migrations.
|
|
8
|
+
*/
|
|
9
|
+
export class Migration20261118000000_billing_memos extends Migration {
|
|
10
|
+
async up(): Promise<void> {
|
|
11
|
+
this.addSql(
|
|
12
|
+
`alter table "billing_invoices" add column if not exists "corrects_invoice_number" text null, add column if not exists "corrects_issue_date" date null;`,
|
|
13
|
+
)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async down(): Promise<void> {
|
|
17
|
+
this.addSql(
|
|
18
|
+
`alter table "billing_invoices" drop column if exists "corrects_invoice_number", drop column if exists "corrects_issue_date";`,
|
|
19
|
+
)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Operator feedback round 1 (Spec F).
|
|
5
|
+
*
|
|
6
|
+
* - `billing_items.price_basis` ('net' | 'gross', default 'net'): the item
|
|
7
|
+
* price is stored as typed; invoice lines and prepaid debits are computed
|
|
8
|
+
* from that basis (F-D2).
|
|
9
|
+
* - `billing_settings.prepaid_tax_point` ('topup' | 'consumption', default
|
|
10
|
+
* 'topup'): where prepaid VAT is charged (F-D3).
|
|
11
|
+
* - `billing_statements.vat_summary` jsonb: per-rate net / tax / gross of the
|
|
12
|
+
* period's prepaid debits (empty in `topup` mode).
|
|
13
|
+
*
|
|
14
|
+
* Hand-written like the package's earlier migrations: `yarn mercato db
|
|
15
|
+
* generate` only diffs `@app` modules. Columns mirror `data/entities.ts` 1:1.
|
|
16
|
+
*/
|
|
17
|
+
export class Migration20261119000000_billing_operator_feedback extends Migration {
|
|
18
|
+
async up(): Promise<void> {
|
|
19
|
+
this.addSql(`alter table "billing_items" add column if not exists "price_basis" text not null default 'net';`)
|
|
20
|
+
this.addSql(
|
|
21
|
+
`alter table "billing_items" add constraint "billing_items_price_basis_check" check ("price_basis" in ('net', 'gross'));`,
|
|
22
|
+
)
|
|
23
|
+
this.addSql(
|
|
24
|
+
`alter table "billing_settings" add column if not exists "prepaid_tax_point" text not null default 'topup';`,
|
|
25
|
+
)
|
|
26
|
+
this.addSql(
|
|
27
|
+
`alter table "billing_settings" add constraint "billing_settings_prepaid_tax_point_check" check ("prepaid_tax_point" in ('topup', 'consumption'));`,
|
|
28
|
+
)
|
|
29
|
+
this.addSql(`alter table "billing_statements" add column if not exists "vat_summary" jsonb null;`)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async down(): Promise<void> {
|
|
33
|
+
this.addSql(`alter table "billing_statements" drop column if exists "vat_summary";`)
|
|
34
|
+
this.addSql(`alter table "billing_settings" drop constraint if exists "billing_settings_prepaid_tax_point_check";`)
|
|
35
|
+
this.addSql(`alter table "billing_settings" drop column if exists "prepaid_tax_point";`)
|
|
36
|
+
this.addSql(`alter table "billing_items" drop constraint if exists "billing_items_price_basis_check";`)
|
|
37
|
+
this.addSql(`alter table "billing_items" drop column if exists "price_basis";`)
|
|
38
|
+
}
|
|
39
|
+
}
|
package/src/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `billing_allocations` lookup indexes lead with the tenant scope, like every
|
|
5
|
+
* other billing table. Each allocation read filters by tenant + organization
|
|
6
|
+
* plus the invoice, the source (payment / credit memo) or the account.
|
|
7
|
+
*
|
|
8
|
+
* Hand-written like the package's earlier migrations: `yarn mercato db
|
|
9
|
+
* generate` only diffs `@app` modules. Indexes mirror `data/entities.ts` 1:1.
|
|
10
|
+
*/
|
|
11
|
+
export class Migration20261120000000_billing_allocation_scope_indexes extends Migration {
|
|
12
|
+
async up(): Promise<void> {
|
|
13
|
+
this.addSql(`drop index if exists "billing_allocations_source_idx";`)
|
|
14
|
+
this.addSql(`drop index if exists "billing_allocations_invoice_idx";`)
|
|
15
|
+
this.addSql(`drop index if exists "billing_allocations_account_idx";`)
|
|
16
|
+
this.addSql(
|
|
17
|
+
`create index if not exists "billing_allocations_source_idx" on "billing_allocations" ("tenant_id", "organization_id", "source_type", "source_id") where "deleted_at" is null;`,
|
|
18
|
+
)
|
|
19
|
+
this.addSql(
|
|
20
|
+
`create index if not exists "billing_allocations_invoice_idx" on "billing_allocations" ("tenant_id", "organization_id", "invoice_id") where "deleted_at" is null;`,
|
|
21
|
+
)
|
|
22
|
+
this.addSql(
|
|
23
|
+
`create index if not exists "billing_allocations_account_idx" on "billing_allocations" ("tenant_id", "organization_id", "bill_account_id") where "deleted_at" is null;`,
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async down(): Promise<void> {
|
|
28
|
+
this.addSql(`drop index if exists "billing_allocations_source_idx";`)
|
|
29
|
+
this.addSql(`drop index if exists "billing_allocations_invoice_idx";`)
|
|
30
|
+
this.addSql(`drop index if exists "billing_allocations_account_idx";`)
|
|
31
|
+
this.addSql(`create index if not exists "billing_allocations_source_idx" on "billing_allocations" ("source_type", "source_id") where "deleted_at" is null;`)
|
|
32
|
+
this.addSql(`create index if not exists "billing_allocations_invoice_idx" on "billing_allocations" ("invoice_id") where "deleted_at" is null;`)
|
|
33
|
+
this.addSql(`create index if not exists "billing_allocations_account_idx" on "billing_allocations" ("bill_account_id") where "deleted_at" is null;`)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
2
2
|
import type { ModuleSetupConfig } from '@open-mercato/shared/modules/setup'
|
|
3
3
|
import { features as billingAclFeatures } from './acl'
|
|
4
|
-
import {
|
|
5
|
-
Dictionary,
|
|
6
|
-
DictionaryEntry,
|
|
7
|
-
} from '@open-mercato/core/modules/dictionaries/data/entities'
|
|
8
|
-
import { ModuleConfig } from '@open-mercato/core/modules/configs/data/entities'
|
|
4
|
+
import { getBillingSettings } from './lib/billingSettings'
|
|
9
5
|
|
|
10
6
|
/**
|
|
11
7
|
* Billing module setup — per-tenant defaults at module installation.
|
|
@@ -14,17 +10,11 @@ import { ModuleConfig } from '@open-mercato/core/modules/configs/data/entities'
|
|
|
14
10
|
* - All seed helpers below check for an existing row before inserting.
|
|
15
11
|
* - Safe to re-run on every `mercato init` and on `auth sync-role-acls`.
|
|
16
12
|
*
|
|
17
|
-
* What this file seeds
|
|
18
|
-
*
|
|
19
|
-
* - `
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* billing owns them per Phase 0 validation.)
|
|
23
|
-
* - `billing.cron_schedule` + `billing.cron_enabled` module configs.
|
|
24
|
-
* - `billing.invoice_number.format` + `.reset_cycle` configs (per-tenant
|
|
25
|
-
* defaults; the actual atomic numbering uses core/sales'
|
|
26
|
-
* `SalesDocumentSequence` which is created by core/sales' own
|
|
27
|
-
* `onTenantCreated`).
|
|
13
|
+
* What this file seeds (Spec 0 — no core `configs` / `dictionaries` /
|
|
14
|
+
* `sales` rows any more):
|
|
15
|
+
* - one `billing_settings` row per organization with the defaults
|
|
16
|
+
* (prepaid defaults + number masks). `getBillingSettings` also creates
|
|
17
|
+
* it lazily, so this is only a warm-up.
|
|
28
18
|
*
|
|
29
19
|
* Default role-feature grants:
|
|
30
20
|
* - `admin` gets every `billing.*` feature.
|
|
@@ -33,214 +23,6 @@ import { ModuleConfig } from '@open-mercato/core/modules/configs/data/entities'
|
|
|
33
23
|
* - `billing_usage_writer` is the narrow scope for external system API keys.
|
|
34
24
|
*/
|
|
35
25
|
|
|
36
|
-
const BILLING_UOM_DICTIONARY_KEY = 'billing.uom'
|
|
37
|
-
const SALES_INVOICE_STATUS_DICTIONARY_KEY = 'sales.invoice_status'
|
|
38
|
-
|
|
39
|
-
const BILLING_UOM_CODES = [
|
|
40
|
-
// time
|
|
41
|
-
{ value: 'hour', label: 'Hour' },
|
|
42
|
-
{ value: 'day', label: 'Day' },
|
|
43
|
-
{ value: 'week', label: 'Week' },
|
|
44
|
-
{ value: 'month', label: 'Month' },
|
|
45
|
-
// volume
|
|
46
|
-
{ value: 'gb', label: 'Gigabyte' },
|
|
47
|
-
{ value: 'tb', label: 'Terabyte' },
|
|
48
|
-
{ value: 'mb', label: 'Megabyte' },
|
|
49
|
-
// requests / tokens
|
|
50
|
-
{ value: 'request', label: 'Request' },
|
|
51
|
-
{ value: 'api_request', label: 'API Request' },
|
|
52
|
-
{ value: 'token', label: 'Token' },
|
|
53
|
-
{ value: 'input_token', label: 'Input Token' },
|
|
54
|
-
{ value: 'output_token', label: 'Output Token' },
|
|
55
|
-
// seats / devices
|
|
56
|
-
{ value: 'seat', label: 'Seat' },
|
|
57
|
-
{ value: 'user', label: 'User' },
|
|
58
|
-
{ value: 'device', label: 'Device' },
|
|
59
|
-
{ value: 'active_user', label: 'Active User' },
|
|
60
|
-
] as const
|
|
61
|
-
|
|
62
|
-
const INVOICE_STATUS_ENTRIES = [
|
|
63
|
-
// `posted` is the canonical "issued" state and is also the default a
|
|
64
|
-
// freshly created invoice transitions to — but billing creates drafts,
|
|
65
|
-
// so `draft` is the default DictionaryEntry for new rows.
|
|
66
|
-
{ value: 'draft', label: 'Draft', isDefault: true, color: '#9ca3af' },
|
|
67
|
-
{ value: 'posted', label: 'Posted', isDefault: false, color: '#2563eb' },
|
|
68
|
-
{ value: 'paid', label: 'Paid', isDefault: false, color: '#16a34a' },
|
|
69
|
-
{ value: 'void', label: 'Void', isDefault: false, color: '#dc2626' },
|
|
70
|
-
] as const
|
|
71
|
-
|
|
72
|
-
type SeedScope = { tenantId: string; organizationId: string }
|
|
73
|
-
|
|
74
|
-
async function ensureDictionary(
|
|
75
|
-
em: EntityManager,
|
|
76
|
-
scope: SeedScope,
|
|
77
|
-
params: { key: string; name: string; description: string },
|
|
78
|
-
): Promise<Dictionary> {
|
|
79
|
-
const existing = await em.findOne(Dictionary, {
|
|
80
|
-
tenantId: scope.tenantId,
|
|
81
|
-
organizationId: scope.organizationId,
|
|
82
|
-
key: params.key,
|
|
83
|
-
deletedAt: null,
|
|
84
|
-
})
|
|
85
|
-
if (existing) return existing
|
|
86
|
-
const dictionary = em.create(Dictionary, {
|
|
87
|
-
tenantId: scope.tenantId,
|
|
88
|
-
organizationId: scope.organizationId,
|
|
89
|
-
key: params.key,
|
|
90
|
-
name: params.name,
|
|
91
|
-
description: params.description,
|
|
92
|
-
isSystem: true,
|
|
93
|
-
isActive: true,
|
|
94
|
-
managerVisibility: 'hidden',
|
|
95
|
-
createdAt: new Date(),
|
|
96
|
-
updatedAt: new Date(),
|
|
97
|
-
})
|
|
98
|
-
em.persist(dictionary)
|
|
99
|
-
await em.flush()
|
|
100
|
-
return dictionary
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
async function ensureDictionaryEntries(
|
|
104
|
-
em: EntityManager,
|
|
105
|
-
scope: SeedScope,
|
|
106
|
-
dictionary: Dictionary,
|
|
107
|
-
entries: ReadonlyArray<{
|
|
108
|
-
value: string
|
|
109
|
-
label: string
|
|
110
|
-
isDefault?: boolean
|
|
111
|
-
color?: string
|
|
112
|
-
}>,
|
|
113
|
-
): Promise<void> {
|
|
114
|
-
const existing = await em.find(DictionaryEntry, {
|
|
115
|
-
dictionary,
|
|
116
|
-
tenantId: scope.tenantId,
|
|
117
|
-
organizationId: scope.organizationId,
|
|
118
|
-
})
|
|
119
|
-
const existingValues = new Set(existing.map((e) => e.value))
|
|
120
|
-
let position = existing.length
|
|
121
|
-
for (const entry of entries) {
|
|
122
|
-
if (existingValues.has(entry.value)) continue
|
|
123
|
-
em.persist(
|
|
124
|
-
em.create(DictionaryEntry, {
|
|
125
|
-
dictionary,
|
|
126
|
-
tenantId: scope.tenantId,
|
|
127
|
-
organizationId: scope.organizationId,
|
|
128
|
-
value: entry.value,
|
|
129
|
-
normalizedValue: entry.value.trim().toLowerCase(),
|
|
130
|
-
label: entry.label,
|
|
131
|
-
color: entry.color ?? null,
|
|
132
|
-
position,
|
|
133
|
-
isDefault: entry.isDefault ?? false,
|
|
134
|
-
createdAt: new Date(),
|
|
135
|
-
updatedAt: new Date(),
|
|
136
|
-
}),
|
|
137
|
-
)
|
|
138
|
-
position += 1
|
|
139
|
-
}
|
|
140
|
-
await em.flush()
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
async function seedBillingUomDictionary(em: EntityManager, scope: SeedScope): Promise<void> {
|
|
144
|
-
const dict = await ensureDictionary(em, scope, {
|
|
145
|
-
key: BILLING_UOM_DICTIONARY_KEY,
|
|
146
|
-
name: 'Billing units of measure',
|
|
147
|
-
description: 'Units billing accepts on usage records (exact match — no conversion).',
|
|
148
|
-
})
|
|
149
|
-
await ensureDictionaryEntries(em, scope, dict, BILLING_UOM_CODES)
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
async function seedInvoiceStatusDictionary(em: EntityManager, scope: SeedScope): Promise<void> {
|
|
153
|
-
const dict = await ensureDictionary(em, scope, {
|
|
154
|
-
key: SALES_INVOICE_STATUS_DICTIONARY_KEY,
|
|
155
|
-
name: 'Sales invoice statuses',
|
|
156
|
-
description: 'draft → posted → paid (or void). Drives the billing draft/post lifecycle.',
|
|
157
|
-
})
|
|
158
|
-
await ensureDictionaryEntries(em, scope, dict, INVOICE_STATUS_ENTRIES)
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
async function ensureModuleConfig(
|
|
162
|
-
em: EntityManager,
|
|
163
|
-
params: { moduleId: string; name: string; value: unknown },
|
|
164
|
-
): Promise<void> {
|
|
165
|
-
const existing = await em.findOne(ModuleConfig, {
|
|
166
|
-
moduleId: params.moduleId,
|
|
167
|
-
name: params.name,
|
|
168
|
-
})
|
|
169
|
-
if (existing) return
|
|
170
|
-
em.persist(
|
|
171
|
-
em.create(ModuleConfig, {
|
|
172
|
-
moduleId: params.moduleId,
|
|
173
|
-
name: params.name,
|
|
174
|
-
valueJson: params.value as Record<string, unknown> | null,
|
|
175
|
-
createdAt: new Date(),
|
|
176
|
-
updatedAt: new Date(),
|
|
177
|
-
}),
|
|
178
|
-
)
|
|
179
|
-
await em.flush()
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
async function seedBillingConfigs(em: EntityManager): Promise<void> {
|
|
183
|
-
await ensureModuleConfig(em, {
|
|
184
|
-
moduleId: 'billing',
|
|
185
|
-
name: 'cron_schedule',
|
|
186
|
-
value: '0 2 * * *',
|
|
187
|
-
})
|
|
188
|
-
await ensureModuleConfig(em, {
|
|
189
|
-
moduleId: 'billing',
|
|
190
|
-
name: 'cron_enabled',
|
|
191
|
-
value: true,
|
|
192
|
-
})
|
|
193
|
-
await ensureModuleConfig(em, {
|
|
194
|
-
moduleId: 'billing',
|
|
195
|
-
name: 'invoice_number.format',
|
|
196
|
-
value: 'INV-{YYYY}-{0000001}',
|
|
197
|
-
})
|
|
198
|
-
await ensureModuleConfig(em, {
|
|
199
|
-
moduleId: 'billing',
|
|
200
|
-
name: 'invoice_number.reset_cycle',
|
|
201
|
-
value: 'yearly',
|
|
202
|
-
})
|
|
203
|
-
|
|
204
|
-
// ─── Prepaid balance billing (SPEC-002) ──────────────────────
|
|
205
|
-
// Fallback low-balance threshold when a prepaid account leaves its own
|
|
206
|
-
// `low_balance_threshold` null. 0 = off (status never flips to `low`
|
|
207
|
-
// until an operator sets a per-account threshold).
|
|
208
|
-
await ensureModuleConfig(em, {
|
|
209
|
-
moduleId: 'billing',
|
|
210
|
-
name: 'prepaid.low_balance_threshold_default',
|
|
211
|
-
value: 0,
|
|
212
|
-
})
|
|
213
|
-
// Default gateway provider key for top-up sessions.
|
|
214
|
-
await ensureModuleConfig(em, {
|
|
215
|
-
moduleId: 'billing',
|
|
216
|
-
name: 'prepaid.topup_provider',
|
|
217
|
-
value: 'stripe',
|
|
218
|
-
})
|
|
219
|
-
// Master switch for period statements.
|
|
220
|
-
await ensureModuleConfig(em, {
|
|
221
|
-
moduleId: 'billing',
|
|
222
|
-
name: 'prepaid.statement_enabled',
|
|
223
|
-
value: true,
|
|
224
|
-
})
|
|
225
|
-
// VAT rate (percent) applied to top-up receipts. The top-up `amount` is
|
|
226
|
-
// treated as GROSS (what the customer pays = what the balance is credited);
|
|
227
|
-
// the core tax service computes net + VAT from this rate. 0 = no VAT until
|
|
228
|
-
// an operator sets the jurisdiction's rate. (Deviation from xd-249, which
|
|
229
|
-
// never resolves a rate — see CHANGELOG.)
|
|
230
|
-
await ensureModuleConfig(em, {
|
|
231
|
-
moduleId: 'billing',
|
|
232
|
-
name: 'prepaid.topup_tax_rate',
|
|
233
|
-
value: 0,
|
|
234
|
-
})
|
|
235
|
-
// Fallback buffer for the `near_limit` credit status. 0 = warn only at the
|
|
236
|
-
// limit itself.
|
|
237
|
-
await ensureModuleConfig(em, {
|
|
238
|
-
moduleId: 'billing',
|
|
239
|
-
name: 'credit.near_limit_buffer_default',
|
|
240
|
-
value: 0,
|
|
241
|
-
})
|
|
242
|
-
}
|
|
243
|
-
|
|
244
26
|
// Derived from `acl.ts` so a new feature added there automatically lands
|
|
245
27
|
// in every role that should get "everything billing" — no parallel list
|
|
246
28
|
// to keep in sync.
|
|
@@ -269,6 +51,8 @@ export const setup: ModuleSetupConfig = {
|
|
|
269
51
|
'billing.credit.view',
|
|
270
52
|
'billing.topup.view',
|
|
271
53
|
'billing.statement.view',
|
|
54
|
+
'billing.settings.view',
|
|
55
|
+
'billing.payment.view',
|
|
272
56
|
],
|
|
273
57
|
|
|
274
58
|
// Narrow scope for external usage-ingestion API keys.
|
|
@@ -276,21 +60,11 @@ export const setup: ModuleSetupConfig = {
|
|
|
276
60
|
},
|
|
277
61
|
|
|
278
62
|
/**
|
|
279
|
-
*
|
|
280
|
-
*
|
|
281
|
-
*/
|
|
282
|
-
async onTenantCreated({ em }) {
|
|
283
|
-
await seedBillingConfigs(em)
|
|
284
|
-
},
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* Reference data: dictionaries (UoM, invoice statuses). Always runs
|
|
288
|
-
* during `mercato init`. Idempotent — re-seed is safe.
|
|
63
|
+
* Reference data: the organization's billing settings row (Spec 0).
|
|
64
|
+
* Always runs during `mercato init`. Idempotent (race-safe upsert).
|
|
289
65
|
*/
|
|
290
66
|
async seedDefaults({ em, tenantId, organizationId }) {
|
|
291
|
-
|
|
292
|
-
await seedBillingUomDictionary(em, scope)
|
|
293
|
-
await seedInvoiceStatusDictionary(em, scope)
|
|
67
|
+
await getBillingSettings(em as EntityManager, { tenantId, organizationId })
|
|
294
68
|
},
|
|
295
69
|
}
|
|
296
70
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
2
|
+
import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
|
|
3
|
+
import { autoSendInvoice } from './invoice-auto-send'
|
|
4
|
+
|
|
5
|
+
/** Auto-send of posted credit memos for accounts with `auto_send_invoice` (Spec D, P-D9). */
|
|
6
|
+
export const metadata = {
|
|
7
|
+
event: 'billing.credit_memo.posted',
|
|
8
|
+
persistent: true,
|
|
9
|
+
id: 'billing-credit-memo-auto-send',
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default async function handle(payload: { invoiceId?: string; tenantId?: string; organizationId?: string }): Promise<void> {
|
|
13
|
+
const container = await createRequestContainer()
|
|
14
|
+
await autoSendInvoice((container.resolve('em') as EntityManager).fork(), payload)
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { applyCreditForAccount, type PostedPayload } from './invoice-apply-credit'
|
|
2
|
+
import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
|
|
3
|
+
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
4
|
+
|
|
5
|
+
/** Credit auto-apply when a debit memo is posted (Spec D, P-D6) — same handler as for invoices. */
|
|
6
|
+
export const metadata = {
|
|
7
|
+
event: 'billing.debit_memo.posted',
|
|
8
|
+
persistent: true,
|
|
9
|
+
id: 'billing-debit-memo-apply-credit',
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default async function handle(payload: PostedPayload): Promise<void> {
|
|
13
|
+
const container = await createRequestContainer()
|
|
14
|
+
await applyCreditForAccount((container.resolve('em') as EntityManager).fork(), payload)
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
2
|
+
import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
|
|
3
|
+
import { autoSendInvoice } from './invoice-auto-send'
|
|
4
|
+
|
|
5
|
+
/** Auto-send of posted debit memos for accounts with `auto_send_invoice` (Spec D, P-D9). */
|
|
6
|
+
export const metadata = {
|
|
7
|
+
event: 'billing.debit_memo.posted',
|
|
8
|
+
persistent: true,
|
|
9
|
+
id: 'billing-debit-memo-auto-send',
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default async function handle(payload: { invoiceId?: string; tenantId?: string; organizationId?: string }): Promise<void> {
|
|
13
|
+
const container = await createRequestContainer()
|
|
14
|
+
await autoSendInvoice((container.resolve('em') as EntityManager).fork(), payload)
|
|
15
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
2
|
+
import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
|
|
3
|
+
import { BillingAccount } from '../data/entities'
|
|
4
|
+
import { withAccountLock } from '../lib/accountLock'
|
|
5
|
+
import { applyAccountCredit } from '../lib/allocation'
|
|
6
|
+
import { emitAllocationEffects } from '../lib/allocationEvents'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Credit auto-apply on post (Spec C, D12): when an invoice is posted, any
|
|
10
|
+
* unapplied credit of its account (overpayments, unallocated payments,
|
|
11
|
+
* open credit memos) is spent on the account's open receivables, oldest due
|
|
12
|
+
* date first. Persistent and safe to re-run (it only spends what is left).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export const metadata = {
|
|
16
|
+
event: 'billing.invoice.posted',
|
|
17
|
+
persistent: true,
|
|
18
|
+
id: 'billing-invoice-apply-credit',
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type PostedPayload = { billAccountId?: string; tenantId?: string; organizationId?: string }
|
|
22
|
+
|
|
23
|
+
export async function applyCreditForAccount(em: EntityManager, payload: PostedPayload): Promise<number> {
|
|
24
|
+
if (!payload?.billAccountId || !payload.tenantId || !payload.organizationId) return 0
|
|
25
|
+
const scope = { tenantId: payload.tenantId, organizationId: payload.organizationId }
|
|
26
|
+
const account = await em.findOne(BillingAccount, { id: payload.billAccountId, ...scope } as never)
|
|
27
|
+
if (!account || account.billingMode === 'prepaid') return 0
|
|
28
|
+
const effects = await withAccountLock(em, { tenantId: scope.tenantId, billAccountId: account.id }, (tem) =>
|
|
29
|
+
applyAccountCredit(tem, scope, { id: account.id, currencyCode: account.currencyCode }),
|
|
30
|
+
)
|
|
31
|
+
await emitAllocationEffects(scope, effects)
|
|
32
|
+
return effects.created.length
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default async function handle(payload: PostedPayload): Promise<void> {
|
|
36
|
+
const container = await createRequestContainer()
|
|
37
|
+
const em = (container.resolve('em') as EntityManager).fork()
|
|
38
|
+
await applyCreditForAccount(em, payload)
|
|
39
|
+
}
|