@dainamite/billing 0.20.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/dist/modules/billing/acl.js +13 -1
  3. package/dist/modules/billing/acl.js.map +2 -2
  4. package/dist/modules/billing/api/accounts/[id]/summary/route.js +52 -0
  5. package/dist/modules/billing/api/accounts/[id]/summary/route.js.map +7 -0
  6. package/dist/modules/billing/api/accounts/route.js +47 -4
  7. package/dist/modules/billing/api/accounts/route.js.map +2 -2
  8. package/dist/modules/billing/api/export/account/[id]/route.js +11 -7
  9. package/dist/modules/billing/api/export/account/[id]/route.js.map +2 -2
  10. package/dist/modules/billing/api/invoices/[id]/memos/route.js +54 -0
  11. package/dist/modules/billing/api/invoices/[id]/memos/route.js.map +7 -0
  12. package/dist/modules/billing/api/invoices/[id]/pdf/route.js +70 -0
  13. package/dist/modules/billing/api/invoices/[id]/pdf/route.js.map +7 -0
  14. package/dist/modules/billing/api/invoices/[id]/route.js +44 -24
  15. package/dist/modules/billing/api/invoices/[id]/route.js.map +2 -2
  16. package/dist/modules/billing/api/invoices/[id]/send/route.js +107 -0
  17. package/dist/modules/billing/api/invoices/[id]/send/route.js.map +7 -0
  18. package/dist/modules/billing/api/invoices/add-line/route.js +2 -2
  19. package/dist/modules/billing/api/invoices/add-line/route.js.map +2 -2
  20. package/dist/modules/billing/api/invoices/delete-draft/route.js +33 -0
  21. package/dist/modules/billing/api/invoices/delete-draft/route.js.map +7 -0
  22. package/dist/modules/billing/api/invoices/edit-line/route.js +2 -2
  23. package/dist/modules/billing/api/invoices/edit-line/route.js.map +2 -2
  24. package/dist/modules/billing/api/invoices/post/route.js +2 -2
  25. package/dist/modules/billing/api/invoices/post/route.js.map +2 -2
  26. package/dist/modules/billing/api/invoices/remove-line/route.js +2 -2
  27. package/dist/modules/billing/api/invoices/remove-line/route.js.map +2 -2
  28. package/dist/modules/billing/api/invoices/route.js +45 -46
  29. package/dist/modules/billing/api/invoices/route.js.map +2 -2
  30. package/dist/modules/billing/api/items/bulk/route.js +1 -1
  31. package/dist/modules/billing/api/items/bulk/route.js.map +2 -2
  32. package/dist/modules/billing/api/items/change-price/route.js +44 -0
  33. package/dist/modules/billing/api/items/change-price/route.js.map +7 -0
  34. package/dist/modules/billing/api/items/route.js +19 -7
  35. package/dist/modules/billing/api/items/route.js.map +2 -2
  36. package/dist/modules/billing/api/payment-imports/[id]/route.js +49 -0
  37. package/dist/modules/billing/api/payment-imports/[id]/route.js.map +7 -0
  38. package/dist/modules/billing/api/payment-imports/route.js +57 -0
  39. package/dist/modules/billing/api/payment-imports/route.js.map +7 -0
  40. package/dist/modules/billing/api/payments/[id]/route.js +60 -0
  41. package/dist/modules/billing/api/payments/[id]/route.js.map +7 -0
  42. package/dist/modules/billing/api/payments/allocate/route.js +35 -0
  43. package/dist/modules/billing/api/payments/allocate/route.js.map +7 -0
  44. package/dist/modules/billing/api/payments/assign/route.js +36 -0
  45. package/dist/modules/billing/api/payments/assign/route.js.map +7 -0
  46. package/dist/modules/billing/api/payments/convert-to-topup/route.js +35 -0
  47. package/dist/modules/billing/api/payments/convert-to-topup/route.js.map +7 -0
  48. package/dist/modules/billing/api/payments/ignore/route.js +35 -0
  49. package/dist/modules/billing/api/payments/ignore/route.js.map +7 -0
  50. package/dist/modules/billing/api/payments/import/route.js +63 -0
  51. package/dist/modules/billing/api/payments/import/route.js.map +7 -0
  52. package/dist/modules/billing/api/payments/restore/route.js +35 -0
  53. package/dist/modules/billing/api/payments/restore/route.js.map +7 -0
  54. package/dist/modules/billing/api/payments/route.js +114 -0
  55. package/dist/modules/billing/api/payments/route.js.map +7 -0
  56. package/dist/modules/billing/api/payments/unallocate/route.js +35 -0
  57. package/dist/modules/billing/api/payments/unallocate/route.js.map +7 -0
  58. package/dist/modules/billing/api/payments/unassign/route.js +35 -0
  59. package/dist/modules/billing/api/payments/unassign/route.js.map +7 -0
  60. package/dist/modules/billing/api/run-outcomes/route.js +43 -6
  61. package/dist/modules/billing/api/run-outcomes/route.js.map +2 -2
  62. package/dist/modules/billing/api/runs/[id]/post-drafts/route.js +61 -0
  63. package/dist/modules/billing/api/runs/[id]/post-drafts/route.js.map +7 -0
  64. package/dist/modules/billing/api/runs/[id]/route.js +53 -0
  65. package/dist/modules/billing/api/runs/[id]/route.js.map +7 -0
  66. package/dist/modules/billing/api/runs/retry-failed/route.js +1 -1
  67. package/dist/modules/billing/api/runs/retry-failed/route.js.map +2 -2
  68. package/dist/modules/billing/api/runs/route.js +9 -3
  69. package/dist/modules/billing/api/runs/route.js.map +2 -2
  70. package/dist/modules/billing/api/settings/number-preview/route.js +42 -0
  71. package/dist/modules/billing/api/settings/number-preview/route.js.map +7 -0
  72. package/dist/modules/billing/api/settings/route.js +92 -0
  73. package/dist/modules/billing/api/settings/route.js.map +7 -0
  74. package/dist/modules/billing/api/statements/route.js +3 -0
  75. package/dist/modules/billing/api/statements/route.js.map +2 -2
  76. package/dist/modules/billing/api/test-invoices/wipe/route.js +2 -2
  77. package/dist/modules/billing/api/test-invoices/wipe/route.js.map +2 -2
  78. package/dist/modules/billing/backend/billing/accounts/[id]/page.js +121 -232
  79. package/dist/modules/billing/backend/billing/accounts/[id]/page.js.map +2 -2
  80. package/dist/modules/billing/backend/billing/accounts/create/page.js +6 -0
  81. package/dist/modules/billing/backend/billing/accounts/create/page.js.map +2 -2
  82. package/dist/modules/billing/backend/billing/accounts/page.js +63 -4
  83. package/dist/modules/billing/backend/billing/accounts/page.js.map +2 -2
  84. package/dist/modules/billing/backend/billing/invoices/[id]/page.js +297 -65
  85. package/dist/modules/billing/backend/billing/invoices/[id]/page.js.map +3 -3
  86. package/dist/modules/billing/backend/billing/invoices/page.js +6 -172
  87. package/dist/modules/billing/backend/billing/invoices/page.js.map +2 -2
  88. package/dist/modules/billing/backend/billing/items/[id]/page.js +51 -7
  89. package/dist/modules/billing/backend/billing/items/[id]/page.js.map +2 -2
  90. package/dist/modules/billing/backend/billing/items/create/page.js +9 -6
  91. package/dist/modules/billing/backend/billing/items/create/page.js.map +2 -2
  92. package/dist/modules/billing/backend/billing/items/page.js +8 -2
  93. package/dist/modules/billing/backend/billing/items/page.js.map +2 -2
  94. package/dist/modules/billing/backend/billing/payments/[id]/page.js +297 -0
  95. package/dist/modules/billing/backend/billing/payments/[id]/page.js.map +7 -0
  96. package/dist/modules/billing/backend/billing/payments/[id]/page.meta.js +21 -0
  97. package/dist/modules/billing/backend/billing/payments/[id]/page.meta.js.map +7 -0
  98. package/dist/modules/billing/backend/billing/payments/imports/[id]/page.js +74 -0
  99. package/dist/modules/billing/backend/billing/payments/imports/[id]/page.js.map +7 -0
  100. package/dist/modules/billing/backend/billing/payments/imports/[id]/page.meta.js +21 -0
  101. package/dist/modules/billing/backend/billing/payments/imports/[id]/page.meta.js.map +7 -0
  102. package/dist/modules/billing/backend/billing/payments/page.js +58 -0
  103. package/dist/modules/billing/backend/billing/payments/page.js.map +7 -0
  104. package/dist/modules/billing/backend/billing/payments/page.meta.js +18 -0
  105. package/dist/modules/billing/backend/billing/payments/page.meta.js.map +7 -0
  106. package/dist/modules/billing/backend/billing/runs/[id]/page.js +49 -14
  107. package/dist/modules/billing/backend/billing/runs/[id]/page.js.map +2 -2
  108. package/dist/modules/billing/backend/billing/runs/page.js +58 -7
  109. package/dist/modules/billing/backend/billing/runs/page.js.map +2 -2
  110. package/dist/modules/billing/backend/billing/statements/[id]/page.js +61 -6
  111. package/dist/modules/billing/backend/billing/statements/[id]/page.js.map +2 -2
  112. package/dist/modules/billing/backend/billing/statements/page.js +1 -1
  113. package/dist/modules/billing/backend/billing/statements/page.js.map +2 -2
  114. package/dist/modules/billing/backend/billing/topups/page.js +1 -1
  115. package/dist/modules/billing/backend/billing/topups/page.js.map +2 -2
  116. package/dist/modules/billing/backend/billing/transactions/page.js +1 -1
  117. package/dist/modules/billing/backend/billing/transactions/page.js.map +2 -2
  118. package/dist/modules/billing/backend/billing/usage/create/page.js +3 -2
  119. package/dist/modules/billing/backend/billing/usage/create/page.js.map +2 -2
  120. package/dist/modules/billing/backend/config/billing/page.js +472 -0
  121. package/dist/modules/billing/backend/config/billing/page.js.map +7 -0
  122. package/dist/modules/billing/backend/config/billing/page.meta.js +19 -0
  123. package/dist/modules/billing/backend/config/billing/page.meta.js.map +7 -0
  124. package/dist/modules/billing/cli.js +22 -1
  125. package/dist/modules/billing/cli.js.map +2 -2
  126. package/dist/modules/billing/commands/accounts.js +6 -0
  127. package/dist/modules/billing/commands/accounts.js.map +2 -2
  128. package/dist/modules/billing/commands/index.js +3 -0
  129. package/dist/modules/billing/commands/index.js.map +2 -2
  130. package/dist/modules/billing/commands/invoices.js +269 -167
  131. package/dist/modules/billing/commands/invoices.js.map +2 -2
  132. package/dist/modules/billing/commands/items.js +108 -0
  133. package/dist/modules/billing/commands/items.js.map +2 -2
  134. package/dist/modules/billing/commands/memos.js +179 -0
  135. package/dist/modules/billing/commands/memos.js.map +7 -0
  136. package/dist/modules/billing/commands/payments.js +379 -0
  137. package/dist/modules/billing/commands/payments.js.map +7 -0
  138. package/dist/modules/billing/commands/runs.js +151 -4
  139. package/dist/modules/billing/commands/runs.js.map +2 -2
  140. package/dist/modules/billing/commands/settings.js +59 -0
  141. package/dist/modules/billing/commands/settings.js.map +7 -0
  142. package/dist/modules/billing/commands/topups.js +9 -2
  143. package/dist/modules/billing/commands/topups.js.map +2 -2
  144. package/dist/modules/billing/commands/transactions.js +2 -2
  145. package/dist/modules/billing/commands/transactions.js.map +2 -2
  146. package/dist/modules/billing/components/AccountForm.js +149 -42
  147. package/dist/modules/billing/components/AccountForm.js.map +2 -2
  148. package/dist/modules/billing/components/AccountInvoicesSection.js +64 -0
  149. package/dist/modules/billing/components/AccountInvoicesSection.js.map +7 -0
  150. package/dist/modules/billing/components/AccountPaymentsSection.js +43 -0
  151. package/dist/modules/billing/components/AccountPaymentsSection.js.map +7 -0
  152. package/dist/modules/billing/components/AccountPicker.js +56 -0
  153. package/dist/modules/billing/components/AccountPicker.js.map +7 -0
  154. package/dist/modules/billing/components/AllocatePaymentDialog.js +134 -0
  155. package/dist/modules/billing/components/AllocatePaymentDialog.js.map +7 -0
  156. package/dist/modules/billing/components/BillingDataTable.js +21 -0
  157. package/dist/modules/billing/components/BillingDataTable.js.map +7 -0
  158. package/dist/modules/billing/components/BillingSettingsLink.js +19 -0
  159. package/dist/modules/billing/components/BillingSettingsLink.js.map +7 -0
  160. package/dist/modules/billing/components/ChangeItemPriceDialog.js +158 -0
  161. package/dist/modules/billing/components/ChangeItemPriceDialog.js.map +7 -0
  162. package/dist/modules/billing/components/CreateMemoDialog.js +200 -0
  163. package/dist/modules/billing/components/CreateMemoDialog.js.map +7 -0
  164. package/dist/modules/billing/components/CustomerLabel.js +33 -0
  165. package/dist/modules/billing/components/CustomerLabel.js.map +7 -0
  166. package/dist/modules/billing/components/InvoicesTable.js +270 -0
  167. package/dist/modules/billing/components/InvoicesTable.js.map +7 -0
  168. package/dist/modules/billing/components/ItemForm.js +176 -44
  169. package/dist/modules/billing/components/ItemForm.js.map +2 -2
  170. package/dist/modules/billing/components/ItemPriceField.js +46 -0
  171. package/dist/modules/billing/components/ItemPriceField.js.map +7 -0
  172. package/dist/modules/billing/components/LineFormDialog.js +25 -2
  173. package/dist/modules/billing/components/LineFormDialog.js.map +2 -2
  174. package/dist/modules/billing/components/ManualPaymentDialog.js +122 -0
  175. package/dist/modules/billing/components/ManualPaymentDialog.js.map +7 -0
  176. package/dist/modules/billing/components/MoneyInput.js +14 -0
  177. package/dist/modules/billing/components/MoneyInput.js.map +7 -0
  178. package/dist/modules/billing/components/PaymentUploadDialog.js +115 -0
  179. package/dist/modules/billing/components/PaymentUploadDialog.js.map +7 -0
  180. package/dist/modules/billing/components/PaymentsTable.js +171 -0
  181. package/dist/modules/billing/components/PaymentsTable.js.map +7 -0
  182. package/dist/modules/billing/components/PostRunDraftsButton.js +105 -0
  183. package/dist/modules/billing/components/PostRunDraftsButton.js.map +7 -0
  184. package/dist/modules/billing/components/PrepaidPanel.js +14 -4
  185. package/dist/modules/billing/components/PrepaidPanel.js.map +2 -2
  186. package/dist/modules/billing/components/RunCyclesSection.js +209 -0
  187. package/dist/modules/billing/components/RunCyclesSection.js.map +7 -0
  188. package/dist/modules/billing/components/TestRunActions.js +127 -0
  189. package/dist/modules/billing/components/TestRunActions.js.map +7 -0
  190. package/dist/modules/billing/components/account/AccountItemsTab.js +157 -0
  191. package/dist/modules/billing/components/account/AccountItemsTab.js.map +7 -0
  192. package/dist/modules/billing/components/account/AccountRunBillingDialog.js +122 -0
  193. package/dist/modules/billing/components/account/AccountRunBillingDialog.js.map +7 -0
  194. package/dist/modules/billing/components/account/AccountRunsTab.js +152 -0
  195. package/dist/modules/billing/components/account/AccountRunsTab.js.map +7 -0
  196. package/dist/modules/billing/components/account/AccountStatementsTab.js +98 -0
  197. package/dist/modules/billing/components/account/AccountStatementsTab.js.map +7 -0
  198. package/dist/modules/billing/components/account/AccountSummaryCards.js +125 -0
  199. package/dist/modules/billing/components/account/AccountSummaryCards.js.map +7 -0
  200. package/dist/modules/billing/components/account/AccountUsageTab.js +91 -0
  201. package/dist/modules/billing/components/account/AccountUsageTab.js.map +7 -0
  202. package/dist/modules/billing/components/account/AccountView.js +73 -0
  203. package/dist/modules/billing/components/account/AccountView.js.map +7 -0
  204. package/dist/modules/billing/components/account/accountRow.js +39 -0
  205. package/dist/modules/billing/components/account/accountRow.js.map +7 -0
  206. package/dist/modules/billing/components/customerNames.js +42 -0
  207. package/dist/modules/billing/components/customerNames.js.map +7 -0
  208. package/dist/modules/billing/data/entities.js +560 -4
  209. package/dist/modules/billing/data/entities.js.map +2 -2
  210. package/dist/modules/billing/data/entityIds.js +10 -1
  211. package/dist/modules/billing/data/entityIds.js.map +2 -2
  212. package/dist/modules/billing/data/validators.js +269 -15
  213. package/dist/modules/billing/data/validators.js.map +2 -2
  214. package/dist/modules/billing/events.js +50 -0
  215. package/dist/modules/billing/events.js.map +2 -2
  216. package/dist/modules/billing/i18n/de.json +880 -0
  217. package/dist/modules/billing/i18n/en.json +457 -21
  218. package/dist/modules/billing/i18n/es.json +880 -0
  219. package/dist/modules/billing/i18n/pl.json +458 -22
  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 +237 -102
  237. package/dist/modules/billing/lib/billRunEngine.js.map +2 -2
  238. package/dist/modules/billing/lib/billingSettings.js +116 -0
  239. package/dist/modules/billing/lib/billingSettings.js.map +7 -0
  240. package/dist/modules/billing/lib/commandRoute.js +81 -0
  241. package/dist/modules/billing/lib/commandRoute.js.map +7 -0
  242. package/dist/modules/billing/lib/customerLookup.js +97 -0
  243. package/dist/modules/billing/lib/customerLookup.js.map +7 -0
  244. package/dist/modules/billing/lib/dateOnly.js +13 -0
  245. package/dist/modules/billing/lib/dateOnly.js.map +7 -0
  246. package/dist/modules/billing/lib/documentParties.js +16 -0
  247. package/dist/modules/billing/lib/documentParties.js.map +7 -0
  248. package/dist/modules/billing/lib/documentTypes.js +27 -0
  249. package/dist/modules/billing/lib/documentTypes.js.map +7 -0
  250. package/dist/modules/billing/lib/dueDate.js +18 -0
  251. package/dist/modules/billing/lib/dueDate.js.map +7 -0
  252. package/dist/modules/billing/lib/iban.js +29 -0
  253. package/dist/modules/billing/lib/iban.js.map +7 -0
  254. package/dist/modules/billing/lib/invoiceDelivery.js +133 -0
  255. package/dist/modules/billing/lib/invoiceDelivery.js.map +7 -0
  256. package/dist/modules/billing/lib/invoiceLanguages.js +28 -0
  257. package/dist/modules/billing/lib/invoiceLanguages.js.map +7 -0
  258. package/dist/modules/billing/lib/invoiceWriter.js +107 -99
  259. package/dist/modules/billing/lib/invoiceWriter.js.map +2 -2
  260. package/dist/modules/billing/lib/itemBillingState.js +27 -0
  261. package/dist/modules/billing/lib/itemBillingState.js.map +7 -0
  262. package/dist/modules/billing/lib/itemPriceChange.js +18 -0
  263. package/dist/modules/billing/lib/itemPriceChange.js.map +7 -0
  264. package/dist/modules/billing/lib/itemSelector.js.map +2 -2
  265. package/dist/modules/billing/lib/lineAmounts.js +32 -0
  266. package/dist/modules/billing/lib/lineAmounts.js.map +7 -0
  267. package/dist/modules/billing/lib/memoGuards.js +25 -0
  268. package/dist/modules/billing/lib/memoGuards.js.map +7 -0
  269. package/dist/modules/billing/lib/navigation.js +48 -0
  270. package/dist/modules/billing/lib/navigation.js.map +7 -0
  271. package/dist/modules/billing/lib/numbering.js +120 -0
  272. package/dist/modules/billing/lib/numbering.js.map +7 -0
  273. package/dist/modules/billing/lib/overdue.js +36 -0
  274. package/dist/modules/billing/lib/overdue.js.map +7 -0
  275. package/dist/modules/billing/lib/paymentCsv.js +125 -0
  276. package/dist/modules/billing/lib/paymentCsv.js.map +7 -0
  277. package/dist/modules/billing/lib/paymentGateway.js +15 -0
  278. package/dist/modules/billing/lib/paymentGateway.js.map +7 -0
  279. package/dist/modules/billing/lib/paymentImport.js +164 -0
  280. package/dist/modules/billing/lib/paymentImport.js.map +7 -0
  281. package/dist/modules/billing/lib/paymentMatcher.js +36 -0
  282. package/dist/modules/billing/lib/paymentMatcher.js.map +7 -0
  283. package/dist/modules/billing/lib/pdf/attachmentStore.js +46 -0
  284. package/dist/modules/billing/lib/pdf/attachmentStore.js.map +7 -0
  285. package/dist/modules/billing/lib/pdf/fonts/embeddedFonts.js +7 -0
  286. package/dist/modules/billing/lib/pdf/fonts/embeddedFonts.js.map +7 -0
  287. package/dist/modules/billing/lib/pdf/invoiceModel.js +194 -0
  288. package/dist/modules/billing/lib/pdf/invoiceModel.js.map +7 -0
  289. package/dist/modules/billing/lib/pdf/invoicePdf.js +165 -0
  290. package/dist/modules/billing/lib/pdf/invoicePdf.js.map +7 -0
  291. package/dist/modules/billing/lib/pdf/invoiceTemplate.js +276 -0
  292. package/dist/modules/billing/lib/pdf/invoiceTemplate.js.map +7 -0
  293. package/dist/modules/billing/lib/prepaidConfig.js +17 -25
  294. package/dist/modules/billing/lib/prepaidConfig.js.map +2 -2
  295. package/dist/modules/billing/lib/prepaidConsume.js +26 -7
  296. package/dist/modules/billing/lib/prepaidConsume.js.map +2 -2
  297. package/dist/modules/billing/lib/prepaidPeriodClose.js +277 -158
  298. package/dist/modules/billing/lib/prepaidPeriodClose.js.map +2 -2
  299. package/dist/modules/billing/lib/prepaidTaxPoint.js +37 -0
  300. package/dist/modules/billing/lib/prepaidTaxPoint.js.map +7 -0
  301. package/dist/modules/billing/lib/seeds/demo.js +51 -3
  302. package/dist/modules/billing/lib/seeds/demo.js.map +2 -2
  303. package/dist/modules/billing/lib/seeds/paymentsSample.js +93 -0
  304. package/dist/modules/billing/lib/seeds/paymentsSample.js.map +7 -0
  305. package/dist/modules/billing/lib/seeds/sellerSettings.js +41 -0
  306. package/dist/modules/billing/lib/seeds/sellerSettings.js.map +7 -0
  307. package/dist/modules/billing/lib/servicePeriods.js +121 -0
  308. package/dist/modules/billing/lib/servicePeriods.js.map +7 -0
  309. package/dist/modules/billing/lib/testRunCleanup.js +24 -0
  310. package/dist/modules/billing/lib/testRunCleanup.js.map +7 -0
  311. package/dist/modules/billing/lib/topupCapture.js +2 -2
  312. package/dist/modules/billing/lib/topupCapture.js.map +2 -2
  313. package/dist/modules/billing/lib/topupReceipt.js +58 -79
  314. package/dist/modules/billing/lib/topupReceipt.js.map +2 -2
  315. package/dist/modules/billing/lib/usageRater.js.map +1 -1
  316. package/dist/modules/billing/lib/usageRunner.js +14 -6
  317. package/dist/modules/billing/lib/usageRunner.js.map +2 -2
  318. package/dist/modules/billing/lib/vat.js +39 -0
  319. package/dist/modules/billing/lib/vat.js.map +7 -0
  320. package/dist/modules/billing/migrations/Migration20261114000000_billing_customer_kind.js +15 -0
  321. package/dist/modules/billing/migrations/Migration20261114000000_billing_customer_kind.js.map +7 -0
  322. package/dist/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.js +25 -0
  323. package/dist/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.js.map +7 -0
  324. package/dist/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.js +115 -0
  325. package/dist/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.js.map +7 -0
  326. package/dist/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.js +47 -0
  327. package/dist/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.js.map +7 -0
  328. package/dist/modules/billing/migrations/Migration20261117000000_billing_payments.js +89 -0
  329. package/dist/modules/billing/migrations/Migration20261117000000_billing_payments.js.map +7 -0
  330. package/dist/modules/billing/migrations/Migration20261118000000_billing_memos.js +17 -0
  331. package/dist/modules/billing/migrations/Migration20261118000000_billing_memos.js.map +7 -0
  332. package/dist/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.js +27 -0
  333. package/dist/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.js.map +7 -0
  334. package/dist/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.js +29 -0
  335. package/dist/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.js.map +7 -0
  336. package/dist/modules/billing/setup.js +7 -184
  337. package/dist/modules/billing/setup.js.map +2 -2
  338. package/dist/modules/billing/subscribers/credit-memo-auto-send.js +16 -0
  339. package/dist/modules/billing/subscribers/credit-memo-auto-send.js.map +7 -0
  340. package/dist/modules/billing/subscribers/debit-memo-apply-credit.js +16 -0
  341. package/dist/modules/billing/subscribers/debit-memo-apply-credit.js.map +7 -0
  342. package/dist/modules/billing/subscribers/debit-memo-auto-send.js +16 -0
  343. package/dist/modules/billing/subscribers/debit-memo-auto-send.js.map +7 -0
  344. package/dist/modules/billing/subscribers/invoice-apply-credit.js +34 -0
  345. package/dist/modules/billing/subscribers/invoice-apply-credit.js.map +7 -0
  346. package/dist/modules/billing/subscribers/invoice-auto-send.js +30 -0
  347. package/dist/modules/billing/subscribers/invoice-auto-send.js.map +7 -0
  348. package/dist/modules/billing/subscribers/payment-captured-to-paid.js +69 -33
  349. package/dist/modules/billing/subscribers/payment-captured-to-paid.js.map +2 -2
  350. package/dist/modules/billing/subscribers/prepaid-topup-captured.js +4 -6
  351. package/dist/modules/billing/subscribers/prepaid-topup-captured.js.map +2 -2
  352. package/generated/entities/billing_account/index.ts +3 -0
  353. package/generated/entities/billing_allocation/index.ts +18 -0
  354. package/generated/entities/billing_document_sequence/index.ts +11 -0
  355. package/generated/entities/billing_invoice/index.ts +38 -0
  356. package/generated/entities/billing_invoice_line/index.ts +24 -0
  357. package/generated/entities/billing_item/index.ts +4 -0
  358. package/generated/entities/billing_payment/index.ts +25 -0
  359. package/generated/entities/billing_payment_import/index.ts +14 -0
  360. package/generated/entities/billing_run/index.ts +0 -1
  361. package/generated/entities/billing_run_outcome/index.ts +1 -0
  362. package/generated/entities/billing_settings/index.ts +26 -0
  363. package/generated/entities/billing_statement/index.ts +1 -0
  364. package/generated/entities.ids.generated.ts +7 -0
  365. package/package.json +5 -1
  366. package/src/modules/billing/__integration__/TC-BILL-004.spec.ts +171 -0
  367. package/src/modules/billing/__integration__/TC-BILL-005.spec.ts +134 -0
  368. package/src/modules/billing/__integration__/TC-BILL-006.spec.ts +101 -0
  369. package/src/modules/billing/__integration__/TC-BILL-007.spec.ts +140 -0
  370. package/src/modules/billing/__integration__/TC-BILL-008.spec.ts +108 -0
  371. package/src/modules/billing/__integration__/TC-BILL-009.spec.ts +113 -0
  372. package/src/modules/billing/__integration__/TC-BILL-010.spec.ts +118 -0
  373. package/src/modules/billing/__integration__/TC-BILL-011.spec.ts +142 -0
  374. package/src/modules/billing/__integration__/TC-BILL-012.spec.ts +115 -0
  375. package/src/modules/billing/__integration__/TC-BILL-013.spec.ts +118 -0
  376. package/src/modules/billing/__integration__/sellerSettings.ts +24 -0
  377. package/src/modules/billing/__tests__/commands/invoices.test.ts +436 -354
  378. package/src/modules/billing/__tests__/commands/itemsBulk.test.ts +33 -0
  379. package/src/modules/billing/__tests__/commands/memos.test.ts +205 -0
  380. package/src/modules/billing/__tests__/commands/payments.test.ts +241 -0
  381. package/src/modules/billing/__tests__/commands/runsDelete.test.ts +146 -0
  382. package/src/modules/billing/__tests__/commands/runsPostDrafts.test.ts +106 -0
  383. package/src/modules/billing/__tests__/commands/topups.test.ts +11 -0
  384. package/src/modules/billing/__tests__/entityRegistry.test.ts +8 -1
  385. package/src/modules/billing/__tests__/helpers/prepaidMockEm.ts +28 -11
  386. package/src/modules/billing/__tests__/i18n/dictionaries.test.ts +64 -0
  387. package/src/modules/billing/__tests__/lib/accountFinancials.test.ts +53 -0
  388. package/src/modules/billing/__tests__/lib/accountSummary.test.ts +97 -0
  389. package/src/modules/billing/__tests__/lib/allocation.test.ts +319 -0
  390. package/src/modules/billing/__tests__/lib/billRunEngine.test.ts +228 -17
  391. package/src/modules/billing/__tests__/lib/billingSettings.test.ts +109 -0
  392. package/src/modules/billing/__tests__/lib/customerLookup.test.ts +156 -0
  393. package/src/modules/billing/__tests__/lib/dueDate.test.ts +35 -0
  394. package/src/modules/billing/__tests__/lib/iban.test.ts +38 -0
  395. package/src/modules/billing/__tests__/lib/invoiceDelivery.test.ts +206 -0
  396. package/src/modules/billing/__tests__/lib/invoiceLanguages.test.ts +49 -0
  397. package/src/modules/billing/__tests__/lib/invoiceWriter.test.ts +212 -10
  398. package/src/modules/billing/__tests__/lib/itemBillingState.test.ts +42 -0
  399. package/src/modules/billing/__tests__/lib/itemPriceChange.test.ts +165 -0
  400. package/src/modules/billing/__tests__/lib/lineAmounts.test.ts +86 -0
  401. package/src/modules/billing/__tests__/lib/navigation.test.ts +71 -0
  402. package/src/modules/billing/__tests__/lib/numbering.test.ts +91 -0
  403. package/src/modules/billing/__tests__/lib/overdue.test.ts +36 -0
  404. package/src/modules/billing/__tests__/lib/paymentCsv.test.ts +148 -0
  405. package/src/modules/billing/__tests__/lib/paymentImport.test.ts +113 -0
  406. package/src/modules/billing/__tests__/lib/paymentsSample.test.ts +73 -0
  407. package/src/modules/billing/__tests__/lib/pdf/invoicePdf.test.ts +269 -0
  408. package/src/modules/billing/__tests__/lib/pdf/invoicePdfService.test.ts +147 -0
  409. package/src/modules/billing/__tests__/lib/prepaidPeriodClose.test.ts +374 -98
  410. package/src/modules/billing/__tests__/lib/prepaidTaxPoint.test.ts +118 -0
  411. package/src/modules/billing/__tests__/lib/seedsDemo.test.ts +53 -2
  412. package/src/modules/billing/__tests__/lib/sellerSettings.test.ts +28 -0
  413. package/src/modules/billing/__tests__/lib/servicePeriods.test.ts +190 -0
  414. package/src/modules/billing/__tests__/lib/topupCapture.test.ts +6 -28
  415. package/src/modules/billing/__tests__/lib/topupReceipt.test.ts +21 -52
  416. package/src/modules/billing/__tests__/lib/vat.test.ts +51 -0
  417. package/src/modules/billing/__tests__/package-isolation.test.ts +22 -8
  418. package/src/modules/billing/__tests__/setup.test.ts +13 -4
  419. package/src/modules/billing/__tests__/validators.test.ts +197 -3
  420. package/src/modules/billing/acl.ts +12 -0
  421. package/src/modules/billing/api/accounts/[id]/summary/route.ts +62 -0
  422. package/src/modules/billing/api/accounts/route.ts +59 -4
  423. package/src/modules/billing/api/export/account/[id]/route.ts +13 -11
  424. package/src/modules/billing/api/invoices/[id]/memos/route.ts +63 -0
  425. package/src/modules/billing/api/invoices/[id]/pdf/route.ts +80 -0
  426. package/src/modules/billing/api/invoices/[id]/route.ts +57 -70
  427. package/src/modules/billing/api/invoices/[id]/send/route.ts +127 -0
  428. package/src/modules/billing/api/invoices/add-line/route.ts +2 -2
  429. package/src/modules/billing/api/invoices/delete-draft/route.ts +33 -0
  430. package/src/modules/billing/api/invoices/edit-line/route.ts +2 -2
  431. package/src/modules/billing/api/invoices/post/route.ts +7 -6
  432. package/src/modules/billing/api/invoices/remove-line/route.ts +2 -2
  433. package/src/modules/billing/api/invoices/route.ts +81 -86
  434. package/src/modules/billing/api/items/bulk/route.ts +2 -1
  435. package/src/modules/billing/api/items/change-price/route.ts +54 -0
  436. package/src/modules/billing/api/items/route.ts +23 -7
  437. package/src/modules/billing/api/payment-imports/[id]/route.ts +49 -0
  438. package/src/modules/billing/api/payment-imports/route.ts +57 -0
  439. package/src/modules/billing/api/payments/[id]/route.ts +63 -0
  440. package/src/modules/billing/api/payments/allocate/route.ts +35 -0
  441. package/src/modules/billing/api/payments/assign/route.ts +36 -0
  442. package/src/modules/billing/api/payments/convert-to-topup/route.ts +35 -0
  443. package/src/modules/billing/api/payments/ignore/route.ts +35 -0
  444. package/src/modules/billing/api/payments/import/route.ts +72 -0
  445. package/src/modules/billing/api/payments/restore/route.ts +35 -0
  446. package/src/modules/billing/api/payments/route.ts +147 -0
  447. package/src/modules/billing/api/payments/unallocate/route.ts +35 -0
  448. package/src/modules/billing/api/payments/unassign/route.ts +35 -0
  449. package/src/modules/billing/api/run-outcomes/route.ts +49 -6
  450. package/src/modules/billing/api/runs/[id]/post-drafts/route.ts +71 -0
  451. package/src/modules/billing/api/runs/[id]/route.ts +59 -0
  452. package/src/modules/billing/api/runs/retry-failed/route.ts +2 -1
  453. package/src/modules/billing/api/runs/route.ts +15 -7
  454. package/src/modules/billing/api/settings/number-preview/route.ts +46 -0
  455. package/src/modules/billing/api/settings/route.ts +116 -0
  456. package/src/modules/billing/api/statements/route.ts +5 -0
  457. package/src/modules/billing/api/test-invoices/wipe/route.ts +2 -2
  458. package/src/modules/billing/backend/billing/accounts/[id]/page.tsx +151 -372
  459. package/src/modules/billing/backend/billing/accounts/create/page.tsx +6 -0
  460. package/src/modules/billing/backend/billing/accounts/page.tsx +70 -4
  461. package/src/modules/billing/backend/billing/invoices/[id]/page.tsx +444 -95
  462. package/src/modules/billing/backend/billing/invoices/page.tsx +8 -227
  463. package/src/modules/billing/backend/billing/items/[id]/page.tsx +75 -6
  464. package/src/modules/billing/backend/billing/items/create/page.tsx +13 -8
  465. package/src/modules/billing/backend/billing/items/page.tsx +18 -2
  466. package/src/modules/billing/backend/billing/payments/[id]/page.meta.ts +19 -0
  467. package/src/modules/billing/backend/billing/payments/[id]/page.tsx +415 -0
  468. package/src/modules/billing/backend/billing/payments/imports/[id]/page.meta.ts +19 -0
  469. package/src/modules/billing/backend/billing/payments/imports/[id]/page.tsx +106 -0
  470. package/src/modules/billing/backend/billing/payments/page.meta.ts +16 -0
  471. package/src/modules/billing/backend/billing/payments/page.tsx +56 -0
  472. package/src/modules/billing/backend/billing/runs/[id]/page.tsx +49 -18
  473. package/src/modules/billing/backend/billing/runs/page.tsx +59 -8
  474. package/src/modules/billing/backend/billing/statements/[id]/page.tsx +86 -5
  475. package/src/modules/billing/backend/billing/statements/page.tsx +1 -1
  476. package/src/modules/billing/backend/billing/topups/page.tsx +1 -1
  477. package/src/modules/billing/backend/billing/transactions/page.tsx +1 -1
  478. package/src/modules/billing/backend/billing/usage/create/page.tsx +3 -2
  479. package/src/modules/billing/backend/config/billing/page.meta.ts +21 -0
  480. package/src/modules/billing/backend/config/billing/page.tsx +549 -0
  481. package/src/modules/billing/cli.ts +31 -1
  482. package/src/modules/billing/commands/accounts.ts +6 -0
  483. package/src/modules/billing/commands/index.ts +3 -0
  484. package/src/modules/billing/commands/invoices.ts +364 -231
  485. package/src/modules/billing/commands/items.ts +143 -0
  486. package/src/modules/billing/commands/memos.ts +218 -0
  487. package/src/modules/billing/commands/payments.ts +428 -0
  488. package/src/modules/billing/commands/runs.ts +205 -3
  489. package/src/modules/billing/commands/settings.ts +77 -0
  490. package/src/modules/billing/commands/topups.ts +12 -3
  491. package/src/modules/billing/commands/transactions.ts +2 -2
  492. package/src/modules/billing/components/AccountForm.tsx +199 -53
  493. package/src/modules/billing/components/AccountInvoicesSection.tsx +75 -0
  494. package/src/modules/billing/components/AccountPaymentsSection.tsx +42 -0
  495. package/src/modules/billing/components/AccountPicker.tsx +70 -0
  496. package/src/modules/billing/components/AllocatePaymentDialog.tsx +167 -0
  497. package/src/modules/billing/components/BillingDataTable.tsx +34 -0
  498. package/src/modules/billing/components/BillingSettingsLink.tsx +25 -0
  499. package/src/modules/billing/components/ChangeItemPriceDialog.tsx +180 -0
  500. package/src/modules/billing/components/CreateMemoDialog.tsx +232 -0
  501. package/src/modules/billing/components/CustomerLabel.tsx +53 -0
  502. package/src/modules/billing/components/InvoicesTable.tsx +344 -0
  503. package/src/modules/billing/components/ItemForm.tsx +233 -44
  504. package/src/modules/billing/components/ItemPriceField.tsx +81 -0
  505. package/src/modules/billing/components/LineFormDialog.tsx +25 -1
  506. package/src/modules/billing/components/ManualPaymentDialog.tsx +140 -0
  507. package/src/modules/billing/components/MoneyInput.tsx +26 -0
  508. package/src/modules/billing/components/PaymentUploadDialog.tsx +148 -0
  509. package/src/modules/billing/components/PaymentsTable.tsx +213 -0
  510. package/src/modules/billing/components/PostRunDraftsButton.tsx +129 -0
  511. package/src/modules/billing/components/PrepaidPanel.tsx +19 -6
  512. package/src/modules/billing/components/RunCyclesSection.tsx +298 -0
  513. package/src/modules/billing/components/TestRunActions.tsx +152 -0
  514. package/src/modules/billing/components/account/AccountItemsTab.tsx +192 -0
  515. package/src/modules/billing/components/account/AccountRunBillingDialog.tsx +147 -0
  516. package/src/modules/billing/components/account/AccountRunsTab.tsx +201 -0
  517. package/src/modules/billing/components/account/AccountStatementsTab.tsx +120 -0
  518. package/src/modules/billing/components/account/AccountSummaryCards.tsx +153 -0
  519. package/src/modules/billing/components/account/AccountUsageTab.tsx +122 -0
  520. package/src/modules/billing/components/account/AccountView.tsx +101 -0
  521. package/src/modules/billing/components/account/accountRow.ts +70 -0
  522. package/src/modules/billing/components/customerNames.ts +62 -0
  523. package/src/modules/billing/data/entities.ts +656 -6
  524. package/src/modules/billing/data/entityIds.ts +9 -0
  525. package/src/modules/billing/data/validators.ts +388 -8
  526. package/src/modules/billing/events.ts +56 -3
  527. package/src/modules/billing/i18n/de.json +880 -0
  528. package/src/modules/billing/i18n/en.json +457 -21
  529. package/src/modules/billing/i18n/es.json +880 -0
  530. package/src/modules/billing/i18n/pl.json +458 -22
  531. package/src/modules/billing/index.ts +6 -2
  532. package/src/modules/billing/lib/accountFinancials.ts +84 -0
  533. package/src/modules/billing/lib/accountLock.ts +32 -0
  534. package/src/modules/billing/lib/accountStatus.ts +11 -9
  535. package/src/modules/billing/lib/accountSummary.ts +172 -0
  536. package/src/modules/billing/lib/allocation.ts +515 -0
  537. package/src/modules/billing/lib/allocationEvents.ts +26 -0
  538. package/src/modules/billing/lib/billPeriod.ts +19 -0
  539. package/src/modules/billing/lib/billRunEngine.ts +350 -150
  540. package/src/modules/billing/lib/billingSettings.ts +145 -0
  541. package/src/modules/billing/lib/commandRoute.ts +112 -0
  542. package/src/modules/billing/lib/customerLookup.ts +157 -0
  543. package/src/modules/billing/lib/dateOnly.ts +22 -0
  544. package/src/modules/billing/lib/documentParties.ts +23 -0
  545. package/src/modules/billing/lib/documentTypes.ts +37 -0
  546. package/src/modules/billing/lib/dueDate.ts +26 -0
  547. package/src/modules/billing/lib/iban.ts +36 -0
  548. package/src/modules/billing/lib/invoiceDelivery.ts +196 -0
  549. package/src/modules/billing/lib/invoiceLanguages.ts +57 -0
  550. package/src/modules/billing/lib/invoiceWriter.ts +162 -148
  551. package/src/modules/billing/lib/itemBillingState.ts +67 -0
  552. package/src/modules/billing/lib/itemPriceChange.ts +56 -0
  553. package/src/modules/billing/lib/itemSelector.ts +4 -1
  554. package/src/modules/billing/lib/lineAmounts.ts +61 -0
  555. package/src/modules/billing/lib/memoGuards.ts +41 -0
  556. package/src/modules/billing/lib/navigation.ts +64 -0
  557. package/src/modules/billing/lib/numbering.ts +174 -0
  558. package/src/modules/billing/lib/overdue.ts +60 -0
  559. package/src/modules/billing/lib/paymentCsv.ts +171 -0
  560. package/src/modules/billing/lib/paymentGateway.ts +52 -0
  561. package/src/modules/billing/lib/paymentImport.ts +228 -0
  562. package/src/modules/billing/lib/paymentMatcher.ts +88 -0
  563. package/src/modules/billing/lib/pdf/attachmentStore.ts +60 -0
  564. package/src/modules/billing/lib/pdf/fonts/NotoSans-Bold.ttf +0 -0
  565. package/src/modules/billing/lib/pdf/fonts/NotoSans-Regular.ttf +0 -0
  566. package/src/modules/billing/lib/pdf/fonts/OFL.txt +93 -0
  567. package/src/modules/billing/lib/pdf/fonts/embeddedFonts.ts +9 -0
  568. package/src/modules/billing/lib/pdf/invoiceModel.ts +329 -0
  569. package/src/modules/billing/lib/pdf/invoicePdf.ts +220 -0
  570. package/src/modules/billing/lib/pdf/invoiceTemplate.ts +338 -0
  571. package/src/modules/billing/lib/prepaidConfig.ts +27 -36
  572. package/src/modules/billing/lib/prepaidConsume.ts +29 -6
  573. package/src/modules/billing/lib/prepaidPeriodClose.ts +407 -239
  574. package/src/modules/billing/lib/prepaidTaxPoint.ts +76 -0
  575. package/src/modules/billing/lib/seeds/demo.ts +79 -6
  576. package/src/modules/billing/lib/seeds/paymentsSample.ts +136 -0
  577. package/src/modules/billing/lib/seeds/sellerSettings.ts +78 -0
  578. package/src/modules/billing/lib/servicePeriods.ts +226 -0
  579. package/src/modules/billing/lib/testRunCleanup.ts +42 -0
  580. package/src/modules/billing/lib/topupCapture.ts +3 -4
  581. package/src/modules/billing/lib/topupReceipt.ts +70 -103
  582. package/src/modules/billing/lib/usageRater.ts +1 -1
  583. package/src/modules/billing/lib/usageRunner.ts +17 -5
  584. package/src/modules/billing/lib/vat.ts +56 -0
  585. package/src/modules/billing/migrations/Migration20261114000000_billing_customer_kind.ts +25 -0
  586. package/src/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.ts +37 -0
  587. package/src/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.ts +132 -0
  588. package/src/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.ts +58 -0
  589. package/src/modules/billing/migrations/Migration20261117000000_billing_payments.ts +97 -0
  590. package/src/modules/billing/migrations/Migration20261118000000_billing_memos.ts +21 -0
  591. package/src/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.ts +39 -0
  592. package/src/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.ts +35 -0
  593. package/src/modules/billing/setup.ts +11 -237
  594. package/src/modules/billing/subscribers/credit-memo-auto-send.ts +15 -0
  595. package/src/modules/billing/subscribers/debit-memo-apply-credit.ts +15 -0
  596. package/src/modules/billing/subscribers/debit-memo-auto-send.ts +15 -0
  597. package/src/modules/billing/subscribers/invoice-apply-credit.ts +39 -0
  598. package/src/modules/billing/subscribers/invoice-auto-send.ts +46 -0
  599. package/src/modules/billing/subscribers/payment-captured-to-paid.ts +84 -62
  600. package/src/modules/billing/subscribers/prepaid-topup-captured.ts +4 -8
  601. package/dist/modules/billing/lib/invoiceStatus.js +0 -38
  602. package/dist/modules/billing/lib/invoiceStatus.js.map +0 -7
  603. package/src/modules/billing/__tests__/lib/invoiceStatus.test.ts +0 -97
  604. package/src/modules/billing/lib/invoiceStatus.ts +0 -61
@@ -30,6 +30,15 @@ export const billingEntityIds = {
30
30
  transaction: 'billing:billing_account_transaction',
31
31
  topup: 'billing:billing_topup',
32
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',
33
42
  } as const
34
43
 
35
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>
@@ -5,10 +5,13 @@ import { createModuleEvents } from '@open-mercato/shared/modules/events'
5
5
  *
6
6
  * Emission contract:
7
7
  * - `billing.invoice.posted` fires once per posted draft AFTER the post
8
- * transaction commits (sequence number assigned, status set to `posted`
9
- * in core/sales). Consumed by mailers / accounting bridges / analytics.
8
+ * transaction commits (series number, issue/due dates assigned, status
9
+ * `posted` in `billing_invoices`) and after the PDF is frozen. Consumed by
10
+ * the auto-send subscriber, accounting bridges, analytics.
11
+ * - `billing.invoice.sent` / `billing.invoice.send_failed` fire once per
12
+ * email delivery attempt (Spec B), manual or automatic.
10
13
  * - `billing.invoice.line_posted` fires once per line on a posted invoice
11
- * so analytics can aggregate without scanning core/sales lines directly.
14
+ * so analytics can aggregate without scanning invoice lines directly.
12
15
  * - `billing.run.completed` fires once per Bill Run after all per-account
13
16
  * transactions finished (status is one of `completed` / `partial_failure`
14
17
  * / `failed`). Useful for "did the nightly run go OK?" alerts.
@@ -47,6 +50,48 @@ const events = [
47
50
  category: 'lifecycle',
48
51
  clientBroadcast: true,
49
52
  },
53
+ {
54
+ id: 'billing.invoice.sent',
55
+ label: 'Billing Invoice Sent',
56
+ entity: 'invoice',
57
+ category: 'lifecycle',
58
+ clientBroadcast: true,
59
+ },
60
+ {
61
+ id: 'billing.invoice.send_failed',
62
+ label: 'Billing Invoice Send Failed',
63
+ entity: 'invoice',
64
+ category: 'lifecycle',
65
+ clientBroadcast: true,
66
+ },
67
+ // ─── Payments (Spec C) ───────────────────────────────────────
68
+ { id: 'billing.payment.created', label: 'Billing Payment Created', entity: 'payment', category: 'lifecycle' },
69
+ { id: 'billing.payment.allocated', label: 'Billing Payment Allocated', entity: 'payment', category: 'lifecycle' },
70
+ { id: 'billing.payment.unallocated', label: 'Billing Payment Unallocated', entity: 'payment', category: 'lifecycle' },
71
+ {
72
+ id: 'billing.payment.converted_to_topup',
73
+ label: 'Billing Payment Converted to Top-up',
74
+ entity: 'payment',
75
+ category: 'lifecycle',
76
+ },
77
+ {
78
+ id: 'billing.payment_import.completed',
79
+ label: 'Billing Payment Import Completed',
80
+ entity: 'payment_import',
81
+ category: 'lifecycle',
82
+ clientBroadcast: true,
83
+ },
84
+ { id: 'billing.invoice.paid', label: 'Billing Invoice Paid', entity: 'invoice', category: 'lifecycle', clientBroadcast: true },
85
+ // ─── Corrective documents (Spec D) ───────────────────────────
86
+ { id: 'billing.credit_memo.posted', label: 'Billing Credit Memo Posted', entity: 'credit_memo', category: 'lifecycle', clientBroadcast: true },
87
+ { id: 'billing.debit_memo.posted', label: 'Billing Debit Memo Posted', entity: 'debit_memo', category: 'lifecycle', clientBroadcast: true },
88
+ { id: 'billing.invoice.credited', label: 'Billing Invoice Credited', entity: 'invoice', category: 'lifecycle', clientBroadcast: true },
89
+ {
90
+ id: 'billing.invoice.partially_paid',
91
+ label: 'Billing Invoice Partially Paid',
92
+ entity: 'invoice',
93
+ category: 'lifecycle',
94
+ },
50
95
  {
51
96
  id: 'billing.invoice.line_posted',
52
97
  label: 'Billing Invoice Line Posted',
@@ -60,6 +105,14 @@ const events = [
60
105
  category: 'lifecycle',
61
106
  clientBroadcast: true,
62
107
  },
108
+ // Spec F — a test / dry run and its test invoices were deleted.
109
+ {
110
+ id: 'billing.run.deleted',
111
+ label: 'Bill Run Deleted',
112
+ entity: 'bill_run',
113
+ category: 'lifecycle',
114
+ clientBroadcast: true,
115
+ },
63
116
  // ─── Prepaid balance billing (SPEC-002) ──────────────────────
64
117
  {
65
118
  id: 'billing.balance.topped_up',