@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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/billing/subscribers/prepaid-topup-captured.ts"],
4
- "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport type { SalesDocumentNumberGenerator } from '@open-mercato/core/modules/sales/services/salesDocumentNumberGenerator'\nimport type { TaxCalculationService } from '@open-mercato/core/modules/sales/services/taxCalculationService'\nimport { BillingAccount, BillingTopup } from '../data/entities'\nimport { emitBillingEvent } from '../events'\nimport { captureTopup } from '../lib/topupCapture'\nimport { getTopupTaxRate } from '../lib/prepaidConfig'\n\n/**\n * Subscriber: `payment_gateways.payment.captured` \u2192 prepaid top-up captured.\n *\n * Coexists with `payment-captured-to-paid.ts`: that subscriber matches\n * `paymentId == invoiceId` (postpaid), while a top-up's `paymentId` is a\n * minted UUID that only ever matches a `BillingTopup`. Finding the\n * BillingTopup IS the guard \u2014 for any non-top-up payment this is a silent\n * no-op.\n *\n * Idempotent: a re-fired capture on an already-captured top-up is a no-op\n * (the gateway delivers webhooks at-least-once).\n */\n\nexport const metadata = {\n event: 'payment_gateways.payment.captured',\n persistent: true,\n id: 'billing-prepaid-topup-captured',\n}\n\ntype CapturedPayload = {\n paymentId?: string\n transactionId?: string\n organizationId?: string\n tenantId?: string\n providerKey?: string\n}\n\nexport default async function handle(payload: CapturedPayload): Promise<void> {\n if (!payload?.paymentId || !payload.tenantId || !payload.organizationId) {\n return\n }\n\n const container = await createRequestContainer()\n const em = (container.resolve('em') as EntityManager).fork()\n\n const topup = await em.findOne(BillingTopup, {\n paymentId: payload.paymentId,\n tenantId: payload.tenantId,\n organizationId: payload.organizationId,\n deletedAt: null,\n })\n if (!topup) {\n // Not a prepaid top-up \u2014 other subscribers own this captured payment.\n return\n }\n if (topup.status === 'captured') {\n return // idempotent re-fire\n }\n\n const account = await em.findOne(BillingAccount, {\n id: topup.billAccountId,\n tenantId: payload.tenantId,\n organizationId: payload.organizationId,\n deletedAt: null,\n })\n if (!account) {\n return\n }\n\n const taxRate = await getTopupTaxRate(em)\n const numberGenerator = container.resolve(\n 'salesDocumentNumberGenerator',\n ) as SalesDocumentNumberGenerator\n const taxService = container.resolve('taxCalculationService') as TaxCalculationService\n\n const result = await captureTopup(\n em,\n { numberGenerator, taxService },\n {\n topup,\n account: {\n id: account.id,\n organizationId: account.organizationId,\n tenantId: account.tenantId,\n currencyCode: account.currencyCode,\n },\n taxRate,\n gatewayTransactionId: payload.transactionId ?? null,\n },\n )\n\n if (result.status !== 'captured') return\n\n // Side effects fire AFTER the capture transaction commits.\n await emitBillingEvent('billing.balance.topped_up', {\n billAccountId: account.id,\n tenantId: account.tenantId,\n organizationId: account.organizationId,\n topupId: topup.id,\n amount: topup.amount,\n currencyCode: account.currencyCode,\n balance: result.balanceAfter ?? null,\n transactionId: result.transactionId ?? null,\n receiptInvoiceId: result.receiptInvoiceId ?? null,\n })\n\n // Reuse the postpaid receipt path so the existing mailer / accounting bridge\n // sends the top-up VAT receipt.\n if (result.receiptInvoiceId) {\n await emitBillingEvent('billing.invoice.posted', {\n invoiceId: result.receiptInvoiceId,\n invoiceNumber: result.invoiceNumber ?? null,\n tenantId: account.tenantId,\n organizationId: account.organizationId,\n grandTotalGross: result.grossAmount ?? null,\n currencyCode: account.currencyCode,\n billAccountId: account.id,\n kind: 'prepaid_topup',\n })\n }\n}\n"],
5
- "mappings": "AACA,SAAS,8BAA8B;AAGvC,SAAS,gBAAgB,oBAAoB;AAC7C,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAezB,MAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,IAAI;AACN;AAUA,eAAO,OAA8B,SAAyC;AAC5E,MAAI,CAAC,SAAS,aAAa,CAAC,QAAQ,YAAY,CAAC,QAAQ,gBAAgB;AACvE;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,uBAAuB;AAC/C,QAAM,KAAM,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAE3D,QAAM,QAAQ,MAAM,GAAG,QAAQ,cAAc;AAAA,IAC3C,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,IAClB,gBAAgB,QAAQ;AAAA,IACxB,WAAW;AAAA,EACb,CAAC;AACD,MAAI,CAAC,OAAO;AAEV;AAAA,EACF;AACA,MAAI,MAAM,WAAW,YAAY;AAC/B;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,GAAG,QAAQ,gBAAgB;AAAA,IAC/C,IAAI,MAAM;AAAA,IACV,UAAU,QAAQ;AAAA,IAClB,gBAAgB,QAAQ;AAAA,IACxB,WAAW;AAAA,EACb,CAAC;AACD,MAAI,CAAC,SAAS;AACZ;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,gBAAgB,EAAE;AACxC,QAAM,kBAAkB,UAAU;AAAA,IAChC;AAAA,EACF;AACA,QAAM,aAAa,UAAU,QAAQ,uBAAuB;AAE5D,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,EAAE,iBAAiB,WAAW;AAAA,IAC9B;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,IAAI,QAAQ;AAAA,QACZ,gBAAgB,QAAQ;AAAA,QACxB,UAAU,QAAQ;AAAA,QAClB,cAAc,QAAQ;AAAA,MACxB;AAAA,MACA;AAAA,MACA,sBAAsB,QAAQ,iBAAiB;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,WAAY;AAGlC,QAAM,iBAAiB,6BAA6B;AAAA,IAClD,eAAe,QAAQ;AAAA,IACvB,UAAU,QAAQ;AAAA,IAClB,gBAAgB,QAAQ;AAAA,IACxB,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,cAAc,QAAQ;AAAA,IACtB,SAAS,OAAO,gBAAgB;AAAA,IAChC,eAAe,OAAO,iBAAiB;AAAA,IACvC,kBAAkB,OAAO,oBAAoB;AAAA,EAC/C,CAAC;AAID,MAAI,OAAO,kBAAkB;AAC3B,UAAM,iBAAiB,0BAA0B;AAAA,MAC/C,WAAW,OAAO;AAAA,MAClB,eAAe,OAAO,iBAAiB;AAAA,MACvC,UAAU,QAAQ;AAAA,MAClB,gBAAgB,QAAQ;AAAA,MACxB,iBAAiB,OAAO,eAAe;AAAA,MACvC,cAAc,QAAQ;AAAA,MACtB,eAAe,QAAQ;AAAA,MACvB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;",
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { BillingAccount, BillingTopup } from '../data/entities'\nimport { emitBillingEvent } from '../events'\nimport { captureTopup } from '../lib/topupCapture'\nimport { getTopupTaxRate } from '../lib/prepaidConfig'\n\n/**\n * Subscriber: `payment_gateways.payment.captured` \u2192 prepaid top-up captured.\n *\n * Coexists with `payment-captured-to-paid.ts`: that subscriber matches\n * `paymentId == invoiceId` (postpaid), while a top-up's `paymentId` is a\n * minted UUID that only ever matches a `BillingTopup`. Finding the\n * BillingTopup IS the guard \u2014 for any non-top-up payment this is a silent\n * no-op.\n *\n * Idempotent: a re-fired capture on an already-captured top-up is a no-op\n * (the gateway delivers webhooks at-least-once).\n */\n\nexport const metadata = {\n event: 'payment_gateways.payment.captured',\n persistent: true,\n id: 'billing-prepaid-topup-captured',\n}\n\ntype CapturedPayload = {\n paymentId?: string\n transactionId?: string\n organizationId?: string\n tenantId?: string\n providerKey?: string\n}\n\nexport default async function handle(payload: CapturedPayload): Promise<void> {\n if (!payload?.paymentId || !payload.tenantId || !payload.organizationId) {\n return\n }\n\n const container = await createRequestContainer()\n const em = (container.resolve('em') as EntityManager).fork()\n\n const topup = await em.findOne(BillingTopup, {\n paymentId: payload.paymentId,\n tenantId: payload.tenantId,\n organizationId: payload.organizationId,\n deletedAt: null,\n })\n if (!topup) {\n // Not a prepaid top-up \u2014 other subscribers own this captured payment.\n return\n }\n if (topup.status === 'captured') {\n return // idempotent re-fire\n }\n\n const account = await em.findOne(BillingAccount, {\n id: topup.billAccountId,\n tenantId: payload.tenantId,\n organizationId: payload.organizationId,\n deletedAt: null,\n })\n if (!account) {\n return\n }\n\n const taxRate = await getTopupTaxRate(em, {\n tenantId: account.tenantId,\n organizationId: account.organizationId,\n })\n\n const result = await captureTopup(\n em,\n {\n topup,\n account: {\n id: account.id,\n organizationId: account.organizationId,\n tenantId: account.tenantId,\n currencyCode: account.currencyCode,\n },\n taxRate,\n gatewayTransactionId: payload.transactionId ?? null,\n },\n )\n\n if (result.status !== 'captured') return\n\n // Side effects fire AFTER the capture transaction commits.\n await emitBillingEvent('billing.balance.topped_up', {\n billAccountId: account.id,\n tenantId: account.tenantId,\n organizationId: account.organizationId,\n topupId: topup.id,\n amount: topup.amount,\n currencyCode: account.currencyCode,\n balance: result.balanceAfter ?? null,\n transactionId: result.transactionId ?? null,\n receiptInvoiceId: result.receiptInvoiceId ?? null,\n })\n\n // Reuse the postpaid receipt path so the existing mailer / accounting bridge\n // sends the top-up VAT receipt.\n if (result.receiptInvoiceId) {\n await emitBillingEvent('billing.invoice.posted', {\n invoiceId: result.receiptInvoiceId,\n invoiceNumber: result.invoiceNumber ?? null,\n tenantId: account.tenantId,\n organizationId: account.organizationId,\n grandTotalGross: result.grossAmount ?? null,\n currencyCode: account.currencyCode,\n billAccountId: account.id,\n kind: 'prepaid_topup',\n })\n }\n}\n"],
5
+ "mappings": "AACA,SAAS,8BAA8B;AACvC,SAAS,gBAAgB,oBAAoB;AAC7C,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAezB,MAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,IAAI;AACN;AAUA,eAAO,OAA8B,SAAyC;AAC5E,MAAI,CAAC,SAAS,aAAa,CAAC,QAAQ,YAAY,CAAC,QAAQ,gBAAgB;AACvE;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,uBAAuB;AAC/C,QAAM,KAAM,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAE3D,QAAM,QAAQ,MAAM,GAAG,QAAQ,cAAc;AAAA,IAC3C,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,IAClB,gBAAgB,QAAQ;AAAA,IACxB,WAAW;AAAA,EACb,CAAC;AACD,MAAI,CAAC,OAAO;AAEV;AAAA,EACF;AACA,MAAI,MAAM,WAAW,YAAY;AAC/B;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,GAAG,QAAQ,gBAAgB;AAAA,IAC/C,IAAI,MAAM;AAAA,IACV,UAAU,QAAQ;AAAA,IAClB,gBAAgB,QAAQ;AAAA,IACxB,WAAW;AAAA,EACb,CAAC;AACD,MAAI,CAAC,SAAS;AACZ;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,gBAAgB,IAAI;AAAA,IACxC,UAAU,QAAQ;AAAA,IAClB,gBAAgB,QAAQ;AAAA,EAC1B,CAAC;AAED,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,IAAI,QAAQ;AAAA,QACZ,gBAAgB,QAAQ;AAAA,QACxB,UAAU,QAAQ;AAAA,QAClB,cAAc,QAAQ;AAAA,MACxB;AAAA,MACA;AAAA,MACA,sBAAsB,QAAQ,iBAAiB;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,WAAY;AAGlC,QAAM,iBAAiB,6BAA6B;AAAA,IAClD,eAAe,QAAQ;AAAA,IACvB,UAAU,QAAQ;AAAA,IAClB,gBAAgB,QAAQ;AAAA,IACxB,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,cAAc,QAAQ;AAAA,IACtB,SAAS,OAAO,gBAAgB;AAAA,IAChC,eAAe,OAAO,iBAAiB;AAAA,IACvC,kBAAkB,OAAO,oBAAoB;AAAA,EAC/C,CAAC;AAID,MAAI,OAAO,kBAAkB;AAC3B,UAAM,iBAAiB,0BAA0B;AAAA,MAC/C,WAAW,OAAO;AAAA,MAClB,eAAe,OAAO,iBAAiB;AAAA,MACvC,UAAU,QAAQ;AAAA,MAClB,gBAAgB,QAAQ;AAAA,MACxB,iBAAiB,OAAO,eAAe;AAAA,MACvC,cAAc,QAAQ;AAAA,MACtB,eAAe,QAAQ;AAAA,MACvB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;",
6
6
  "names": []
7
7
  }
@@ -5,6 +5,7 @@ export const id = "id"
5
5
  export const organization_id = "organization_id"
6
6
  export const tenant_id = "tenant_id"
7
7
  export const customer_id = "customer_id"
8
+ export const customer_kind = "customer_kind"
8
9
  export const name = "name"
9
10
  export const currency_code = "currency_code"
10
11
  export const bill_cycle = "bill_cycle"
@@ -17,6 +18,8 @@ export const next_bill_date = "next_bill_date"
17
18
  export const last_bill_date = "last_bill_date"
18
19
  export const billing_mode = "billing_mode"
19
20
  export const credit_limit = "credit_limit"
21
+ export const payment_terms_days = "payment_terms_days"
22
+ export const auto_send_invoice = "auto_send_invoice"
20
23
  export const is_active = "is_active"
21
24
  export const created_at = "created_at"
22
25
  export const updated_at = "updated_at"
@@ -0,0 +1,18 @@
1
+ // AUTO-GENERATED by @dainamite/billing scripts/generate-entity-registry.mjs — do not edit.
2
+ // Columns of billing:billing_allocation (BillingAllocation, table billing_allocations).
3
+
4
+ export const id = "id"
5
+ export const organization_id = "organization_id"
6
+ export const tenant_id = "tenant_id"
7
+ export const source_type = "source_type"
8
+ export const source_id = "source_id"
9
+ export const invoice_id = "invoice_id"
10
+ export const bill_account_id = "bill_account_id"
11
+ export const amount = "amount"
12
+ export const currency_code = "currency_code"
13
+ export const allocated_by = "allocated_by"
14
+ export const user_id = "user_id"
15
+ export const deallocated_by_user_id = "deallocated_by_user_id"
16
+ export const created_at = "created_at"
17
+ export const updated_at = "updated_at"
18
+ export const deleted_at = "deleted_at"
@@ -0,0 +1,11 @@
1
+ // AUTO-GENERATED by @dainamite/billing scripts/generate-entity-registry.mjs — do not edit.
2
+ // Columns of billing:billing_document_sequence (BillingDocumentSequence, table billing_document_sequences).
3
+
4
+ export const id = "id"
5
+ export const organization_id = "organization_id"
6
+ export const tenant_id = "tenant_id"
7
+ export const series = "series"
8
+ export const scope_key = "scope_key"
9
+ export const next_value = "next_value"
10
+ export const created_at = "created_at"
11
+ export const updated_at = "updated_at"
@@ -0,0 +1,38 @@
1
+ // AUTO-GENERATED by @dainamite/billing scripts/generate-entity-registry.mjs — do not edit.
2
+ // Columns of billing:billing_invoice (BillingInvoice, table billing_invoices).
3
+
4
+ export const id = "id"
5
+ export const organization_id = "organization_id"
6
+ export const tenant_id = "tenant_id"
7
+ export const bill_account_id = "bill_account_id"
8
+ export const document_type = "document_type"
9
+ export const number = "number"
10
+ export const series = "series"
11
+ export const status = "status"
12
+ export const test_run = "test_run"
13
+ export const bill_run_id = "bill_run_id"
14
+ export const bill_date = "bill_date"
15
+ export const period_start = "period_start"
16
+ export const period_end = "period_end"
17
+ export const issue_date = "issue_date"
18
+ export const due_date = "due_date"
19
+ export const currency_code = "currency_code"
20
+ export const subtotal_net = "subtotal_net"
21
+ export const tax_total = "tax_total"
22
+ export const total_gross = "total_gross"
23
+ export const paid_total = "paid_total"
24
+ export const credited_total = "credited_total"
25
+ export const outstanding = "outstanding"
26
+ export const corrects_invoice_id = "corrects_invoice_id"
27
+ export const correction_reason = "correction_reason"
28
+ export const corrects_invoice_number = "corrects_invoice_number"
29
+ export const corrects_issue_date = "corrects_issue_date"
30
+ export const buyer_snapshot = "buyer_snapshot"
31
+ export const seller_snapshot = "seller_snapshot"
32
+ export const pdf_attachment_id = "pdf_attachment_id"
33
+ export const topup_id = "topup_id"
34
+ export const posted_at = "posted_at"
35
+ export const metadata = "metadata"
36
+ export const created_at = "created_at"
37
+ export const updated_at = "updated_at"
38
+ export const deleted_at = "deleted_at"
@@ -0,0 +1,24 @@
1
+ // AUTO-GENERATED by @dainamite/billing scripts/generate-entity-registry.mjs — do not edit.
2
+ // Columns of billing:billing_invoice_line (BillingInvoiceLine, table billing_invoice_lines).
3
+
4
+ export const id = "id"
5
+ export const organization_id = "organization_id"
6
+ export const tenant_id = "tenant_id"
7
+ export const invoice_id = "invoice_id"
8
+ export const line_number = "line_number"
9
+ export const billing_item_id = "billing_item_id"
10
+ export const billing_type = "billing_type"
11
+ export const description = "description"
12
+ export const quantity = "quantity"
13
+ export const unit_price_net = "unit_price_net"
14
+ export const tax_rate = "tax_rate"
15
+ export const net_amount = "net_amount"
16
+ export const tax_amount = "tax_amount"
17
+ export const gross_amount = "gross_amount"
18
+ export const service_period_start = "service_period_start"
19
+ export const service_period_end = "service_period_end"
20
+ export const corrects_line_id = "corrects_line_id"
21
+ export const metadata = "metadata"
22
+ export const created_at = "created_at"
23
+ export const updated_at = "updated_at"
24
+ export const deleted_at = "deleted_at"
@@ -16,6 +16,10 @@ export const subscription_item_id = "subscription_item_id"
16
16
  export const source_ref = "source_ref"
17
17
  export const currency_mismatch = "currency_mismatch"
18
18
  export const billed_to_date = "billed_to_date"
19
+ export const charge_timing = "charge_timing"
20
+ export const prorate = "prorate"
21
+ export const tax_rate = "tax_rate"
22
+ export const price_basis = "price_basis"
19
23
  export const is_active = "is_active"
20
24
  export const created_at = "created_at"
21
25
  export const updated_at = "updated_at"
@@ -0,0 +1,25 @@
1
+ // AUTO-GENERATED by @dainamite/billing scripts/generate-entity-registry.mjs — do not edit.
2
+ // Columns of billing:billing_payment (BillingPayment, table billing_payments).
3
+
4
+ export const id = "id"
5
+ export const organization_id = "organization_id"
6
+ export const tenant_id = "tenant_id"
7
+ export const received_at = "received_at"
8
+ export const amount = "amount"
9
+ export const currency_code = "currency_code"
10
+ export const reference = "reference"
11
+ export const payer_name = "payer_name"
12
+ export const payer_account = "payer_account"
13
+ export const source = "source"
14
+ export const import_id = "import_id"
15
+ export const bill_account_id = "bill_account_id"
16
+ export const status = "status"
17
+ export const unallocated_amount = "unallocated_amount"
18
+ export const match_reason = "match_reason"
19
+ export const source_ref = "source_ref"
20
+ export const external_ref = "external_ref"
21
+ export const topup_id = "topup_id"
22
+ export const metadata = "metadata"
23
+ export const created_at = "created_at"
24
+ export const updated_at = "updated_at"
25
+ export const deleted_at = "deleted_at"
@@ -0,0 +1,14 @@
1
+ // AUTO-GENERATED by @dainamite/billing scripts/generate-entity-registry.mjs — do not edit.
2
+ // Columns of billing:billing_payment_import (BillingPaymentImport, table billing_payment_imports).
3
+
4
+ export const id = "id"
5
+ export const organization_id = "organization_id"
6
+ export const tenant_id = "tenant_id"
7
+ export const file_name = "file_name"
8
+ export const row_count = "row_count"
9
+ export const counts = "counts"
10
+ export const errors = "errors"
11
+ export const user_id = "user_id"
12
+ export const created_at = "created_at"
13
+ export const updated_at = "updated_at"
14
+ export const deleted_at = "deleted_at"
@@ -8,7 +8,6 @@ export const triggered_by = "triggered_by"
8
8
  export const parent_run_id = "parent_run_id"
9
9
  export const dry_run = "dry_run"
10
10
  export const test_mode = "test_mode"
11
- export const catch_up = "catch_up"
12
11
  export const scoped_account_ids = "scoped_account_ids"
13
12
  export const as_of_date = "as_of_date"
14
13
  export const started_at = "started_at"
@@ -11,6 +11,7 @@ export const error_message = "error_message"
11
11
  export const warnings = "warnings"
12
12
  export const draft_invoice_id = "draft_invoice_id"
13
13
  export const statement_id = "statement_id"
14
+ export const cycles = "cycles"
14
15
  export const is_active = "is_active"
15
16
  export const created_at = "created_at"
16
17
  export const updated_at = "updated_at"
@@ -0,0 +1,26 @@
1
+ // AUTO-GENERATED by @dainamite/billing scripts/generate-entity-registry.mjs — do not edit.
2
+ // Columns of billing:billing_settings (BillingSettings, table billing_settings).
3
+
4
+ export const id = "id"
5
+ export const organization_id = "organization_id"
6
+ export const tenant_id = "tenant_id"
7
+ export const low_balance_threshold_default = "low_balance_threshold_default"
8
+ export const near_limit_buffer_default = "near_limit_buffer_default"
9
+ export const statement_enabled = "statement_enabled"
10
+ export const topup_tax_rate = "topup_tax_rate"
11
+ export const prepaid_tax_point = "prepaid_tax_point"
12
+ export const topup_provider = "topup_provider"
13
+ export const number_masks = "number_masks"
14
+ export const legal_name = "legal_name"
15
+ export const seller_address = "seller_address"
16
+ export const tax_id = "tax_id"
17
+ export const bank_name = "bank_name"
18
+ export const iban = "iban"
19
+ export const bic = "bic"
20
+ export const invoice_footer = "invoice_footer"
21
+ export const logo_attachment_id = "logo_attachment_id"
22
+ export const default_payment_terms_days = "default_payment_terms_days"
23
+ export const default_tax_rate = "default_tax_rate"
24
+ export const created_at = "created_at"
25
+ export const updated_at = "updated_at"
26
+ export const deleted_at = "deleted_at"
@@ -16,6 +16,7 @@ export const total_recurring = "total_recurring"
16
16
  export const total_adjustments = "total_adjustments"
17
17
  export const closing_balance = "closing_balance"
18
18
  export const debit_breakdown = "debit_breakdown"
19
+ export const vat_summary = "vat_summary"
19
20
  export const status = "status"
20
21
  export const created_at = "created_at"
21
22
  export const updated_at = "updated_at"
@@ -21,6 +21,13 @@ export const E = {
21
21
  billing_account_transaction: 'billing:billing_account_transaction',
22
22
  billing_topup: 'billing:billing_topup',
23
23
  billing_statement: 'billing:billing_statement',
24
+ billing_invoice: 'billing:billing_invoice',
25
+ billing_invoice_line: 'billing:billing_invoice_line',
26
+ billing_document_sequence: 'billing:billing_document_sequence',
27
+ billing_settings: 'billing:billing_settings',
28
+ billing_payment: 'billing:billing_payment',
29
+ billing_allocation: 'billing:billing_allocation',
30
+ billing_payment_import: 'billing:billing_payment_import',
24
31
  },
25
32
  } as const
26
33
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dainamite/billing",
3
- "version": "0.20.0",
3
+ "version": "0.22.0",
4
4
  "description": "Dainamite Billing — lightweight recurring-billing engine for Open Mercato (Bill Runs, one-time / recurring / usage items, draft invoices in core/sales with human approval).",
5
5
  "type": "module",
6
6
  "main": "./dist/modules/billing/index.js",
@@ -145,5 +145,9 @@
145
145
  "license": "MIT",
146
146
  "engines": {
147
147
  "node": ">=24.0.0"
148
+ },
149
+ "dependencies": {
150
+ "@pdf-lib/fontkit": "^1.1.1",
151
+ "pdf-lib": "^1.17.1"
148
152
  }
149
153
  }
@@ -0,0 +1,171 @@
1
+ import { test, expect, type APIRequestContext } from '@playwright/test'
2
+ import { getAuthToken, apiRequest } from '@open-mercato/core/helpers/integration/api'
3
+ import { login } from '@open-mercato/core/helpers/integration/auth'
4
+ import {
5
+ createPersonFixture,
6
+ deleteEntityIfExists,
7
+ } from '@open-mercato/core/helpers/integration/crmFixtures'
8
+
9
+ /**
10
+ * TC-BILL-004: B2C billing accounts, invoice-language picklist, return-to-account navigation
11
+ * Category: BILL — API + UI
12
+ * Priority: High
13
+ * Spec: .ai/specs/2026-11-14-billing-account-workspace.md (Phase 1, D21–D23)
14
+ *
15
+ * Self-contained: creates its own person, account and item; removes them
16
+ * in teardown. Avoids `GET /api/billing/accounts?id=` (known CI flake, see
17
+ * TC-BILL-001) — reads back through the `customerKind` + `search` filters.
18
+ */
19
+
20
+ const uniq = () => Date.now().toString(36) + Math.random().toString(36).slice(2, 6)
21
+
22
+ function accountPayload(overrides: Record<string, unknown> = {}) {
23
+ return {
24
+ customerId: `cust-${uniq()}`,
25
+ name: `B2C Account ${uniq()}`,
26
+ currencyCode: 'PLN',
27
+ billCycle: 'monthly',
28
+ billCycleAnchor: '1',
29
+ invoiceEmail: `inv-${uniq()}@example.com`,
30
+ invoiceLanguage: 'pl',
31
+ nextBillDate: '2026-12-01',
32
+ invoiceAddress: { line1: 'ul. Testowa 1', city: 'Warszawa', postal_code: '00-001', country: 'PL' },
33
+ ...overrides,
34
+ }
35
+ }
36
+
37
+ async function createAccount(
38
+ request: APIRequestContext,
39
+ token: string,
40
+ data: Record<string, unknown>,
41
+ ): Promise<string> {
42
+ const res = await apiRequest(request, 'POST', '/api/billing/accounts', { token, data })
43
+ expect(res.ok(), `POST /api/billing/accounts status was ${res.status()}`).toBeTruthy()
44
+ const body = (await res.json()) as { id?: string }
45
+ expect(body.id).toBeTruthy()
46
+ return body.id as string
47
+ }
48
+
49
+ async function createItem(request: APIRequestContext, token: string, billAccountId: string): Promise<string> {
50
+ const res = await apiRequest(request, 'POST', '/api/billing/items', {
51
+ token,
52
+ data: {
53
+ billAccountId,
54
+ type: 'recurring',
55
+ billStartDate: '2026-12-01',
56
+ description: `Internet 300 ${uniq()}`,
57
+ rateJson: { unit_price: 79 },
58
+ },
59
+ })
60
+ expect(res.ok(), `POST /api/billing/items status was ${res.status()}`).toBeTruthy()
61
+ return ((await res.json()) as { id: string }).id
62
+ }
63
+
64
+ test.describe('TC-BILL-004: B2C accounts + navigation', () => {
65
+ let token: string
66
+ const accountIds: string[] = []
67
+ const itemIds: string[] = []
68
+ const personIds: string[] = []
69
+
70
+ test.beforeAll(async ({ request }) => {
71
+ token = await getAuthToken(request, 'admin')
72
+ })
73
+
74
+ test.afterEach(async ({ request }) => {
75
+ while (itemIds.length) {
76
+ await apiRequest(request, 'DELETE', '/api/billing/items', { token, data: { id: itemIds.pop() } })
77
+ }
78
+ while (accountIds.length) {
79
+ await apiRequest(request, 'DELETE', '/api/billing/accounts', { token, data: { id: accountIds.pop() } })
80
+ }
81
+ while (personIds.length) {
82
+ await deleteEntityIfExists(request, token, '/api/customers/people', personIds.pop() ?? null)
83
+ }
84
+ })
85
+
86
+ test('creates a person (B2C) account and filters by customer kind', async ({ request }) => {
87
+ const suffix = uniq()
88
+ const personId = await createPersonFixture(request, token, {
89
+ firstName: 'Jan',
90
+ lastName: `Kowalski ${suffix}`,
91
+ displayName: `Jan Kowalski ${suffix}`,
92
+ primaryEmail: `jan-${suffix}@example.com`,
93
+ })
94
+ personIds.push(personId)
95
+ const name = `B2C ${suffix}`
96
+ accountIds.push(
97
+ await createAccount(request, token, accountPayload({ customerId: personId, customerKind: 'person', name })),
98
+ )
99
+
100
+ const persons = await apiRequest(
101
+ request,
102
+ 'GET',
103
+ `/api/billing/accounts?customerKind=person&search=${encodeURIComponent(name)}`,
104
+ { token },
105
+ )
106
+ const personRows = ((await persons.json()) as { items: Array<{ name: string; customer_kind: string }> }).items
107
+ expect(personRows.find((row) => row.name === name)?.customer_kind).toBe('person')
108
+
109
+ const companies = await apiRequest(
110
+ request,
111
+ 'GET',
112
+ `/api/billing/accounts?customerKind=company&search=${encodeURIComponent(name)}`,
113
+ { token },
114
+ )
115
+ const companyRows = ((await companies.json()) as { items: Array<{ name: string }> }).items
116
+ expect(companyRows.some((row) => row.name === name)).toBe(false)
117
+ })
118
+
119
+ test('defaults customer kind to company', async ({ request }) => {
120
+ const name = `Company ${uniq()}`
121
+ accountIds.push(await createAccount(request, token, accountPayload({ name })))
122
+ const res = await apiRequest(
123
+ request,
124
+ 'GET',
125
+ `/api/billing/accounts?customerKind=company&search=${encodeURIComponent(name)}`,
126
+ { token },
127
+ )
128
+ const rows = ((await res.json()) as { items: Array<{ name: string; customer_kind: string }> }).items
129
+ expect(rows.find((row) => row.name === name)?.customer_kind).toBe('company')
130
+ })
131
+
132
+ test('rejects an invoice language the template does not support', async ({ request }) => {
133
+ const res = await apiRequest(request, 'POST', '/api/billing/accounts', {
134
+ token,
135
+ // `fr` has no document template (spec 2026-11-15-billing-multi-language).
136
+ data: accountPayload({ invoiceLanguage: 'fr' }),
137
+ })
138
+ expect(res.status()).toBe(400)
139
+ })
140
+
141
+ test('item pages return to the owning account; from the items list they return to the list', async ({
142
+ page,
143
+ request,
144
+ }) => {
145
+ const accountId = await createAccount(request, token, accountPayload())
146
+ accountIds.push(accountId)
147
+ const itemId = await createItem(request, token, accountId)
148
+ itemIds.push(itemId)
149
+
150
+ await login(page, 'admin')
151
+
152
+ // FormHeader's back link is the anchor rendering the "←" glyph. (The
153
+ // detail body also links to the account, so match the header link only.)
154
+ const backLink = page.locator('a', { hasText: '←' }).first()
155
+
156
+ // Opened in account context → back goes to the account's Items tab (Spec F, F8).
157
+ await page.goto(`/backend/billing/items/${itemId}`, { waitUntil: 'domcontentloaded' })
158
+ await expect(backLink).toHaveAttribute('href', `/backend/billing/accounts/${accountId}?tab=items`)
159
+
160
+ // Opened from the global Items list → back goes to the list.
161
+ await page.goto(`/backend/billing/items/${itemId}?from=items`, { waitUntil: 'domcontentloaded' })
162
+ await expect(backLink).toHaveAttribute('href', '/backend/billing/items')
163
+
164
+ // "Add item" from an account → Cancel returns to that account's Items tab.
165
+ await page.goto(`/backend/billing/items/create?billAccountId=${accountId}`, {
166
+ waitUntil: 'domcontentloaded',
167
+ })
168
+ await page.getByRole('button', { name: /cancel/i }).first().click()
169
+ await expect(page).toHaveURL(new RegExp(`/backend/billing/accounts/${accountId}\\?tab=items$`))
170
+ })
171
+ })
@@ -0,0 +1,134 @@
1
+ import { test, expect, type APIRequestContext } from '@playwright/test'
2
+ import { getAuthToken, apiRequest } from '@open-mercato/core/helpers/integration/api'
3
+
4
+ /**
5
+ * TC-BILL-005: Bill Run catches up on every due cycle (Spec A)
6
+ * Category: BILL — API
7
+ * Priority: High
8
+ * Spec: .ai/specs/2026-11-14-billing-cycle-semantics.md
9
+ *
10
+ * An account whose next bill date lies three cycles before the as-of date,
11
+ * with one monthly in-advance item:
12
+ * - a dry run previews 3 cycles and writes no invoice;
13
+ * - a test run writes 3 TEST drafts (one per bill date), each covering its
14
+ * own month, and leaves the account untouched;
15
+ * - a legacy `catchUp` flag in the body is accepted and ignored.
16
+ * Self-contained: creates its own account + item, wipes its test drafts.
17
+ * Scoped with `scopedAccountIds` so other tenant data can't interfere.
18
+ */
19
+
20
+ const uniq = () => Date.now().toString(36) + Math.random().toString(36).slice(2, 6)
21
+
22
+ type Cycle = { bill_date: string; period_start: string | null; period_end: string | null; status: string; invoice_id: string | null }
23
+
24
+ async function createAccountWithItem(request: APIRequestContext, token: string): Promise<string> {
25
+ const account = await apiRequest(request, 'POST', '/api/billing/accounts', {
26
+ token,
27
+ data: {
28
+ customerId: `cust-${uniq()}`,
29
+ name: `Catch-up ${uniq()}`,
30
+ currencyCode: 'PLN',
31
+ billCycle: 'monthly',
32
+ billCycleAnchor: '1',
33
+ invoiceEmail: `inv-${uniq()}@example.com`,
34
+ invoiceLanguage: 'en',
35
+ nextBillDate: '2026-08-01',
36
+ invoiceAddress: { line1: 'ul. Testowa 1', city: 'Warszawa', postal_code: '00-001', country: 'PL' },
37
+ },
38
+ })
39
+ expect(account.ok(), `POST account status was ${account.status()}`).toBeTruthy()
40
+ const accountId = ((await account.json()) as { id: string }).id
41
+
42
+ const item = await apiRequest(request, 'POST', '/api/billing/items', {
43
+ token,
44
+ data: {
45
+ billAccountId: accountId,
46
+ type: 'recurring',
47
+ billStartDate: '2026-08-01',
48
+ description: 'Internet 300',
49
+ rateJson: { unit_price: 100 },
50
+ chargeTiming: 'in_advance',
51
+ },
52
+ })
53
+ expect(item.ok(), `POST item status was ${item.status()}`).toBeTruthy()
54
+ return accountId
55
+ }
56
+
57
+ async function runCycles(
58
+ request: APIRequestContext,
59
+ token: string,
60
+ accountId: string,
61
+ mode: 'dry' | 'test',
62
+ ): Promise<{ billRunId: string; cycles: Cycle[] }> {
63
+ const run = await apiRequest(request, 'POST', '/api/billing/runs', {
64
+ token,
65
+ data: { mode, asOfDate: '2026-10-15', scopedAccountIds: [accountId], catchUp: true },
66
+ })
67
+ expect(run.ok(), `POST run (${mode}) status was ${run.status()}`).toBeTruthy()
68
+ const { billRunId } = (await run.json()) as { billRunId: string }
69
+
70
+ const outcomes = await apiRequest(request, 'GET', `/api/billing/run-outcomes?billRunId=${billRunId}`, { token })
71
+ const body = (await outcomes.json()) as { items: Array<{ bill_account_id: string; cycles: Cycle[] | null }> }
72
+ const outcome = body.items.find((row) => row.bill_account_id === accountId)
73
+ expect(outcome, 'outcome for the scoped account').toBeTruthy()
74
+ return { billRunId, cycles: outcome?.cycles ?? [] }
75
+ }
76
+
77
+ test.describe('TC-BILL-005: Bill Run catch-up (Spec A)', () => {
78
+ let token: string
79
+ let accountId: string | null = null
80
+ const testRunIds: string[] = []
81
+
82
+ test.beforeAll(async ({ request }) => {
83
+ token = await getAuthToken(request, 'admin')
84
+ })
85
+
86
+ test.afterEach(async ({ request }) => {
87
+ while (testRunIds.length) {
88
+ await apiRequest(request, 'POST', '/api/billing/test-invoices/wipe', {
89
+ token,
90
+ data: { billRunId: testRunIds.pop() },
91
+ })
92
+ }
93
+ if (accountId) {
94
+ await apiRequest(request, 'DELETE', '/api/billing/accounts', { token, data: { id: accountId } })
95
+ accountId = null
96
+ }
97
+ })
98
+
99
+ test('dry run previews every due cycle without writing invoices', async ({ request }) => {
100
+ accountId = await createAccountWithItem(request, token)
101
+ const { cycles } = await runCycles(request, token, accountId, 'dry')
102
+ expect(cycles.map((c) => [c.bill_date, c.status, c.invoice_id])).toEqual([
103
+ ['2026-08-01', 'previewed', null],
104
+ ['2026-09-01', 'previewed', null],
105
+ ['2026-10-01', 'previewed', null],
106
+ ])
107
+ })
108
+
109
+ test('test run writes one TEST draft per bill date, each for its own month', async ({ request }) => {
110
+ accountId = await createAccountWithItem(request, token)
111
+ const { billRunId, cycles } = await runCycles(request, token, accountId, 'test')
112
+ testRunIds.push(billRunId)
113
+
114
+ expect(cycles.map((c) => [c.bill_date, c.period_start, c.period_end, c.status])).toEqual([
115
+ ['2026-08-01', '2026-08-01', '2026-08-31', 'invoiced'],
116
+ ['2026-09-01', '2026-09-01', '2026-09-30', 'invoiced'],
117
+ ['2026-10-01', '2026-10-01', '2026-10-31', 'invoiced'],
118
+ ])
119
+ expect(new Set(cycles.map((c) => c.invoice_id)).size).toBe(3)
120
+
121
+ const invoices = await apiRequest(
122
+ request,
123
+ 'GET',
124
+ `/api/billing/invoices?billAccountId=${accountId}&testRun=true`,
125
+ { token },
126
+ )
127
+ const invoiceRows = ((await invoices.json()) as { items: unknown[] }).items
128
+ expect(invoiceRows).toHaveLength(3)
129
+
130
+ // Test mode never advances the account: a second dry run still sees 3 cycles.
131
+ const again = await runCycles(request, token, accountId, 'dry')
132
+ expect(again.cycles).toHaveLength(3)
133
+ })
134
+ })