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