@dainamite/billing 0.20.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 (598) hide show
  1. package/CHANGELOG.md +90 -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 +46 -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 +69 -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/en.json +457 -21
  217. package/dist/modules/billing/i18n/pl.json +457 -21
  218. package/dist/modules/billing/index.js +6 -2
  219. package/dist/modules/billing/index.js.map +2 -2
  220. package/dist/modules/billing/lib/accountFinancials.js +58 -0
  221. package/dist/modules/billing/lib/accountFinancials.js.map +7 -0
  222. package/dist/modules/billing/lib/accountLock.js +14 -0
  223. package/dist/modules/billing/lib/accountLock.js.map +7 -0
  224. package/dist/modules/billing/lib/accountStatus.js +9 -7
  225. package/dist/modules/billing/lib/accountStatus.js.map +2 -2
  226. package/dist/modules/billing/lib/accountSummary.js +106 -0
  227. package/dist/modules/billing/lib/accountSummary.js.map +7 -0
  228. package/dist/modules/billing/lib/allocation.js +356 -0
  229. package/dist/modules/billing/lib/allocation.js.map +7 -0
  230. package/dist/modules/billing/lib/allocationEvents.js +22 -0
  231. package/dist/modules/billing/lib/allocationEvents.js.map +7 -0
  232. package/dist/modules/billing/lib/billPeriod.js +15 -1
  233. package/dist/modules/billing/lib/billPeriod.js.map +2 -2
  234. package/dist/modules/billing/lib/billRunEngine.js +237 -102
  235. package/dist/modules/billing/lib/billRunEngine.js.map +2 -2
  236. package/dist/modules/billing/lib/billingSettings.js +116 -0
  237. package/dist/modules/billing/lib/billingSettings.js.map +7 -0
  238. package/dist/modules/billing/lib/commandRoute.js +81 -0
  239. package/dist/modules/billing/lib/commandRoute.js.map +7 -0
  240. package/dist/modules/billing/lib/customerLookup.js +97 -0
  241. package/dist/modules/billing/lib/customerLookup.js.map +7 -0
  242. package/dist/modules/billing/lib/dateOnly.js +13 -0
  243. package/dist/modules/billing/lib/dateOnly.js.map +7 -0
  244. package/dist/modules/billing/lib/documentParties.js +16 -0
  245. package/dist/modules/billing/lib/documentParties.js.map +7 -0
  246. package/dist/modules/billing/lib/documentTypes.js +27 -0
  247. package/dist/modules/billing/lib/documentTypes.js.map +7 -0
  248. package/dist/modules/billing/lib/dueDate.js +18 -0
  249. package/dist/modules/billing/lib/dueDate.js.map +7 -0
  250. package/dist/modules/billing/lib/iban.js +29 -0
  251. package/dist/modules/billing/lib/iban.js.map +7 -0
  252. package/dist/modules/billing/lib/invoiceDelivery.js +131 -0
  253. package/dist/modules/billing/lib/invoiceDelivery.js.map +7 -0
  254. package/dist/modules/billing/lib/invoiceLanguages.js +16 -0
  255. package/dist/modules/billing/lib/invoiceLanguages.js.map +7 -0
  256. package/dist/modules/billing/lib/invoiceWriter.js +107 -99
  257. package/dist/modules/billing/lib/invoiceWriter.js.map +2 -2
  258. package/dist/modules/billing/lib/itemBillingState.js +27 -0
  259. package/dist/modules/billing/lib/itemBillingState.js.map +7 -0
  260. package/dist/modules/billing/lib/itemPriceChange.js +18 -0
  261. package/dist/modules/billing/lib/itemPriceChange.js.map +7 -0
  262. package/dist/modules/billing/lib/itemSelector.js.map +2 -2
  263. package/dist/modules/billing/lib/lineAmounts.js +32 -0
  264. package/dist/modules/billing/lib/lineAmounts.js.map +7 -0
  265. package/dist/modules/billing/lib/memoGuards.js +25 -0
  266. package/dist/modules/billing/lib/memoGuards.js.map +7 -0
  267. package/dist/modules/billing/lib/navigation.js +48 -0
  268. package/dist/modules/billing/lib/navigation.js.map +7 -0
  269. package/dist/modules/billing/lib/numbering.js +120 -0
  270. package/dist/modules/billing/lib/numbering.js.map +7 -0
  271. package/dist/modules/billing/lib/overdue.js +36 -0
  272. package/dist/modules/billing/lib/overdue.js.map +7 -0
  273. package/dist/modules/billing/lib/paymentCsv.js +125 -0
  274. package/dist/modules/billing/lib/paymentCsv.js.map +7 -0
  275. package/dist/modules/billing/lib/paymentGateway.js +15 -0
  276. package/dist/modules/billing/lib/paymentGateway.js.map +7 -0
  277. package/dist/modules/billing/lib/paymentImport.js +164 -0
  278. package/dist/modules/billing/lib/paymentImport.js.map +7 -0
  279. package/dist/modules/billing/lib/paymentMatcher.js +36 -0
  280. package/dist/modules/billing/lib/paymentMatcher.js.map +7 -0
  281. package/dist/modules/billing/lib/pdf/attachmentStore.js +46 -0
  282. package/dist/modules/billing/lib/pdf/attachmentStore.js.map +7 -0
  283. package/dist/modules/billing/lib/pdf/fonts/embeddedFonts.js +7 -0
  284. package/dist/modules/billing/lib/pdf/fonts/embeddedFonts.js.map +7 -0
  285. package/dist/modules/billing/lib/pdf/invoiceModel.js +194 -0
  286. package/dist/modules/billing/lib/pdf/invoiceModel.js.map +7 -0
  287. package/dist/modules/billing/lib/pdf/invoicePdf.js +165 -0
  288. package/dist/modules/billing/lib/pdf/invoicePdf.js.map +7 -0
  289. package/dist/modules/billing/lib/pdf/invoiceTemplate.js +274 -0
  290. package/dist/modules/billing/lib/pdf/invoiceTemplate.js.map +7 -0
  291. package/dist/modules/billing/lib/prepaidConfig.js +17 -25
  292. package/dist/modules/billing/lib/prepaidConfig.js.map +2 -2
  293. package/dist/modules/billing/lib/prepaidConsume.js +26 -7
  294. package/dist/modules/billing/lib/prepaidConsume.js.map +2 -2
  295. package/dist/modules/billing/lib/prepaidPeriodClose.js +277 -158
  296. package/dist/modules/billing/lib/prepaidPeriodClose.js.map +2 -2
  297. package/dist/modules/billing/lib/prepaidTaxPoint.js +37 -0
  298. package/dist/modules/billing/lib/prepaidTaxPoint.js.map +7 -0
  299. package/dist/modules/billing/lib/seeds/demo.js +51 -3
  300. package/dist/modules/billing/lib/seeds/demo.js.map +2 -2
  301. package/dist/modules/billing/lib/seeds/paymentsSample.js +93 -0
  302. package/dist/modules/billing/lib/seeds/paymentsSample.js.map +7 -0
  303. package/dist/modules/billing/lib/seeds/sellerSettings.js +41 -0
  304. package/dist/modules/billing/lib/seeds/sellerSettings.js.map +7 -0
  305. package/dist/modules/billing/lib/servicePeriods.js +121 -0
  306. package/dist/modules/billing/lib/servicePeriods.js.map +7 -0
  307. package/dist/modules/billing/lib/testRunCleanup.js +24 -0
  308. package/dist/modules/billing/lib/testRunCleanup.js.map +7 -0
  309. package/dist/modules/billing/lib/topupCapture.js +2 -2
  310. package/dist/modules/billing/lib/topupCapture.js.map +2 -2
  311. package/dist/modules/billing/lib/topupReceipt.js +58 -79
  312. package/dist/modules/billing/lib/topupReceipt.js.map +2 -2
  313. package/dist/modules/billing/lib/usageRater.js.map +1 -1
  314. package/dist/modules/billing/lib/usageRunner.js +14 -6
  315. package/dist/modules/billing/lib/usageRunner.js.map +2 -2
  316. package/dist/modules/billing/lib/vat.js +39 -0
  317. package/dist/modules/billing/lib/vat.js.map +7 -0
  318. package/dist/modules/billing/migrations/Migration20261114000000_billing_customer_kind.js +15 -0
  319. package/dist/modules/billing/migrations/Migration20261114000000_billing_customer_kind.js.map +7 -0
  320. package/dist/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.js +25 -0
  321. package/dist/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.js.map +7 -0
  322. package/dist/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.js +115 -0
  323. package/dist/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.js.map +7 -0
  324. package/dist/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.js +47 -0
  325. package/dist/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.js.map +7 -0
  326. package/dist/modules/billing/migrations/Migration20261117000000_billing_payments.js +89 -0
  327. package/dist/modules/billing/migrations/Migration20261117000000_billing_payments.js.map +7 -0
  328. package/dist/modules/billing/migrations/Migration20261118000000_billing_memos.js +17 -0
  329. package/dist/modules/billing/migrations/Migration20261118000000_billing_memos.js.map +7 -0
  330. package/dist/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.js +27 -0
  331. package/dist/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.js.map +7 -0
  332. package/dist/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.js +29 -0
  333. package/dist/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.js.map +7 -0
  334. package/dist/modules/billing/setup.js +7 -184
  335. package/dist/modules/billing/setup.js.map +2 -2
  336. package/dist/modules/billing/subscribers/credit-memo-auto-send.js +16 -0
  337. package/dist/modules/billing/subscribers/credit-memo-auto-send.js.map +7 -0
  338. package/dist/modules/billing/subscribers/debit-memo-apply-credit.js +16 -0
  339. package/dist/modules/billing/subscribers/debit-memo-apply-credit.js.map +7 -0
  340. package/dist/modules/billing/subscribers/debit-memo-auto-send.js +16 -0
  341. package/dist/modules/billing/subscribers/debit-memo-auto-send.js.map +7 -0
  342. package/dist/modules/billing/subscribers/invoice-apply-credit.js +34 -0
  343. package/dist/modules/billing/subscribers/invoice-apply-credit.js.map +7 -0
  344. package/dist/modules/billing/subscribers/invoice-auto-send.js +30 -0
  345. package/dist/modules/billing/subscribers/invoice-auto-send.js.map +7 -0
  346. package/dist/modules/billing/subscribers/payment-captured-to-paid.js +69 -33
  347. package/dist/modules/billing/subscribers/payment-captured-to-paid.js.map +2 -2
  348. package/dist/modules/billing/subscribers/prepaid-topup-captured.js +4 -6
  349. package/dist/modules/billing/subscribers/prepaid-topup-captured.js.map +2 -2
  350. package/generated/entities/billing_account/index.ts +3 -0
  351. package/generated/entities/billing_allocation/index.ts +18 -0
  352. package/generated/entities/billing_document_sequence/index.ts +11 -0
  353. package/generated/entities/billing_invoice/index.ts +38 -0
  354. package/generated/entities/billing_invoice_line/index.ts +24 -0
  355. package/generated/entities/billing_item/index.ts +4 -0
  356. package/generated/entities/billing_payment/index.ts +25 -0
  357. package/generated/entities/billing_payment_import/index.ts +14 -0
  358. package/generated/entities/billing_run/index.ts +0 -1
  359. package/generated/entities/billing_run_outcome/index.ts +1 -0
  360. package/generated/entities/billing_settings/index.ts +26 -0
  361. package/generated/entities/billing_statement/index.ts +1 -0
  362. package/generated/entities.ids.generated.ts +7 -0
  363. package/package.json +5 -1
  364. package/src/modules/billing/__integration__/TC-BILL-004.spec.ts +170 -0
  365. package/src/modules/billing/__integration__/TC-BILL-005.spec.ts +134 -0
  366. package/src/modules/billing/__integration__/TC-BILL-006.spec.ts +101 -0
  367. package/src/modules/billing/__integration__/TC-BILL-007.spec.ts +140 -0
  368. package/src/modules/billing/__integration__/TC-BILL-008.spec.ts +108 -0
  369. package/src/modules/billing/__integration__/TC-BILL-009.spec.ts +113 -0
  370. package/src/modules/billing/__integration__/TC-BILL-010.spec.ts +118 -0
  371. package/src/modules/billing/__integration__/TC-BILL-011.spec.ts +142 -0
  372. package/src/modules/billing/__integration__/TC-BILL-012.spec.ts +115 -0
  373. package/src/modules/billing/__integration__/TC-BILL-013.spec.ts +118 -0
  374. package/src/modules/billing/__integration__/sellerSettings.ts +24 -0
  375. package/src/modules/billing/__tests__/commands/invoices.test.ts +436 -354
  376. package/src/modules/billing/__tests__/commands/itemsBulk.test.ts +33 -0
  377. package/src/modules/billing/__tests__/commands/memos.test.ts +205 -0
  378. package/src/modules/billing/__tests__/commands/payments.test.ts +241 -0
  379. package/src/modules/billing/__tests__/commands/runsDelete.test.ts +146 -0
  380. package/src/modules/billing/__tests__/commands/runsPostDrafts.test.ts +106 -0
  381. package/src/modules/billing/__tests__/commands/topups.test.ts +11 -0
  382. package/src/modules/billing/__tests__/entityRegistry.test.ts +8 -1
  383. package/src/modules/billing/__tests__/helpers/prepaidMockEm.ts +28 -11
  384. package/src/modules/billing/__tests__/lib/accountFinancials.test.ts +53 -0
  385. package/src/modules/billing/__tests__/lib/accountSummary.test.ts +97 -0
  386. package/src/modules/billing/__tests__/lib/allocation.test.ts +319 -0
  387. package/src/modules/billing/__tests__/lib/billRunEngine.test.ts +228 -17
  388. package/src/modules/billing/__tests__/lib/billingSettings.test.ts +109 -0
  389. package/src/modules/billing/__tests__/lib/customerLookup.test.ts +156 -0
  390. package/src/modules/billing/__tests__/lib/dueDate.test.ts +35 -0
  391. package/src/modules/billing/__tests__/lib/iban.test.ts +38 -0
  392. package/src/modules/billing/__tests__/lib/invoiceDelivery.test.ts +189 -0
  393. package/src/modules/billing/__tests__/lib/invoiceWriter.test.ts +212 -10
  394. package/src/modules/billing/__tests__/lib/itemBillingState.test.ts +42 -0
  395. package/src/modules/billing/__tests__/lib/itemPriceChange.test.ts +165 -0
  396. package/src/modules/billing/__tests__/lib/lineAmounts.test.ts +86 -0
  397. package/src/modules/billing/__tests__/lib/navigation.test.ts +71 -0
  398. package/src/modules/billing/__tests__/lib/numbering.test.ts +91 -0
  399. package/src/modules/billing/__tests__/lib/overdue.test.ts +36 -0
  400. package/src/modules/billing/__tests__/lib/paymentCsv.test.ts +148 -0
  401. package/src/modules/billing/__tests__/lib/paymentImport.test.ts +113 -0
  402. package/src/modules/billing/__tests__/lib/paymentsSample.test.ts +73 -0
  403. package/src/modules/billing/__tests__/lib/pdf/invoicePdf.test.ts +199 -0
  404. package/src/modules/billing/__tests__/lib/pdf/invoicePdfService.test.ts +147 -0
  405. package/src/modules/billing/__tests__/lib/prepaidPeriodClose.test.ts +374 -98
  406. package/src/modules/billing/__tests__/lib/prepaidTaxPoint.test.ts +118 -0
  407. package/src/modules/billing/__tests__/lib/seedsDemo.test.ts +53 -2
  408. package/src/modules/billing/__tests__/lib/sellerSettings.test.ts +28 -0
  409. package/src/modules/billing/__tests__/lib/servicePeriods.test.ts +190 -0
  410. package/src/modules/billing/__tests__/lib/topupCapture.test.ts +6 -28
  411. package/src/modules/billing/__tests__/lib/topupReceipt.test.ts +21 -52
  412. package/src/modules/billing/__tests__/lib/vat.test.ts +51 -0
  413. package/src/modules/billing/__tests__/package-isolation.test.ts +22 -8
  414. package/src/modules/billing/__tests__/setup.test.ts +13 -4
  415. package/src/modules/billing/__tests__/validators.test.ts +193 -3
  416. package/src/modules/billing/acl.ts +12 -0
  417. package/src/modules/billing/api/accounts/[id]/summary/route.ts +62 -0
  418. package/src/modules/billing/api/accounts/route.ts +58 -4
  419. package/src/modules/billing/api/export/account/[id]/route.ts +13 -11
  420. package/src/modules/billing/api/invoices/[id]/memos/route.ts +63 -0
  421. package/src/modules/billing/api/invoices/[id]/pdf/route.ts +79 -0
  422. package/src/modules/billing/api/invoices/[id]/route.ts +57 -70
  423. package/src/modules/billing/api/invoices/[id]/send/route.ts +127 -0
  424. package/src/modules/billing/api/invoices/add-line/route.ts +2 -2
  425. package/src/modules/billing/api/invoices/delete-draft/route.ts +33 -0
  426. package/src/modules/billing/api/invoices/edit-line/route.ts +2 -2
  427. package/src/modules/billing/api/invoices/post/route.ts +7 -6
  428. package/src/modules/billing/api/invoices/remove-line/route.ts +2 -2
  429. package/src/modules/billing/api/invoices/route.ts +81 -86
  430. package/src/modules/billing/api/items/bulk/route.ts +2 -1
  431. package/src/modules/billing/api/items/change-price/route.ts +54 -0
  432. package/src/modules/billing/api/items/route.ts +23 -7
  433. package/src/modules/billing/api/payment-imports/[id]/route.ts +49 -0
  434. package/src/modules/billing/api/payment-imports/route.ts +57 -0
  435. package/src/modules/billing/api/payments/[id]/route.ts +63 -0
  436. package/src/modules/billing/api/payments/allocate/route.ts +35 -0
  437. package/src/modules/billing/api/payments/assign/route.ts +36 -0
  438. package/src/modules/billing/api/payments/convert-to-topup/route.ts +35 -0
  439. package/src/modules/billing/api/payments/ignore/route.ts +35 -0
  440. package/src/modules/billing/api/payments/import/route.ts +72 -0
  441. package/src/modules/billing/api/payments/restore/route.ts +35 -0
  442. package/src/modules/billing/api/payments/route.ts +147 -0
  443. package/src/modules/billing/api/payments/unallocate/route.ts +35 -0
  444. package/src/modules/billing/api/payments/unassign/route.ts +35 -0
  445. package/src/modules/billing/api/run-outcomes/route.ts +49 -6
  446. package/src/modules/billing/api/runs/[id]/post-drafts/route.ts +71 -0
  447. package/src/modules/billing/api/runs/[id]/route.ts +59 -0
  448. package/src/modules/billing/api/runs/retry-failed/route.ts +2 -1
  449. package/src/modules/billing/api/runs/route.ts +15 -7
  450. package/src/modules/billing/api/settings/number-preview/route.ts +46 -0
  451. package/src/modules/billing/api/settings/route.ts +116 -0
  452. package/src/modules/billing/api/statements/route.ts +5 -0
  453. package/src/modules/billing/api/test-invoices/wipe/route.ts +2 -2
  454. package/src/modules/billing/backend/billing/accounts/[id]/page.tsx +151 -372
  455. package/src/modules/billing/backend/billing/accounts/create/page.tsx +6 -0
  456. package/src/modules/billing/backend/billing/accounts/page.tsx +70 -4
  457. package/src/modules/billing/backend/billing/invoices/[id]/page.tsx +444 -95
  458. package/src/modules/billing/backend/billing/invoices/page.tsx +8 -227
  459. package/src/modules/billing/backend/billing/items/[id]/page.tsx +75 -6
  460. package/src/modules/billing/backend/billing/items/create/page.tsx +13 -8
  461. package/src/modules/billing/backend/billing/items/page.tsx +18 -2
  462. package/src/modules/billing/backend/billing/payments/[id]/page.meta.ts +19 -0
  463. package/src/modules/billing/backend/billing/payments/[id]/page.tsx +415 -0
  464. package/src/modules/billing/backend/billing/payments/imports/[id]/page.meta.ts +19 -0
  465. package/src/modules/billing/backend/billing/payments/imports/[id]/page.tsx +106 -0
  466. package/src/modules/billing/backend/billing/payments/page.meta.ts +16 -0
  467. package/src/modules/billing/backend/billing/payments/page.tsx +56 -0
  468. package/src/modules/billing/backend/billing/runs/[id]/page.tsx +49 -18
  469. package/src/modules/billing/backend/billing/runs/page.tsx +59 -8
  470. package/src/modules/billing/backend/billing/statements/[id]/page.tsx +86 -5
  471. package/src/modules/billing/backend/billing/statements/page.tsx +1 -1
  472. package/src/modules/billing/backend/billing/topups/page.tsx +1 -1
  473. package/src/modules/billing/backend/billing/transactions/page.tsx +1 -1
  474. package/src/modules/billing/backend/billing/usage/create/page.tsx +3 -2
  475. package/src/modules/billing/backend/config/billing/page.meta.ts +21 -0
  476. package/src/modules/billing/backend/config/billing/page.tsx +549 -0
  477. package/src/modules/billing/cli.ts +31 -1
  478. package/src/modules/billing/commands/accounts.ts +6 -0
  479. package/src/modules/billing/commands/index.ts +3 -0
  480. package/src/modules/billing/commands/invoices.ts +364 -231
  481. package/src/modules/billing/commands/items.ts +143 -0
  482. package/src/modules/billing/commands/memos.ts +218 -0
  483. package/src/modules/billing/commands/payments.ts +428 -0
  484. package/src/modules/billing/commands/runs.ts +205 -3
  485. package/src/modules/billing/commands/settings.ts +77 -0
  486. package/src/modules/billing/commands/topups.ts +12 -3
  487. package/src/modules/billing/commands/transactions.ts +2 -2
  488. package/src/modules/billing/components/AccountForm.tsx +199 -53
  489. package/src/modules/billing/components/AccountInvoicesSection.tsx +75 -0
  490. package/src/modules/billing/components/AccountPaymentsSection.tsx +42 -0
  491. package/src/modules/billing/components/AccountPicker.tsx +70 -0
  492. package/src/modules/billing/components/AllocatePaymentDialog.tsx +167 -0
  493. package/src/modules/billing/components/BillingDataTable.tsx +34 -0
  494. package/src/modules/billing/components/BillingSettingsLink.tsx +25 -0
  495. package/src/modules/billing/components/ChangeItemPriceDialog.tsx +180 -0
  496. package/src/modules/billing/components/CreateMemoDialog.tsx +232 -0
  497. package/src/modules/billing/components/CustomerLabel.tsx +53 -0
  498. package/src/modules/billing/components/InvoicesTable.tsx +344 -0
  499. package/src/modules/billing/components/ItemForm.tsx +233 -44
  500. package/src/modules/billing/components/ItemPriceField.tsx +81 -0
  501. package/src/modules/billing/components/LineFormDialog.tsx +25 -1
  502. package/src/modules/billing/components/ManualPaymentDialog.tsx +140 -0
  503. package/src/modules/billing/components/MoneyInput.tsx +26 -0
  504. package/src/modules/billing/components/PaymentUploadDialog.tsx +148 -0
  505. package/src/modules/billing/components/PaymentsTable.tsx +213 -0
  506. package/src/modules/billing/components/PostRunDraftsButton.tsx +129 -0
  507. package/src/modules/billing/components/PrepaidPanel.tsx +19 -6
  508. package/src/modules/billing/components/RunCyclesSection.tsx +298 -0
  509. package/src/modules/billing/components/TestRunActions.tsx +152 -0
  510. package/src/modules/billing/components/account/AccountItemsTab.tsx +192 -0
  511. package/src/modules/billing/components/account/AccountRunBillingDialog.tsx +147 -0
  512. package/src/modules/billing/components/account/AccountRunsTab.tsx +201 -0
  513. package/src/modules/billing/components/account/AccountStatementsTab.tsx +120 -0
  514. package/src/modules/billing/components/account/AccountSummaryCards.tsx +153 -0
  515. package/src/modules/billing/components/account/AccountUsageTab.tsx +122 -0
  516. package/src/modules/billing/components/account/AccountView.tsx +101 -0
  517. package/src/modules/billing/components/account/accountRow.ts +70 -0
  518. package/src/modules/billing/components/customerNames.ts +62 -0
  519. package/src/modules/billing/data/entities.ts +654 -5
  520. package/src/modules/billing/data/entityIds.ts +9 -0
  521. package/src/modules/billing/data/validators.ts +388 -8
  522. package/src/modules/billing/events.ts +56 -3
  523. package/src/modules/billing/i18n/en.json +457 -21
  524. package/src/modules/billing/i18n/pl.json +457 -21
  525. package/src/modules/billing/index.ts +6 -2
  526. package/src/modules/billing/lib/accountFinancials.ts +84 -0
  527. package/src/modules/billing/lib/accountLock.ts +32 -0
  528. package/src/modules/billing/lib/accountStatus.ts +11 -9
  529. package/src/modules/billing/lib/accountSummary.ts +172 -0
  530. package/src/modules/billing/lib/allocation.ts +515 -0
  531. package/src/modules/billing/lib/allocationEvents.ts +26 -0
  532. package/src/modules/billing/lib/billPeriod.ts +19 -0
  533. package/src/modules/billing/lib/billRunEngine.ts +350 -150
  534. package/src/modules/billing/lib/billingSettings.ts +145 -0
  535. package/src/modules/billing/lib/commandRoute.ts +112 -0
  536. package/src/modules/billing/lib/customerLookup.ts +157 -0
  537. package/src/modules/billing/lib/dateOnly.ts +22 -0
  538. package/src/modules/billing/lib/documentParties.ts +23 -0
  539. package/src/modules/billing/lib/documentTypes.ts +37 -0
  540. package/src/modules/billing/lib/dueDate.ts +26 -0
  541. package/src/modules/billing/lib/iban.ts +36 -0
  542. package/src/modules/billing/lib/invoiceDelivery.ts +197 -0
  543. package/src/modules/billing/lib/invoiceLanguages.ts +34 -0
  544. package/src/modules/billing/lib/invoiceWriter.ts +162 -148
  545. package/src/modules/billing/lib/itemBillingState.ts +67 -0
  546. package/src/modules/billing/lib/itemPriceChange.ts +56 -0
  547. package/src/modules/billing/lib/itemSelector.ts +4 -1
  548. package/src/modules/billing/lib/lineAmounts.ts +61 -0
  549. package/src/modules/billing/lib/memoGuards.ts +41 -0
  550. package/src/modules/billing/lib/navigation.ts +64 -0
  551. package/src/modules/billing/lib/numbering.ts +174 -0
  552. package/src/modules/billing/lib/overdue.ts +60 -0
  553. package/src/modules/billing/lib/paymentCsv.ts +171 -0
  554. package/src/modules/billing/lib/paymentGateway.ts +52 -0
  555. package/src/modules/billing/lib/paymentImport.ts +228 -0
  556. package/src/modules/billing/lib/paymentMatcher.ts +88 -0
  557. package/src/modules/billing/lib/pdf/attachmentStore.ts +60 -0
  558. package/src/modules/billing/lib/pdf/fonts/NotoSans-Bold.ttf +0 -0
  559. package/src/modules/billing/lib/pdf/fonts/NotoSans-Regular.ttf +0 -0
  560. package/src/modules/billing/lib/pdf/fonts/OFL.txt +93 -0
  561. package/src/modules/billing/lib/pdf/fonts/embeddedFonts.ts +9 -0
  562. package/src/modules/billing/lib/pdf/invoiceModel.ts +328 -0
  563. package/src/modules/billing/lib/pdf/invoicePdf.ts +216 -0
  564. package/src/modules/billing/lib/pdf/invoiceTemplate.ts +338 -0
  565. package/src/modules/billing/lib/prepaidConfig.ts +27 -36
  566. package/src/modules/billing/lib/prepaidConsume.ts +29 -6
  567. package/src/modules/billing/lib/prepaidPeriodClose.ts +407 -239
  568. package/src/modules/billing/lib/prepaidTaxPoint.ts +76 -0
  569. package/src/modules/billing/lib/seeds/demo.ts +79 -6
  570. package/src/modules/billing/lib/seeds/paymentsSample.ts +136 -0
  571. package/src/modules/billing/lib/seeds/sellerSettings.ts +78 -0
  572. package/src/modules/billing/lib/servicePeriods.ts +226 -0
  573. package/src/modules/billing/lib/testRunCleanup.ts +42 -0
  574. package/src/modules/billing/lib/topupCapture.ts +3 -4
  575. package/src/modules/billing/lib/topupReceipt.ts +70 -103
  576. package/src/modules/billing/lib/usageRater.ts +1 -1
  577. package/src/modules/billing/lib/usageRunner.ts +17 -5
  578. package/src/modules/billing/lib/vat.ts +56 -0
  579. package/src/modules/billing/migrations/Migration20261114000000_billing_customer_kind.ts +25 -0
  580. package/src/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.ts +37 -0
  581. package/src/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.ts +132 -0
  582. package/src/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.ts +58 -0
  583. package/src/modules/billing/migrations/Migration20261117000000_billing_payments.ts +97 -0
  584. package/src/modules/billing/migrations/Migration20261118000000_billing_memos.ts +21 -0
  585. package/src/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.ts +39 -0
  586. package/src/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.ts +35 -0
  587. package/src/modules/billing/setup.ts +11 -237
  588. package/src/modules/billing/subscribers/credit-memo-auto-send.ts +15 -0
  589. package/src/modules/billing/subscribers/debit-memo-apply-credit.ts +15 -0
  590. package/src/modules/billing/subscribers/debit-memo-auto-send.ts +15 -0
  591. package/src/modules/billing/subscribers/invoice-apply-credit.ts +39 -0
  592. package/src/modules/billing/subscribers/invoice-auto-send.ts +46 -0
  593. package/src/modules/billing/subscribers/payment-captured-to-paid.ts +84 -62
  594. package/src/modules/billing/subscribers/prepaid-topup-captured.ts +4 -8
  595. package/dist/modules/billing/lib/invoiceStatus.js +0 -38
  596. package/dist/modules/billing/lib/invoiceStatus.js.map +0 -7
  597. package/src/modules/billing/__tests__/lib/invoiceStatus.test.ts +0 -97
  598. package/src/modules/billing/lib/invoiceStatus.ts +0 -61
@@ -0,0 +1,58 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ /**
4
+ * Invoice documents (Spec B): VAT per item, payment terms, seller settings.
5
+ *
6
+ * - `billing_items.tax_rate` — existing items get 0 (P-D5: no back-fill, a
7
+ * default would silently re-price live subscriptions; demo data reseeds);
8
+ * - `billing_accounts.payment_terms_days` / `auto_send_invoice`;
9
+ * - `billing_settings` seller block, bank, footer, logo, default terms and
10
+ * default tax rate.
11
+ *
12
+ * Additive only. Hand-written like the package's earlier migrations (`yarn
13
+ * mercato db generate` only diffs `@app` modules); columns mirror
14
+ * `data/entities.ts` 1:1.
15
+ */
16
+ export class Migration20261116000000_billing_invoice_documents extends Migration {
17
+ async up(): Promise<void> {
18
+ this.addSql(
19
+ `alter table "billing_items" add column if not exists "tax_rate" numeric(7, 4) not null default '0';`,
20
+ )
21
+ this.addSql(
22
+ `alter table "billing_accounts" add column if not exists "payment_terms_days" int null, add column if not exists "auto_send_invoice" boolean not null default false;`,
23
+ )
24
+ this.addSql(
25
+ `alter table "billing_settings"
26
+ add column if not exists "legal_name" text null,
27
+ add column if not exists "seller_address" jsonb null,
28
+ add column if not exists "tax_id" text null,
29
+ add column if not exists "bank_name" text null,
30
+ add column if not exists "iban" text null,
31
+ add column if not exists "bic" text null,
32
+ add column if not exists "invoice_footer" text null,
33
+ add column if not exists "logo_attachment_id" uuid null,
34
+ add column if not exists "default_payment_terms_days" int not null default 14,
35
+ add column if not exists "default_tax_rate" numeric(7, 4) not null default '23';`,
36
+ )
37
+ }
38
+
39
+ async down(): Promise<void> {
40
+ this.addSql(
41
+ `alter table "billing_settings"
42
+ drop column if exists "legal_name",
43
+ drop column if exists "seller_address",
44
+ drop column if exists "tax_id",
45
+ drop column if exists "bank_name",
46
+ drop column if exists "iban",
47
+ drop column if exists "bic",
48
+ drop column if exists "invoice_footer",
49
+ drop column if exists "logo_attachment_id",
50
+ drop column if exists "default_payment_terms_days",
51
+ drop column if exists "default_tax_rate";`,
52
+ )
53
+ this.addSql(
54
+ `alter table "billing_accounts" drop column if exists "payment_terms_days", drop column if exists "auto_send_invoice";`,
55
+ )
56
+ this.addSql(`alter table "billing_items" drop column if exists "tax_rate";`)
57
+ }
58
+ }
@@ -0,0 +1,97 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ /**
4
+ * Payments (Spec C): billing-owned payment register, source-typed
5
+ * allocations (payments now, credit memos in Spec D) and CSV import batches.
6
+ *
7
+ * Hand-written like the package's earlier migrations (`yarn mercato db
8
+ * generate` only diffs `@app` modules). Partial unique indexes cannot be
9
+ * expressed with decorators, so they live here only.
10
+ */
11
+ export class Migration20261117000000_billing_payments extends Migration {
12
+ async up(): Promise<void> {
13
+ this.addSql(`create table if not exists "billing_payments" (
14
+ "id" uuid not null default gen_random_uuid(),
15
+ "organization_id" uuid not null,
16
+ "tenant_id" uuid not null,
17
+ "received_at" date not null,
18
+ "amount" numeric(18, 4) not null,
19
+ "currency_code" text not null,
20
+ "reference" text null,
21
+ "payer_name" text null,
22
+ "payer_account" text null,
23
+ "source" text not null,
24
+ "import_id" uuid null,
25
+ "bill_account_id" uuid null,
26
+ "status" text not null,
27
+ "unallocated_amount" numeric(18, 4) not null,
28
+ "match_reason" text null,
29
+ "source_ref" text not null,
30
+ "external_ref" text null,
31
+ "topup_id" uuid null,
32
+ "metadata" jsonb null,
33
+ "created_at" timestamptz not null,
34
+ "updated_at" timestamptz not null,
35
+ "deleted_at" timestamptz null,
36
+ constraint "billing_payments_pkey" primary key ("id"),
37
+ constraint "billing_payments_amount_positive" check ("amount" > 0),
38
+ constraint "billing_payments_unallocated_range" check ("unallocated_amount" >= 0 and "unallocated_amount" <= "amount")
39
+ );`)
40
+ this.addSql(`create index if not exists "billing_payments_status_idx" on "billing_payments" ("tenant_id", "organization_id", "status");`)
41
+ this.addSql(`create index if not exists "billing_payments_account_idx" on "billing_payments" ("bill_account_id", "status");`)
42
+ this.addSql(`create index if not exists "billing_payments_import_idx" on "billing_payments" ("import_id");`)
43
+ this.addSql(
44
+ `create unique index if not exists "billing_payments_source_ref_uq" on "billing_payments" ("tenant_id", "organization_id", "source_ref") where "deleted_at" is null;`,
45
+ )
46
+ this.addSql(
47
+ `create unique index if not exists "billing_payments_external_ref_uq" on "billing_payments" ("tenant_id", "organization_id", "external_ref") where "external_ref" is not null;`,
48
+ )
49
+
50
+ this.addSql(`create table if not exists "billing_allocations" (
51
+ "id" uuid not null default gen_random_uuid(),
52
+ "organization_id" uuid not null,
53
+ "tenant_id" uuid not null,
54
+ "source_type" text not null,
55
+ "source_id" uuid not null,
56
+ "invoice_id" uuid not null,
57
+ "bill_account_id" uuid not null,
58
+ "amount" numeric(18, 4) not null,
59
+ "currency_code" text not null,
60
+ "allocated_by" text not null,
61
+ "user_id" uuid null,
62
+ "deallocated_by_user_id" uuid null,
63
+ "created_at" timestamptz not null,
64
+ "updated_at" timestamptz not null,
65
+ "deleted_at" timestamptz null,
66
+ constraint "billing_allocations_pkey" primary key ("id"),
67
+ constraint "billing_allocations_amount_positive" check ("amount" > 0)
68
+ );`)
69
+ this.addSql(`create index if not exists "billing_allocations_source_idx" on "billing_allocations" ("source_type", "source_id") where "deleted_at" is null;`)
70
+ this.addSql(`create index if not exists "billing_allocations_invoice_idx" on "billing_allocations" ("invoice_id") where "deleted_at" is null;`)
71
+ this.addSql(`create index if not exists "billing_allocations_account_idx" on "billing_allocations" ("bill_account_id") where "deleted_at" is null;`)
72
+
73
+ this.addSql(`create table if not exists "billing_payment_imports" (
74
+ "id" uuid not null default gen_random_uuid(),
75
+ "organization_id" uuid not null,
76
+ "tenant_id" uuid not null,
77
+ "file_name" text not null,
78
+ "row_count" int not null,
79
+ "counts" jsonb null,
80
+ "errors" jsonb null,
81
+ "user_id" uuid null,
82
+ "created_at" timestamptz not null,
83
+ "updated_at" timestamptz not null,
84
+ "deleted_at" timestamptz null,
85
+ constraint "billing_payment_imports_pkey" primary key ("id")
86
+ );`)
87
+ this.addSql(
88
+ `create index if not exists "billing_payment_imports_scope_idx" on "billing_payment_imports" ("tenant_id", "organization_id", "created_at");`,
89
+ )
90
+ }
91
+
92
+ async down(): Promise<void> {
93
+ this.addSql(`drop table if exists "billing_payment_imports";`)
94
+ this.addSql(`drop table if exists "billing_allocations";`)
95
+ this.addSql(`drop table if exists "billing_payments";`)
96
+ }
97
+ }
@@ -0,0 +1,21 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ /**
4
+ * Credit / debit memos (Spec D). Memo columns `document_type`,
5
+ * `corrects_invoice_id`, `correction_reason` and `credited_total` exist since
6
+ * Spec 0; this adds the snapshot of the corrected document printed on the
7
+ * memo. Additive, hand-written like the package's earlier migrations.
8
+ */
9
+ export class Migration20261118000000_billing_memos extends Migration {
10
+ async up(): Promise<void> {
11
+ this.addSql(
12
+ `alter table "billing_invoices" add column if not exists "corrects_invoice_number" text null, add column if not exists "corrects_issue_date" date null;`,
13
+ )
14
+ }
15
+
16
+ async down(): Promise<void> {
17
+ this.addSql(
18
+ `alter table "billing_invoices" drop column if exists "corrects_invoice_number", drop column if exists "corrects_issue_date";`,
19
+ )
20
+ }
21
+ }
@@ -0,0 +1,39 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ /**
4
+ * Operator feedback round 1 (Spec F).
5
+ *
6
+ * - `billing_items.price_basis` ('net' | 'gross', default 'net'): the item
7
+ * price is stored as typed; invoice lines and prepaid debits are computed
8
+ * from that basis (F-D2).
9
+ * - `billing_settings.prepaid_tax_point` ('topup' | 'consumption', default
10
+ * 'topup'): where prepaid VAT is charged (F-D3).
11
+ * - `billing_statements.vat_summary` jsonb: per-rate net / tax / gross of the
12
+ * period's prepaid debits (empty in `topup` mode).
13
+ *
14
+ * Hand-written like the package's earlier migrations: `yarn mercato db
15
+ * generate` only diffs `@app` modules. Columns mirror `data/entities.ts` 1:1.
16
+ */
17
+ export class Migration20261119000000_billing_operator_feedback extends Migration {
18
+ async up(): Promise<void> {
19
+ this.addSql(`alter table "billing_items" add column if not exists "price_basis" text not null default 'net';`)
20
+ this.addSql(
21
+ `alter table "billing_items" add constraint "billing_items_price_basis_check" check ("price_basis" in ('net', 'gross'));`,
22
+ )
23
+ this.addSql(
24
+ `alter table "billing_settings" add column if not exists "prepaid_tax_point" text not null default 'topup';`,
25
+ )
26
+ this.addSql(
27
+ `alter table "billing_settings" add constraint "billing_settings_prepaid_tax_point_check" check ("prepaid_tax_point" in ('topup', 'consumption'));`,
28
+ )
29
+ this.addSql(`alter table "billing_statements" add column if not exists "vat_summary" jsonb null;`)
30
+ }
31
+
32
+ async down(): Promise<void> {
33
+ this.addSql(`alter table "billing_statements" drop column if exists "vat_summary";`)
34
+ this.addSql(`alter table "billing_settings" drop constraint if exists "billing_settings_prepaid_tax_point_check";`)
35
+ this.addSql(`alter table "billing_settings" drop column if exists "prepaid_tax_point";`)
36
+ this.addSql(`alter table "billing_items" drop constraint if exists "billing_items_price_basis_check";`)
37
+ this.addSql(`alter table "billing_items" drop column if exists "price_basis";`)
38
+ }
39
+ }
@@ -0,0 +1,35 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ /**
4
+ * `billing_allocations` lookup indexes lead with the tenant scope, like every
5
+ * other billing table. Each allocation read filters by tenant + organization
6
+ * plus the invoice, the source (payment / credit memo) or the account.
7
+ *
8
+ * Hand-written like the package's earlier migrations: `yarn mercato db
9
+ * generate` only diffs `@app` modules. Indexes mirror `data/entities.ts` 1:1.
10
+ */
11
+ export class Migration20261120000000_billing_allocation_scope_indexes extends Migration {
12
+ async up(): Promise<void> {
13
+ this.addSql(`drop index if exists "billing_allocations_source_idx";`)
14
+ this.addSql(`drop index if exists "billing_allocations_invoice_idx";`)
15
+ this.addSql(`drop index if exists "billing_allocations_account_idx";`)
16
+ this.addSql(
17
+ `create index if not exists "billing_allocations_source_idx" on "billing_allocations" ("tenant_id", "organization_id", "source_type", "source_id") where "deleted_at" is null;`,
18
+ )
19
+ this.addSql(
20
+ `create index if not exists "billing_allocations_invoice_idx" on "billing_allocations" ("tenant_id", "organization_id", "invoice_id") where "deleted_at" is null;`,
21
+ )
22
+ this.addSql(
23
+ `create index if not exists "billing_allocations_account_idx" on "billing_allocations" ("tenant_id", "organization_id", "bill_account_id") where "deleted_at" is null;`,
24
+ )
25
+ }
26
+
27
+ async down(): Promise<void> {
28
+ this.addSql(`drop index if exists "billing_allocations_source_idx";`)
29
+ this.addSql(`drop index if exists "billing_allocations_invoice_idx";`)
30
+ this.addSql(`drop index if exists "billing_allocations_account_idx";`)
31
+ this.addSql(`create index if not exists "billing_allocations_source_idx" on "billing_allocations" ("source_type", "source_id") where "deleted_at" is null;`)
32
+ this.addSql(`create index if not exists "billing_allocations_invoice_idx" on "billing_allocations" ("invoice_id") where "deleted_at" is null;`)
33
+ this.addSql(`create index if not exists "billing_allocations_account_idx" on "billing_allocations" ("bill_account_id") where "deleted_at" is null;`)
34
+ }
35
+ }
@@ -1,11 +1,7 @@
1
1
  import type { EntityManager } from '@mikro-orm/postgresql'
2
2
  import type { ModuleSetupConfig } from '@open-mercato/shared/modules/setup'
3
3
  import { features as billingAclFeatures } from './acl'
4
- import {
5
- Dictionary,
6
- DictionaryEntry,
7
- } from '@open-mercato/core/modules/dictionaries/data/entities'
8
- import { ModuleConfig } from '@open-mercato/core/modules/configs/data/entities'
4
+ import { getBillingSettings } from './lib/billingSettings'
9
5
 
10
6
  /**
11
7
  * Billing module setup — per-tenant defaults at module installation.
@@ -14,17 +10,11 @@ import { ModuleConfig } from '@open-mercato/core/modules/configs/data/entities'
14
10
  * - All seed helpers below check for an existing row before inserting.
15
11
  * - Safe to re-run on every `mercato init` and on `auth sync-role-acls`.
16
12
  *
17
- * What this file seeds:
18
- * - `billing.uom` dictionary with 16 global codes (operators can add more).
19
- * - `sales.invoice_status` dictionary with `draft` / `posted` / `paid` /
20
- * `void` so the core/sales Invoice entity's dictionary-driven status
21
- * workflow has values to point at. (Core/sales does NOT seed these —
22
- * billing owns them per Phase 0 validation.)
23
- * - `billing.cron_schedule` + `billing.cron_enabled` module configs.
24
- * - `billing.invoice_number.format` + `.reset_cycle` configs (per-tenant
25
- * defaults; the actual atomic numbering uses core/sales'
26
- * `SalesDocumentSequence` which is created by core/sales' own
27
- * `onTenantCreated`).
13
+ * What this file seeds (Spec 0 — no core `configs` / `dictionaries` /
14
+ * `sales` rows any more):
15
+ * - one `billing_settings` row per organization with the defaults
16
+ * (prepaid defaults + number masks). `getBillingSettings` also creates
17
+ * it lazily, so this is only a warm-up.
28
18
  *
29
19
  * Default role-feature grants:
30
20
  * - `admin` gets every `billing.*` feature.
@@ -33,214 +23,6 @@ import { ModuleConfig } from '@open-mercato/core/modules/configs/data/entities'
33
23
  * - `billing_usage_writer` is the narrow scope for external system API keys.
34
24
  */
35
25
 
36
- const BILLING_UOM_DICTIONARY_KEY = 'billing.uom'
37
- const SALES_INVOICE_STATUS_DICTIONARY_KEY = 'sales.invoice_status'
38
-
39
- const BILLING_UOM_CODES = [
40
- // time
41
- { value: 'hour', label: 'Hour' },
42
- { value: 'day', label: 'Day' },
43
- { value: 'week', label: 'Week' },
44
- { value: 'month', label: 'Month' },
45
- // volume
46
- { value: 'gb', label: 'Gigabyte' },
47
- { value: 'tb', label: 'Terabyte' },
48
- { value: 'mb', label: 'Megabyte' },
49
- // requests / tokens
50
- { value: 'request', label: 'Request' },
51
- { value: 'api_request', label: 'API Request' },
52
- { value: 'token', label: 'Token' },
53
- { value: 'input_token', label: 'Input Token' },
54
- { value: 'output_token', label: 'Output Token' },
55
- // seats / devices
56
- { value: 'seat', label: 'Seat' },
57
- { value: 'user', label: 'User' },
58
- { value: 'device', label: 'Device' },
59
- { value: 'active_user', label: 'Active User' },
60
- ] as const
61
-
62
- const INVOICE_STATUS_ENTRIES = [
63
- // `posted` is the canonical "issued" state and is also the default a
64
- // freshly created invoice transitions to — but billing creates drafts,
65
- // so `draft` is the default DictionaryEntry for new rows.
66
- { value: 'draft', label: 'Draft', isDefault: true, color: '#9ca3af' },
67
- { value: 'posted', label: 'Posted', isDefault: false, color: '#2563eb' },
68
- { value: 'paid', label: 'Paid', isDefault: false, color: '#16a34a' },
69
- { value: 'void', label: 'Void', isDefault: false, color: '#dc2626' },
70
- ] as const
71
-
72
- type SeedScope = { tenantId: string; organizationId: string }
73
-
74
- async function ensureDictionary(
75
- em: EntityManager,
76
- scope: SeedScope,
77
- params: { key: string; name: string; description: string },
78
- ): Promise<Dictionary> {
79
- const existing = await em.findOne(Dictionary, {
80
- tenantId: scope.tenantId,
81
- organizationId: scope.organizationId,
82
- key: params.key,
83
- deletedAt: null,
84
- })
85
- if (existing) return existing
86
- const dictionary = em.create(Dictionary, {
87
- tenantId: scope.tenantId,
88
- organizationId: scope.organizationId,
89
- key: params.key,
90
- name: params.name,
91
- description: params.description,
92
- isSystem: true,
93
- isActive: true,
94
- managerVisibility: 'hidden',
95
- createdAt: new Date(),
96
- updatedAt: new Date(),
97
- })
98
- em.persist(dictionary)
99
- await em.flush()
100
- return dictionary
101
- }
102
-
103
- async function ensureDictionaryEntries(
104
- em: EntityManager,
105
- scope: SeedScope,
106
- dictionary: Dictionary,
107
- entries: ReadonlyArray<{
108
- value: string
109
- label: string
110
- isDefault?: boolean
111
- color?: string
112
- }>,
113
- ): Promise<void> {
114
- const existing = await em.find(DictionaryEntry, {
115
- dictionary,
116
- tenantId: scope.tenantId,
117
- organizationId: scope.organizationId,
118
- })
119
- const existingValues = new Set(existing.map((e) => e.value))
120
- let position = existing.length
121
- for (const entry of entries) {
122
- if (existingValues.has(entry.value)) continue
123
- em.persist(
124
- em.create(DictionaryEntry, {
125
- dictionary,
126
- tenantId: scope.tenantId,
127
- organizationId: scope.organizationId,
128
- value: entry.value,
129
- normalizedValue: entry.value.trim().toLowerCase(),
130
- label: entry.label,
131
- color: entry.color ?? null,
132
- position,
133
- isDefault: entry.isDefault ?? false,
134
- createdAt: new Date(),
135
- updatedAt: new Date(),
136
- }),
137
- )
138
- position += 1
139
- }
140
- await em.flush()
141
- }
142
-
143
- async function seedBillingUomDictionary(em: EntityManager, scope: SeedScope): Promise<void> {
144
- const dict = await ensureDictionary(em, scope, {
145
- key: BILLING_UOM_DICTIONARY_KEY,
146
- name: 'Billing units of measure',
147
- description: 'Units billing accepts on usage records (exact match — no conversion).',
148
- })
149
- await ensureDictionaryEntries(em, scope, dict, BILLING_UOM_CODES)
150
- }
151
-
152
- async function seedInvoiceStatusDictionary(em: EntityManager, scope: SeedScope): Promise<void> {
153
- const dict = await ensureDictionary(em, scope, {
154
- key: SALES_INVOICE_STATUS_DICTIONARY_KEY,
155
- name: 'Sales invoice statuses',
156
- description: 'draft → posted → paid (or void). Drives the billing draft/post lifecycle.',
157
- })
158
- await ensureDictionaryEntries(em, scope, dict, INVOICE_STATUS_ENTRIES)
159
- }
160
-
161
- async function ensureModuleConfig(
162
- em: EntityManager,
163
- params: { moduleId: string; name: string; value: unknown },
164
- ): Promise<void> {
165
- const existing = await em.findOne(ModuleConfig, {
166
- moduleId: params.moduleId,
167
- name: params.name,
168
- })
169
- if (existing) return
170
- em.persist(
171
- em.create(ModuleConfig, {
172
- moduleId: params.moduleId,
173
- name: params.name,
174
- valueJson: params.value as Record<string, unknown> | null,
175
- createdAt: new Date(),
176
- updatedAt: new Date(),
177
- }),
178
- )
179
- await em.flush()
180
- }
181
-
182
- async function seedBillingConfigs(em: EntityManager): Promise<void> {
183
- await ensureModuleConfig(em, {
184
- moduleId: 'billing',
185
- name: 'cron_schedule',
186
- value: '0 2 * * *',
187
- })
188
- await ensureModuleConfig(em, {
189
- moduleId: 'billing',
190
- name: 'cron_enabled',
191
- value: true,
192
- })
193
- await ensureModuleConfig(em, {
194
- moduleId: 'billing',
195
- name: 'invoice_number.format',
196
- value: 'INV-{YYYY}-{0000001}',
197
- })
198
- await ensureModuleConfig(em, {
199
- moduleId: 'billing',
200
- name: 'invoice_number.reset_cycle',
201
- value: 'yearly',
202
- })
203
-
204
- // ─── Prepaid balance billing (SPEC-002) ──────────────────────
205
- // Fallback low-balance threshold when a prepaid account leaves its own
206
- // `low_balance_threshold` null. 0 = off (status never flips to `low`
207
- // until an operator sets a per-account threshold).
208
- await ensureModuleConfig(em, {
209
- moduleId: 'billing',
210
- name: 'prepaid.low_balance_threshold_default',
211
- value: 0,
212
- })
213
- // Default gateway provider key for top-up sessions.
214
- await ensureModuleConfig(em, {
215
- moduleId: 'billing',
216
- name: 'prepaid.topup_provider',
217
- value: 'stripe',
218
- })
219
- // Master switch for period statements.
220
- await ensureModuleConfig(em, {
221
- moduleId: 'billing',
222
- name: 'prepaid.statement_enabled',
223
- value: true,
224
- })
225
- // VAT rate (percent) applied to top-up receipts. The top-up `amount` is
226
- // treated as GROSS (what the customer pays = what the balance is credited);
227
- // the core tax service computes net + VAT from this rate. 0 = no VAT until
228
- // an operator sets the jurisdiction's rate. (Deviation from xd-249, which
229
- // never resolves a rate — see CHANGELOG.)
230
- await ensureModuleConfig(em, {
231
- moduleId: 'billing',
232
- name: 'prepaid.topup_tax_rate',
233
- value: 0,
234
- })
235
- // Fallback buffer for the `near_limit` credit status. 0 = warn only at the
236
- // limit itself.
237
- await ensureModuleConfig(em, {
238
- moduleId: 'billing',
239
- name: 'credit.near_limit_buffer_default',
240
- value: 0,
241
- })
242
- }
243
-
244
26
  // Derived from `acl.ts` so a new feature added there automatically lands
245
27
  // in every role that should get "everything billing" — no parallel list
246
28
  // to keep in sync.
@@ -269,6 +51,8 @@ export const setup: ModuleSetupConfig = {
269
51
  'billing.credit.view',
270
52
  'billing.topup.view',
271
53
  'billing.statement.view',
54
+ 'billing.settings.view',
55
+ 'billing.payment.view',
272
56
  ],
273
57
 
274
58
  // Narrow scope for external usage-ingestion API keys.
@@ -276,21 +60,11 @@ export const setup: ModuleSetupConfig = {
276
60
  },
277
61
 
278
62
  /**
279
- * Tenant init: per-tenant module configs (cron, invoice number defaults).
280
- * Runs inside `setupInitialTenant()`, always — no `--no-examples` gate.
281
- */
282
- async onTenantCreated({ em }) {
283
- await seedBillingConfigs(em)
284
- },
285
-
286
- /**
287
- * Reference data: dictionaries (UoM, invoice statuses). Always runs
288
- * during `mercato init`. Idempotent — re-seed is safe.
63
+ * Reference data: the organization's billing settings row (Spec 0).
64
+ * Always runs during `mercato init`. Idempotent (race-safe upsert).
289
65
  */
290
66
  async seedDefaults({ em, tenantId, organizationId }) {
291
- const scope = { tenantId, organizationId }
292
- await seedBillingUomDictionary(em, scope)
293
- await seedInvoiceStatusDictionary(em, scope)
67
+ await getBillingSettings(em as EntityManager, { tenantId, organizationId })
294
68
  },
295
69
  }
296
70
 
@@ -0,0 +1,15 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql'
2
+ import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
3
+ import { autoSendInvoice } from './invoice-auto-send'
4
+
5
+ /** Auto-send of posted credit memos for accounts with `auto_send_invoice` (Spec D, P-D9). */
6
+ export const metadata = {
7
+ event: 'billing.credit_memo.posted',
8
+ persistent: true,
9
+ id: 'billing-credit-memo-auto-send',
10
+ }
11
+
12
+ export default async function handle(payload: { invoiceId?: string; tenantId?: string; organizationId?: string }): Promise<void> {
13
+ const container = await createRequestContainer()
14
+ await autoSendInvoice((container.resolve('em') as EntityManager).fork(), payload)
15
+ }
@@ -0,0 +1,15 @@
1
+ import { applyCreditForAccount, type PostedPayload } from './invoice-apply-credit'
2
+ import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
3
+ import type { EntityManager } from '@mikro-orm/postgresql'
4
+
5
+ /** Credit auto-apply when a debit memo is posted (Spec D, P-D6) — same handler as for invoices. */
6
+ export const metadata = {
7
+ event: 'billing.debit_memo.posted',
8
+ persistent: true,
9
+ id: 'billing-debit-memo-apply-credit',
10
+ }
11
+
12
+ export default async function handle(payload: PostedPayload): Promise<void> {
13
+ const container = await createRequestContainer()
14
+ await applyCreditForAccount((container.resolve('em') as EntityManager).fork(), payload)
15
+ }
@@ -0,0 +1,15 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql'
2
+ import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
3
+ import { autoSendInvoice } from './invoice-auto-send'
4
+
5
+ /** Auto-send of posted debit memos for accounts with `auto_send_invoice` (Spec D, P-D9). */
6
+ export const metadata = {
7
+ event: 'billing.debit_memo.posted',
8
+ persistent: true,
9
+ id: 'billing-debit-memo-auto-send',
10
+ }
11
+
12
+ export default async function handle(payload: { invoiceId?: string; tenantId?: string; organizationId?: string }): Promise<void> {
13
+ const container = await createRequestContainer()
14
+ await autoSendInvoice((container.resolve('em') as EntityManager).fork(), payload)
15
+ }
@@ -0,0 +1,39 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql'
2
+ import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
3
+ import { BillingAccount } from '../data/entities'
4
+ import { withAccountLock } from '../lib/accountLock'
5
+ import { applyAccountCredit } from '../lib/allocation'
6
+ import { emitAllocationEffects } from '../lib/allocationEvents'
7
+
8
+ /**
9
+ * Credit auto-apply on post (Spec C, D12): when an invoice is posted, any
10
+ * unapplied credit of its account (overpayments, unallocated payments,
11
+ * open credit memos) is spent on the account's open receivables, oldest due
12
+ * date first. Persistent and safe to re-run (it only spends what is left).
13
+ */
14
+
15
+ export const metadata = {
16
+ event: 'billing.invoice.posted',
17
+ persistent: true,
18
+ id: 'billing-invoice-apply-credit',
19
+ }
20
+
21
+ export type PostedPayload = { billAccountId?: string; tenantId?: string; organizationId?: string }
22
+
23
+ export async function applyCreditForAccount(em: EntityManager, payload: PostedPayload): Promise<number> {
24
+ if (!payload?.billAccountId || !payload.tenantId || !payload.organizationId) return 0
25
+ const scope = { tenantId: payload.tenantId, organizationId: payload.organizationId }
26
+ const account = await em.findOne(BillingAccount, { id: payload.billAccountId, ...scope } as never)
27
+ if (!account || account.billingMode === 'prepaid') return 0
28
+ const effects = await withAccountLock(em, { tenantId: scope.tenantId, billAccountId: account.id }, (tem) =>
29
+ applyAccountCredit(tem, scope, { id: account.id, currencyCode: account.currencyCode }),
30
+ )
31
+ await emitAllocationEffects(scope, effects)
32
+ return effects.created.length
33
+ }
34
+
35
+ export default async function handle(payload: PostedPayload): Promise<void> {
36
+ const container = await createRequestContainer()
37
+ const em = (container.resolve('em') as EntityManager).fork()
38
+ await applyCreditForAccount(em, payload)
39
+ }