@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.
Files changed (614) hide show
  1. package/CHANGELOG.md +172 -0
  2. package/README.md +14 -0
  3. package/dist/modules/billing/acl.js +13 -1
  4. package/dist/modules/billing/acl.js.map +2 -2
  5. package/dist/modules/billing/api/accounts/[id]/summary/route.js +52 -0
  6. package/dist/modules/billing/api/accounts/[id]/summary/route.js.map +7 -0
  7. package/dist/modules/billing/api/accounts/route.js +46 -4
  8. package/dist/modules/billing/api/accounts/route.js.map +2 -2
  9. package/dist/modules/billing/api/export/account/[id]/route.js +16 -12
  10. package/dist/modules/billing/api/export/account/[id]/route.js.map +2 -2
  11. package/dist/modules/billing/api/invoices/[id]/memos/route.js +54 -0
  12. package/dist/modules/billing/api/invoices/[id]/memos/route.js.map +7 -0
  13. package/dist/modules/billing/api/invoices/[id]/pdf/route.js +69 -0
  14. package/dist/modules/billing/api/invoices/[id]/pdf/route.js.map +7 -0
  15. package/dist/modules/billing/api/invoices/[id]/route.js +44 -24
  16. package/dist/modules/billing/api/invoices/[id]/route.js.map +2 -2
  17. package/dist/modules/billing/api/invoices/[id]/send/route.js +107 -0
  18. package/dist/modules/billing/api/invoices/[id]/send/route.js.map +7 -0
  19. package/dist/modules/billing/api/invoices/add-line/route.js +3 -3
  20. package/dist/modules/billing/api/invoices/add-line/route.js.map +2 -2
  21. package/dist/modules/billing/api/invoices/delete-draft/route.js +33 -0
  22. package/dist/modules/billing/api/invoices/delete-draft/route.js.map +7 -0
  23. package/dist/modules/billing/api/invoices/edit-line/route.js +3 -3
  24. package/dist/modules/billing/api/invoices/edit-line/route.js.map +2 -2
  25. package/dist/modules/billing/api/invoices/post/route.js +2 -2
  26. package/dist/modules/billing/api/invoices/post/route.js.map +2 -2
  27. package/dist/modules/billing/api/invoices/remove-line/route.js +3 -3
  28. package/dist/modules/billing/api/invoices/remove-line/route.js.map +2 -2
  29. package/dist/modules/billing/api/invoices/route.js +45 -46
  30. package/dist/modules/billing/api/invoices/route.js.map +2 -2
  31. package/dist/modules/billing/api/items/bulk/route.js +1 -1
  32. package/dist/modules/billing/api/items/bulk/route.js.map +2 -2
  33. package/dist/modules/billing/api/items/change-price/route.js +44 -0
  34. package/dist/modules/billing/api/items/change-price/route.js.map +7 -0
  35. package/dist/modules/billing/api/items/route.js +19 -7
  36. package/dist/modules/billing/api/items/route.js.map +2 -2
  37. package/dist/modules/billing/api/payment-imports/[id]/route.js +49 -0
  38. package/dist/modules/billing/api/payment-imports/[id]/route.js.map +7 -0
  39. package/dist/modules/billing/api/payment-imports/route.js +57 -0
  40. package/dist/modules/billing/api/payment-imports/route.js.map +7 -0
  41. package/dist/modules/billing/api/payments/[id]/route.js +60 -0
  42. package/dist/modules/billing/api/payments/[id]/route.js.map +7 -0
  43. package/dist/modules/billing/api/payments/allocate/route.js +35 -0
  44. package/dist/modules/billing/api/payments/allocate/route.js.map +7 -0
  45. package/dist/modules/billing/api/payments/assign/route.js +36 -0
  46. package/dist/modules/billing/api/payments/assign/route.js.map +7 -0
  47. package/dist/modules/billing/api/payments/convert-to-topup/route.js +35 -0
  48. package/dist/modules/billing/api/payments/convert-to-topup/route.js.map +7 -0
  49. package/dist/modules/billing/api/payments/ignore/route.js +35 -0
  50. package/dist/modules/billing/api/payments/ignore/route.js.map +7 -0
  51. package/dist/modules/billing/api/payments/import/route.js +63 -0
  52. package/dist/modules/billing/api/payments/import/route.js.map +7 -0
  53. package/dist/modules/billing/api/payments/restore/route.js +35 -0
  54. package/dist/modules/billing/api/payments/restore/route.js.map +7 -0
  55. package/dist/modules/billing/api/payments/route.js +114 -0
  56. package/dist/modules/billing/api/payments/route.js.map +7 -0
  57. package/dist/modules/billing/api/payments/unallocate/route.js +35 -0
  58. package/dist/modules/billing/api/payments/unallocate/route.js.map +7 -0
  59. package/dist/modules/billing/api/payments/unassign/route.js +35 -0
  60. package/dist/modules/billing/api/payments/unassign/route.js.map +7 -0
  61. package/dist/modules/billing/api/run-outcomes/route.js +44 -7
  62. package/dist/modules/billing/api/run-outcomes/route.js.map +2 -2
  63. package/dist/modules/billing/api/runs/[id]/post-drafts/route.js +61 -0
  64. package/dist/modules/billing/api/runs/[id]/post-drafts/route.js.map +7 -0
  65. package/dist/modules/billing/api/runs/[id]/route.js +53 -0
  66. package/dist/modules/billing/api/runs/[id]/route.js.map +7 -0
  67. package/dist/modules/billing/api/runs/retry-failed/route.js +3 -3
  68. package/dist/modules/billing/api/runs/retry-failed/route.js.map +2 -2
  69. package/dist/modules/billing/api/runs/route.js +11 -5
  70. package/dist/modules/billing/api/runs/route.js.map +2 -2
  71. package/dist/modules/billing/api/settings/number-preview/route.js +42 -0
  72. package/dist/modules/billing/api/settings/number-preview/route.js.map +7 -0
  73. package/dist/modules/billing/api/settings/route.js +92 -0
  74. package/dist/modules/billing/api/settings/route.js.map +7 -0
  75. package/dist/modules/billing/api/statements/route.js +3 -0
  76. package/dist/modules/billing/api/statements/route.js.map +2 -2
  77. package/dist/modules/billing/api/test-invoices/wipe/route.js +2 -2
  78. package/dist/modules/billing/api/test-invoices/wipe/route.js.map +2 -2
  79. package/dist/modules/billing/backend/billing/accounts/[id]/page.js +121 -232
  80. package/dist/modules/billing/backend/billing/accounts/[id]/page.js.map +2 -2
  81. package/dist/modules/billing/backend/billing/accounts/create/page.js +6 -0
  82. package/dist/modules/billing/backend/billing/accounts/create/page.js.map +2 -2
  83. package/dist/modules/billing/backend/billing/accounts/page.js +63 -4
  84. package/dist/modules/billing/backend/billing/accounts/page.js.map +2 -2
  85. package/dist/modules/billing/backend/billing/invoices/[id]/page.js +297 -65
  86. package/dist/modules/billing/backend/billing/invoices/[id]/page.js.map +3 -3
  87. package/dist/modules/billing/backend/billing/invoices/page.js +6 -172
  88. package/dist/modules/billing/backend/billing/invoices/page.js.map +2 -2
  89. package/dist/modules/billing/backend/billing/items/[id]/page.js +51 -7
  90. package/dist/modules/billing/backend/billing/items/[id]/page.js.map +2 -2
  91. package/dist/modules/billing/backend/billing/items/create/page.js +9 -6
  92. package/dist/modules/billing/backend/billing/items/create/page.js.map +2 -2
  93. package/dist/modules/billing/backend/billing/items/page.js +8 -2
  94. package/dist/modules/billing/backend/billing/items/page.js.map +2 -2
  95. package/dist/modules/billing/backend/billing/payments/[id]/page.js +297 -0
  96. package/dist/modules/billing/backend/billing/payments/[id]/page.js.map +7 -0
  97. package/dist/modules/billing/backend/billing/payments/[id]/page.meta.js +21 -0
  98. package/dist/modules/billing/backend/billing/payments/[id]/page.meta.js.map +7 -0
  99. package/dist/modules/billing/backend/billing/payments/imports/[id]/page.js +74 -0
  100. package/dist/modules/billing/backend/billing/payments/imports/[id]/page.js.map +7 -0
  101. package/dist/modules/billing/backend/billing/payments/imports/[id]/page.meta.js +21 -0
  102. package/dist/modules/billing/backend/billing/payments/imports/[id]/page.meta.js.map +7 -0
  103. package/dist/modules/billing/backend/billing/payments/page.js +58 -0
  104. package/dist/modules/billing/backend/billing/payments/page.js.map +7 -0
  105. package/dist/modules/billing/backend/billing/payments/page.meta.js +18 -0
  106. package/dist/modules/billing/backend/billing/payments/page.meta.js.map +7 -0
  107. package/dist/modules/billing/backend/billing/runs/[id]/page.js +49 -14
  108. package/dist/modules/billing/backend/billing/runs/[id]/page.js.map +2 -2
  109. package/dist/modules/billing/backend/billing/runs/page.js +58 -7
  110. package/dist/modules/billing/backend/billing/runs/page.js.map +2 -2
  111. package/dist/modules/billing/backend/billing/statements/[id]/page.js +61 -6
  112. package/dist/modules/billing/backend/billing/statements/[id]/page.js.map +2 -2
  113. package/dist/modules/billing/backend/billing/statements/page.js +1 -1
  114. package/dist/modules/billing/backend/billing/statements/page.js.map +2 -2
  115. package/dist/modules/billing/backend/billing/topups/page.js +1 -1
  116. package/dist/modules/billing/backend/billing/topups/page.js.map +2 -2
  117. package/dist/modules/billing/backend/billing/transactions/page.js +1 -1
  118. package/dist/modules/billing/backend/billing/transactions/page.js.map +2 -2
  119. package/dist/modules/billing/backend/billing/usage/create/page.js +3 -2
  120. package/dist/modules/billing/backend/billing/usage/create/page.js.map +2 -2
  121. package/dist/modules/billing/backend/config/billing/page.js +472 -0
  122. package/dist/modules/billing/backend/config/billing/page.js.map +7 -0
  123. package/dist/modules/billing/backend/config/billing/page.meta.js +19 -0
  124. package/dist/modules/billing/backend/config/billing/page.meta.js.map +7 -0
  125. package/dist/modules/billing/ce.js.map +2 -2
  126. package/dist/modules/billing/cli.js +22 -1
  127. package/dist/modules/billing/cli.js.map +2 -2
  128. package/dist/modules/billing/commands/accounts.js +6 -0
  129. package/dist/modules/billing/commands/accounts.js.map +2 -2
  130. package/dist/modules/billing/commands/index.js +3 -0
  131. package/dist/modules/billing/commands/index.js.map +2 -2
  132. package/dist/modules/billing/commands/invoices.js +272 -170
  133. package/dist/modules/billing/commands/invoices.js.map +2 -2
  134. package/dist/modules/billing/commands/items.js +108 -0
  135. package/dist/modules/billing/commands/items.js.map +2 -2
  136. package/dist/modules/billing/commands/memos.js +179 -0
  137. package/dist/modules/billing/commands/memos.js.map +7 -0
  138. package/dist/modules/billing/commands/payments.js +379 -0
  139. package/dist/modules/billing/commands/payments.js.map +7 -0
  140. package/dist/modules/billing/commands/runs.js +154 -7
  141. package/dist/modules/billing/commands/runs.js.map +2 -2
  142. package/dist/modules/billing/commands/settings.js +59 -0
  143. package/dist/modules/billing/commands/settings.js.map +7 -0
  144. package/dist/modules/billing/commands/topups.js +9 -2
  145. package/dist/modules/billing/commands/topups.js.map +2 -2
  146. package/dist/modules/billing/commands/transactions.js +2 -2
  147. package/dist/modules/billing/commands/transactions.js.map +2 -2
  148. package/dist/modules/billing/components/AccountForm.js +149 -42
  149. package/dist/modules/billing/components/AccountForm.js.map +2 -2
  150. package/dist/modules/billing/components/AccountInvoicesSection.js +64 -0
  151. package/dist/modules/billing/components/AccountInvoicesSection.js.map +7 -0
  152. package/dist/modules/billing/components/AccountPaymentsSection.js +43 -0
  153. package/dist/modules/billing/components/AccountPaymentsSection.js.map +7 -0
  154. package/dist/modules/billing/components/AccountPicker.js +56 -0
  155. package/dist/modules/billing/components/AccountPicker.js.map +7 -0
  156. package/dist/modules/billing/components/AllocatePaymentDialog.js +134 -0
  157. package/dist/modules/billing/components/AllocatePaymentDialog.js.map +7 -0
  158. package/dist/modules/billing/components/BillingDataTable.js +21 -0
  159. package/dist/modules/billing/components/BillingDataTable.js.map +7 -0
  160. package/dist/modules/billing/components/BillingSettingsLink.js +19 -0
  161. package/dist/modules/billing/components/BillingSettingsLink.js.map +7 -0
  162. package/dist/modules/billing/components/ChangeItemPriceDialog.js +158 -0
  163. package/dist/modules/billing/components/ChangeItemPriceDialog.js.map +7 -0
  164. package/dist/modules/billing/components/CreateMemoDialog.js +200 -0
  165. package/dist/modules/billing/components/CreateMemoDialog.js.map +7 -0
  166. package/dist/modules/billing/components/CustomerLabel.js +33 -0
  167. package/dist/modules/billing/components/CustomerLabel.js.map +7 -0
  168. package/dist/modules/billing/components/InvoicesTable.js +270 -0
  169. package/dist/modules/billing/components/InvoicesTable.js.map +7 -0
  170. package/dist/modules/billing/components/ItemForm.js +176 -44
  171. package/dist/modules/billing/components/ItemForm.js.map +2 -2
  172. package/dist/modules/billing/components/ItemPriceField.js +46 -0
  173. package/dist/modules/billing/components/ItemPriceField.js.map +7 -0
  174. package/dist/modules/billing/components/LineFormDialog.js +25 -2
  175. package/dist/modules/billing/components/LineFormDialog.js.map +2 -2
  176. package/dist/modules/billing/components/ManualPaymentDialog.js +122 -0
  177. package/dist/modules/billing/components/ManualPaymentDialog.js.map +7 -0
  178. package/dist/modules/billing/components/MoneyInput.js +14 -0
  179. package/dist/modules/billing/components/MoneyInput.js.map +7 -0
  180. package/dist/modules/billing/components/PaymentUploadDialog.js +115 -0
  181. package/dist/modules/billing/components/PaymentUploadDialog.js.map +7 -0
  182. package/dist/modules/billing/components/PaymentsTable.js +171 -0
  183. package/dist/modules/billing/components/PaymentsTable.js.map +7 -0
  184. package/dist/modules/billing/components/PostRunDraftsButton.js +105 -0
  185. package/dist/modules/billing/components/PostRunDraftsButton.js.map +7 -0
  186. package/dist/modules/billing/components/PrepaidPanel.js +14 -4
  187. package/dist/modules/billing/components/PrepaidPanel.js.map +2 -2
  188. package/dist/modules/billing/components/RunCyclesSection.js +209 -0
  189. package/dist/modules/billing/components/RunCyclesSection.js.map +7 -0
  190. package/dist/modules/billing/components/TestRunActions.js +127 -0
  191. package/dist/modules/billing/components/TestRunActions.js.map +7 -0
  192. package/dist/modules/billing/components/account/AccountItemsTab.js +157 -0
  193. package/dist/modules/billing/components/account/AccountItemsTab.js.map +7 -0
  194. package/dist/modules/billing/components/account/AccountRunBillingDialog.js +122 -0
  195. package/dist/modules/billing/components/account/AccountRunBillingDialog.js.map +7 -0
  196. package/dist/modules/billing/components/account/AccountRunsTab.js +152 -0
  197. package/dist/modules/billing/components/account/AccountRunsTab.js.map +7 -0
  198. package/dist/modules/billing/components/account/AccountStatementsTab.js +98 -0
  199. package/dist/modules/billing/components/account/AccountStatementsTab.js.map +7 -0
  200. package/dist/modules/billing/components/account/AccountSummaryCards.js +125 -0
  201. package/dist/modules/billing/components/account/AccountSummaryCards.js.map +7 -0
  202. package/dist/modules/billing/components/account/AccountUsageTab.js +91 -0
  203. package/dist/modules/billing/components/account/AccountUsageTab.js.map +7 -0
  204. package/dist/modules/billing/components/account/AccountView.js +73 -0
  205. package/dist/modules/billing/components/account/AccountView.js.map +7 -0
  206. package/dist/modules/billing/components/account/accountRow.js +39 -0
  207. package/dist/modules/billing/components/account/accountRow.js.map +7 -0
  208. package/dist/modules/billing/components/customerNames.js +42 -0
  209. package/dist/modules/billing/components/customerNames.js.map +7 -0
  210. package/dist/modules/billing/data/entities.js +615 -59
  211. package/dist/modules/billing/data/entities.js.map +2 -2
  212. package/dist/modules/billing/data/entityIds.js +10 -1
  213. package/dist/modules/billing/data/entityIds.js.map +2 -2
  214. package/dist/modules/billing/data/validators.js +269 -15
  215. package/dist/modules/billing/data/validators.js.map +2 -2
  216. package/dist/modules/billing/events.js +70 -0
  217. package/dist/modules/billing/events.js.map +2 -2
  218. package/dist/modules/billing/i18n/en.json +457 -21
  219. package/dist/modules/billing/i18n/pl.json +457 -21
  220. package/dist/modules/billing/index.js +6 -2
  221. package/dist/modules/billing/index.js.map +2 -2
  222. package/dist/modules/billing/lib/accountFinancials.js +58 -0
  223. package/dist/modules/billing/lib/accountFinancials.js.map +7 -0
  224. package/dist/modules/billing/lib/accountLock.js +14 -0
  225. package/dist/modules/billing/lib/accountLock.js.map +7 -0
  226. package/dist/modules/billing/lib/accountStatus.js +9 -7
  227. package/dist/modules/billing/lib/accountStatus.js.map +2 -2
  228. package/dist/modules/billing/lib/accountSummary.js +106 -0
  229. package/dist/modules/billing/lib/accountSummary.js.map +7 -0
  230. package/dist/modules/billing/lib/allocation.js +356 -0
  231. package/dist/modules/billing/lib/allocation.js.map +7 -0
  232. package/dist/modules/billing/lib/allocationEvents.js +22 -0
  233. package/dist/modules/billing/lib/allocationEvents.js.map +7 -0
  234. package/dist/modules/billing/lib/billPeriod.js +15 -1
  235. package/dist/modules/billing/lib/billPeriod.js.map +2 -2
  236. package/dist/modules/billing/lib/billRunEngine.js +241 -106
  237. package/dist/modules/billing/lib/billRunEngine.js.map +2 -2
  238. package/dist/modules/billing/lib/billRunLabel.js.map +1 -1
  239. package/dist/modules/billing/lib/billingSettings.js +116 -0
  240. package/dist/modules/billing/lib/billingSettings.js.map +7 -0
  241. package/dist/modules/billing/lib/commandRoute.js +81 -0
  242. package/dist/modules/billing/lib/commandRoute.js.map +7 -0
  243. package/dist/modules/billing/lib/customerLookup.js +97 -0
  244. package/dist/modules/billing/lib/customerLookup.js.map +7 -0
  245. package/dist/modules/billing/lib/dateOnly.js +13 -0
  246. package/dist/modules/billing/lib/dateOnly.js.map +7 -0
  247. package/dist/modules/billing/lib/documentParties.js +16 -0
  248. package/dist/modules/billing/lib/documentParties.js.map +7 -0
  249. package/dist/modules/billing/lib/documentTypes.js +27 -0
  250. package/dist/modules/billing/lib/documentTypes.js.map +7 -0
  251. package/dist/modules/billing/lib/dueDate.js +18 -0
  252. package/dist/modules/billing/lib/dueDate.js.map +7 -0
  253. package/dist/modules/billing/lib/iban.js +29 -0
  254. package/dist/modules/billing/lib/iban.js.map +7 -0
  255. package/dist/modules/billing/lib/invoiceDelivery.js +131 -0
  256. package/dist/modules/billing/lib/invoiceDelivery.js.map +7 -0
  257. package/dist/modules/billing/lib/invoiceLanguages.js +16 -0
  258. package/dist/modules/billing/lib/invoiceLanguages.js.map +7 -0
  259. package/dist/modules/billing/lib/invoiceWriter.js +107 -99
  260. package/dist/modules/billing/lib/invoiceWriter.js.map +2 -2
  261. package/dist/modules/billing/lib/itemBillingState.js +27 -0
  262. package/dist/modules/billing/lib/itemBillingState.js.map +7 -0
  263. package/dist/modules/billing/lib/itemPriceChange.js +18 -0
  264. package/dist/modules/billing/lib/itemPriceChange.js.map +7 -0
  265. package/dist/modules/billing/lib/itemSelector.js.map +2 -2
  266. package/dist/modules/billing/lib/lineAmounts.js +32 -0
  267. package/dist/modules/billing/lib/lineAmounts.js.map +7 -0
  268. package/dist/modules/billing/lib/memoGuards.js +25 -0
  269. package/dist/modules/billing/lib/memoGuards.js.map +7 -0
  270. package/dist/modules/billing/lib/navigation.js +48 -0
  271. package/dist/modules/billing/lib/navigation.js.map +7 -0
  272. package/dist/modules/billing/lib/numbering.js +120 -0
  273. package/dist/modules/billing/lib/numbering.js.map +7 -0
  274. package/dist/modules/billing/lib/overdue.js +36 -0
  275. package/dist/modules/billing/lib/overdue.js.map +7 -0
  276. package/dist/modules/billing/lib/paymentCsv.js +125 -0
  277. package/dist/modules/billing/lib/paymentCsv.js.map +7 -0
  278. package/dist/modules/billing/lib/paymentGateway.js +15 -0
  279. package/dist/modules/billing/lib/paymentGateway.js.map +7 -0
  280. package/dist/modules/billing/lib/paymentImport.js +164 -0
  281. package/dist/modules/billing/lib/paymentImport.js.map +7 -0
  282. package/dist/modules/billing/lib/paymentMatcher.js +36 -0
  283. package/dist/modules/billing/lib/paymentMatcher.js.map +7 -0
  284. package/dist/modules/billing/lib/pdf/attachmentStore.js +46 -0
  285. package/dist/modules/billing/lib/pdf/attachmentStore.js.map +7 -0
  286. package/dist/modules/billing/lib/pdf/fonts/embeddedFonts.js +7 -0
  287. package/dist/modules/billing/lib/pdf/fonts/embeddedFonts.js.map +7 -0
  288. package/dist/modules/billing/lib/pdf/invoiceModel.js +194 -0
  289. package/dist/modules/billing/lib/pdf/invoiceModel.js.map +7 -0
  290. package/dist/modules/billing/lib/pdf/invoicePdf.js +165 -0
  291. package/dist/modules/billing/lib/pdf/invoicePdf.js.map +7 -0
  292. package/dist/modules/billing/lib/pdf/invoiceTemplate.js +274 -0
  293. package/dist/modules/billing/lib/pdf/invoiceTemplate.js.map +7 -0
  294. package/dist/modules/billing/lib/prepaidConfig.js +17 -25
  295. package/dist/modules/billing/lib/prepaidConfig.js.map +2 -2
  296. package/dist/modules/billing/lib/prepaidConsume.js +26 -7
  297. package/dist/modules/billing/lib/prepaidConsume.js.map +2 -2
  298. package/dist/modules/billing/lib/prepaidPeriodClose.js +277 -158
  299. package/dist/modules/billing/lib/prepaidPeriodClose.js.map +2 -2
  300. package/dist/modules/billing/lib/prepaidTaxPoint.js +37 -0
  301. package/dist/modules/billing/lib/prepaidTaxPoint.js.map +7 -0
  302. package/dist/modules/billing/lib/seeds/demo.js +51 -3
  303. package/dist/modules/billing/lib/seeds/demo.js.map +2 -2
  304. package/dist/modules/billing/lib/seeds/paymentsSample.js +93 -0
  305. package/dist/modules/billing/lib/seeds/paymentsSample.js.map +7 -0
  306. package/dist/modules/billing/lib/seeds/sellerSettings.js +41 -0
  307. package/dist/modules/billing/lib/seeds/sellerSettings.js.map +7 -0
  308. package/dist/modules/billing/lib/servicePeriods.js +121 -0
  309. package/dist/modules/billing/lib/servicePeriods.js.map +7 -0
  310. package/dist/modules/billing/lib/tenantLock.js.map +1 -1
  311. package/dist/modules/billing/lib/testRunCleanup.js +24 -0
  312. package/dist/modules/billing/lib/testRunCleanup.js.map +7 -0
  313. package/dist/modules/billing/lib/topupCapture.js +2 -2
  314. package/dist/modules/billing/lib/topupCapture.js.map +2 -2
  315. package/dist/modules/billing/lib/topupReceipt.js +58 -79
  316. package/dist/modules/billing/lib/topupReceipt.js.map +2 -2
  317. package/dist/modules/billing/lib/usageRater.js.map +1 -1
  318. package/dist/modules/billing/lib/usageRunner.js +14 -6
  319. package/dist/modules/billing/lib/usageRunner.js.map +2 -2
  320. package/dist/modules/billing/lib/vat.js +39 -0
  321. package/dist/modules/billing/lib/vat.js.map +7 -0
  322. package/dist/modules/billing/migrations/Migration20261114000000_billing_customer_kind.js +15 -0
  323. package/dist/modules/billing/migrations/Migration20261114000000_billing_customer_kind.js.map +7 -0
  324. package/dist/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.js +25 -0
  325. package/dist/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.js.map +7 -0
  326. package/dist/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.js +115 -0
  327. package/dist/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.js.map +7 -0
  328. package/dist/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.js +47 -0
  329. package/dist/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.js.map +7 -0
  330. package/dist/modules/billing/migrations/Migration20261117000000_billing_payments.js +89 -0
  331. package/dist/modules/billing/migrations/Migration20261117000000_billing_payments.js.map +7 -0
  332. package/dist/modules/billing/migrations/Migration20261118000000_billing_memos.js +17 -0
  333. package/dist/modules/billing/migrations/Migration20261118000000_billing_memos.js.map +7 -0
  334. package/dist/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.js +27 -0
  335. package/dist/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.js.map +7 -0
  336. package/dist/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.js +29 -0
  337. package/dist/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.js.map +7 -0
  338. package/dist/modules/billing/setup.js +7 -184
  339. package/dist/modules/billing/setup.js.map +2 -2
  340. package/dist/modules/billing/subscribers/credit-memo-auto-send.js +16 -0
  341. package/dist/modules/billing/subscribers/credit-memo-auto-send.js.map +7 -0
  342. package/dist/modules/billing/subscribers/debit-memo-apply-credit.js +16 -0
  343. package/dist/modules/billing/subscribers/debit-memo-apply-credit.js.map +7 -0
  344. package/dist/modules/billing/subscribers/debit-memo-auto-send.js +16 -0
  345. package/dist/modules/billing/subscribers/debit-memo-auto-send.js.map +7 -0
  346. package/dist/modules/billing/subscribers/invoice-apply-credit.js +34 -0
  347. package/dist/modules/billing/subscribers/invoice-apply-credit.js.map +7 -0
  348. package/dist/modules/billing/subscribers/invoice-auto-send.js +30 -0
  349. package/dist/modules/billing/subscribers/invoice-auto-send.js.map +7 -0
  350. package/dist/modules/billing/subscribers/payment-captured-to-paid.js +69 -33
  351. package/dist/modules/billing/subscribers/payment-captured-to-paid.js.map +2 -2
  352. package/dist/modules/billing/subscribers/prepaid-topup-captured.js +4 -6
  353. package/dist/modules/billing/subscribers/prepaid-topup-captured.js.map +2 -2
  354. package/dist/modules/billing/workers/reap-stale-bill-runs.js +2 -2
  355. package/dist/modules/billing/workers/reap-stale-bill-runs.js.map +2 -2
  356. package/generated/entities/billing_account/index.ts +26 -0
  357. package/generated/entities/billing_account_balance/index.ts +13 -0
  358. package/generated/entities/billing_account_transaction/index.ts +21 -0
  359. package/generated/entities/billing_account_usage/index.ts +18 -0
  360. package/generated/entities/billing_allocation/index.ts +18 -0
  361. package/generated/entities/billing_document_sequence/index.ts +11 -0
  362. package/generated/entities/billing_draft_invoice_edit/index.ts +14 -0
  363. package/generated/entities/billing_invoice/index.ts +38 -0
  364. package/generated/entities/billing_invoice_line/index.ts +24 -0
  365. package/generated/entities/billing_item/index.ts +26 -0
  366. package/generated/entities/billing_payment/index.ts +25 -0
  367. package/generated/entities/billing_payment_import/index.ts +14 -0
  368. package/generated/entities/billing_run/index.ts +20 -0
  369. package/generated/entities/billing_run_outcome/index.ts +18 -0
  370. package/generated/entities/billing_settings/index.ts +26 -0
  371. package/generated/entities/billing_statement/index.ts +22 -0
  372. package/generated/entities/billing_topup/index.ts +20 -0
  373. package/generated/entities.ids.generated.ts +35 -0
  374. package/package.json +15 -10
  375. package/src/modules/billing/__integration__/TC-BILL-004.spec.ts +170 -0
  376. package/src/modules/billing/__integration__/TC-BILL-005.spec.ts +134 -0
  377. package/src/modules/billing/__integration__/TC-BILL-006.spec.ts +101 -0
  378. package/src/modules/billing/__integration__/TC-BILL-007.spec.ts +140 -0
  379. package/src/modules/billing/__integration__/TC-BILL-008.spec.ts +108 -0
  380. package/src/modules/billing/__integration__/TC-BILL-009.spec.ts +113 -0
  381. package/src/modules/billing/__integration__/TC-BILL-010.spec.ts +118 -0
  382. package/src/modules/billing/__integration__/TC-BILL-011.spec.ts +142 -0
  383. package/src/modules/billing/__integration__/TC-BILL-012.spec.ts +115 -0
  384. package/src/modules/billing/__integration__/TC-BILL-013.spec.ts +118 -0
  385. package/src/modules/billing/__integration__/sellerSettings.ts +24 -0
  386. package/src/modules/billing/__tests__/commands/invoices.test.ts +437 -355
  387. package/src/modules/billing/__tests__/commands/itemsBulk.test.ts +33 -0
  388. package/src/modules/billing/__tests__/commands/memos.test.ts +205 -0
  389. package/src/modules/billing/__tests__/commands/payments.test.ts +241 -0
  390. package/src/modules/billing/__tests__/commands/runsDelete.test.ts +146 -0
  391. package/src/modules/billing/__tests__/commands/runsPostDrafts.test.ts +106 -0
  392. package/src/modules/billing/__tests__/commands/topups.test.ts +11 -0
  393. package/src/modules/billing/__tests__/entityRegistry.test.ts +326 -0
  394. package/src/modules/billing/__tests__/events.test.ts +142 -0
  395. package/src/modules/billing/__tests__/helpers/prepaidMockEm.ts +28 -11
  396. package/src/modules/billing/__tests__/lib/accountFinancials.test.ts +53 -0
  397. package/src/modules/billing/__tests__/lib/accountSummary.test.ts +97 -0
  398. package/src/modules/billing/__tests__/lib/allocation.test.ts +319 -0
  399. package/src/modules/billing/__tests__/lib/billRunEngine.test.ts +231 -20
  400. package/src/modules/billing/__tests__/lib/billingSettings.test.ts +109 -0
  401. package/src/modules/billing/__tests__/lib/customerLookup.test.ts +156 -0
  402. package/src/modules/billing/__tests__/lib/dueDate.test.ts +35 -0
  403. package/src/modules/billing/__tests__/lib/iban.test.ts +38 -0
  404. package/src/modules/billing/__tests__/lib/invoiceDelivery.test.ts +189 -0
  405. package/src/modules/billing/__tests__/lib/invoiceWriter.test.ts +212 -10
  406. package/src/modules/billing/__tests__/lib/itemBillingState.test.ts +42 -0
  407. package/src/modules/billing/__tests__/lib/itemPriceChange.test.ts +165 -0
  408. package/src/modules/billing/__tests__/lib/lineAmounts.test.ts +86 -0
  409. package/src/modules/billing/__tests__/lib/navigation.test.ts +71 -0
  410. package/src/modules/billing/__tests__/lib/numbering.test.ts +91 -0
  411. package/src/modules/billing/__tests__/lib/overdue.test.ts +36 -0
  412. package/src/modules/billing/__tests__/lib/paymentCsv.test.ts +148 -0
  413. package/src/modules/billing/__tests__/lib/paymentImport.test.ts +113 -0
  414. package/src/modules/billing/__tests__/lib/paymentsSample.test.ts +73 -0
  415. package/src/modules/billing/__tests__/lib/pdf/invoicePdf.test.ts +199 -0
  416. package/src/modules/billing/__tests__/lib/pdf/invoicePdfService.test.ts +147 -0
  417. package/src/modules/billing/__tests__/lib/prepaidPeriodClose.test.ts +374 -98
  418. package/src/modules/billing/__tests__/lib/prepaidTaxPoint.test.ts +118 -0
  419. package/src/modules/billing/__tests__/lib/seedsDemo.test.ts +53 -2
  420. package/src/modules/billing/__tests__/lib/sellerSettings.test.ts +28 -0
  421. package/src/modules/billing/__tests__/lib/servicePeriods.test.ts +190 -0
  422. package/src/modules/billing/__tests__/lib/topupCapture.test.ts +6 -28
  423. package/src/modules/billing/__tests__/lib/topupReceipt.test.ts +21 -52
  424. package/src/modules/billing/__tests__/lib/vat.test.ts +51 -0
  425. package/src/modules/billing/__tests__/package-isolation.test.ts +22 -8
  426. package/src/modules/billing/__tests__/setup.test.ts +13 -4
  427. package/src/modules/billing/__tests__/validators.test.ts +193 -3
  428. package/src/modules/billing/acl.ts +12 -0
  429. package/src/modules/billing/api/accounts/[id]/summary/route.ts +62 -0
  430. package/src/modules/billing/api/accounts/route.ts +58 -4
  431. package/src/modules/billing/api/export/account/[id]/route.ts +20 -18
  432. package/src/modules/billing/api/invoices/[id]/memos/route.ts +63 -0
  433. package/src/modules/billing/api/invoices/[id]/pdf/route.ts +79 -0
  434. package/src/modules/billing/api/invoices/[id]/route.ts +57 -70
  435. package/src/modules/billing/api/invoices/[id]/send/route.ts +127 -0
  436. package/src/modules/billing/api/invoices/add-line/route.ts +3 -3
  437. package/src/modules/billing/api/invoices/delete-draft/route.ts +33 -0
  438. package/src/modules/billing/api/invoices/edit-line/route.ts +4 -4
  439. package/src/modules/billing/api/invoices/post/route.ts +7 -6
  440. package/src/modules/billing/api/invoices/remove-line/route.ts +3 -3
  441. package/src/modules/billing/api/invoices/route.ts +81 -86
  442. package/src/modules/billing/api/items/bulk/route.ts +2 -1
  443. package/src/modules/billing/api/items/change-price/route.ts +54 -0
  444. package/src/modules/billing/api/items/route.ts +23 -7
  445. package/src/modules/billing/api/payment-imports/[id]/route.ts +49 -0
  446. package/src/modules/billing/api/payment-imports/route.ts +57 -0
  447. package/src/modules/billing/api/payments/[id]/route.ts +63 -0
  448. package/src/modules/billing/api/payments/allocate/route.ts +35 -0
  449. package/src/modules/billing/api/payments/assign/route.ts +36 -0
  450. package/src/modules/billing/api/payments/convert-to-topup/route.ts +35 -0
  451. package/src/modules/billing/api/payments/ignore/route.ts +35 -0
  452. package/src/modules/billing/api/payments/import/route.ts +72 -0
  453. package/src/modules/billing/api/payments/restore/route.ts +35 -0
  454. package/src/modules/billing/api/payments/route.ts +147 -0
  455. package/src/modules/billing/api/payments/unallocate/route.ts +35 -0
  456. package/src/modules/billing/api/payments/unassign/route.ts +35 -0
  457. package/src/modules/billing/api/run-outcomes/route.ts +50 -7
  458. package/src/modules/billing/api/runs/[id]/post-drafts/route.ts +71 -0
  459. package/src/modules/billing/api/runs/[id]/route.ts +59 -0
  460. package/src/modules/billing/api/runs/retry-failed/route.ts +4 -3
  461. package/src/modules/billing/api/runs/route.ts +17 -9
  462. package/src/modules/billing/api/settings/number-preview/route.ts +46 -0
  463. package/src/modules/billing/api/settings/route.ts +116 -0
  464. package/src/modules/billing/api/statements/route.ts +5 -0
  465. package/src/modules/billing/api/test-invoices/wipe/route.ts +2 -2
  466. package/src/modules/billing/backend/billing/accounts/[id]/page.tsx +151 -372
  467. package/src/modules/billing/backend/billing/accounts/create/page.tsx +6 -0
  468. package/src/modules/billing/backend/billing/accounts/page.tsx +71 -5
  469. package/src/modules/billing/backend/billing/invoices/[id]/page.tsx +445 -96
  470. package/src/modules/billing/backend/billing/invoices/page.tsx +8 -227
  471. package/src/modules/billing/backend/billing/items/[id]/page.tsx +75 -6
  472. package/src/modules/billing/backend/billing/items/create/page.tsx +13 -8
  473. package/src/modules/billing/backend/billing/items/page.tsx +19 -3
  474. package/src/modules/billing/backend/billing/payments/[id]/page.meta.ts +19 -0
  475. package/src/modules/billing/backend/billing/payments/[id]/page.tsx +415 -0
  476. package/src/modules/billing/backend/billing/payments/imports/[id]/page.meta.ts +19 -0
  477. package/src/modules/billing/backend/billing/payments/imports/[id]/page.tsx +106 -0
  478. package/src/modules/billing/backend/billing/payments/page.meta.ts +16 -0
  479. package/src/modules/billing/backend/billing/payments/page.tsx +56 -0
  480. package/src/modules/billing/backend/billing/runs/[id]/page.tsx +50 -19
  481. package/src/modules/billing/backend/billing/runs/page.tsx +60 -9
  482. package/src/modules/billing/backend/billing/statements/[id]/page.tsx +87 -6
  483. package/src/modules/billing/backend/billing/statements/page.tsx +2 -2
  484. package/src/modules/billing/backend/billing/topups/page.tsx +2 -2
  485. package/src/modules/billing/backend/billing/transactions/page.tsx +2 -2
  486. package/src/modules/billing/backend/billing/usage/create/page.tsx +3 -2
  487. package/src/modules/billing/backend/config/billing/page.meta.ts +21 -0
  488. package/src/modules/billing/backend/config/billing/page.tsx +549 -0
  489. package/src/modules/billing/ce.ts +8 -7
  490. package/src/modules/billing/cli.ts +31 -1
  491. package/src/modules/billing/commands/accounts.ts +6 -0
  492. package/src/modules/billing/commands/index.ts +3 -0
  493. package/src/modules/billing/commands/invoices.ts +371 -238
  494. package/src/modules/billing/commands/items.ts +143 -0
  495. package/src/modules/billing/commands/memos.ts +218 -0
  496. package/src/modules/billing/commands/payments.ts +428 -0
  497. package/src/modules/billing/commands/runs.ts +208 -6
  498. package/src/modules/billing/commands/settings.ts +77 -0
  499. package/src/modules/billing/commands/topups.ts +12 -3
  500. package/src/modules/billing/commands/transactions.ts +2 -2
  501. package/src/modules/billing/components/AccountForm.tsx +199 -53
  502. package/src/modules/billing/components/AccountInvoicesSection.tsx +75 -0
  503. package/src/modules/billing/components/AccountPaymentsSection.tsx +42 -0
  504. package/src/modules/billing/components/AccountPicker.tsx +70 -0
  505. package/src/modules/billing/components/AllocatePaymentDialog.tsx +167 -0
  506. package/src/modules/billing/components/BillingDataTable.tsx +34 -0
  507. package/src/modules/billing/components/BillingSettingsLink.tsx +25 -0
  508. package/src/modules/billing/components/ChangeItemPriceDialog.tsx +180 -0
  509. package/src/modules/billing/components/CreateMemoDialog.tsx +232 -0
  510. package/src/modules/billing/components/CustomerLabel.tsx +53 -0
  511. package/src/modules/billing/components/InvoicesTable.tsx +344 -0
  512. package/src/modules/billing/components/ItemForm.tsx +233 -44
  513. package/src/modules/billing/components/ItemPriceField.tsx +81 -0
  514. package/src/modules/billing/components/LineFormDialog.tsx +25 -1
  515. package/src/modules/billing/components/ManualPaymentDialog.tsx +140 -0
  516. package/src/modules/billing/components/MoneyInput.tsx +26 -0
  517. package/src/modules/billing/components/PaymentUploadDialog.tsx +148 -0
  518. package/src/modules/billing/components/PaymentsTable.tsx +213 -0
  519. package/src/modules/billing/components/PostRunDraftsButton.tsx +129 -0
  520. package/src/modules/billing/components/PrepaidPanel.tsx +20 -7
  521. package/src/modules/billing/components/RunCyclesSection.tsx +298 -0
  522. package/src/modules/billing/components/TestRunActions.tsx +152 -0
  523. package/src/modules/billing/components/account/AccountItemsTab.tsx +192 -0
  524. package/src/modules/billing/components/account/AccountRunBillingDialog.tsx +147 -0
  525. package/src/modules/billing/components/account/AccountRunsTab.tsx +201 -0
  526. package/src/modules/billing/components/account/AccountStatementsTab.tsx +120 -0
  527. package/src/modules/billing/components/account/AccountSummaryCards.tsx +153 -0
  528. package/src/modules/billing/components/account/AccountUsageTab.tsx +122 -0
  529. package/src/modules/billing/components/account/AccountView.tsx +101 -0
  530. package/src/modules/billing/components/account/accountRow.ts +70 -0
  531. package/src/modules/billing/components/customerNames.ts +62 -0
  532. package/src/modules/billing/data/entities.ts +685 -15
  533. package/src/modules/billing/data/entityIds.ts +25 -11
  534. package/src/modules/billing/data/validators.ts +388 -8
  535. package/src/modules/billing/events.ts +82 -3
  536. package/src/modules/billing/i18n/en.json +457 -21
  537. package/src/modules/billing/i18n/pl.json +457 -21
  538. package/src/modules/billing/index.ts +6 -2
  539. package/src/modules/billing/lib/accountFinancials.ts +84 -0
  540. package/src/modules/billing/lib/accountLock.ts +32 -0
  541. package/src/modules/billing/lib/accountStatus.ts +11 -9
  542. package/src/modules/billing/lib/accountSummary.ts +172 -0
  543. package/src/modules/billing/lib/allocation.ts +515 -0
  544. package/src/modules/billing/lib/allocationEvents.ts +26 -0
  545. package/src/modules/billing/lib/billPeriod.ts +19 -0
  546. package/src/modules/billing/lib/billRunEngine.ts +362 -162
  547. package/src/modules/billing/lib/billRunLabel.ts +1 -1
  548. package/src/modules/billing/lib/billingSettings.ts +145 -0
  549. package/src/modules/billing/lib/commandRoute.ts +112 -0
  550. package/src/modules/billing/lib/customerLookup.ts +157 -0
  551. package/src/modules/billing/lib/dateOnly.ts +22 -0
  552. package/src/modules/billing/lib/documentParties.ts +23 -0
  553. package/src/modules/billing/lib/documentTypes.ts +37 -0
  554. package/src/modules/billing/lib/dueDate.ts +26 -0
  555. package/src/modules/billing/lib/iban.ts +36 -0
  556. package/src/modules/billing/lib/invoiceDelivery.ts +197 -0
  557. package/src/modules/billing/lib/invoiceLanguages.ts +34 -0
  558. package/src/modules/billing/lib/invoiceWriter.ts +162 -148
  559. package/src/modules/billing/lib/itemBillingState.ts +67 -0
  560. package/src/modules/billing/lib/itemPriceChange.ts +56 -0
  561. package/src/modules/billing/lib/itemSelector.ts +4 -1
  562. package/src/modules/billing/lib/lineAmounts.ts +61 -0
  563. package/src/modules/billing/lib/memoGuards.ts +41 -0
  564. package/src/modules/billing/lib/navigation.ts +64 -0
  565. package/src/modules/billing/lib/numbering.ts +174 -0
  566. package/src/modules/billing/lib/overdue.ts +60 -0
  567. package/src/modules/billing/lib/paymentCsv.ts +171 -0
  568. package/src/modules/billing/lib/paymentGateway.ts +52 -0
  569. package/src/modules/billing/lib/paymentImport.ts +228 -0
  570. package/src/modules/billing/lib/paymentMatcher.ts +88 -0
  571. package/src/modules/billing/lib/pdf/attachmentStore.ts +60 -0
  572. package/src/modules/billing/lib/pdf/fonts/NotoSans-Bold.ttf +0 -0
  573. package/src/modules/billing/lib/pdf/fonts/NotoSans-Regular.ttf +0 -0
  574. package/src/modules/billing/lib/pdf/fonts/OFL.txt +93 -0
  575. package/src/modules/billing/lib/pdf/fonts/embeddedFonts.ts +9 -0
  576. package/src/modules/billing/lib/pdf/invoiceModel.ts +328 -0
  577. package/src/modules/billing/lib/pdf/invoicePdf.ts +216 -0
  578. package/src/modules/billing/lib/pdf/invoiceTemplate.ts +338 -0
  579. package/src/modules/billing/lib/prepaidConfig.ts +27 -36
  580. package/src/modules/billing/lib/prepaidConsume.ts +29 -6
  581. package/src/modules/billing/lib/prepaidPeriodClose.ts +410 -242
  582. package/src/modules/billing/lib/prepaidTaxPoint.ts +76 -0
  583. package/src/modules/billing/lib/seeds/demo.ts +79 -6
  584. package/src/modules/billing/lib/seeds/paymentsSample.ts +136 -0
  585. package/src/modules/billing/lib/seeds/sellerSettings.ts +78 -0
  586. package/src/modules/billing/lib/servicePeriods.ts +226 -0
  587. package/src/modules/billing/lib/tenantLock.ts +1 -1
  588. package/src/modules/billing/lib/testRunCleanup.ts +42 -0
  589. package/src/modules/billing/lib/topupCapture.ts +3 -4
  590. package/src/modules/billing/lib/topupReceipt.ts +70 -103
  591. package/src/modules/billing/lib/usageRater.ts +1 -1
  592. package/src/modules/billing/lib/usageRunner.ts +17 -5
  593. package/src/modules/billing/lib/vat.ts +56 -0
  594. package/src/modules/billing/migrations/Migration20261114000000_billing_customer_kind.ts +25 -0
  595. package/src/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.ts +37 -0
  596. package/src/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.ts +132 -0
  597. package/src/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.ts +58 -0
  598. package/src/modules/billing/migrations/Migration20261117000000_billing_payments.ts +97 -0
  599. package/src/modules/billing/migrations/Migration20261118000000_billing_memos.ts +21 -0
  600. package/src/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.ts +39 -0
  601. package/src/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.ts +35 -0
  602. package/src/modules/billing/setup.ts +11 -237
  603. package/src/modules/billing/subscribers/credit-memo-auto-send.ts +15 -0
  604. package/src/modules/billing/subscribers/debit-memo-apply-credit.ts +15 -0
  605. package/src/modules/billing/subscribers/debit-memo-auto-send.ts +15 -0
  606. package/src/modules/billing/subscribers/invoice-apply-credit.ts +39 -0
  607. package/src/modules/billing/subscribers/invoice-auto-send.ts +46 -0
  608. package/src/modules/billing/subscribers/payment-captured-to-paid.ts +84 -62
  609. package/src/modules/billing/subscribers/prepaid-topup-captured.ts +4 -8
  610. package/src/modules/billing/workers/reap-stale-bill-runs.ts +4 -4
  611. package/dist/modules/billing/lib/invoiceStatus.js +0 -38
  612. package/dist/modules/billing/lib/invoiceStatus.js.map +0 -7
  613. package/src/modules/billing/__tests__/lib/invoiceStatus.test.ts +0 -97
  614. package/src/modules/billing/lib/invoiceStatus.ts +0 -61
@@ -30,10 +30,13 @@ import { Entity, Index, PrimaryKey, Property, Unique } from '@mikro-orm/decorato
30
30
  })
31
31
  export class BillingAccount {
32
32
  [OptionalProps]?:
33
+ | 'customerKind'
33
34
  | 'taxId'
34
35
  | 'lastBillDate'
35
36
  | 'billingMode'
36
37
  | 'creditLimit'
38
+ | 'paymentTermsDays'
39
+ | 'autoSendInvoice'
37
40
  | 'isActive'
38
41
  | 'createdAt'
39
42
  | 'updatedAt'
@@ -54,6 +57,12 @@ export class BillingAccount {
54
57
  @Property({ name: 'customer_id', type: 'text' })
55
58
  customerId!: string
56
59
 
60
+ // Spec E (B2C): which customers collection `customer_id` points into —
61
+ // 'company' | 'person'. Drives the lookup + label only; immutable after
62
+ // create, like `customer_id`.
63
+ @Property({ name: 'customer_kind', type: 'text', default: 'company' })
64
+ customerKind: 'company' | 'person' = 'company'
65
+
57
66
  @Property({ type: 'text' })
58
67
  name!: string
59
68
 
@@ -109,6 +118,15 @@ export class BillingAccount {
109
118
  @Property({ name: 'credit_limit', type: 'numeric', columnType: 'numeric(18, 4)', default: '0' })
110
119
  creditLimit: string = '0'
111
120
 
121
+ // Spec B — payment terms in days for this account's invoices; null = the
122
+ // organization default (`billing_settings.default_payment_terms_days`).
123
+ @Property({ name: 'payment_terms_days', type: 'integer', nullable: true })
124
+ paymentTermsDays?: number | null
125
+
126
+ // Spec B — email each invoice to `invoice_email` automatically at post.
127
+ @Property({ name: 'auto_send_invoice', type: 'boolean', default: false })
128
+ autoSendInvoice: boolean = false
129
+
112
130
  @Property({ name: 'is_active', type: 'boolean', default: true })
113
131
  isActive: boolean = true
114
132
 
@@ -160,6 +178,10 @@ export class BillingItem {
160
178
  | 'sourceRef'
161
179
  | 'currencyMismatch'
162
180
  | 'billedToDate'
181
+ | 'chargeTiming'
182
+ | 'prorate'
183
+ | 'taxRate'
184
+ | 'priceBasis'
163
185
  | 'isActive'
164
186
  | 'createdAt'
165
187
  | 'updatedAt'
@@ -226,6 +248,29 @@ export class BillingItem {
226
248
  @Property({ name: 'billed_to_date', type: 'date', columnType: 'date', nullable: true })
227
249
  billedToDate?: Date | null
228
250
 
251
+ // Spec A — recurring items only. 'in_advance' (default) bills the coming
252
+ // period on the bill date; 'in_arrears' bills the period just ended.
253
+ @Property({ name: 'charge_timing', type: 'text', default: 'in_advance' })
254
+ chargeTiming: 'in_advance' | 'in_arrears' = 'in_advance'
255
+
256
+ // Spec A — recurring items only. Prorate partial periods (item starts /
257
+ // ends mid-period) by calendar days, and credit unused days when an item
258
+ // billed in advance ends early. False = skip partial periods.
259
+ @Property({ name: 'prorate', type: 'boolean', default: true })
260
+ prorate: boolean = true
261
+
262
+ // Spec B (B-D1) — VAT rate in percent, snapshotted onto every invoice line.
263
+ // Filled from `billing_settings.default_tax_rate` at creation when omitted;
264
+ // never looked up live, so a default change never re-prices subscriptions.
265
+ @Property({ name: 'tax_rate', type: 'numeric', columnType: 'numeric(7, 4)', default: '0' })
266
+ taxRate: string = '0'
267
+
268
+ // Spec F (F-D2) — the `rate_json` amounts are stored as typed, on this
269
+ // basis. Invoice lines are computed from it (`lib/lineAmounts.ts`), so a
270
+ // typed gross is reproduced exactly. Tiered usage rates are always 'net'.
271
+ @Property({ name: 'price_basis', type: 'text', default: 'net' })
272
+ priceBasis: 'net' | 'gross' = 'net'
273
+
229
274
  @Property({ name: 'is_active', type: 'boolean', default: true })
230
275
  isActive: boolean = true
231
276
 
@@ -318,13 +363,20 @@ export class BillingAccountUsage {
318
363
  deletedAt?: Date | null
319
364
  }
320
365
 
321
- // ─── BillRun ─────────────────────────────────────────────────────
366
+ // ─── BillingRun ──────────────────────────────────────────────────
322
367
  //
323
368
  // A single execution of the engine — one row per trigger (schedule or
324
369
  // manual). The concurrency lock is a Postgres transaction-scoped advisory
325
370
  // lock keyed by hash(tenant_id || 'billing-run'); it is NOT stored on this
326
371
  // row. Crash recovery for zombie `status='running'` rows is handled by
327
372
  // workers/reap-stale-bill-runs.ts.
373
+ //
374
+ // Class names must be the PascalCase of the entity-id suffix (`billing:
375
+ // billing_run` → `BillingRun`) — that is how Open Mercato maps an id to its
376
+ // table. Until 0.20.0 this class was `BillRun` (likewise `BillRunOutcome`,
377
+ // `DraftInvoiceEdit`), and those three ids resolved to no table; see
378
+ // data/entityIds.ts. Type-only aliases for the old names are at the end of
379
+ // this file.
328
380
 
329
381
  @Entity({ tableName: 'billing_runs' })
330
382
  @Index({
@@ -335,12 +387,11 @@ export class BillingAccountUsage {
335
387
  name: 'billing_runs_parent_idx',
336
388
  properties: ['parentRunId'],
337
389
  })
338
- export class BillRun {
390
+ export class BillingRun {
339
391
  [OptionalProps]?:
340
392
  | 'parentRunId'
341
393
  | 'dryRun'
342
394
  | 'testMode'
343
- | 'catchUp'
344
395
  | 'scopedAccountIds'
345
396
  | 'startedAt'
346
397
  | 'finishedAt'
@@ -375,10 +426,6 @@ export class BillRun {
375
426
  @Property({ name: 'test_mode', type: 'boolean', default: false })
376
427
  testMode: boolean = false
377
428
 
378
- // True → loop missed cycles per account in one run (manual only).
379
- @Property({ name: 'catch_up', type: 'boolean', default: false })
380
- catchUp: boolean = false
381
-
382
429
  // Optional — run processes only these accounts when set. JSONB
383
430
  // (Postgres arrays would work too, but jsonb keeps tooling uniform
384
431
  // across this package).
@@ -417,10 +464,10 @@ export class BillRun {
417
464
  deletedAt?: Date | null
418
465
  }
419
466
 
420
- // ─── BillRunOutcome ──────────────────────────────────────────────
467
+ // ─── BillingRunOutcome ───────────────────────────────────────────
421
468
  //
422
469
  // Per-account outcome of a Bill Run. Stored in its own table (not as a
423
- // JSONB array on BillRun.summary) so operators can query failures across
470
+ // JSONB array on BillingRun.summary) so operators can query failures across
424
471
  // runs without jsonb_array_elements gymnastics. See spec rationale.
425
472
 
426
473
  @Entity({ tableName: 'billing_run_outcomes' })
@@ -432,12 +479,13 @@ export class BillRun {
432
479
  name: 'billing_run_outcomes_account_history_idx',
433
480
  properties: ['organizationId', 'tenantId', 'billAccountId', 'createdAt'],
434
481
  })
435
- export class BillRunOutcome {
482
+ export class BillingRunOutcome {
436
483
  [OptionalProps]?:
437
484
  | 'errorMessage'
438
485
  | 'warnings'
439
486
  | 'draftInvoiceId'
440
487
  | 'statementId'
488
+ | 'cycles'
441
489
  | 'isActive'
442
490
  | 'createdAt'
443
491
  | 'updatedAt'
@@ -480,6 +528,13 @@ export class BillRunOutcome {
480
528
  @Property({ name: 'statement_id', type: 'uuid', nullable: true })
481
529
  statementId?: string | null
482
530
 
531
+ // Spec A — one entry per bill date the run processed for this account
532
+ // (catch-up emits several): `[{ bill_date, period_start, period_end,
533
+ // status, line_count, total_net, invoice_id }]`. `draft_invoice_id` keeps
534
+ // pointing at the last invoice for backward compatibility.
535
+ @Property({ type: 'jsonb', nullable: true })
536
+ cycles?: Array<Record<string, unknown>> | null
537
+
483
538
  @Property({ name: 'is_active', type: 'boolean', default: true })
484
539
  isActive: boolean = true
485
540
 
@@ -493,7 +548,7 @@ export class BillRunOutcome {
493
548
  deletedAt?: Date | null
494
549
  }
495
550
 
496
- // ─── DraftInvoiceEdit (audit) ────────────────────────────────────
551
+ // ─── BillingDraftInvoiceEdit (audit) ─────────────────────────────
497
552
  //
498
553
  // Append-only audit of every operator edit on a draft invoice line.
499
554
  // Pattern mirrors `cpq_subscription_change_logs` — minimal columns
@@ -509,7 +564,7 @@ export class BillRunOutcome {
509
564
  name: 'billing_draft_invoice_edits_user_idx',
510
565
  properties: ['organizationId', 'tenantId', 'userId', 'createdAt'],
511
566
  })
512
- export class DraftInvoiceEdit {
567
+ export class BillingDraftInvoiceEdit {
513
568
  [OptionalProps]?: 'invoiceLineId' | 'beforeJson' | 'afterJson' | 'createdAt' | 'deletedAt'
514
569
 
515
570
  @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })
@@ -630,8 +685,8 @@ export class BillingAccountBalance {
630
685
  // ─── BillingAccountTransaction (SPEC-002, append-only) ───────────
631
686
  //
632
687
  // The source of truth for every balance movement. Append-only — pattern
633
- // mirrors DraftInvoiceEdit (no `updated_at` / `is_active`; `deleted_at`
634
- // reserved for compliance erasure only). `balance = SUM(amount)`.
688
+ // mirrors BillingDraftInvoiceEdit (no `updated_at` / `is_active`;
689
+ // `deleted_at` reserved for compliance erasure only). `balance = SUM(amount)`.
635
690
  //
636
691
  // The unique `(tenant_id, bill_account_id, source_ref)` is the idempotency
637
692
  // gate: a deduplicated usage upload or a retried recurring charge can never
@@ -845,6 +900,7 @@ export class BillingStatement {
845
900
  [OptionalProps]?:
846
901
  | 'billRunId'
847
902
  | 'totalAdjustments'
903
+ | 'vatSummary'
848
904
  | 'createdAt'
849
905
  | 'updatedAt'
850
906
 
@@ -860,7 +916,7 @@ export class BillingStatement {
860
916
  @Property({ name: 'bill_account_id', type: 'uuid' })
861
917
  billAccountId!: string
862
918
 
863
- // FK (string) to the BillRun that generated it (period close reuses the
919
+ // FK (string) to the BillingRun that generated it (period close reuses the
864
920
  // run engine). Null for a manually-generated statement.
865
921
  @Property({ name: 'bill_run_id', type: 'uuid', nullable: true })
866
922
  billRunId?: string | null
@@ -904,6 +960,11 @@ export class BillingStatement {
904
960
  @Property({ name: 'debit_breakdown', type: 'jsonb' })
905
961
  debitBreakdown!: Record<string, unknown>
906
962
 
963
+ // Spec F (F5) — `[{ rate, net, tax, gross }]` per VAT rate of the period's
964
+ // prepaid debits. Empty in `topup` tax-point mode (VAT was on the receipt).
965
+ @Property({ name: 'vat_summary', type: 'jsonb', nullable: true })
966
+ vatSummary?: Array<{ rate: string; net: string; tax: string; gross: string }> | null
967
+
907
968
  // 'generated' | 'sent'.
908
969
  @Property({ type: 'text' })
909
970
  status!: string
@@ -914,3 +975,612 @@ export class BillingStatement {
914
975
  @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })
915
976
  updatedAt: Date = new Date()
916
977
  }
978
+
979
+ // ─── Deprecated names (0.20.0) ───────────────────────────────────
980
+ //
981
+ // Type-only on purpose: a runtime alias (`export const BillRun = BillingRun`)
982
+ // would make the app's generated `entities` list carry the same class twice.
983
+ // Code that used the old names as values (`em.find(BillRun, …)`) must switch
984
+ // to the new ones — TypeScript flags it.
985
+
986
+ /** @deprecated Renamed to {@link BillingRun} in 0.20.0. */
987
+ export type BillRun = BillingRun
988
+ /** @deprecated Renamed to {@link BillingRunOutcome} in 0.20.0. */
989
+ export type BillRunOutcome = BillingRunOutcome
990
+ /** @deprecated Renamed to {@link BillingDraftInvoiceEdit} in 0.20.0. */
991
+ export type DraftInvoiceEdit = BillingDraftInvoiceEdit
992
+
993
+ // ─── Spec 0 — standalone invoice ledger ─────────────────────────
994
+ //
995
+ // Billing owns its documents end to end: invoices, credit / debit memos and
996
+ // prepaid top-up receipts live here, NOT in core `sales_invoices`. FK
997
+ // columns are plain strings (the package guard forbids ORM relations).
998
+ // Partial unique indexes (dedupe per bill date, unique posted number) are
999
+ // created in the migration — decorators can't express their WHERE clause.
1000
+
1001
+ @Entity({ tableName: 'billing_invoices' })
1002
+ @Index({
1003
+ name: 'billing_invoices_status_idx',
1004
+ properties: ['tenantId', 'organizationId', 'status'],
1005
+ })
1006
+ @Index({
1007
+ name: 'billing_invoices_account_idx',
1008
+ properties: ['billAccountId', 'status', 'dueDate'],
1009
+ })
1010
+ @Index({ name: 'billing_invoices_run_idx', properties: ['billRunId'] })
1011
+ @Index({ name: 'billing_invoices_corrects_idx', properties: ['correctsInvoiceId'] })
1012
+ @Index({ name: 'billing_invoices_topup_idx', properties: ['topupId'] })
1013
+ export class BillingInvoice {
1014
+ [OptionalProps]?:
1015
+ | 'documentType'
1016
+ | 'series'
1017
+ | 'status'
1018
+ | 'testRun'
1019
+ | 'billRunId'
1020
+ | 'billDate'
1021
+ | 'periodStart'
1022
+ | 'periodEnd'
1023
+ | 'issueDate'
1024
+ | 'dueDate'
1025
+ | 'subtotalNet'
1026
+ | 'taxTotal'
1027
+ | 'totalGross'
1028
+ | 'paidTotal'
1029
+ | 'creditedTotal'
1030
+ | 'outstanding'
1031
+ | 'correctsInvoiceId'
1032
+ | 'correctionReason'
1033
+ | 'correctsInvoiceNumber'
1034
+ | 'correctsIssueDate'
1035
+ | 'buyerSnapshot'
1036
+ | 'sellerSnapshot'
1037
+ | 'pdfAttachmentId'
1038
+ | 'topupId'
1039
+ | 'postedAt'
1040
+ | 'metadata'
1041
+ | 'createdAt'
1042
+ | 'updatedAt'
1043
+ | 'deletedAt'
1044
+
1045
+ @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })
1046
+ id!: string
1047
+
1048
+ @Property({ name: 'organization_id', type: 'uuid' })
1049
+ organizationId!: string
1050
+
1051
+ @Property({ name: 'tenant_id', type: 'uuid' })
1052
+ tenantId!: string
1053
+
1054
+ @Property({ name: 'bill_account_id', type: 'uuid' })
1055
+ billAccountId!: string
1056
+
1057
+ // 'invoice' | 'credit_memo' | 'debit_memo' | 'receipt'.
1058
+ @Property({ name: 'document_type', type: 'text', default: 'invoice' })
1059
+ documentType: string = 'invoice'
1060
+
1061
+ // DRAFT-… / TEST-… until posted, then the series number (Spec 0 numbering).
1062
+ @Property({ type: 'text' })
1063
+ number!: string
1064
+
1065
+ // Numbering series the posted number came from; null while draft.
1066
+ @Property({ type: 'text', nullable: true })
1067
+ series?: string | null
1068
+
1069
+ // 'draft' | 'posted' | 'partially_paid' | 'paid' | 'credited'. No 'void'.
1070
+ @Property({ type: 'text', default: 'draft' })
1071
+ status: string = 'draft'
1072
+
1073
+ @Property({ name: 'test_run', type: 'boolean', default: false })
1074
+ testRun: boolean = false
1075
+
1076
+ @Property({ name: 'bill_run_id', type: 'uuid', nullable: true })
1077
+ billRunId?: string | null
1078
+
1079
+ // Spec A: the bill date this invoice is for (dedupe key).
1080
+ @Property({ name: 'bill_date', type: 'date', columnType: 'date', nullable: true })
1081
+ billDate?: Date | null
1082
+
1083
+ // Display period = min/max of the line service periods.
1084
+ @Property({ name: 'period_start', type: 'date', columnType: 'date', nullable: true })
1085
+ periodStart?: Date | null
1086
+
1087
+ @Property({ name: 'period_end', type: 'date', columnType: 'date', nullable: true })
1088
+ periodEnd?: Date | null
1089
+
1090
+ @Property({ name: 'issue_date', type: 'date', columnType: 'date', nullable: true })
1091
+ issueDate?: Date | null
1092
+
1093
+ @Property({ name: 'due_date', type: 'date', columnType: 'date', nullable: true })
1094
+ dueDate?: Date | null
1095
+
1096
+ @Property({ name: 'currency_code', type: 'text' })
1097
+ currencyCode!: string
1098
+
1099
+ @Property({ name: 'subtotal_net', type: 'numeric', columnType: 'numeric(18, 4)', default: '0' })
1100
+ subtotalNet: string = '0'
1101
+
1102
+ @Property({ name: 'tax_total', type: 'numeric', columnType: 'numeric(18, 4)', default: '0' })
1103
+ taxTotal: string = '0'
1104
+
1105
+ @Property({ name: 'total_gross', type: 'numeric', columnType: 'numeric(18, 4)', default: '0' })
1106
+ totalGross: string = '0'
1107
+
1108
+ @Property({ name: 'paid_total', type: 'numeric', columnType: 'numeric(18, 4)', default: '0' })
1109
+ paidTotal: string = '0'
1110
+
1111
+ @Property({ name: 'credited_total', type: 'numeric', columnType: 'numeric(18, 4)', default: '0' })
1112
+ creditedTotal: string = '0'
1113
+
1114
+ @Property({ type: 'numeric', columnType: 'numeric(18, 4)', default: '0' })
1115
+ outstanding: string = '0'
1116
+
1117
+ // Spec D groundwork: the document a credit / debit memo corrects.
1118
+ @Property({ name: 'corrects_invoice_id', type: 'uuid', nullable: true })
1119
+ correctsInvoiceId?: string | null
1120
+
1121
+ @Property({ name: 'correction_reason', type: 'text', nullable: true })
1122
+ correctionReason?: string | null
1123
+
1124
+ // Spec D — snapshot of the corrected document (printed "Corrects invoice X of DATE").
1125
+ @Property({ name: 'corrects_invoice_number', type: 'text', nullable: true })
1126
+ correctsInvoiceNumber?: string | null
1127
+
1128
+ @Property({ name: 'corrects_issue_date', type: 'date', columnType: 'date', nullable: true })
1129
+ correctsIssueDate?: Date | null
1130
+
1131
+ // Frozen at post: who the document was issued to / by.
1132
+ @Property({ name: 'buyer_snapshot', type: 'jsonb', nullable: true })
1133
+ buyerSnapshot?: Record<string, unknown> | null
1134
+
1135
+ @Property({ name: 'seller_snapshot', type: 'jsonb', nullable: true })
1136
+ sellerSnapshot?: Record<string, unknown> | null
1137
+
1138
+ @Property({ name: 'pdf_attachment_id', type: 'uuid', nullable: true })
1139
+ pdfAttachmentId?: string | null
1140
+
1141
+ // Receipts: the BillingTopup this receipt was issued for.
1142
+ @Property({ name: 'topup_id', type: 'uuid', nullable: true })
1143
+ topupId?: string | null
1144
+
1145
+ @Property({ name: 'posted_at', type: Date, nullable: true })
1146
+ postedAt?: Date | null
1147
+
1148
+ // Free-form extras only (delivery log, …) — never a query key.
1149
+ @Property({ type: 'jsonb', nullable: true })
1150
+ metadata?: Record<string, unknown> | null
1151
+
1152
+ @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })
1153
+ createdAt: Date = new Date()
1154
+
1155
+ @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })
1156
+ updatedAt: Date = new Date()
1157
+
1158
+ @Property({ name: 'deleted_at', type: Date, nullable: true })
1159
+ deletedAt?: Date | null
1160
+ }
1161
+
1162
+ @Entity({ tableName: 'billing_invoice_lines' })
1163
+ @Index({ name: 'billing_invoice_lines_invoice_idx', properties: ['invoiceId', 'lineNumber'] })
1164
+ export class BillingInvoiceLine {
1165
+ [OptionalProps]?:
1166
+ | 'billingItemId'
1167
+ | 'taxRate'
1168
+ | 'taxAmount'
1169
+ | 'servicePeriodStart'
1170
+ | 'servicePeriodEnd'
1171
+ | 'correctsLineId'
1172
+ | 'metadata'
1173
+ | 'createdAt'
1174
+ | 'updatedAt'
1175
+ | 'deletedAt'
1176
+
1177
+ @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })
1178
+ id!: string
1179
+
1180
+ @Property({ name: 'organization_id', type: 'uuid' })
1181
+ organizationId!: string
1182
+
1183
+ @Property({ name: 'tenant_id', type: 'uuid' })
1184
+ tenantId!: string
1185
+
1186
+ @Property({ name: 'invoice_id', type: 'uuid' })
1187
+ invoiceId!: string
1188
+
1189
+ @Property({ name: 'line_number', type: 'integer' })
1190
+ lineNumber!: number
1191
+
1192
+ @Property({ name: 'billing_item_id', type: 'uuid', nullable: true })
1193
+ billingItemId?: string | null
1194
+
1195
+ // 'one_time' | 'recurring' | 'usage' | 'manual' | 'receipt'.
1196
+ @Property({ name: 'billing_type', type: 'text' })
1197
+ billingType!: string
1198
+
1199
+ @Property({ type: 'text' })
1200
+ description!: string
1201
+
1202
+ @Property({ type: 'numeric', columnType: 'numeric(18, 4)' })
1203
+ quantity!: string
1204
+
1205
+ @Property({ name: 'unit_price_net', type: 'numeric', columnType: 'numeric(18, 4)' })
1206
+ unitPriceNet!: string
1207
+
1208
+ @Property({ name: 'tax_rate', type: 'numeric', columnType: 'numeric(7, 4)', default: '0' })
1209
+ taxRate: string = '0'
1210
+
1211
+ @Property({ name: 'net_amount', type: 'numeric', columnType: 'numeric(18, 4)' })
1212
+ netAmount!: string
1213
+
1214
+ @Property({ name: 'tax_amount', type: 'numeric', columnType: 'numeric(18, 4)', default: '0' })
1215
+ taxAmount: string = '0'
1216
+
1217
+ @Property({ name: 'gross_amount', type: 'numeric', columnType: 'numeric(18, 4)' })
1218
+ grossAmount!: string
1219
+
1220
+ @Property({ name: 'service_period_start', type: 'date', columnType: 'date', nullable: true })
1221
+ servicePeriodStart?: Date | null
1222
+
1223
+ @Property({ name: 'service_period_end', type: 'date', columnType: 'date', nullable: true })
1224
+ servicePeriodEnd?: Date | null
1225
+
1226
+ // Spec D groundwork: the original line a memo line corrects.
1227
+ @Property({ name: 'corrects_line_id', type: 'uuid', nullable: true })
1228
+ correctsLineId?: string | null
1229
+
1230
+ // Proration / credit / usage tier breakdown / charge timing.
1231
+ @Property({ type: 'jsonb', nullable: true })
1232
+ metadata?: Record<string, unknown> | null
1233
+
1234
+ @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })
1235
+ createdAt: Date = new Date()
1236
+
1237
+ @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })
1238
+ updatedAt: Date = new Date()
1239
+
1240
+ @Property({ name: 'deleted_at', type: Date, nullable: true })
1241
+ deletedAt?: Date | null
1242
+ }
1243
+
1244
+ @Entity({ tableName: 'billing_document_sequences' })
1245
+ @Unique({
1246
+ name: 'billing_document_sequences_scope_uq',
1247
+ properties: ['tenantId', 'organizationId', 'series', 'scopeKey'],
1248
+ })
1249
+ export class BillingDocumentSequence {
1250
+ [OptionalProps]?: 'scopeKey' | 'nextValue' | 'createdAt' | 'updatedAt'
1251
+
1252
+ @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })
1253
+ id!: string
1254
+
1255
+ @Property({ name: 'organization_id', type: 'uuid' })
1256
+ organizationId!: string
1257
+
1258
+ @Property({ name: 'tenant_id', type: 'uuid' })
1259
+ tenantId!: string
1260
+
1261
+ // 'invoice' | 'credit_memo' | 'receipt'.
1262
+ @Property({ type: 'text' })
1263
+ series!: string
1264
+
1265
+ // '' (never resets), 'YYYY' (yearly) or 'YYYY-MM' (monthly) — from the mask.
1266
+ @Property({ name: 'scope_key', type: 'text', default: '' })
1267
+ scopeKey: string = ''
1268
+
1269
+ @Property({ name: 'next_value', type: 'bigint', default: 1 })
1270
+ nextValue: number = 1
1271
+
1272
+ @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })
1273
+ createdAt: Date = new Date()
1274
+
1275
+ @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })
1276
+ updatedAt: Date = new Date()
1277
+ }
1278
+
1279
+ @Entity({ tableName: 'billing_settings' })
1280
+ // Mirrors the partial unique index `billing_settings_org_uq` (… WHERE deleted_at IS NULL)
1281
+ // created in Migration20261115000000_billing_invoice_ledger: one settings row per organization.
1282
+ @Unique({ name: 'billing_settings_org_uq', properties: ['tenantId', 'organizationId'] })
1283
+ export class BillingSettings {
1284
+ [OptionalProps]?:
1285
+ | 'lowBalanceThresholdDefault'
1286
+ | 'nearLimitBufferDefault'
1287
+ | 'statementEnabled'
1288
+ | 'topupTaxRate'
1289
+ | 'prepaidTaxPoint'
1290
+ | 'topupProvider'
1291
+ | 'numberMasks'
1292
+ | 'legalName'
1293
+ | 'sellerAddress'
1294
+ | 'taxId'
1295
+ | 'bankName'
1296
+ | 'iban'
1297
+ | 'bic'
1298
+ | 'invoiceFooter'
1299
+ | 'logoAttachmentId'
1300
+ | 'defaultPaymentTermsDays'
1301
+ | 'defaultTaxRate'
1302
+ | 'createdAt'
1303
+ | 'updatedAt'
1304
+ | 'deletedAt'
1305
+
1306
+ @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })
1307
+ id!: string
1308
+
1309
+ @Property({ name: 'organization_id', type: 'uuid' })
1310
+ organizationId!: string
1311
+
1312
+ @Property({ name: 'tenant_id', type: 'uuid' })
1313
+ tenantId!: string
1314
+
1315
+ // Prepaid defaults (moved from core `configs`, E-D2).
1316
+ @Property({ name: 'low_balance_threshold_default', type: 'numeric', columnType: 'numeric(18, 4)', default: '0' })
1317
+ lowBalanceThresholdDefault: string = '0'
1318
+
1319
+ @Property({ name: 'near_limit_buffer_default', type: 'numeric', columnType: 'numeric(18, 4)', default: '0' })
1320
+ nearLimitBufferDefault: string = '0'
1321
+
1322
+ @Property({ name: 'statement_enabled', type: 'boolean', default: true })
1323
+ statementEnabled: boolean = true
1324
+
1325
+ @Property({ name: 'topup_tax_rate', type: 'numeric', columnType: 'numeric(7, 4)', default: '0' })
1326
+ topupTaxRate: string = '0'
1327
+
1328
+ // Spec F (F-D3) — where prepaid VAT is charged: 'topup' (VAT split on the
1329
+ // top-up receipt; consumption debits carry no VAT) or 'consumption'
1330
+ // (receipts carry no VAT; debits are gross at the item's tax rate).
1331
+ @Property({ name: 'prepaid_tax_point', type: 'text', default: 'topup' })
1332
+ prepaidTaxPoint: 'topup' | 'consumption' = 'topup'
1333
+
1334
+ @Property({ name: 'topup_provider', type: 'text', default: 'stripe' })
1335
+ topupProvider: string = 'stripe'
1336
+
1337
+ // { invoice, credit_memo, receipt } number masks (Spec 0 numbering).
1338
+ @Property({ name: 'number_masks', type: 'jsonb', nullable: true })
1339
+ numberMasks?: Record<string, string> | null
1340
+
1341
+ // Seller / payment / document fields (Spec B). Posting is blocked until
1342
+ // legal_name, seller_address, tax_id and iban are filled.
1343
+ @Property({ name: 'legal_name', type: 'text', nullable: true })
1344
+ legalName?: string | null
1345
+
1346
+ // { line1, line2?, city, postal_code, country }
1347
+ @Property({ name: 'seller_address', type: 'jsonb', nullable: true })
1348
+ sellerAddress?: Record<string, unknown> | null
1349
+
1350
+ @Property({ name: 'tax_id', type: 'text', nullable: true })
1351
+ taxId?: string | null
1352
+
1353
+ @Property({ name: 'bank_name', type: 'text', nullable: true })
1354
+ bankName?: string | null
1355
+
1356
+ @Property({ name: 'iban', type: 'text', nullable: true })
1357
+ iban?: string | null
1358
+
1359
+ @Property({ name: 'bic', type: 'text', nullable: true })
1360
+ bic?: string | null
1361
+
1362
+ @Property({ name: 'invoice_footer', type: 'text', nullable: true })
1363
+ invoiceFooter?: string | null
1364
+
1365
+ // Attachment id (core `attachments`) of the document logo.
1366
+ @Property({ name: 'logo_attachment_id', type: 'uuid', nullable: true })
1367
+ logoAttachmentId?: string | null
1368
+
1369
+ @Property({ name: 'default_payment_terms_days', type: 'integer', default: 14 })
1370
+ defaultPaymentTermsDays: number = 14
1371
+
1372
+ @Property({ name: 'default_tax_rate', type: 'numeric', columnType: 'numeric(7, 4)', default: '23' })
1373
+ defaultTaxRate: string = '23'
1374
+
1375
+ @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })
1376
+ createdAt: Date = new Date()
1377
+
1378
+ @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })
1379
+ updatedAt: Date = new Date()
1380
+
1381
+ @Property({ name: 'deleted_at', type: Date, nullable: true })
1382
+ deletedAt?: Date | null
1383
+ }
1384
+
1385
+ // ─── Spec C — payments, allocations, imports ─────────────────────
1386
+ //
1387
+ // A billing-owned payment register (no core `SalesPayment`). One row per
1388
+ // money-in event (bank CSV line, manual entry, gateway capture). Invoice
1389
+ // `paid_total` / `outstanding` / status are always RECOMPUTED from the
1390
+ // active allocations (`lib/allocation.ts`), never incremented.
1391
+ // Partial unique indexes (source_ref, external_ref) are in the migration.
1392
+
1393
+ @Entity({ tableName: 'billing_payments' })
1394
+ @Index({ name: 'billing_payments_status_idx', properties: ['tenantId', 'organizationId', 'status'] })
1395
+ @Index({ name: 'billing_payments_account_idx', properties: ['billAccountId', 'status'] })
1396
+ @Index({ name: 'billing_payments_import_idx', properties: ['importId'] })
1397
+ export class BillingPayment {
1398
+ [OptionalProps]?:
1399
+ | 'reference'
1400
+ | 'payerName'
1401
+ | 'payerAccount'
1402
+ | 'importId'
1403
+ | 'billAccountId'
1404
+ | 'matchReason'
1405
+ | 'externalRef'
1406
+ | 'topupId'
1407
+ | 'metadata'
1408
+ | 'createdAt'
1409
+ | 'updatedAt'
1410
+ | 'deletedAt'
1411
+
1412
+ @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })
1413
+ id!: string
1414
+
1415
+ @Property({ name: 'organization_id', type: 'uuid' })
1416
+ organizationId!: string
1417
+
1418
+ @Property({ name: 'tenant_id', type: 'uuid' })
1419
+ tenantId!: string
1420
+
1421
+ @Property({ name: 'received_at', type: 'date', columnType: 'date' })
1422
+ receivedAt!: Date
1423
+
1424
+ // Always > 0 (refunds are out of scope).
1425
+ @Property({ type: 'numeric', columnType: 'numeric(18, 4)' })
1426
+ amount!: string
1427
+
1428
+ @Property({ name: 'currency_code', type: 'text' })
1429
+ currencyCode!: string
1430
+
1431
+ @Property({ type: 'text', nullable: true })
1432
+ reference?: string | null
1433
+
1434
+ @Property({ name: 'payer_name', type: 'text', nullable: true })
1435
+ payerName?: string | null
1436
+
1437
+ @Property({ name: 'payer_account', type: 'text', nullable: true })
1438
+ payerAccount?: string | null
1439
+
1440
+ // csv | manual | gateway
1441
+ @Property({ type: 'text' })
1442
+ source!: string
1443
+
1444
+ @Property({ name: 'import_id', type: 'uuid', nullable: true })
1445
+ importId?: string | null
1446
+
1447
+ // Null while unmatched; set by the matcher or "assign account".
1448
+ @Property({ name: 'bill_account_id', type: 'uuid', nullable: true })
1449
+ billAccountId?: string | null
1450
+
1451
+ // unmatched | matched | partially_allocated | allocated | ignored | converted_to_topup
1452
+ @Property({ type: 'text' })
1453
+ status!: string
1454
+
1455
+ @Property({ name: 'unallocated_amount', type: 'numeric', columnType: 'numeric(18, 4)' })
1456
+ unallocatedAmount!: string
1457
+
1458
+ // no_reference | currency_mismatch | invoice_already_paid | prepaid_account | manual
1459
+ @Property({ name: 'match_reason', type: 'text', nullable: true })
1460
+ matchReason?: string | null
1461
+
1462
+ // Duplicate guard — sha256 of the row + occurrence index (unique per org).
1463
+ @Property({ name: 'source_ref', type: 'text' })
1464
+ sourceRef!: string
1465
+
1466
+ // Gateway transaction id (unique per org when set).
1467
+ @Property({ name: 'external_ref', type: 'text', nullable: true })
1468
+ externalRef?: string | null
1469
+
1470
+ // Set by "convert to top-up" (C-D3).
1471
+ @Property({ name: 'topup_id', type: 'uuid', nullable: true })
1472
+ topupId?: string | null
1473
+
1474
+ @Property({ type: 'jsonb', nullable: true })
1475
+ metadata?: Record<string, unknown> | null
1476
+
1477
+ @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })
1478
+ createdAt: Date = new Date()
1479
+
1480
+ @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })
1481
+ updatedAt: Date = new Date()
1482
+
1483
+ @Property({ name: 'deleted_at', type: Date, nullable: true })
1484
+ deletedAt?: Date | null
1485
+ }
1486
+
1487
+ // Source-typed allocation (Spec C, generalised for Spec D credit memos):
1488
+ // `source_type = 'payment' | 'credit_memo'`, `source_id` → billing_payments
1489
+ // or billing_invoices. Un-allocate = soft delete (history kept).
1490
+ @Entity({ tableName: 'billing_allocations' })
1491
+ // Scope-first like the package's other indexes; every allocation read filters by
1492
+ // tenant + organization plus the invoice or the source (Migration20261120000000).
1493
+ @Index({ name: 'billing_allocations_source_idx', properties: ['tenantId', 'organizationId', 'sourceType', 'sourceId'] })
1494
+ @Index({ name: 'billing_allocations_invoice_idx', properties: ['tenantId', 'organizationId', 'invoiceId'] })
1495
+ @Index({ name: 'billing_allocations_account_idx', properties: ['tenantId', 'organizationId', 'billAccountId'] })
1496
+ export class BillingAllocation {
1497
+ [OptionalProps]?: 'userId' | 'deallocatedByUserId' | 'createdAt' | 'updatedAt' | 'deletedAt'
1498
+
1499
+ @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })
1500
+ id!: string
1501
+
1502
+ @Property({ name: 'organization_id', type: 'uuid' })
1503
+ organizationId!: string
1504
+
1505
+ @Property({ name: 'tenant_id', type: 'uuid' })
1506
+ tenantId!: string
1507
+
1508
+ @Property({ name: 'source_type', type: 'text' })
1509
+ sourceType!: string
1510
+
1511
+ @Property({ name: 'source_id', type: 'uuid' })
1512
+ sourceId!: string
1513
+
1514
+ @Property({ name: 'invoice_id', type: 'uuid' })
1515
+ invoiceId!: string
1516
+
1517
+ @Property({ name: 'bill_account_id', type: 'uuid' })
1518
+ billAccountId!: string
1519
+
1520
+ @Property({ type: 'numeric', columnType: 'numeric(18, 4)' })
1521
+ amount!: string
1522
+
1523
+ @Property({ name: 'currency_code', type: 'text' })
1524
+ currencyCode!: string
1525
+
1526
+ // auto | credit | user | gateway
1527
+ @Property({ name: 'allocated_by', type: 'text' })
1528
+ allocatedBy!: string
1529
+
1530
+ @Property({ name: 'user_id', type: 'uuid', nullable: true })
1531
+ userId?: string | null
1532
+
1533
+ @Property({ name: 'deallocated_by_user_id', type: 'uuid', nullable: true })
1534
+ deallocatedByUserId?: string | null
1535
+
1536
+ @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })
1537
+ createdAt: Date = new Date()
1538
+
1539
+ @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })
1540
+ updatedAt: Date = new Date()
1541
+
1542
+ @Property({ name: 'deleted_at', type: Date, nullable: true })
1543
+ deletedAt?: Date | null
1544
+ }
1545
+
1546
+ // One CSV upload (C-D4): counts per outcome + row errors.
1547
+ @Entity({ tableName: 'billing_payment_imports' })
1548
+ @Index({ name: 'billing_payment_imports_scope_idx', properties: ['tenantId', 'organizationId', 'createdAt'] })
1549
+ export class BillingPaymentImport {
1550
+ [OptionalProps]?: 'userId' | 'counts' | 'errors' | 'createdAt' | 'updatedAt' | 'deletedAt'
1551
+
1552
+ @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })
1553
+ id!: string
1554
+
1555
+ @Property({ name: 'organization_id', type: 'uuid' })
1556
+ organizationId!: string
1557
+
1558
+ @Property({ name: 'tenant_id', type: 'uuid' })
1559
+ tenantId!: string
1560
+
1561
+ @Property({ name: 'file_name', type: 'text' })
1562
+ fileName!: string
1563
+
1564
+ @Property({ name: 'row_count', type: 'integer' })
1565
+ rowCount!: number
1566
+
1567
+ // { allocated, partially_allocated, matched, unmatched, duplicate, rejected }
1568
+ @Property({ type: 'jsonb', nullable: true })
1569
+ counts?: Record<string, number> | null
1570
+
1571
+ // [{ row, message }] — capped at 200 entries
1572
+ @Property({ type: 'jsonb', nullable: true })
1573
+ errors?: Array<{ row: number; message: string }> | null
1574
+
1575
+ @Property({ name: 'user_id', type: 'uuid', nullable: true })
1576
+ userId?: string | null
1577
+
1578
+ @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })
1579
+ createdAt: Date = new Date()
1580
+
1581
+ @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })
1582
+ updatedAt: Date = new Date()
1583
+
1584
+ @Property({ name: 'deleted_at', type: Date, nullable: true })
1585
+ deletedAt?: Date | null
1586
+ }