@dainamite/billing 0.19.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (614) hide show
  1. package/CHANGELOG.md +172 -0
  2. package/README.md +14 -0
  3. package/dist/modules/billing/acl.js +13 -1
  4. package/dist/modules/billing/acl.js.map +2 -2
  5. package/dist/modules/billing/api/accounts/[id]/summary/route.js +52 -0
  6. package/dist/modules/billing/api/accounts/[id]/summary/route.js.map +7 -0
  7. package/dist/modules/billing/api/accounts/route.js +46 -4
  8. package/dist/modules/billing/api/accounts/route.js.map +2 -2
  9. package/dist/modules/billing/api/export/account/[id]/route.js +16 -12
  10. package/dist/modules/billing/api/export/account/[id]/route.js.map +2 -2
  11. package/dist/modules/billing/api/invoices/[id]/memos/route.js +54 -0
  12. package/dist/modules/billing/api/invoices/[id]/memos/route.js.map +7 -0
  13. package/dist/modules/billing/api/invoices/[id]/pdf/route.js +69 -0
  14. package/dist/modules/billing/api/invoices/[id]/pdf/route.js.map +7 -0
  15. package/dist/modules/billing/api/invoices/[id]/route.js +44 -24
  16. package/dist/modules/billing/api/invoices/[id]/route.js.map +2 -2
  17. package/dist/modules/billing/api/invoices/[id]/send/route.js +107 -0
  18. package/dist/modules/billing/api/invoices/[id]/send/route.js.map +7 -0
  19. package/dist/modules/billing/api/invoices/add-line/route.js +3 -3
  20. package/dist/modules/billing/api/invoices/add-line/route.js.map +2 -2
  21. package/dist/modules/billing/api/invoices/delete-draft/route.js +33 -0
  22. package/dist/modules/billing/api/invoices/delete-draft/route.js.map +7 -0
  23. package/dist/modules/billing/api/invoices/edit-line/route.js +3 -3
  24. package/dist/modules/billing/api/invoices/edit-line/route.js.map +2 -2
  25. package/dist/modules/billing/api/invoices/post/route.js +2 -2
  26. package/dist/modules/billing/api/invoices/post/route.js.map +2 -2
  27. package/dist/modules/billing/api/invoices/remove-line/route.js +3 -3
  28. package/dist/modules/billing/api/invoices/remove-line/route.js.map +2 -2
  29. package/dist/modules/billing/api/invoices/route.js +45 -46
  30. package/dist/modules/billing/api/invoices/route.js.map +2 -2
  31. package/dist/modules/billing/api/items/bulk/route.js +1 -1
  32. package/dist/modules/billing/api/items/bulk/route.js.map +2 -2
  33. package/dist/modules/billing/api/items/change-price/route.js +44 -0
  34. package/dist/modules/billing/api/items/change-price/route.js.map +7 -0
  35. package/dist/modules/billing/api/items/route.js +19 -7
  36. package/dist/modules/billing/api/items/route.js.map +2 -2
  37. package/dist/modules/billing/api/payment-imports/[id]/route.js +49 -0
  38. package/dist/modules/billing/api/payment-imports/[id]/route.js.map +7 -0
  39. package/dist/modules/billing/api/payment-imports/route.js +57 -0
  40. package/dist/modules/billing/api/payment-imports/route.js.map +7 -0
  41. package/dist/modules/billing/api/payments/[id]/route.js +60 -0
  42. package/dist/modules/billing/api/payments/[id]/route.js.map +7 -0
  43. package/dist/modules/billing/api/payments/allocate/route.js +35 -0
  44. package/dist/modules/billing/api/payments/allocate/route.js.map +7 -0
  45. package/dist/modules/billing/api/payments/assign/route.js +36 -0
  46. package/dist/modules/billing/api/payments/assign/route.js.map +7 -0
  47. package/dist/modules/billing/api/payments/convert-to-topup/route.js +35 -0
  48. package/dist/modules/billing/api/payments/convert-to-topup/route.js.map +7 -0
  49. package/dist/modules/billing/api/payments/ignore/route.js +35 -0
  50. package/dist/modules/billing/api/payments/ignore/route.js.map +7 -0
  51. package/dist/modules/billing/api/payments/import/route.js +63 -0
  52. package/dist/modules/billing/api/payments/import/route.js.map +7 -0
  53. package/dist/modules/billing/api/payments/restore/route.js +35 -0
  54. package/dist/modules/billing/api/payments/restore/route.js.map +7 -0
  55. package/dist/modules/billing/api/payments/route.js +114 -0
  56. package/dist/modules/billing/api/payments/route.js.map +7 -0
  57. package/dist/modules/billing/api/payments/unallocate/route.js +35 -0
  58. package/dist/modules/billing/api/payments/unallocate/route.js.map +7 -0
  59. package/dist/modules/billing/api/payments/unassign/route.js +35 -0
  60. package/dist/modules/billing/api/payments/unassign/route.js.map +7 -0
  61. package/dist/modules/billing/api/run-outcomes/route.js +44 -7
  62. package/dist/modules/billing/api/run-outcomes/route.js.map +2 -2
  63. package/dist/modules/billing/api/runs/[id]/post-drafts/route.js +61 -0
  64. package/dist/modules/billing/api/runs/[id]/post-drafts/route.js.map +7 -0
  65. package/dist/modules/billing/api/runs/[id]/route.js +53 -0
  66. package/dist/modules/billing/api/runs/[id]/route.js.map +7 -0
  67. package/dist/modules/billing/api/runs/retry-failed/route.js +3 -3
  68. package/dist/modules/billing/api/runs/retry-failed/route.js.map +2 -2
  69. package/dist/modules/billing/api/runs/route.js +11 -5
  70. package/dist/modules/billing/api/runs/route.js.map +2 -2
  71. package/dist/modules/billing/api/settings/number-preview/route.js +42 -0
  72. package/dist/modules/billing/api/settings/number-preview/route.js.map +7 -0
  73. package/dist/modules/billing/api/settings/route.js +92 -0
  74. package/dist/modules/billing/api/settings/route.js.map +7 -0
  75. package/dist/modules/billing/api/statements/route.js +3 -0
  76. package/dist/modules/billing/api/statements/route.js.map +2 -2
  77. package/dist/modules/billing/api/test-invoices/wipe/route.js +2 -2
  78. package/dist/modules/billing/api/test-invoices/wipe/route.js.map +2 -2
  79. package/dist/modules/billing/backend/billing/accounts/[id]/page.js +121 -232
  80. package/dist/modules/billing/backend/billing/accounts/[id]/page.js.map +2 -2
  81. package/dist/modules/billing/backend/billing/accounts/create/page.js +6 -0
  82. package/dist/modules/billing/backend/billing/accounts/create/page.js.map +2 -2
  83. package/dist/modules/billing/backend/billing/accounts/page.js +63 -4
  84. package/dist/modules/billing/backend/billing/accounts/page.js.map +2 -2
  85. package/dist/modules/billing/backend/billing/invoices/[id]/page.js +297 -65
  86. package/dist/modules/billing/backend/billing/invoices/[id]/page.js.map +3 -3
  87. package/dist/modules/billing/backend/billing/invoices/page.js +6 -172
  88. package/dist/modules/billing/backend/billing/invoices/page.js.map +2 -2
  89. package/dist/modules/billing/backend/billing/items/[id]/page.js +51 -7
  90. package/dist/modules/billing/backend/billing/items/[id]/page.js.map +2 -2
  91. package/dist/modules/billing/backend/billing/items/create/page.js +9 -6
  92. package/dist/modules/billing/backend/billing/items/create/page.js.map +2 -2
  93. package/dist/modules/billing/backend/billing/items/page.js +8 -2
  94. package/dist/modules/billing/backend/billing/items/page.js.map +2 -2
  95. package/dist/modules/billing/backend/billing/payments/[id]/page.js +297 -0
  96. package/dist/modules/billing/backend/billing/payments/[id]/page.js.map +7 -0
  97. package/dist/modules/billing/backend/billing/payments/[id]/page.meta.js +21 -0
  98. package/dist/modules/billing/backend/billing/payments/[id]/page.meta.js.map +7 -0
  99. package/dist/modules/billing/backend/billing/payments/imports/[id]/page.js +74 -0
  100. package/dist/modules/billing/backend/billing/payments/imports/[id]/page.js.map +7 -0
  101. package/dist/modules/billing/backend/billing/payments/imports/[id]/page.meta.js +21 -0
  102. package/dist/modules/billing/backend/billing/payments/imports/[id]/page.meta.js.map +7 -0
  103. package/dist/modules/billing/backend/billing/payments/page.js +58 -0
  104. package/dist/modules/billing/backend/billing/payments/page.js.map +7 -0
  105. package/dist/modules/billing/backend/billing/payments/page.meta.js +18 -0
  106. package/dist/modules/billing/backend/billing/payments/page.meta.js.map +7 -0
  107. package/dist/modules/billing/backend/billing/runs/[id]/page.js +49 -14
  108. package/dist/modules/billing/backend/billing/runs/[id]/page.js.map +2 -2
  109. package/dist/modules/billing/backend/billing/runs/page.js +58 -7
  110. package/dist/modules/billing/backend/billing/runs/page.js.map +2 -2
  111. package/dist/modules/billing/backend/billing/statements/[id]/page.js +61 -6
  112. package/dist/modules/billing/backend/billing/statements/[id]/page.js.map +2 -2
  113. package/dist/modules/billing/backend/billing/statements/page.js +1 -1
  114. package/dist/modules/billing/backend/billing/statements/page.js.map +2 -2
  115. package/dist/modules/billing/backend/billing/topups/page.js +1 -1
  116. package/dist/modules/billing/backend/billing/topups/page.js.map +2 -2
  117. package/dist/modules/billing/backend/billing/transactions/page.js +1 -1
  118. package/dist/modules/billing/backend/billing/transactions/page.js.map +2 -2
  119. package/dist/modules/billing/backend/billing/usage/create/page.js +3 -2
  120. package/dist/modules/billing/backend/billing/usage/create/page.js.map +2 -2
  121. package/dist/modules/billing/backend/config/billing/page.js +472 -0
  122. package/dist/modules/billing/backend/config/billing/page.js.map +7 -0
  123. package/dist/modules/billing/backend/config/billing/page.meta.js +19 -0
  124. package/dist/modules/billing/backend/config/billing/page.meta.js.map +7 -0
  125. package/dist/modules/billing/ce.js.map +2 -2
  126. package/dist/modules/billing/cli.js +22 -1
  127. package/dist/modules/billing/cli.js.map +2 -2
  128. package/dist/modules/billing/commands/accounts.js +6 -0
  129. package/dist/modules/billing/commands/accounts.js.map +2 -2
  130. package/dist/modules/billing/commands/index.js +3 -0
  131. package/dist/modules/billing/commands/index.js.map +2 -2
  132. package/dist/modules/billing/commands/invoices.js +272 -170
  133. package/dist/modules/billing/commands/invoices.js.map +2 -2
  134. package/dist/modules/billing/commands/items.js +108 -0
  135. package/dist/modules/billing/commands/items.js.map +2 -2
  136. package/dist/modules/billing/commands/memos.js +179 -0
  137. package/dist/modules/billing/commands/memos.js.map +7 -0
  138. package/dist/modules/billing/commands/payments.js +379 -0
  139. package/dist/modules/billing/commands/payments.js.map +7 -0
  140. package/dist/modules/billing/commands/runs.js +154 -7
  141. package/dist/modules/billing/commands/runs.js.map +2 -2
  142. package/dist/modules/billing/commands/settings.js +59 -0
  143. package/dist/modules/billing/commands/settings.js.map +7 -0
  144. package/dist/modules/billing/commands/topups.js +9 -2
  145. package/dist/modules/billing/commands/topups.js.map +2 -2
  146. package/dist/modules/billing/commands/transactions.js +2 -2
  147. package/dist/modules/billing/commands/transactions.js.map +2 -2
  148. package/dist/modules/billing/components/AccountForm.js +149 -42
  149. package/dist/modules/billing/components/AccountForm.js.map +2 -2
  150. package/dist/modules/billing/components/AccountInvoicesSection.js +64 -0
  151. package/dist/modules/billing/components/AccountInvoicesSection.js.map +7 -0
  152. package/dist/modules/billing/components/AccountPaymentsSection.js +43 -0
  153. package/dist/modules/billing/components/AccountPaymentsSection.js.map +7 -0
  154. package/dist/modules/billing/components/AccountPicker.js +56 -0
  155. package/dist/modules/billing/components/AccountPicker.js.map +7 -0
  156. package/dist/modules/billing/components/AllocatePaymentDialog.js +134 -0
  157. package/dist/modules/billing/components/AllocatePaymentDialog.js.map +7 -0
  158. package/dist/modules/billing/components/BillingDataTable.js +21 -0
  159. package/dist/modules/billing/components/BillingDataTable.js.map +7 -0
  160. package/dist/modules/billing/components/BillingSettingsLink.js +19 -0
  161. package/dist/modules/billing/components/BillingSettingsLink.js.map +7 -0
  162. package/dist/modules/billing/components/ChangeItemPriceDialog.js +158 -0
  163. package/dist/modules/billing/components/ChangeItemPriceDialog.js.map +7 -0
  164. package/dist/modules/billing/components/CreateMemoDialog.js +200 -0
  165. package/dist/modules/billing/components/CreateMemoDialog.js.map +7 -0
  166. package/dist/modules/billing/components/CustomerLabel.js +33 -0
  167. package/dist/modules/billing/components/CustomerLabel.js.map +7 -0
  168. package/dist/modules/billing/components/InvoicesTable.js +270 -0
  169. package/dist/modules/billing/components/InvoicesTable.js.map +7 -0
  170. package/dist/modules/billing/components/ItemForm.js +176 -44
  171. package/dist/modules/billing/components/ItemForm.js.map +2 -2
  172. package/dist/modules/billing/components/ItemPriceField.js +46 -0
  173. package/dist/modules/billing/components/ItemPriceField.js.map +7 -0
  174. package/dist/modules/billing/components/LineFormDialog.js +25 -2
  175. package/dist/modules/billing/components/LineFormDialog.js.map +2 -2
  176. package/dist/modules/billing/components/ManualPaymentDialog.js +122 -0
  177. package/dist/modules/billing/components/ManualPaymentDialog.js.map +7 -0
  178. package/dist/modules/billing/components/MoneyInput.js +14 -0
  179. package/dist/modules/billing/components/MoneyInput.js.map +7 -0
  180. package/dist/modules/billing/components/PaymentUploadDialog.js +115 -0
  181. package/dist/modules/billing/components/PaymentUploadDialog.js.map +7 -0
  182. package/dist/modules/billing/components/PaymentsTable.js +171 -0
  183. package/dist/modules/billing/components/PaymentsTable.js.map +7 -0
  184. package/dist/modules/billing/components/PostRunDraftsButton.js +105 -0
  185. package/dist/modules/billing/components/PostRunDraftsButton.js.map +7 -0
  186. package/dist/modules/billing/components/PrepaidPanel.js +14 -4
  187. package/dist/modules/billing/components/PrepaidPanel.js.map +2 -2
  188. package/dist/modules/billing/components/RunCyclesSection.js +209 -0
  189. package/dist/modules/billing/components/RunCyclesSection.js.map +7 -0
  190. package/dist/modules/billing/components/TestRunActions.js +127 -0
  191. package/dist/modules/billing/components/TestRunActions.js.map +7 -0
  192. package/dist/modules/billing/components/account/AccountItemsTab.js +157 -0
  193. package/dist/modules/billing/components/account/AccountItemsTab.js.map +7 -0
  194. package/dist/modules/billing/components/account/AccountRunBillingDialog.js +122 -0
  195. package/dist/modules/billing/components/account/AccountRunBillingDialog.js.map +7 -0
  196. package/dist/modules/billing/components/account/AccountRunsTab.js +152 -0
  197. package/dist/modules/billing/components/account/AccountRunsTab.js.map +7 -0
  198. package/dist/modules/billing/components/account/AccountStatementsTab.js +98 -0
  199. package/dist/modules/billing/components/account/AccountStatementsTab.js.map +7 -0
  200. package/dist/modules/billing/components/account/AccountSummaryCards.js +125 -0
  201. package/dist/modules/billing/components/account/AccountSummaryCards.js.map +7 -0
  202. package/dist/modules/billing/components/account/AccountUsageTab.js +91 -0
  203. package/dist/modules/billing/components/account/AccountUsageTab.js.map +7 -0
  204. package/dist/modules/billing/components/account/AccountView.js +73 -0
  205. package/dist/modules/billing/components/account/AccountView.js.map +7 -0
  206. package/dist/modules/billing/components/account/accountRow.js +39 -0
  207. package/dist/modules/billing/components/account/accountRow.js.map +7 -0
  208. package/dist/modules/billing/components/customerNames.js +42 -0
  209. package/dist/modules/billing/components/customerNames.js.map +7 -0
  210. package/dist/modules/billing/data/entities.js +615 -59
  211. package/dist/modules/billing/data/entities.js.map +2 -2
  212. package/dist/modules/billing/data/entityIds.js +10 -1
  213. package/dist/modules/billing/data/entityIds.js.map +2 -2
  214. package/dist/modules/billing/data/validators.js +269 -15
  215. package/dist/modules/billing/data/validators.js.map +2 -2
  216. package/dist/modules/billing/events.js +70 -0
  217. package/dist/modules/billing/events.js.map +2 -2
  218. package/dist/modules/billing/i18n/en.json +457 -21
  219. package/dist/modules/billing/i18n/pl.json +457 -21
  220. package/dist/modules/billing/index.js +6 -2
  221. package/dist/modules/billing/index.js.map +2 -2
  222. package/dist/modules/billing/lib/accountFinancials.js +58 -0
  223. package/dist/modules/billing/lib/accountFinancials.js.map +7 -0
  224. package/dist/modules/billing/lib/accountLock.js +14 -0
  225. package/dist/modules/billing/lib/accountLock.js.map +7 -0
  226. package/dist/modules/billing/lib/accountStatus.js +9 -7
  227. package/dist/modules/billing/lib/accountStatus.js.map +2 -2
  228. package/dist/modules/billing/lib/accountSummary.js +106 -0
  229. package/dist/modules/billing/lib/accountSummary.js.map +7 -0
  230. package/dist/modules/billing/lib/allocation.js +356 -0
  231. package/dist/modules/billing/lib/allocation.js.map +7 -0
  232. package/dist/modules/billing/lib/allocationEvents.js +22 -0
  233. package/dist/modules/billing/lib/allocationEvents.js.map +7 -0
  234. package/dist/modules/billing/lib/billPeriod.js +15 -1
  235. package/dist/modules/billing/lib/billPeriod.js.map +2 -2
  236. package/dist/modules/billing/lib/billRunEngine.js +241 -106
  237. package/dist/modules/billing/lib/billRunEngine.js.map +2 -2
  238. package/dist/modules/billing/lib/billRunLabel.js.map +1 -1
  239. package/dist/modules/billing/lib/billingSettings.js +116 -0
  240. package/dist/modules/billing/lib/billingSettings.js.map +7 -0
  241. package/dist/modules/billing/lib/commandRoute.js +81 -0
  242. package/dist/modules/billing/lib/commandRoute.js.map +7 -0
  243. package/dist/modules/billing/lib/customerLookup.js +97 -0
  244. package/dist/modules/billing/lib/customerLookup.js.map +7 -0
  245. package/dist/modules/billing/lib/dateOnly.js +13 -0
  246. package/dist/modules/billing/lib/dateOnly.js.map +7 -0
  247. package/dist/modules/billing/lib/documentParties.js +16 -0
  248. package/dist/modules/billing/lib/documentParties.js.map +7 -0
  249. package/dist/modules/billing/lib/documentTypes.js +27 -0
  250. package/dist/modules/billing/lib/documentTypes.js.map +7 -0
  251. package/dist/modules/billing/lib/dueDate.js +18 -0
  252. package/dist/modules/billing/lib/dueDate.js.map +7 -0
  253. package/dist/modules/billing/lib/iban.js +29 -0
  254. package/dist/modules/billing/lib/iban.js.map +7 -0
  255. package/dist/modules/billing/lib/invoiceDelivery.js +131 -0
  256. package/dist/modules/billing/lib/invoiceDelivery.js.map +7 -0
  257. package/dist/modules/billing/lib/invoiceLanguages.js +16 -0
  258. package/dist/modules/billing/lib/invoiceLanguages.js.map +7 -0
  259. package/dist/modules/billing/lib/invoiceWriter.js +107 -99
  260. package/dist/modules/billing/lib/invoiceWriter.js.map +2 -2
  261. package/dist/modules/billing/lib/itemBillingState.js +27 -0
  262. package/dist/modules/billing/lib/itemBillingState.js.map +7 -0
  263. package/dist/modules/billing/lib/itemPriceChange.js +18 -0
  264. package/dist/modules/billing/lib/itemPriceChange.js.map +7 -0
  265. package/dist/modules/billing/lib/itemSelector.js.map +2 -2
  266. package/dist/modules/billing/lib/lineAmounts.js +32 -0
  267. package/dist/modules/billing/lib/lineAmounts.js.map +7 -0
  268. package/dist/modules/billing/lib/memoGuards.js +25 -0
  269. package/dist/modules/billing/lib/memoGuards.js.map +7 -0
  270. package/dist/modules/billing/lib/navigation.js +48 -0
  271. package/dist/modules/billing/lib/navigation.js.map +7 -0
  272. package/dist/modules/billing/lib/numbering.js +120 -0
  273. package/dist/modules/billing/lib/numbering.js.map +7 -0
  274. package/dist/modules/billing/lib/overdue.js +36 -0
  275. package/dist/modules/billing/lib/overdue.js.map +7 -0
  276. package/dist/modules/billing/lib/paymentCsv.js +125 -0
  277. package/dist/modules/billing/lib/paymentCsv.js.map +7 -0
  278. package/dist/modules/billing/lib/paymentGateway.js +15 -0
  279. package/dist/modules/billing/lib/paymentGateway.js.map +7 -0
  280. package/dist/modules/billing/lib/paymentImport.js +164 -0
  281. package/dist/modules/billing/lib/paymentImport.js.map +7 -0
  282. package/dist/modules/billing/lib/paymentMatcher.js +36 -0
  283. package/dist/modules/billing/lib/paymentMatcher.js.map +7 -0
  284. package/dist/modules/billing/lib/pdf/attachmentStore.js +46 -0
  285. package/dist/modules/billing/lib/pdf/attachmentStore.js.map +7 -0
  286. package/dist/modules/billing/lib/pdf/fonts/embeddedFonts.js +7 -0
  287. package/dist/modules/billing/lib/pdf/fonts/embeddedFonts.js.map +7 -0
  288. package/dist/modules/billing/lib/pdf/invoiceModel.js +194 -0
  289. package/dist/modules/billing/lib/pdf/invoiceModel.js.map +7 -0
  290. package/dist/modules/billing/lib/pdf/invoicePdf.js +165 -0
  291. package/dist/modules/billing/lib/pdf/invoicePdf.js.map +7 -0
  292. package/dist/modules/billing/lib/pdf/invoiceTemplate.js +274 -0
  293. package/dist/modules/billing/lib/pdf/invoiceTemplate.js.map +7 -0
  294. package/dist/modules/billing/lib/prepaidConfig.js +17 -25
  295. package/dist/modules/billing/lib/prepaidConfig.js.map +2 -2
  296. package/dist/modules/billing/lib/prepaidConsume.js +26 -7
  297. package/dist/modules/billing/lib/prepaidConsume.js.map +2 -2
  298. package/dist/modules/billing/lib/prepaidPeriodClose.js +277 -158
  299. package/dist/modules/billing/lib/prepaidPeriodClose.js.map +2 -2
  300. package/dist/modules/billing/lib/prepaidTaxPoint.js +37 -0
  301. package/dist/modules/billing/lib/prepaidTaxPoint.js.map +7 -0
  302. package/dist/modules/billing/lib/seeds/demo.js +51 -3
  303. package/dist/modules/billing/lib/seeds/demo.js.map +2 -2
  304. package/dist/modules/billing/lib/seeds/paymentsSample.js +93 -0
  305. package/dist/modules/billing/lib/seeds/paymentsSample.js.map +7 -0
  306. package/dist/modules/billing/lib/seeds/sellerSettings.js +41 -0
  307. package/dist/modules/billing/lib/seeds/sellerSettings.js.map +7 -0
  308. package/dist/modules/billing/lib/servicePeriods.js +121 -0
  309. package/dist/modules/billing/lib/servicePeriods.js.map +7 -0
  310. package/dist/modules/billing/lib/tenantLock.js.map +1 -1
  311. package/dist/modules/billing/lib/testRunCleanup.js +24 -0
  312. package/dist/modules/billing/lib/testRunCleanup.js.map +7 -0
  313. package/dist/modules/billing/lib/topupCapture.js +2 -2
  314. package/dist/modules/billing/lib/topupCapture.js.map +2 -2
  315. package/dist/modules/billing/lib/topupReceipt.js +58 -79
  316. package/dist/modules/billing/lib/topupReceipt.js.map +2 -2
  317. package/dist/modules/billing/lib/usageRater.js.map +1 -1
  318. package/dist/modules/billing/lib/usageRunner.js +14 -6
  319. package/dist/modules/billing/lib/usageRunner.js.map +2 -2
  320. package/dist/modules/billing/lib/vat.js +39 -0
  321. package/dist/modules/billing/lib/vat.js.map +7 -0
  322. package/dist/modules/billing/migrations/Migration20261114000000_billing_customer_kind.js +15 -0
  323. package/dist/modules/billing/migrations/Migration20261114000000_billing_customer_kind.js.map +7 -0
  324. package/dist/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.js +25 -0
  325. package/dist/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.js.map +7 -0
  326. package/dist/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.js +115 -0
  327. package/dist/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.js.map +7 -0
  328. package/dist/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.js +47 -0
  329. package/dist/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.js.map +7 -0
  330. package/dist/modules/billing/migrations/Migration20261117000000_billing_payments.js +89 -0
  331. package/dist/modules/billing/migrations/Migration20261117000000_billing_payments.js.map +7 -0
  332. package/dist/modules/billing/migrations/Migration20261118000000_billing_memos.js +17 -0
  333. package/dist/modules/billing/migrations/Migration20261118000000_billing_memos.js.map +7 -0
  334. package/dist/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.js +27 -0
  335. package/dist/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.js.map +7 -0
  336. package/dist/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.js +29 -0
  337. package/dist/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.js.map +7 -0
  338. package/dist/modules/billing/setup.js +7 -184
  339. package/dist/modules/billing/setup.js.map +2 -2
  340. package/dist/modules/billing/subscribers/credit-memo-auto-send.js +16 -0
  341. package/dist/modules/billing/subscribers/credit-memo-auto-send.js.map +7 -0
  342. package/dist/modules/billing/subscribers/debit-memo-apply-credit.js +16 -0
  343. package/dist/modules/billing/subscribers/debit-memo-apply-credit.js.map +7 -0
  344. package/dist/modules/billing/subscribers/debit-memo-auto-send.js +16 -0
  345. package/dist/modules/billing/subscribers/debit-memo-auto-send.js.map +7 -0
  346. package/dist/modules/billing/subscribers/invoice-apply-credit.js +34 -0
  347. package/dist/modules/billing/subscribers/invoice-apply-credit.js.map +7 -0
  348. package/dist/modules/billing/subscribers/invoice-auto-send.js +30 -0
  349. package/dist/modules/billing/subscribers/invoice-auto-send.js.map +7 -0
  350. package/dist/modules/billing/subscribers/payment-captured-to-paid.js +69 -33
  351. package/dist/modules/billing/subscribers/payment-captured-to-paid.js.map +2 -2
  352. package/dist/modules/billing/subscribers/prepaid-topup-captured.js +4 -6
  353. package/dist/modules/billing/subscribers/prepaid-topup-captured.js.map +2 -2
  354. package/dist/modules/billing/workers/reap-stale-bill-runs.js +2 -2
  355. package/dist/modules/billing/workers/reap-stale-bill-runs.js.map +2 -2
  356. package/generated/entities/billing_account/index.ts +26 -0
  357. package/generated/entities/billing_account_balance/index.ts +13 -0
  358. package/generated/entities/billing_account_transaction/index.ts +21 -0
  359. package/generated/entities/billing_account_usage/index.ts +18 -0
  360. package/generated/entities/billing_allocation/index.ts +18 -0
  361. package/generated/entities/billing_document_sequence/index.ts +11 -0
  362. package/generated/entities/billing_draft_invoice_edit/index.ts +14 -0
  363. package/generated/entities/billing_invoice/index.ts +38 -0
  364. package/generated/entities/billing_invoice_line/index.ts +24 -0
  365. package/generated/entities/billing_item/index.ts +26 -0
  366. package/generated/entities/billing_payment/index.ts +25 -0
  367. package/generated/entities/billing_payment_import/index.ts +14 -0
  368. package/generated/entities/billing_run/index.ts +20 -0
  369. package/generated/entities/billing_run_outcome/index.ts +18 -0
  370. package/generated/entities/billing_settings/index.ts +26 -0
  371. package/generated/entities/billing_statement/index.ts +22 -0
  372. package/generated/entities/billing_topup/index.ts +20 -0
  373. package/generated/entities.ids.generated.ts +35 -0
  374. package/package.json +15 -10
  375. package/src/modules/billing/__integration__/TC-BILL-004.spec.ts +170 -0
  376. package/src/modules/billing/__integration__/TC-BILL-005.spec.ts +134 -0
  377. package/src/modules/billing/__integration__/TC-BILL-006.spec.ts +101 -0
  378. package/src/modules/billing/__integration__/TC-BILL-007.spec.ts +140 -0
  379. package/src/modules/billing/__integration__/TC-BILL-008.spec.ts +108 -0
  380. package/src/modules/billing/__integration__/TC-BILL-009.spec.ts +113 -0
  381. package/src/modules/billing/__integration__/TC-BILL-010.spec.ts +118 -0
  382. package/src/modules/billing/__integration__/TC-BILL-011.spec.ts +142 -0
  383. package/src/modules/billing/__integration__/TC-BILL-012.spec.ts +115 -0
  384. package/src/modules/billing/__integration__/TC-BILL-013.spec.ts +118 -0
  385. package/src/modules/billing/__integration__/sellerSettings.ts +24 -0
  386. package/src/modules/billing/__tests__/commands/invoices.test.ts +437 -355
  387. package/src/modules/billing/__tests__/commands/itemsBulk.test.ts +33 -0
  388. package/src/modules/billing/__tests__/commands/memos.test.ts +205 -0
  389. package/src/modules/billing/__tests__/commands/payments.test.ts +241 -0
  390. package/src/modules/billing/__tests__/commands/runsDelete.test.ts +146 -0
  391. package/src/modules/billing/__tests__/commands/runsPostDrafts.test.ts +106 -0
  392. package/src/modules/billing/__tests__/commands/topups.test.ts +11 -0
  393. package/src/modules/billing/__tests__/entityRegistry.test.ts +326 -0
  394. package/src/modules/billing/__tests__/events.test.ts +142 -0
  395. package/src/modules/billing/__tests__/helpers/prepaidMockEm.ts +28 -11
  396. package/src/modules/billing/__tests__/lib/accountFinancials.test.ts +53 -0
  397. package/src/modules/billing/__tests__/lib/accountSummary.test.ts +97 -0
  398. package/src/modules/billing/__tests__/lib/allocation.test.ts +319 -0
  399. package/src/modules/billing/__tests__/lib/billRunEngine.test.ts +231 -20
  400. package/src/modules/billing/__tests__/lib/billingSettings.test.ts +109 -0
  401. package/src/modules/billing/__tests__/lib/customerLookup.test.ts +156 -0
  402. package/src/modules/billing/__tests__/lib/dueDate.test.ts +35 -0
  403. package/src/modules/billing/__tests__/lib/iban.test.ts +38 -0
  404. package/src/modules/billing/__tests__/lib/invoiceDelivery.test.ts +189 -0
  405. package/src/modules/billing/__tests__/lib/invoiceWriter.test.ts +212 -10
  406. package/src/modules/billing/__tests__/lib/itemBillingState.test.ts +42 -0
  407. package/src/modules/billing/__tests__/lib/itemPriceChange.test.ts +165 -0
  408. package/src/modules/billing/__tests__/lib/lineAmounts.test.ts +86 -0
  409. package/src/modules/billing/__tests__/lib/navigation.test.ts +71 -0
  410. package/src/modules/billing/__tests__/lib/numbering.test.ts +91 -0
  411. package/src/modules/billing/__tests__/lib/overdue.test.ts +36 -0
  412. package/src/modules/billing/__tests__/lib/paymentCsv.test.ts +148 -0
  413. package/src/modules/billing/__tests__/lib/paymentImport.test.ts +113 -0
  414. package/src/modules/billing/__tests__/lib/paymentsSample.test.ts +73 -0
  415. package/src/modules/billing/__tests__/lib/pdf/invoicePdf.test.ts +199 -0
  416. package/src/modules/billing/__tests__/lib/pdf/invoicePdfService.test.ts +147 -0
  417. package/src/modules/billing/__tests__/lib/prepaidPeriodClose.test.ts +374 -98
  418. package/src/modules/billing/__tests__/lib/prepaidTaxPoint.test.ts +118 -0
  419. package/src/modules/billing/__tests__/lib/seedsDemo.test.ts +53 -2
  420. package/src/modules/billing/__tests__/lib/sellerSettings.test.ts +28 -0
  421. package/src/modules/billing/__tests__/lib/servicePeriods.test.ts +190 -0
  422. package/src/modules/billing/__tests__/lib/topupCapture.test.ts +6 -28
  423. package/src/modules/billing/__tests__/lib/topupReceipt.test.ts +21 -52
  424. package/src/modules/billing/__tests__/lib/vat.test.ts +51 -0
  425. package/src/modules/billing/__tests__/package-isolation.test.ts +22 -8
  426. package/src/modules/billing/__tests__/setup.test.ts +13 -4
  427. package/src/modules/billing/__tests__/validators.test.ts +193 -3
  428. package/src/modules/billing/acl.ts +12 -0
  429. package/src/modules/billing/api/accounts/[id]/summary/route.ts +62 -0
  430. package/src/modules/billing/api/accounts/route.ts +58 -4
  431. package/src/modules/billing/api/export/account/[id]/route.ts +20 -18
  432. package/src/modules/billing/api/invoices/[id]/memos/route.ts +63 -0
  433. package/src/modules/billing/api/invoices/[id]/pdf/route.ts +79 -0
  434. package/src/modules/billing/api/invoices/[id]/route.ts +57 -70
  435. package/src/modules/billing/api/invoices/[id]/send/route.ts +127 -0
  436. package/src/modules/billing/api/invoices/add-line/route.ts +3 -3
  437. package/src/modules/billing/api/invoices/delete-draft/route.ts +33 -0
  438. package/src/modules/billing/api/invoices/edit-line/route.ts +4 -4
  439. package/src/modules/billing/api/invoices/post/route.ts +7 -6
  440. package/src/modules/billing/api/invoices/remove-line/route.ts +3 -3
  441. package/src/modules/billing/api/invoices/route.ts +81 -86
  442. package/src/modules/billing/api/items/bulk/route.ts +2 -1
  443. package/src/modules/billing/api/items/change-price/route.ts +54 -0
  444. package/src/modules/billing/api/items/route.ts +23 -7
  445. package/src/modules/billing/api/payment-imports/[id]/route.ts +49 -0
  446. package/src/modules/billing/api/payment-imports/route.ts +57 -0
  447. package/src/modules/billing/api/payments/[id]/route.ts +63 -0
  448. package/src/modules/billing/api/payments/allocate/route.ts +35 -0
  449. package/src/modules/billing/api/payments/assign/route.ts +36 -0
  450. package/src/modules/billing/api/payments/convert-to-topup/route.ts +35 -0
  451. package/src/modules/billing/api/payments/ignore/route.ts +35 -0
  452. package/src/modules/billing/api/payments/import/route.ts +72 -0
  453. package/src/modules/billing/api/payments/restore/route.ts +35 -0
  454. package/src/modules/billing/api/payments/route.ts +147 -0
  455. package/src/modules/billing/api/payments/unallocate/route.ts +35 -0
  456. package/src/modules/billing/api/payments/unassign/route.ts +35 -0
  457. package/src/modules/billing/api/run-outcomes/route.ts +50 -7
  458. package/src/modules/billing/api/runs/[id]/post-drafts/route.ts +71 -0
  459. package/src/modules/billing/api/runs/[id]/route.ts +59 -0
  460. package/src/modules/billing/api/runs/retry-failed/route.ts +4 -3
  461. package/src/modules/billing/api/runs/route.ts +17 -9
  462. package/src/modules/billing/api/settings/number-preview/route.ts +46 -0
  463. package/src/modules/billing/api/settings/route.ts +116 -0
  464. package/src/modules/billing/api/statements/route.ts +5 -0
  465. package/src/modules/billing/api/test-invoices/wipe/route.ts +2 -2
  466. package/src/modules/billing/backend/billing/accounts/[id]/page.tsx +151 -372
  467. package/src/modules/billing/backend/billing/accounts/create/page.tsx +6 -0
  468. package/src/modules/billing/backend/billing/accounts/page.tsx +71 -5
  469. package/src/modules/billing/backend/billing/invoices/[id]/page.tsx +445 -96
  470. package/src/modules/billing/backend/billing/invoices/page.tsx +8 -227
  471. package/src/modules/billing/backend/billing/items/[id]/page.tsx +75 -6
  472. package/src/modules/billing/backend/billing/items/create/page.tsx +13 -8
  473. package/src/modules/billing/backend/billing/items/page.tsx +19 -3
  474. package/src/modules/billing/backend/billing/payments/[id]/page.meta.ts +19 -0
  475. package/src/modules/billing/backend/billing/payments/[id]/page.tsx +415 -0
  476. package/src/modules/billing/backend/billing/payments/imports/[id]/page.meta.ts +19 -0
  477. package/src/modules/billing/backend/billing/payments/imports/[id]/page.tsx +106 -0
  478. package/src/modules/billing/backend/billing/payments/page.meta.ts +16 -0
  479. package/src/modules/billing/backend/billing/payments/page.tsx +56 -0
  480. package/src/modules/billing/backend/billing/runs/[id]/page.tsx +50 -19
  481. package/src/modules/billing/backend/billing/runs/page.tsx +60 -9
  482. package/src/modules/billing/backend/billing/statements/[id]/page.tsx +87 -6
  483. package/src/modules/billing/backend/billing/statements/page.tsx +2 -2
  484. package/src/modules/billing/backend/billing/topups/page.tsx +2 -2
  485. package/src/modules/billing/backend/billing/transactions/page.tsx +2 -2
  486. package/src/modules/billing/backend/billing/usage/create/page.tsx +3 -2
  487. package/src/modules/billing/backend/config/billing/page.meta.ts +21 -0
  488. package/src/modules/billing/backend/config/billing/page.tsx +549 -0
  489. package/src/modules/billing/ce.ts +8 -7
  490. package/src/modules/billing/cli.ts +31 -1
  491. package/src/modules/billing/commands/accounts.ts +6 -0
  492. package/src/modules/billing/commands/index.ts +3 -0
  493. package/src/modules/billing/commands/invoices.ts +371 -238
  494. package/src/modules/billing/commands/items.ts +143 -0
  495. package/src/modules/billing/commands/memos.ts +218 -0
  496. package/src/modules/billing/commands/payments.ts +428 -0
  497. package/src/modules/billing/commands/runs.ts +208 -6
  498. package/src/modules/billing/commands/settings.ts +77 -0
  499. package/src/modules/billing/commands/topups.ts +12 -3
  500. package/src/modules/billing/commands/transactions.ts +2 -2
  501. package/src/modules/billing/components/AccountForm.tsx +199 -53
  502. package/src/modules/billing/components/AccountInvoicesSection.tsx +75 -0
  503. package/src/modules/billing/components/AccountPaymentsSection.tsx +42 -0
  504. package/src/modules/billing/components/AccountPicker.tsx +70 -0
  505. package/src/modules/billing/components/AllocatePaymentDialog.tsx +167 -0
  506. package/src/modules/billing/components/BillingDataTable.tsx +34 -0
  507. package/src/modules/billing/components/BillingSettingsLink.tsx +25 -0
  508. package/src/modules/billing/components/ChangeItemPriceDialog.tsx +180 -0
  509. package/src/modules/billing/components/CreateMemoDialog.tsx +232 -0
  510. package/src/modules/billing/components/CustomerLabel.tsx +53 -0
  511. package/src/modules/billing/components/InvoicesTable.tsx +344 -0
  512. package/src/modules/billing/components/ItemForm.tsx +233 -44
  513. package/src/modules/billing/components/ItemPriceField.tsx +81 -0
  514. package/src/modules/billing/components/LineFormDialog.tsx +25 -1
  515. package/src/modules/billing/components/ManualPaymentDialog.tsx +140 -0
  516. package/src/modules/billing/components/MoneyInput.tsx +26 -0
  517. package/src/modules/billing/components/PaymentUploadDialog.tsx +148 -0
  518. package/src/modules/billing/components/PaymentsTable.tsx +213 -0
  519. package/src/modules/billing/components/PostRunDraftsButton.tsx +129 -0
  520. package/src/modules/billing/components/PrepaidPanel.tsx +20 -7
  521. package/src/modules/billing/components/RunCyclesSection.tsx +298 -0
  522. package/src/modules/billing/components/TestRunActions.tsx +152 -0
  523. package/src/modules/billing/components/account/AccountItemsTab.tsx +192 -0
  524. package/src/modules/billing/components/account/AccountRunBillingDialog.tsx +147 -0
  525. package/src/modules/billing/components/account/AccountRunsTab.tsx +201 -0
  526. package/src/modules/billing/components/account/AccountStatementsTab.tsx +120 -0
  527. package/src/modules/billing/components/account/AccountSummaryCards.tsx +153 -0
  528. package/src/modules/billing/components/account/AccountUsageTab.tsx +122 -0
  529. package/src/modules/billing/components/account/AccountView.tsx +101 -0
  530. package/src/modules/billing/components/account/accountRow.ts +70 -0
  531. package/src/modules/billing/components/customerNames.ts +62 -0
  532. package/src/modules/billing/data/entities.ts +685 -15
  533. package/src/modules/billing/data/entityIds.ts +25 -11
  534. package/src/modules/billing/data/validators.ts +388 -8
  535. package/src/modules/billing/events.ts +82 -3
  536. package/src/modules/billing/i18n/en.json +457 -21
  537. package/src/modules/billing/i18n/pl.json +457 -21
  538. package/src/modules/billing/index.ts +6 -2
  539. package/src/modules/billing/lib/accountFinancials.ts +84 -0
  540. package/src/modules/billing/lib/accountLock.ts +32 -0
  541. package/src/modules/billing/lib/accountStatus.ts +11 -9
  542. package/src/modules/billing/lib/accountSummary.ts +172 -0
  543. package/src/modules/billing/lib/allocation.ts +515 -0
  544. package/src/modules/billing/lib/allocationEvents.ts +26 -0
  545. package/src/modules/billing/lib/billPeriod.ts +19 -0
  546. package/src/modules/billing/lib/billRunEngine.ts +362 -162
  547. package/src/modules/billing/lib/billRunLabel.ts +1 -1
  548. package/src/modules/billing/lib/billingSettings.ts +145 -0
  549. package/src/modules/billing/lib/commandRoute.ts +112 -0
  550. package/src/modules/billing/lib/customerLookup.ts +157 -0
  551. package/src/modules/billing/lib/dateOnly.ts +22 -0
  552. package/src/modules/billing/lib/documentParties.ts +23 -0
  553. package/src/modules/billing/lib/documentTypes.ts +37 -0
  554. package/src/modules/billing/lib/dueDate.ts +26 -0
  555. package/src/modules/billing/lib/iban.ts +36 -0
  556. package/src/modules/billing/lib/invoiceDelivery.ts +197 -0
  557. package/src/modules/billing/lib/invoiceLanguages.ts +34 -0
  558. package/src/modules/billing/lib/invoiceWriter.ts +162 -148
  559. package/src/modules/billing/lib/itemBillingState.ts +67 -0
  560. package/src/modules/billing/lib/itemPriceChange.ts +56 -0
  561. package/src/modules/billing/lib/itemSelector.ts +4 -1
  562. package/src/modules/billing/lib/lineAmounts.ts +61 -0
  563. package/src/modules/billing/lib/memoGuards.ts +41 -0
  564. package/src/modules/billing/lib/navigation.ts +64 -0
  565. package/src/modules/billing/lib/numbering.ts +174 -0
  566. package/src/modules/billing/lib/overdue.ts +60 -0
  567. package/src/modules/billing/lib/paymentCsv.ts +171 -0
  568. package/src/modules/billing/lib/paymentGateway.ts +52 -0
  569. package/src/modules/billing/lib/paymentImport.ts +228 -0
  570. package/src/modules/billing/lib/paymentMatcher.ts +88 -0
  571. package/src/modules/billing/lib/pdf/attachmentStore.ts +60 -0
  572. package/src/modules/billing/lib/pdf/fonts/NotoSans-Bold.ttf +0 -0
  573. package/src/modules/billing/lib/pdf/fonts/NotoSans-Regular.ttf +0 -0
  574. package/src/modules/billing/lib/pdf/fonts/OFL.txt +93 -0
  575. package/src/modules/billing/lib/pdf/fonts/embeddedFonts.ts +9 -0
  576. package/src/modules/billing/lib/pdf/invoiceModel.ts +328 -0
  577. package/src/modules/billing/lib/pdf/invoicePdf.ts +216 -0
  578. package/src/modules/billing/lib/pdf/invoiceTemplate.ts +338 -0
  579. package/src/modules/billing/lib/prepaidConfig.ts +27 -36
  580. package/src/modules/billing/lib/prepaidConsume.ts +29 -6
  581. package/src/modules/billing/lib/prepaidPeriodClose.ts +410 -242
  582. package/src/modules/billing/lib/prepaidTaxPoint.ts +76 -0
  583. package/src/modules/billing/lib/seeds/demo.ts +79 -6
  584. package/src/modules/billing/lib/seeds/paymentsSample.ts +136 -0
  585. package/src/modules/billing/lib/seeds/sellerSettings.ts +78 -0
  586. package/src/modules/billing/lib/servicePeriods.ts +226 -0
  587. package/src/modules/billing/lib/tenantLock.ts +1 -1
  588. package/src/modules/billing/lib/testRunCleanup.ts +42 -0
  589. package/src/modules/billing/lib/topupCapture.ts +3 -4
  590. package/src/modules/billing/lib/topupReceipt.ts +70 -103
  591. package/src/modules/billing/lib/usageRater.ts +1 -1
  592. package/src/modules/billing/lib/usageRunner.ts +17 -5
  593. package/src/modules/billing/lib/vat.ts +56 -0
  594. package/src/modules/billing/migrations/Migration20261114000000_billing_customer_kind.ts +25 -0
  595. package/src/modules/billing/migrations/Migration20261114100000_billing_cycle_semantics.ts +37 -0
  596. package/src/modules/billing/migrations/Migration20261115000000_billing_invoice_ledger.ts +132 -0
  597. package/src/modules/billing/migrations/Migration20261116000000_billing_invoice_documents.ts +58 -0
  598. package/src/modules/billing/migrations/Migration20261117000000_billing_payments.ts +97 -0
  599. package/src/modules/billing/migrations/Migration20261118000000_billing_memos.ts +21 -0
  600. package/src/modules/billing/migrations/Migration20261119000000_billing_operator_feedback.ts +39 -0
  601. package/src/modules/billing/migrations/Migration20261120000000_billing_allocation_scope_indexes.ts +35 -0
  602. package/src/modules/billing/setup.ts +11 -237
  603. package/src/modules/billing/subscribers/credit-memo-auto-send.ts +15 -0
  604. package/src/modules/billing/subscribers/debit-memo-apply-credit.ts +15 -0
  605. package/src/modules/billing/subscribers/debit-memo-auto-send.ts +15 -0
  606. package/src/modules/billing/subscribers/invoice-apply-credit.ts +39 -0
  607. package/src/modules/billing/subscribers/invoice-auto-send.ts +46 -0
  608. package/src/modules/billing/subscribers/payment-captured-to-paid.ts +84 -62
  609. package/src/modules/billing/subscribers/prepaid-topup-captured.ts +4 -8
  610. package/src/modules/billing/workers/reap-stale-bill-runs.ts +4 -4
  611. package/dist/modules/billing/lib/invoiceStatus.js +0 -38
  612. package/dist/modules/billing/lib/invoiceStatus.js.map +0 -7
  613. package/src/modules/billing/__tests__/lib/invoiceStatus.test.ts +0 -97
  614. package/src/modules/billing/lib/invoiceStatus.ts +0 -61
@@ -0,0 +1,63 @@
1
+ import { z } from 'zod'
2
+ import { readRequestBody, runCommandRoute } from '../../../../lib/commandRoute'
3
+
4
+ /**
5
+ * `POST /api/billing/invoices/[id]/memos` — create a DRAFT credit or debit
6
+ * memo correcting a posted billing invoice (Spec D). Post it with
7
+ * `POST /api/billing/invoices/post`.
8
+ */
9
+
10
+ export const metadata = {
11
+ POST: { requireAuth: true, requireFeatures: ['billing.invoice.correct'] },
12
+ }
13
+
14
+ const lineSchema = z.object({
15
+ correctsLineId: z.string().uuid().optional(),
16
+ description: z.string().trim().min(1).max(500),
17
+ quantity: z.coerce.number().positive(),
18
+ unitPriceNet: z.coerce.number().nonnegative(),
19
+ taxRate: z.coerce.number().min(0).max(100).optional(),
20
+ })
21
+
22
+ const bodySchema = z.object({
23
+ invoiceId: z.string().uuid(),
24
+ type: z.enum(['credit_memo', 'debit_memo']),
25
+ reason: z.string().trim().min(1).max(1000),
26
+ lines: z.array(lineSchema).max(200).optional(),
27
+ })
28
+
29
+ export async function POST(req: Request, { params }: { params: Promise<{ id: string }> }) {
30
+ const { id } = await params
31
+ const raw = (await readRequestBody(req)) as Record<string, unknown>
32
+ return runCommandRoute(
33
+ req,
34
+ {
35
+ commandId: 'billing.invoices.create_memo',
36
+ bodySchema,
37
+ resourceKind: 'billing.invoice',
38
+ resourceId: (body) => body.invoiceId,
39
+ logLabel: 'billing/invoices/[id]/memos.POST',
40
+ },
41
+ { ...(raw && typeof raw === 'object' ? raw : {}), invoiceId: id },
42
+ )
43
+ }
44
+
45
+ export const openApi = {
46
+ methods: {
47
+ POST: {
48
+ tags: ['Billing'],
49
+ summary: 'Create a credit or debit memo',
50
+ description:
51
+ 'Creates a draft memo for a posted / partially paid / paid invoice (a fully credited invoice ' +
52
+ 'accepts debit memos only). `reason` is required and printed. Credit memo without `lines` = full ' +
53
+ 'credit of every original line; lines with `correctsLineId` keep the original VAT rate; new lines ' +
54
+ 'default to the organization rate. Amounts are positive — the document type gives the sign.',
55
+ requestBody: { schema: bodySchema.omit({ invoiceId: true }) },
56
+ responses: [{ status: 200, description: '`{ memoId, number, documentType, totalGross }`' }],
57
+ errors: [
58
+ { status: 409, description: '`billing.memo.invalid_original` / `billing.memo.exceeds_invoice`' },
59
+ { status: 400, description: '`billing.memo.invalid_line`' },
60
+ ],
61
+ },
62
+ },
63
+ }
@@ -0,0 +1,79 @@
1
+ import { NextResponse } from 'next/server'
2
+ import type { EntityManager } from '@mikro-orm/postgresql'
3
+ import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
4
+ import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'
5
+ import { BillingInvoice } from '../../../../data/entities'
6
+ import { getInvoicePdf } from '../../../../lib/pdf/invoicePdf'
7
+
8
+ /**
9
+ * `GET /api/billing/invoices/[id]/pdf` — the document PDF (Spec B).
10
+ *
11
+ * Posted documents: the frozen attachment (rendered and frozen on first
12
+ * request if freezing failed at post). Drafts / test documents: a live
13
+ * render with a DRAFT / TEST watermark, never stored. `?download=1` forces
14
+ * an attachment disposition; otherwise the browser shows it inline.
15
+ */
16
+
17
+ export const metadata = {
18
+ GET: { requireAuth: true, requireFeatures: ['billing.invoice.view'] },
19
+ }
20
+
21
+ export async function GET(req: Request, { params }: { params: Promise<{ id: string }> }) {
22
+ try {
23
+ const container = await createRequestContainer()
24
+ const auth = await getAuthFromRequest(req)
25
+ if (!auth || !auth.tenantId) {
26
+ return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
27
+ }
28
+ const organizationId = (auth as { orgId?: string }).orgId ?? null
29
+ if (!organizationId) {
30
+ return NextResponse.json({ error: 'Organization scope required' }, { status: 403 })
31
+ }
32
+ const { id } = await params
33
+ const em = (container.resolve('em') as EntityManager).fork()
34
+ const invoice = await em.findOne(BillingInvoice, {
35
+ id,
36
+ tenantId: auth.tenantId,
37
+ organizationId,
38
+ deletedAt: null,
39
+ } as never)
40
+ if (!invoice) {
41
+ return NextResponse.json({ error: 'Invoice not found' }, { status: 404 })
42
+ }
43
+ const pdf = await getInvoicePdf(em, invoice)
44
+ const download = new URL(req.url).searchParams.get('download') === '1'
45
+ return new NextResponse(Buffer.from(pdf.bytes), {
46
+ status: 200,
47
+ headers: {
48
+ 'Content-Type': 'application/pdf',
49
+ 'Content-Length': String(pdf.bytes.byteLength),
50
+ 'Content-Disposition': `${download ? 'attachment' : 'inline'}; filename="${pdf.fileName}"`,
51
+ // Drafts change with every edit; frozen documents never do.
52
+ 'Cache-Control': pdf.frozen ? 'private, max-age=300' : 'no-store',
53
+ 'X-Content-Type-Options': 'nosniff',
54
+ },
55
+ })
56
+ } catch (err) {
57
+ console.error('[billing/invoices/[id]/pdf.GET]', err)
58
+ return NextResponse.json({ error: 'Internal error' }, { status: 500 })
59
+ }
60
+ }
61
+
62
+ export const openApi = {
63
+ methods: {
64
+ GET: {
65
+ tags: ['Billing'],
66
+ summary: 'Download a billing document PDF',
67
+ parameters: [
68
+ { name: 'id', in: 'path', required: true, schema: { type: 'string', format: 'uuid' } },
69
+ { name: 'download', in: 'query', required: false, schema: { type: 'string', enum: ['1'] } },
70
+ ],
71
+ description:
72
+ '`application/pdf`. Posted documents return the PDF frozen at post (an attachment); drafts ' +
73
+ 'and test documents are rendered live with a DRAFT / TEST watermark and never stored. ' +
74
+ 'Labels follow the account invoice language (en / pl).',
75
+ responses: [{ status: 200, description: 'PDF document (`application/pdf`)' }],
76
+ errors: [{ status: 404, description: 'Invoice not found in this organization' }],
77
+ },
78
+ },
79
+ }
@@ -2,57 +2,20 @@ import { NextResponse } from 'next/server'
2
2
  import type { EntityManager } from '@mikro-orm/postgresql'
3
3
  import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
4
4
  import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'
5
+ import { daysOverdueSql, isoDay } from '../../../lib/overdue'
5
6
 
6
7
  /**
7
- * `GET /api/billing/invoices/[id]` — billing-invoice detail.
8
- *
9
- * Returns the `core/sales` invoice row + its lines, but only if the
10
- * invoice is billing-managed (carries `metadata.bill_run_id`). Other
11
- * `core/sales` invoices return 404 here even though the same UUID
12
- * resolves at `/api/sales/invoices/[id]` — this endpoint is the
13
- * billing operator's surface, scoped to the billing universe.
8
+ * `GET /api/billing/invoices/[id]` — one billing document with its lines
9
+ * (Spec 0: `billing_invoices` / `billing_invoice_lines`). Documents of other
10
+ * modules are never reachable here.
14
11
  */
15
12
 
16
13
  export const metadata = {
17
14
  GET: { requireAuth: true, requireFeatures: ['billing.invoice.view'] },
18
15
  }
19
16
 
20
- type InvoiceRow = {
21
- id: string
22
- invoice_number: string
23
- status: string | null
24
- status_entry_id: string | null
25
- currency_code: string
26
- issue_date: string | null
27
- due_date: string | null
28
- subtotal_net_amount: string
29
- subtotal_gross_amount: string
30
- discount_total_amount: string
31
- tax_total_amount: string
32
- grand_total_net_amount: string
33
- grand_total_gross_amount: string
34
- paid_total_amount: string
35
- outstanding_amount: string
36
- metadata: Record<string, unknown> | null
37
- created_at: string
38
- updated_at: string
39
- }
40
-
41
- type InvoiceLineRow = {
42
- id: string
43
- line_number: number
44
- kind: string
45
- description: string | null
46
- quantity: string
47
- currency_code: string
48
- unit_price_net: string
49
- unit_price_gross: string
50
- tax_rate: string
51
- tax_amount: string
52
- total_net_amount: string
53
- total_gross_amount: string
54
- metadata: Record<string, unknown> | null
55
- }
17
+ type InvoiceRow = Record<string, unknown> & { id: string; bill_account_id: string }
18
+ type InvoiceLineRow = Record<string, unknown> & { id: string }
56
19
 
57
20
  export async function GET(
58
21
  req: Request,
@@ -75,21 +38,20 @@ export async function GET(
75
38
  const { id: invoiceId } = await params
76
39
  const em = (container.resolve('em') as EntityManager).fork()
77
40
 
41
+ const today = isoDay(new Date())
78
42
  const invoiceRows = (await em.execute(
79
- `SELECT id, invoice_number, status, status_entry_id, currency_code,
80
- issue_date, due_date,
81
- subtotal_net_amount, subtotal_gross_amount,
82
- discount_total_amount, tax_total_amount,
83
- grand_total_net_amount, grand_total_gross_amount,
84
- paid_total_amount, outstanding_amount,
85
- metadata, created_at, updated_at
86
- FROM sales_invoices
87
- WHERE id = ?
88
- AND tenant_id = ?
89
- AND organization_id = ?
90
- AND deleted_at IS NULL
91
- AND jsonb_exists(metadata, 'bill_run_id')`,
92
- [invoiceId, auth.tenantId, organizationId],
43
+ `SELECT i.id, i.number, i.document_type, i.series, i.status, i.test_run, i.bill_account_id,
44
+ a.name AS bill_account_name, i.bill_run_id, i.bill_date, i.period_start, i.period_end,
45
+ i.issue_date, i.due_date, i.posted_at, i.currency_code, i.subtotal_net, i.tax_total,
46
+ i.total_gross, i.paid_total, i.credited_total, i.outstanding, i.corrects_invoice_id,
47
+ i.correction_reason, i.corrects_invoice_number, i.corrects_issue_date,
48
+ i.buyer_snapshot, i.seller_snapshot, i.topup_id, i.metadata,
49
+ i.pdf_attachment_id, ${daysOverdueSql('i')}::int AS days_overdue,
50
+ i.created_at, i.updated_at
51
+ FROM billing_invoices i
52
+ LEFT JOIN billing_accounts a ON a.id = i.bill_account_id AND a.tenant_id = i.tenant_id
53
+ WHERE i.id = ? AND i.tenant_id = ? AND i.organization_id = ? AND i.deleted_at IS NULL`,
54
+ [today, today, invoiceId, auth.tenantId, organizationId],
93
55
  )) as unknown as InvoiceRow[]
94
56
 
95
57
  if (!invoiceRows || invoiceRows.length === 0) {
@@ -99,20 +61,44 @@ export async function GET(
99
61
  const invoice = invoiceRows[0]
100
62
 
101
63
  const lineRows = (await em.execute(
102
- `SELECT id, line_number, kind, description, quantity, currency_code,
103
- unit_price_net, unit_price_gross, tax_rate, tax_amount,
104
- total_net_amount, total_gross_amount, metadata
105
- FROM sales_invoice_lines
106
- WHERE invoice_id = ?
107
- AND tenant_id = ?
108
- AND organization_id = ?
64
+ `SELECT id, line_number, billing_item_id, billing_type, description, quantity,
65
+ unit_price_net, tax_rate, net_amount, tax_amount, gross_amount,
66
+ service_period_start, service_period_end, corrects_line_id, metadata
67
+ FROM billing_invoice_lines
68
+ WHERE invoice_id = ? AND tenant_id = ? AND organization_id = ? AND deleted_at IS NULL
109
69
  ORDER BY line_number ASC`,
110
70
  [invoiceId, auth.tenantId, organizationId],
111
71
  )) as unknown as InvoiceLineRow[]
112
72
 
73
+ // Spec C: what settled this receivable (payments; Spec D adds credit memos).
74
+ const allocations = await em.execute(
75
+ `SELECT al.id, al.source_type, al.source_id, al.amount, al.currency_code, al.allocated_by, al.created_at,
76
+ CASE WHEN al.source_type = 'payment' THEN COALESCE(p.reference, p.payer_name)
77
+ ELSE m.number END AS source_label,
78
+ p.received_at AS payment_received_at
79
+ FROM billing_allocations al
80
+ LEFT JOIN billing_payments p ON al.source_type = 'payment' AND p.id = al.source_id
81
+ LEFT JOIN billing_invoices m ON al.source_type = 'credit_memo' AND m.id = al.source_id
82
+ WHERE al.invoice_id = ? AND al.tenant_id = ? AND al.organization_id = ? AND al.deleted_at IS NULL
83
+ ORDER BY al.created_at ASC`,
84
+ [invoiceId, auth.tenantId, organizationId],
85
+ )
86
+
87
+ // Spec D: memos correcting this document.
88
+ const corrections = await em.execute(
89
+ `SELECT id, number, document_type, status, total_gross, outstanding, currency_code, correction_reason, created_at
90
+ FROM billing_invoices
91
+ WHERE corrects_invoice_id = ? AND tenant_id = ? AND organization_id = ? AND deleted_at IS NULL
92
+ ORDER BY created_at ASC`,
93
+ [invoiceId, auth.tenantId, organizationId],
94
+ )
95
+
113
96
  return NextResponse.json({
97
+ corrections,
98
+ allocations,
114
99
  invoice,
115
- lines: lineRows,
100
+ // Lines carry the document currency for display convenience.
101
+ lines: lineRows.map((line) => ({ ...line, currency_code: invoice.currency_code })),
116
102
  })
117
103
  } catch (err) {
118
104
  console.error('[billing/invoices/[id].GET]', err)
@@ -124,12 +110,13 @@ export const openApi = {
124
110
  methods: {
125
111
  GET: {
126
112
  tags: ['Billing'],
127
- summary: 'Get a billing-managed invoice (with lines)',
113
+ summary: 'Get a billing document (with lines)',
128
114
  description:
129
- 'Returns the `core/sales` invoice + every line, scoped to ' +
130
- "billing-managed invoices (`metadata.bill_run_id` set). Non-" +
131
- 'billing invoices return 404 even when the UUID resolves at ' +
132
- '`/api/sales/invoices/[id]`.',
115
+ 'Returns one billing document from `billing_invoices` (invoice, memo or receipt) with its ' +
116
+ 'lines, the frozen buyer / seller snapshots, `bill_account_name` and `allocations[]` (Spec C: ' +
117
+ 'payments / credit memos that settled it, with `source_label`) and `corrections[]` (Spec D memos). ' +
118
+ '404 outside the ' +
119
+ 'caller\'s organization.',
133
120
  parameters: [
134
121
  {
135
122
  name: 'id',
@@ -0,0 +1,127 @@
1
+ import { NextResponse } from 'next/server'
2
+ import { z } from 'zod'
3
+ import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
4
+ import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'
5
+ import {
6
+ organizationScopeRequiredResponse,
7
+ resolveActiveOrganizationId,
8
+ } from '@open-mercato/shared/lib/auth/organizationScope'
9
+ import type { CommandBus, CommandRuntimeContext } from '@open-mercato/shared/lib/commands'
10
+ import { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'
11
+ import { bridgeLegacyGuard, runMutationGuards } from '@open-mercato/shared/lib/crud/mutation-guard-registry'
12
+ import type { SendInvoiceResult } from '../../../../lib/invoiceDelivery'
13
+
14
+ /**
15
+ * `POST /api/billing/invoices/[id]/send` — emails a posted billing document
16
+ * with its frozen PDF to the account's invoice email (Spec B), via the
17
+ * `billing.invoices.send` command.
18
+ *
19
+ * 200 `{ invoiceId, to, status: 'sent' | 'failed', error }` — a transport
20
+ * failure is a recorded `failed` delivery, not an HTTP error.
21
+ * 409 `billing.invoice.not_posted` (draft / test). 422
22
+ * `billing.invoice.email_invalid` (placeholder or malformed address).
23
+ */
24
+
25
+ export const metadata = {
26
+ POST: { requireAuth: true, requireFeatures: ['billing.invoice.send'] },
27
+ }
28
+
29
+ function userFeatures(auth: unknown): string[] {
30
+ const features = (auth as { features?: unknown })?.features
31
+ return Array.isArray(features) ? features.filter((value): value is string => typeof value === 'string') : []
32
+ }
33
+
34
+ export async function POST(req: Request, { params }: { params: Promise<{ id: string }> }) {
35
+ try {
36
+ const container = await createRequestContainer()
37
+ const auth = await getAuthFromRequest(req)
38
+ if (!auth || !auth.tenantId) {
39
+ return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
40
+ }
41
+ const organizationId = resolveActiveOrganizationId(auth)
42
+ if (!organizationId) return organizationScopeRequiredResponse()
43
+ const { id } = await params
44
+ const ctx: CommandRuntimeContext = {
45
+ container,
46
+ auth,
47
+ organizationScope: null,
48
+ selectedOrganizationId: organizationId,
49
+ organizationIds: [organizationId],
50
+ request: req,
51
+ }
52
+ // Custom write route → run the shared mutation guards (record locks etc.)
53
+ // as `update` on the invoice before sending.
54
+ const guardInput = {
55
+ tenantId: auth.tenantId,
56
+ organizationId,
57
+ userId: auth.sub ?? '',
58
+ resourceKind: 'billing.invoice',
59
+ resourceId: id,
60
+ operation: 'update' as const,
61
+ requestMethod: req.method,
62
+ requestHeaders: req.headers,
63
+ }
64
+ const legacyGuard = bridgeLegacyGuard(container)
65
+ const guardResult = legacyGuard
66
+ ? await runMutationGuards([legacyGuard], guardInput, { userFeatures: userFeatures(auth) })
67
+ : { ok: true as const, afterSuccessCallbacks: [] }
68
+ if (!guardResult.ok) {
69
+ return NextResponse.json(guardResult.errorBody ?? { error: 'Operation blocked by guard' }, {
70
+ status: guardResult.errorStatus ?? 422,
71
+ })
72
+ }
73
+
74
+ const commandBus = container.resolve('commandBus') as CommandBus
75
+ const response = await commandBus.execute('billing.invoices.send', {
76
+ input: { tenantId: auth.tenantId, organizationId, invoiceId: id },
77
+ ctx,
78
+ })
79
+ const result = (response as { result?: SendInvoiceResult }).result
80
+ for (const callback of guardResult.afterSuccessCallbacks) {
81
+ if (!callback.guard.afterSuccess) continue
82
+ try {
83
+ await callback.guard.afterSuccess({ ...guardInput, metadata: callback.metadata ?? null })
84
+ } catch (err) {
85
+ console.error('[billing/invoices/[id]/send.POST] guard afterSuccess failed', err)
86
+ }
87
+ }
88
+ return NextResponse.json(result ?? { invoiceId: id, status: 'failed', error: null })
89
+ } catch (err) {
90
+ if (isCrudHttpError(err)) {
91
+ return NextResponse.json(err.body, { status: err.status })
92
+ }
93
+ console.error('[billing/invoices/[id]/send.POST]', err)
94
+ return NextResponse.json({ error: 'Internal error' }, { status: 500 })
95
+ }
96
+ }
97
+
98
+ export const openApi = {
99
+ methods: {
100
+ POST: {
101
+ tags: ['Billing'],
102
+ summary: 'Email a posted billing document',
103
+ parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string', format: 'uuid' } }],
104
+ description:
105
+ 'Sends the frozen PDF to the billing account invoice email through the platform email ' +
106
+ 'transport. Each attempt is appended to `metadata.deliveries` and emits ' +
107
+ '`billing.invoice.sent` / `billing.invoice.send_failed`. Transport failures return ' +
108
+ '200 with `status: "failed"` and the error.',
109
+ responses: [
110
+ {
111
+ status: 200,
112
+ description: 'Delivery attempted',
113
+ schema: z.object({
114
+ invoiceId: z.string().uuid(),
115
+ to: z.string(),
116
+ status: z.enum(['sent', 'failed']),
117
+ error: z.string().nullable(),
118
+ }),
119
+ },
120
+ ],
121
+ errors: [
122
+ { status: 409, description: '`billing.invoice.not_posted` — drafts and test documents cannot be sent' },
123
+ { status: 422, description: '`billing.invoice.email_invalid` — placeholder or malformed invoice email' },
124
+ ],
125
+ },
126
+ },
127
+ }
@@ -2,10 +2,10 @@ import { z } from 'zod'
2
2
  import { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'
3
3
  import { withScopedPayload } from '@open-mercato/shared/lib/api/scoped'
4
4
  import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
5
- import { SalesInvoice } from '@open-mercato/core/modules/sales/data/entities'
6
5
  import { billingEntityIds } from '../../../data/entityIds'
7
6
  import { billingInvoiceAddLineSchema } from '../../../data/validators'
8
7
  import { createBillingCrudOpenApi } from '../../openapi'
8
+ import { BillingInvoice } from '../../../data/entities'
9
9
 
10
10
  const routeMetadata = {
11
11
  POST: { requireAuth: true, requireFeatures: ['billing.invoice.edit_draft'] },
@@ -24,7 +24,7 @@ const rawBodySchema = z.object({}).passthrough()
24
24
  const crud = makeCrudRoute({
25
25
  metadata: routeMetadata,
26
26
  orm: {
27
- entity: SalesInvoice,
27
+ entity: BillingInvoice,
28
28
  idField: 'id',
29
29
  orgField: 'organizationId',
30
30
  tenantField: 'tenantId',
@@ -67,7 +67,7 @@ export const openApi = createBillingCrudOpenApi({
67
67
  responseSchema: addLineResponseSchema,
68
68
  description:
69
69
  'Appends a new line to a draft invoice (e.g. operator adds a ' +
70
- 'one-off adjustment). Writes a `DraftInvoiceEdit` audit row ' +
70
+ 'one-off adjustment). Writes a `BillingDraftInvoiceEdit` audit row ' +
71
71
  '(action=`line_added`, `before_json=null`). Recomputes invoice ' +
72
72
  'totals. Refuses non-draft invoices.',
73
73
  },
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod'
2
+ import { runCommandRoute } from '../../../lib/commandRoute'
3
+
4
+ /** `POST /api/billing/invoices/delete-draft` — delete a DRAFT credit / debit memo (Spec D, D-D7). */
5
+
6
+ export const metadata = {
7
+ POST: { requireAuth: true, requireFeatures: ['billing.invoice.correct'] },
8
+ }
9
+
10
+ const bodySchema = z.object({ invoiceId: z.string().uuid() })
11
+
12
+ export async function POST(req: Request) {
13
+ return runCommandRoute(req, {
14
+ commandId: 'billing.invoices.delete_draft',
15
+ bodySchema,
16
+ resourceKind: 'billing.invoice',
17
+ resourceId: (body) => body.invoiceId,
18
+ logLabel: 'billing/invoices/delete-draft.POST',
19
+ })
20
+ }
21
+
22
+ export const openApi = {
23
+ methods: {
24
+ POST: {
25
+ tags: ['Billing'],
26
+ summary: 'Delete a draft memo',
27
+ description: 'Deletes a draft credit or debit memo with its lines. Posted documents are never deleted (no void).',
28
+ requestBody: { schema: bodySchema },
29
+ responses: [{ status: 200, description: '`{ deleted: true }`' }],
30
+ errors: [{ status: 409, description: '`billing.memo.not_draft`' }],
31
+ },
32
+ },
33
+ }
@@ -2,7 +2,6 @@ import { z } from 'zod'
2
2
  import { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'
3
3
  import { withScopedPayload } from '@open-mercato/shared/lib/api/scoped'
4
4
  import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
5
- import { SalesInvoice } from '@open-mercato/core/modules/sales/data/entities'
6
5
  import { billingEntityIds } from '../../../data/entityIds'
7
6
  import {
8
7
  billingInvoiceAddLineSchema,
@@ -10,11 +9,12 @@ import {
10
9
  billingInvoiceRemoveLineSchema,
11
10
  } from '../../../data/validators'
12
11
  import { createBillingCrudOpenApi } from '../../openapi'
12
+ import { BillingInvoice } from '../../../data/entities'
13
13
 
14
14
  /**
15
15
  * `POST /api/billing/invoices/edit-line` — edits one line of a draft
16
16
  * invoice. Refuses non-drafts (409 / `billing.invoice.not_draft`).
17
- * Writes a `DraftInvoiceEdit` audit row per spec. Recomputes invoice
17
+ * Writes a `BillingDraftInvoiceEdit` audit row per spec. Recomputes invoice
18
18
  * totals from the surviving lines after the edit.
19
19
  *
20
20
  * Operator surface: route is gated by `billing.invoice.edit_draft`.
@@ -38,7 +38,7 @@ const rawBodySchema = z.object({}).passthrough()
38
38
  const crud = makeCrudRoute({
39
39
  metadata: routeMetadata,
40
40
  orm: {
41
- entity: SalesInvoice,
41
+ entity: BillingInvoice,
42
42
  idField: 'id',
43
43
  orgField: 'organizationId',
44
44
  tenantField: 'tenantId',
@@ -82,7 +82,7 @@ export const openApi = createBillingCrudOpenApi({
82
82
  description:
83
83
  'Edits one line of a draft invoice (description, quantity, ' +
84
84
  "unit_price, or explicit `totalNetAmount` override). Writes a " +
85
- '`DraftInvoiceEdit` audit row with before+after snapshots and ' +
85
+ '`BillingDraftInvoiceEdit` audit row with before+after snapshots and ' +
86
86
  'recomputes invoice totals. Refuses non-draft invoices with ' +
87
87
  'HTTP 409 + `billing.invoice.not_draft`.',
88
88
  },
@@ -2,10 +2,10 @@ import { z } from 'zod'
2
2
  import { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'
3
3
  import { withScopedPayload } from '@open-mercato/shared/lib/api/scoped'
4
4
  import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
5
- import { SalesInvoice } from '@open-mercato/core/modules/sales/data/entities'
6
5
  import { billingEntityIds } from '../../../data/entityIds'
7
6
  import { billingInvoicePostSchema } from '../../../data/validators'
8
7
  import { createBillingCrudOpenApi } from '../../openapi'
8
+ import { BillingInvoice } from '../../../data/entities'
9
9
 
10
10
  /**
11
11
  * `POST /api/billing/invoices/post`
@@ -13,13 +13,14 @@ import { createBillingCrudOpenApi } from '../../openapi'
13
13
  * Operator action: flip a billing-drafted invoice from `draft` →
14
14
  * `posted`. The command refuses non-draft inputs (409 with
15
15
  * `billing.invoice.not_draft`) and test-mode invoices (409 with
16
- * `billing.invoice.test_run`). The invoice number is NOT re-assigned
17
- * (it was set at draft create — see Phase 2 deviation note in the
18
- * spec).
16
+ * `billing.invoice.test_run`). The series number is claimed at post
17
+ * (Spec 0 numbering masks) — drafts carry a temporary `DRAFT-…` number.
18
+ * 409 `billing.invoice.number_conflict` when the mask repeats an issued
19
+ * number.
19
20
  *
20
21
  * Implemented as a create-only `makeCrudRoute` so it inherits the same
21
22
  * RBAC + OpenAPI plumbing as the rest of the billing surface. The
22
- * `entity` is `SalesInvoice` only because the factory requires one;
23
+ * `entity` is `BillingInvoice` only because the factory requires one;
23
24
  * the GET half is never exposed on this URL.
24
25
  */
25
26
 
@@ -41,7 +42,7 @@ const rawBodySchema = z.object({}).passthrough()
41
42
  const crud = makeCrudRoute({
42
43
  metadata: routeMetadata,
43
44
  orm: {
44
- entity: SalesInvoice,
45
+ entity: BillingInvoice,
45
46
  idField: 'id',
46
47
  orgField: 'organizationId',
47
48
  tenantField: 'tenantId',
@@ -2,10 +2,10 @@ import { z } from 'zod'
2
2
  import { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'
3
3
  import { withScopedPayload } from '@open-mercato/shared/lib/api/scoped'
4
4
  import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
5
- import { SalesInvoice } from '@open-mercato/core/modules/sales/data/entities'
6
5
  import { billingEntityIds } from '../../../data/entityIds'
7
6
  import { billingInvoiceRemoveLineSchema } from '../../../data/validators'
8
7
  import { createBillingCrudOpenApi } from '../../openapi'
8
+ import { BillingInvoice } from '../../../data/entities'
9
9
 
10
10
  const routeMetadata = {
11
11
  POST: { requireAuth: true, requireFeatures: ['billing.invoice.edit_draft'] },
@@ -24,7 +24,7 @@ const rawBodySchema = z.object({}).passthrough()
24
24
  const crud = makeCrudRoute({
25
25
  metadata: routeMetadata,
26
26
  orm: {
27
- entity: SalesInvoice,
27
+ entity: BillingInvoice,
28
28
  idField: 'id',
29
29
  orgField: 'organizationId',
30
30
  tenantField: 'tenantId',
@@ -68,7 +68,7 @@ export const openApi = createBillingCrudOpenApi({
68
68
  description:
69
69
  'Removes one line from a draft invoice (hard delete — the line ' +
70
70
  'never existed as far as future readers are concerned). Writes ' +
71
- 'a `DraftInvoiceEdit` audit row (action=`line_removed`, ' +
71
+ 'a `BillingDraftInvoiceEdit` audit row (action=`line_removed`, ' +
72
72
  '`after_json=null`) carrying the before-snapshot for forensics. ' +
73
73
  'Recomputes invoice totals. Refuses non-draft invoices.',
74
74
  },