@baruk/core 0.1.0 → 0.2.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 (429) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/auth/password-reset.d.ts.map +1 -1
  3. package/dist/auth/password-reset.js +2 -4
  4. package/dist/auth/password-reset.js.map +1 -1
  5. package/dist/auth/password.d.ts +2 -18
  6. package/dist/auth/password.d.ts.map +1 -1
  7. package/dist/auth/password.js +12 -51
  8. package/dist/auth/password.js.map +1 -1
  9. package/dist/auth/service.d.ts +0 -12
  10. package/dist/auth/service.d.ts.map +1 -1
  11. package/dist/auth/service.js +3 -36
  12. package/dist/auth/service.js.map +1 -1
  13. package/dist/auth/session-token.d.ts +5 -2
  14. package/dist/auth/session-token.d.ts.map +1 -1
  15. package/dist/auth/session-token.js +7 -12
  16. package/dist/auth/session-token.js.map +1 -1
  17. package/dist/billing/dunning.d.ts +33 -0
  18. package/dist/billing/dunning.d.ts.map +1 -0
  19. package/dist/billing/dunning.js +49 -0
  20. package/dist/billing/dunning.js.map +1 -0
  21. package/dist/billing/provider/asaas.d.ts +15 -0
  22. package/dist/billing/provider/asaas.d.ts.map +1 -0
  23. package/dist/billing/provider/asaas.js +121 -0
  24. package/dist/billing/provider/asaas.js.map +1 -0
  25. package/dist/billing/provider/manual.d.ts +14 -0
  26. package/dist/billing/provider/manual.d.ts.map +1 -0
  27. package/dist/billing/provider/manual.js +24 -0
  28. package/dist/billing/provider/manual.js.map +1 -0
  29. package/dist/billing/provider/registry.d.ts +12 -0
  30. package/dist/billing/provider/registry.d.ts.map +1 -0
  31. package/dist/billing/provider/registry.js +22 -0
  32. package/dist/billing/provider/registry.js.map +1 -0
  33. package/dist/billing/provider/types.d.ts +76 -0
  34. package/dist/billing/provider/types.d.ts.map +1 -0
  35. package/dist/billing/provider/types.js +9 -0
  36. package/dist/billing/provider/types.js.map +1 -0
  37. package/dist/billing/receivable.d.ts +108 -0
  38. package/dist/billing/receivable.d.ts.map +1 -0
  39. package/dist/billing/receivable.js +2 -0
  40. package/dist/billing/receivable.js.map +1 -0
  41. package/dist/billing/repository.d.ts +97 -0
  42. package/dist/billing/repository.d.ts.map +1 -0
  43. package/dist/billing/repository.js +167 -0
  44. package/dist/billing/repository.js.map +1 -0
  45. package/dist/cjs/audit/audit.js +31 -0
  46. package/dist/cjs/audit/audit.js.map +1 -0
  47. package/dist/cjs/audit/repository.js +32 -0
  48. package/dist/cjs/audit/repository.js.map +1 -0
  49. package/dist/cjs/auth/password-reset.js +58 -0
  50. package/dist/cjs/auth/password-reset.js.map +1 -0
  51. package/dist/cjs/auth/password.js +32 -0
  52. package/dist/cjs/auth/password.js.map +1 -0
  53. package/dist/cjs/auth/service.js +191 -0
  54. package/dist/cjs/auth/service.js.map +1 -0
  55. package/dist/cjs/auth/session-token.js +18 -0
  56. package/dist/cjs/auth/session-token.js.map +1 -0
  57. package/dist/cjs/billing/dunning.js +54 -0
  58. package/dist/cjs/billing/dunning.js.map +1 -0
  59. package/dist/cjs/billing/provider/asaas.js +125 -0
  60. package/dist/cjs/billing/provider/asaas.js.map +1 -0
  61. package/dist/cjs/billing/provider/manual.js +28 -0
  62. package/dist/cjs/billing/provider/manual.js.map +1 -0
  63. package/dist/cjs/billing/provider/registry.js +27 -0
  64. package/dist/cjs/billing/provider/registry.js.map +1 -0
  65. package/dist/cjs/billing/provider/types.js +10 -0
  66. package/dist/cjs/billing/provider/types.js.map +1 -0
  67. package/dist/cjs/billing/receivable.js +3 -0
  68. package/dist/cjs/billing/receivable.js.map +1 -0
  69. package/dist/cjs/billing/repository.js +180 -0
  70. package/dist/cjs/billing/repository.js.map +1 -0
  71. package/dist/cjs/clients/repository.js +123 -0
  72. package/dist/cjs/clients/repository.js.map +1 -0
  73. package/dist/cjs/commercial-catalog/catalog.js +108 -0
  74. package/dist/cjs/commercial-catalog/catalog.js.map +1 -0
  75. package/dist/cjs/commercial-catalog/consumption-contracts.js +10 -0
  76. package/dist/cjs/commercial-catalog/consumption-contracts.js.map +1 -0
  77. package/dist/cjs/commercial-catalog/coupon.js +53 -0
  78. package/dist/cjs/commercial-catalog/coupon.js.map +1 -0
  79. package/dist/cjs/commercial-catalog/index.js +16 -0
  80. package/dist/cjs/commercial-catalog/index.js.map +1 -0
  81. package/dist/cjs/commercial-catalog/offer-application.js +53 -0
  82. package/dist/cjs/commercial-catalog/offer-application.js.map +1 -0
  83. package/dist/cjs/commercial-catalog/types.js +26 -0
  84. package/dist/cjs/commercial-catalog/types.js.map +1 -0
  85. package/dist/cjs/crm/repository.js +195 -0
  86. package/dist/cjs/crm/repository.js.map +1 -0
  87. package/dist/cjs/dashboard/repository.js +39 -0
  88. package/dist/cjs/dashboard/repository.js.map +1 -0
  89. package/dist/cjs/db/client.js +27 -0
  90. package/dist/cjs/db/client.js.map +1 -0
  91. package/dist/cjs/db/context.js +43 -0
  92. package/dist/cjs/db/context.js.map +1 -0
  93. package/dist/cjs/db/load-env.js +47 -0
  94. package/dist/cjs/db/load-env.js.map +1 -0
  95. package/dist/cjs/db/seed.js +69 -0
  96. package/dist/cjs/db/seed.js.map +1 -0
  97. package/dist/cjs/entitlements/decision.js +203 -0
  98. package/dist/cjs/entitlements/decision.js.map +1 -0
  99. package/dist/cjs/entitlements/derive.js +46 -0
  100. package/dist/cjs/entitlements/derive.js.map +1 -0
  101. package/dist/cjs/entitlements/index.js +23 -0
  102. package/dist/cjs/entitlements/index.js.map +1 -0
  103. package/dist/cjs/entitlements/sources.js +60 -0
  104. package/dist/cjs/entitlements/sources.js.map +1 -0
  105. package/dist/cjs/entitlements/standing.js +42 -0
  106. package/dist/cjs/entitlements/standing.js.map +1 -0
  107. package/dist/cjs/entitlements/types.js +16 -0
  108. package/dist/cjs/entitlements/types.js.map +1 -0
  109. package/dist/cjs/import/clients-import.js +147 -0
  110. package/dist/cjs/import/clients-import.js.map +1 -0
  111. package/dist/cjs/index.js +335 -0
  112. package/dist/cjs/index.js.map +1 -0
  113. package/dist/cjs/mail/dedup-store.js +56 -0
  114. package/dist/cjs/mail/dedup-store.js.map +1 -0
  115. package/dist/cjs/mail/index.js +24 -0
  116. package/dist/cjs/mail/index.js.map +1 -0
  117. package/dist/cjs/mail/provider.js +251 -0
  118. package/dist/cjs/mail/provider.js.map +1 -0
  119. package/dist/cjs/mail/resend-client.js +103 -0
  120. package/dist/cjs/mail/resend-client.js.map +1 -0
  121. package/dist/cjs/mail/resend.js +21 -0
  122. package/dist/cjs/mail/resend.js.map +1 -0
  123. package/dist/cjs/mail/sanitize.js +56 -0
  124. package/dist/cjs/mail/sanitize.js.map +1 -0
  125. package/dist/cjs/mail/sender-resolver.js +15 -0
  126. package/dist/cjs/mail/sender-resolver.js.map +1 -0
  127. package/dist/cjs/mail/template-renderer.js +21 -0
  128. package/dist/cjs/mail/template-renderer.js.map +1 -0
  129. package/dist/cjs/mail/types.js +38 -0
  130. package/dist/cjs/mail/types.js.map +1 -0
  131. package/dist/cjs/notifications/repository.js +49 -0
  132. package/dist/cjs/notifications/repository.js.map +1 -0
  133. package/dist/cjs/onboarding/domain.js +370 -0
  134. package/dist/cjs/onboarding/domain.js.map +1 -0
  135. package/dist/cjs/onboarding/interaction-review.js +425 -0
  136. package/dist/cjs/onboarding/interaction-review.js.map +1 -0
  137. package/dist/cjs/onboarding/persistence.js +444 -0
  138. package/dist/cjs/onboarding/persistence.js.map +1 -0
  139. package/dist/cjs/onboarding/portal-actions.js +157 -0
  140. package/dist/cjs/onboarding/portal-actions.js.map +1 -0
  141. package/dist/cjs/onboarding/portal.js +177 -0
  142. package/dist/cjs/onboarding/portal.js.map +1 -0
  143. package/dist/cjs/package.json +3 -0
  144. package/dist/cjs/portal/repository.js +37 -0
  145. package/dist/cjs/portal/repository.js.map +1 -0
  146. package/dist/cjs/pricing-engine/bundle.js +49 -0
  147. package/dist/cjs/pricing-engine/bundle.js.map +1 -0
  148. package/dist/cjs/pricing-engine/errors.js +48 -0
  149. package/dist/cjs/pricing-engine/errors.js.map +1 -0
  150. package/dist/cjs/pricing-engine/index.js +30 -0
  151. package/dist/cjs/pricing-engine/index.js.map +1 -0
  152. package/dist/cjs/pricing-engine/money.js +69 -0
  153. package/dist/cjs/pricing-engine/money.js.map +1 -0
  154. package/dist/cjs/pricing-engine/pipeline.js +330 -0
  155. package/dist/cjs/pricing-engine/pipeline.js.map +1 -0
  156. package/dist/cjs/pricing-engine/proration.js +53 -0
  157. package/dist/cjs/pricing-engine/proration.js.map +1 -0
  158. package/dist/cjs/pricing-engine/shadow.js +58 -0
  159. package/dist/cjs/pricing-engine/shadow.js.map +1 -0
  160. package/dist/cjs/pricing-engine/types.js +34 -0
  161. package/dist/cjs/pricing-engine/types.js.map +1 -0
  162. package/dist/cjs/products/catalog.js +10 -0
  163. package/dist/cjs/products/catalog.js.map +1 -0
  164. package/dist/cjs/products/repository.js +61 -0
  165. package/dist/cjs/products/repository.js.map +1 -0
  166. package/dist/cjs/rbac/authorize.js +36 -0
  167. package/dist/cjs/rbac/authorize.js.map +1 -0
  168. package/dist/cjs/rbac/catalog.js +455 -0
  169. package/dist/cjs/rbac/catalog.js.map +1 -0
  170. package/dist/cjs/requests/repository.js +114 -0
  171. package/dist/cjs/requests/repository.js.map +1 -0
  172. package/dist/cjs/subscription-billing/dunning.js +26 -0
  173. package/dist/cjs/subscription-billing/dunning.js.map +1 -0
  174. package/dist/cjs/subscription-billing/events.js +45 -0
  175. package/dist/cjs/subscription-billing/events.js.map +1 -0
  176. package/dist/cjs/subscription-billing/index.js +62 -0
  177. package/dist/cjs/subscription-billing/index.js.map +1 -0
  178. package/dist/cjs/subscription-billing/plans.js +88 -0
  179. package/dist/cjs/subscription-billing/plans.js.map +1 -0
  180. package/dist/cjs/subscription-billing/product-config.js +54 -0
  181. package/dist/cjs/subscription-billing/product-config.js.map +1 -0
  182. package/dist/cjs/subscription-billing/provider/asaas.js +233 -0
  183. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -0
  184. package/dist/cjs/subscription-billing/provider/disabled.js +46 -0
  185. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -0
  186. package/dist/cjs/subscription-billing/provider/registry.js +29 -0
  187. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -0
  188. package/dist/cjs/subscription-billing/reconcile.js +198 -0
  189. package/dist/cjs/subscription-billing/reconcile.js.map +1 -0
  190. package/dist/cjs/subscription-billing/repository.js +359 -0
  191. package/dist/cjs/subscription-billing/repository.js.map +1 -0
  192. package/dist/cjs/subscription-billing/service.js +838 -0
  193. package/dist/cjs/subscription-billing/service.js.map +1 -0
  194. package/dist/cjs/subscription-billing/types.js +28 -0
  195. package/dist/cjs/subscription-billing/types.js.map +1 -0
  196. package/dist/cjs/tenancy/provisioning.js +126 -0
  197. package/dist/cjs/tenancy/provisioning.js.map +1 -0
  198. package/dist/cjs/users/repository.js +83 -0
  199. package/dist/cjs/users/repository.js.map +1 -0
  200. package/dist/cjs/vault/crypto.js +94 -0
  201. package/dist/cjs/vault/crypto.js.map +1 -0
  202. package/dist/cjs/vault/repository.js +120 -0
  203. package/dist/cjs/vault/repository.js.map +1 -0
  204. package/dist/commercial-catalog/catalog.d.ts +27 -0
  205. package/dist/commercial-catalog/catalog.d.ts.map +1 -0
  206. package/dist/commercial-catalog/catalog.js +104 -0
  207. package/dist/commercial-catalog/catalog.js.map +1 -0
  208. package/dist/commercial-catalog/consumption-contracts.d.ts +33 -0
  209. package/dist/commercial-catalog/consumption-contracts.d.ts.map +1 -0
  210. package/dist/commercial-catalog/consumption-contracts.js +9 -0
  211. package/dist/commercial-catalog/consumption-contracts.js.map +1 -0
  212. package/dist/commercial-catalog/coupon.d.ts +27 -0
  213. package/dist/commercial-catalog/coupon.d.ts.map +1 -0
  214. package/dist/commercial-catalog/coupon.js +47 -0
  215. package/dist/commercial-catalog/coupon.js.map +1 -0
  216. package/dist/commercial-catalog/index.d.ts +10 -0
  217. package/dist/commercial-catalog/index.d.ts.map +1 -0
  218. package/dist/commercial-catalog/index.js +5 -0
  219. package/dist/commercial-catalog/index.js.map +1 -0
  220. package/dist/commercial-catalog/offer-application.d.ts +39 -0
  221. package/dist/commercial-catalog/offer-application.d.ts.map +1 -0
  222. package/dist/commercial-catalog/offer-application.js +50 -0
  223. package/dist/commercial-catalog/offer-application.js.map +1 -0
  224. package/dist/commercial-catalog/types.d.ts +155 -0
  225. package/dist/commercial-catalog/types.d.ts.map +1 -0
  226. package/dist/commercial-catalog/types.js +23 -0
  227. package/dist/commercial-catalog/types.js.map +1 -0
  228. package/dist/crm/repository.d.ts +109 -0
  229. package/dist/crm/repository.d.ts.map +1 -0
  230. package/dist/crm/repository.js +181 -0
  231. package/dist/crm/repository.js.map +1 -0
  232. package/dist/db/context.d.ts +2 -0
  233. package/dist/db/context.d.ts.map +1 -1
  234. package/dist/db/context.js +3 -0
  235. package/dist/db/context.js.map +1 -1
  236. package/dist/db/migrate.js +7 -2
  237. package/dist/db/migrate.js.map +1 -1
  238. package/dist/db/seed.js +4 -1
  239. package/dist/db/seed.js.map +1 -1
  240. package/dist/entitlements/decision.d.ts +86 -0
  241. package/dist/entitlements/decision.d.ts.map +1 -0
  242. package/dist/entitlements/decision.js +196 -0
  243. package/dist/entitlements/decision.js.map +1 -0
  244. package/dist/entitlements/derive.d.ts +30 -0
  245. package/dist/entitlements/derive.d.ts.map +1 -0
  246. package/dist/entitlements/derive.js +42 -0
  247. package/dist/entitlements/derive.js.map +1 -0
  248. package/dist/entitlements/index.d.ts +10 -0
  249. package/dist/entitlements/index.d.ts.map +1 -0
  250. package/dist/entitlements/index.js +7 -0
  251. package/dist/entitlements/index.js.map +1 -0
  252. package/dist/entitlements/sources.d.ts +30 -0
  253. package/dist/entitlements/sources.d.ts.map +1 -0
  254. package/dist/entitlements/sources.js +55 -0
  255. package/dist/entitlements/sources.js.map +1 -0
  256. package/dist/entitlements/standing.d.ts +22 -0
  257. package/dist/entitlements/standing.d.ts.map +1 -0
  258. package/dist/entitlements/standing.js +38 -0
  259. package/dist/entitlements/standing.js.map +1 -0
  260. package/dist/entitlements/types.d.ts +26 -0
  261. package/dist/entitlements/types.d.ts.map +1 -0
  262. package/dist/entitlements/types.js +15 -0
  263. package/dist/entitlements/types.js.map +1 -0
  264. package/dist/index.d.ts +74 -3
  265. package/dist/index.d.ts.map +1 -1
  266. package/dist/index.js +51 -4
  267. package/dist/index.js.map +1 -1
  268. package/dist/mail/dedup-store.d.ts +25 -0
  269. package/dist/mail/dedup-store.d.ts.map +1 -0
  270. package/dist/mail/dedup-store.js +51 -0
  271. package/dist/mail/dedup-store.js.map +1 -0
  272. package/dist/mail/index.d.ts +10 -0
  273. package/dist/mail/index.d.ts.map +1 -0
  274. package/dist/mail/index.js +9 -0
  275. package/dist/mail/index.js.map +1 -0
  276. package/dist/mail/provider.d.ts +31 -0
  277. package/dist/mail/provider.d.ts.map +1 -0
  278. package/dist/mail/provider.js +248 -0
  279. package/dist/mail/provider.js.map +1 -0
  280. package/dist/mail/resend-client.d.ts +16 -0
  281. package/dist/mail/resend-client.d.ts.map +1 -0
  282. package/dist/mail/resend-client.js +100 -0
  283. package/dist/mail/resend-client.js.map +1 -0
  284. package/dist/mail/resend.d.ts.map +1 -1
  285. package/dist/mail/resend.js +2 -0
  286. package/dist/mail/resend.js.map +1 -1
  287. package/dist/mail/sanitize.d.ts +17 -0
  288. package/dist/mail/sanitize.d.ts.map +1 -0
  289. package/dist/mail/sanitize.js +51 -0
  290. package/dist/mail/sanitize.js.map +1 -0
  291. package/dist/mail/sender-resolver.d.ts +8 -0
  292. package/dist/mail/sender-resolver.d.ts.map +1 -0
  293. package/dist/mail/sender-resolver.js +11 -0
  294. package/dist/mail/sender-resolver.js.map +1 -0
  295. package/dist/mail/template-renderer.d.ts +10 -0
  296. package/dist/mail/template-renderer.d.ts.map +1 -0
  297. package/dist/mail/template-renderer.js +17 -0
  298. package/dist/mail/template-renderer.js.map +1 -0
  299. package/dist/mail/types.d.ts +143 -0
  300. package/dist/mail/types.d.ts.map +1 -0
  301. package/dist/mail/types.js +34 -0
  302. package/dist/mail/types.js.map +1 -0
  303. package/dist/onboarding/domain.d.ts +146 -0
  304. package/dist/onboarding/domain.d.ts.map +1 -0
  305. package/dist/onboarding/domain.js +348 -0
  306. package/dist/onboarding/domain.js.map +1 -0
  307. package/dist/onboarding/interaction-review.d.ts +123 -0
  308. package/dist/onboarding/interaction-review.d.ts.map +1 -0
  309. package/dist/onboarding/interaction-review.js +413 -0
  310. package/dist/onboarding/interaction-review.js.map +1 -0
  311. package/dist/onboarding/persistence.d.ts +106 -0
  312. package/dist/onboarding/persistence.d.ts.map +1 -0
  313. package/dist/onboarding/persistence.js +430 -0
  314. package/dist/onboarding/persistence.js.map +1 -0
  315. package/dist/onboarding/portal-actions.d.ts +48 -0
  316. package/dist/onboarding/portal-actions.d.ts.map +1 -0
  317. package/dist/onboarding/portal-actions.js +153 -0
  318. package/dist/onboarding/portal-actions.js.map +1 -0
  319. package/dist/onboarding/portal.d.ts +58 -0
  320. package/dist/onboarding/portal.d.ts.map +1 -0
  321. package/dist/onboarding/portal.js +170 -0
  322. package/dist/onboarding/portal.js.map +1 -0
  323. package/dist/pricing-engine/bundle.d.ts +22 -0
  324. package/dist/pricing-engine/bundle.d.ts.map +1 -0
  325. package/dist/pricing-engine/bundle.js +44 -0
  326. package/dist/pricing-engine/bundle.js.map +1 -0
  327. package/dist/pricing-engine/errors.d.ts +32 -0
  328. package/dist/pricing-engine/errors.d.ts.map +1 -0
  329. package/dist/pricing-engine/errors.js +44 -0
  330. package/dist/pricing-engine/errors.js.map +1 -0
  331. package/dist/pricing-engine/index.d.ts +12 -0
  332. package/dist/pricing-engine/index.d.ts.map +1 -0
  333. package/dist/pricing-engine/index.js +8 -0
  334. package/dist/pricing-engine/index.js.map +1 -0
  335. package/dist/pricing-engine/money.d.ts +32 -0
  336. package/dist/pricing-engine/money.d.ts.map +1 -0
  337. package/dist/pricing-engine/money.js +58 -0
  338. package/dist/pricing-engine/money.js.map +1 -0
  339. package/dist/pricing-engine/pipeline.d.ts +3 -0
  340. package/dist/pricing-engine/pipeline.d.ts.map +1 -0
  341. package/dist/pricing-engine/pipeline.js +327 -0
  342. package/dist/pricing-engine/pipeline.js.map +1 -0
  343. package/dist/pricing-engine/proration.d.ts +3 -0
  344. package/dist/pricing-engine/proration.d.ts.map +1 -0
  345. package/dist/pricing-engine/proration.js +50 -0
  346. package/dist/pricing-engine/proration.js.map +1 -0
  347. package/dist/pricing-engine/shadow.d.ts +51 -0
  348. package/dist/pricing-engine/shadow.d.ts.map +1 -0
  349. package/dist/pricing-engine/shadow.js +54 -0
  350. package/dist/pricing-engine/shadow.js.map +1 -0
  351. package/dist/pricing-engine/types.d.ts +184 -0
  352. package/dist/pricing-engine/types.d.ts.map +1 -0
  353. package/dist/pricing-engine/types.js +31 -0
  354. package/dist/pricing-engine/types.js.map +1 -0
  355. package/dist/rbac/authorize.d.ts +3 -6
  356. package/dist/rbac/authorize.d.ts.map +1 -1
  357. package/dist/rbac/authorize.js +4 -8
  358. package/dist/rbac/authorize.js.map +1 -1
  359. package/dist/rbac/catalog.d.ts.map +1 -1
  360. package/dist/rbac/catalog.js +414 -21
  361. package/dist/rbac/catalog.js.map +1 -1
  362. package/dist/subscription-billing/dunning.d.ts +18 -0
  363. package/dist/subscription-billing/dunning.d.ts.map +1 -0
  364. package/dist/subscription-billing/dunning.js +28 -0
  365. package/dist/subscription-billing/dunning.js.map +1 -0
  366. package/dist/subscription-billing/events.d.ts +58 -0
  367. package/dist/subscription-billing/events.d.ts.map +1 -0
  368. package/dist/subscription-billing/events.js +38 -0
  369. package/dist/subscription-billing/events.js.map +1 -0
  370. package/dist/subscription-billing/index.d.ts +18 -0
  371. package/dist/subscription-billing/index.d.ts.map +1 -0
  372. package/dist/subscription-billing/index.js +16 -0
  373. package/dist/subscription-billing/index.js.map +1 -0
  374. package/dist/subscription-billing/plans.d.ts +34 -0
  375. package/dist/subscription-billing/plans.d.ts.map +1 -0
  376. package/dist/subscription-billing/plans.js +85 -0
  377. package/dist/subscription-billing/plans.js.map +1 -0
  378. package/dist/subscription-billing/product-config.d.ts +61 -0
  379. package/dist/subscription-billing/product-config.d.ts.map +1 -0
  380. package/dist/subscription-billing/product-config.js +50 -0
  381. package/dist/subscription-billing/product-config.js.map +1 -0
  382. package/dist/subscription-billing/provider/asaas.d.ts +26 -0
  383. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -0
  384. package/dist/subscription-billing/provider/asaas.js +229 -0
  385. package/dist/subscription-billing/provider/asaas.js.map +1 -0
  386. package/dist/subscription-billing/provider/disabled.d.ts +30 -0
  387. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -0
  388. package/dist/subscription-billing/provider/disabled.js +42 -0
  389. package/dist/subscription-billing/provider/disabled.js.map +1 -0
  390. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  391. package/dist/subscription-billing/provider/registry.d.ts.map +1 -0
  392. package/dist/subscription-billing/provider/registry.js +26 -0
  393. package/dist/subscription-billing/provider/registry.js.map +1 -0
  394. package/dist/subscription-billing/reconcile.d.ts +45 -0
  395. package/dist/subscription-billing/reconcile.d.ts.map +1 -0
  396. package/dist/subscription-billing/reconcile.js +192 -0
  397. package/dist/subscription-billing/reconcile.js.map +1 -0
  398. package/dist/subscription-billing/repository.d.ts +168 -0
  399. package/dist/subscription-billing/repository.d.ts.map +1 -0
  400. package/dist/subscription-billing/repository.js +336 -0
  401. package/dist/subscription-billing/repository.js.map +1 -0
  402. package/dist/subscription-billing/service.d.ts +175 -0
  403. package/dist/subscription-billing/service.d.ts.map +1 -0
  404. package/dist/subscription-billing/service.js +818 -0
  405. package/dist/subscription-billing/service.js.map +1 -0
  406. package/dist/subscription-billing/types.d.ts +161 -0
  407. package/dist/subscription-billing/types.d.ts.map +1 -0
  408. package/dist/subscription-billing/types.js +24 -0
  409. package/dist/subscription-billing/types.js.map +1 -0
  410. package/dist/vault/crypto.d.ts +22 -0
  411. package/dist/vault/crypto.d.ts.map +1 -0
  412. package/dist/vault/crypto.js +88 -0
  413. package/dist/vault/crypto.js.map +1 -0
  414. package/dist/vault/repository.d.ts +45 -0
  415. package/dist/vault/repository.d.ts.map +1 -0
  416. package/dist/vault/repository.js +111 -0
  417. package/dist/vault/repository.js.map +1 -0
  418. package/package.json +23 -13
  419. package/src/db/migrations/0012_vault.sql +51 -0
  420. package/src/db/migrations/0013_crm.sql +67 -0
  421. package/src/db/migrations/0014_billing.sql +146 -0
  422. package/src/db/migrations/0015_merchant_billing_ar.sql +201 -0
  423. package/src/db/migrations/0016_office_onboarding.sql +162 -0
  424. package/src/db/migrations/0017_office_onboarding_api.sql +21 -0
  425. package/src/db/migrations/0018_office_onboarding_portal_actions.sql +60 -0
  426. package/src/db/migrations/0019_office_onboarding_interaction_review.sql +134 -0
  427. package/src/db/migrations/0020_saas_billing.sql +157 -0
  428. package/src/db/migrations/0021_saas_billing_indexes.sql +23 -0
  429. package/src/db/migrations/0022_saas_billing_multi_product.sql +75 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Provider `disabled` — estado de primeira classe (RFC §7): sem apiKey
3
+ * configurada, o registry resolve para este stub. NUNCA toca a rede, nunca
4
+ * cobra. Preserva o comportamento de dry-run que o `dental-platform-engine`
5
+ * ja usa em producao hoje (RFC §3).
6
+ *
7
+ * `name` e injetavel (default `'disabled'`) para preservar qual provider FOI
8
+ * PEDIDO mesmo sem chave configurada (ex.: `resolveSubscriptionBillingProvider('asaas', {})`
9
+ * → `name: 'asaas'`) — o Golden Project (`dental`) grava `provider.name` em registros
10
+ * de DB (`CheckoutSession`, `BillingCustomer` etc.) e precisa do nome pedido, nao do
11
+ * literal `'disabled'`, para manter consistencia quando a chave for configurada depois.
12
+ */
13
+ export class DisabledSubscriptionProvider {
14
+ name;
15
+ mode = 'disabled';
16
+ constructor(name = 'disabled') {
17
+ this.name = name;
18
+ }
19
+ /**
20
+ * Lanca erro deliberadamente (nao devolve stub) — contrato ja validado e testado no
21
+ * Golden Project (`dental-platform-engine`, RFC §10): `ensureCustomer` so e chamado
22
+ * apos o chamador checar `mode !== 'disabled'`; chegar aqui e um bug de chamada, e
23
+ * falhar alto e melhor do que persistir um `externalId` fake que parece real.
24
+ */
25
+ async ensureCustomer(_input) {
26
+ void _input;
27
+ throw new Error('Gateway de pagamento nao configurado (modo desabilitado).');
28
+ }
29
+ async createCheckout(_input) {
30
+ return { externalId: null, url: null };
31
+ }
32
+ async getPayment(_externalId) {
33
+ return null;
34
+ }
35
+ verifyWebhook(_headers, _rawBody) {
36
+ return false; // nenhum webhook e confiavel quando desabilitado — nao ha token para validar
37
+ }
38
+ parseWebhookEvent(_payload) {
39
+ return null;
40
+ }
41
+ }
42
+ //# sourceMappingURL=disabled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disabled.js","sourceRoot":"","sources":["../../../src/subscription-billing/provider/disabled.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,4BAA4B;IAC9B,IAAI,CAAS;IACb,IAAI,GAAG,UAAmB,CAAC;IAEpC,YAAY,IAAI,GAAG,UAAU;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,MAA2B;QAC9C,KAAK,MAAM,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAA2B;QAC9C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,QAAwB,EAAE,QAAgB;QACtD,OAAO,KAAK,CAAC,CAAC,6EAA6E;IAC7F,CAAC;IAED,iBAAiB,CAAC,QAAiB;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { PaymentGatewayProvider, SubscriptionProviderConfig } from '../types.js';
2
+ export type SubscriptionProviderFactory = (config: SubscriptionProviderConfig) => PaymentGatewayProvider;
3
+ /**
4
+ * Resolve o Provider por nome (RFC §7) — nenhum outro modulo importa
5
+ * `provider/asaas.ts` diretamente. Sem `apiKey` configurada, resolve para
6
+ * `disabled` automaticamente, independente do nome pedido — nunca cobra por
7
+ * falta de configuracao (mesmo padrao best-effort de `cap.communication.transactional-email`).
8
+ */
9
+ export declare function resolveSubscriptionBillingProvider(name: string, config: SubscriptionProviderConfig): PaymentGatewayProvider;
10
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/subscription-billing/provider/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAItF,MAAM,MAAM,2BAA2B,GAAG,CAAC,MAAM,EAAE,0BAA0B,KAAK,sBAAsB,CAAC;AAOzG;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,0BAA0B,GAAG,sBAAsB,CAW3H"}
@@ -0,0 +1,26 @@
1
+ import { ValidationError } from '@baruk/shared';
2
+ import { AsaasSubscriptionProvider } from './asaas.js';
3
+ import { DisabledSubscriptionProvider } from './disabled.js';
4
+ const FACTORIES = {
5
+ asaas: (config) => new AsaasSubscriptionProvider(config),
6
+ disabled: () => new DisabledSubscriptionProvider(),
7
+ };
8
+ /**
9
+ * Resolve o Provider por nome (RFC §7) — nenhum outro modulo importa
10
+ * `provider/asaas.ts` diretamente. Sem `apiKey` configurada, resolve para
11
+ * `disabled` automaticamente, independente do nome pedido — nunca cobra por
12
+ * falta de configuracao (mesmo padrao best-effort de `cap.communication.transactional-email`).
13
+ */
14
+ export function resolveSubscriptionBillingProvider(name, config) {
15
+ if (!config.apiKey || config.mode === 'disabled') {
16
+ // Preserva o nome pedido mesmo desabilitado (ver `disabled.ts`) — consumidores que
17
+ // gravam `provider.name` em DB precisam do nome configurado, nao do literal `'disabled'`.
18
+ return new DisabledSubscriptionProvider(name);
19
+ }
20
+ const factory = FACTORIES[name];
21
+ if (!factory) {
22
+ throw new ValidationError(`Provider de pagamento desconhecido: "${name}".`);
23
+ }
24
+ return factory(config);
25
+ }
26
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/subscription-billing/provider/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAI7D,MAAM,SAAS,GAAgD;IAC7D,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,yBAAyB,CAAC,MAAM,CAAC;IACxD,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,4BAA4B,EAAE;CACnD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,kCAAkC,CAAC,IAAY,EAAE,MAAkC;IACjG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACjD,mFAAmF;QACnF,0FAA0F;QAC1F,OAAO,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,eAAe,CAAC,wCAAwC,IAAI,IAAI,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { type DomainEvent } from './events.js';
2
+ import type { NormalizedWebhookEvent, Subscription } from './types.js';
3
+ /**
4
+ * Reconciliacao da Assinatura (RFC §6/§9) — PURA e deterministica, sem I/O, sem
5
+ * `Date.now()` interno (o instante e sempre injetado). Generaliza
6
+ * `reconcileInternalPlan`/`applyEffects` do `dental-platform-engine` (RFC §3), mas
7
+ * sem Prisma/DB: quem persiste (decisao de v0.2, `CAPABILITY_LIFECYCLE.md` Etapa 3
8
+ * ainda em aberto para isso) chama esta funcao com o estado atual carregado e
9
+ * grava o `next` devolvido.
10
+ *
11
+ * IDEMPOTENCIA REAL (dedup por `externalEventId`) e responsabilidade de quem
12
+ * persiste — mesmo padrao do dental (`webhookEvent.create`, unique constraint,
13
+ * ANTES de reconciliar). Esta funcao garante uma propriedade mais fraca e testavel
14
+ * sem DB: reaplicar um evento cujo efeito ja esta refletido no estado atual e um
15
+ * no-op (nenhum DomainEvent novo, `next === current` em conteudo).
16
+ */
17
+ export interface ReconcileInput {
18
+ /** `null` = nenhuma assinatura ainda para este tenant. */
19
+ current: Subscription | null;
20
+ tenantId: string;
21
+ /** Resolvido externamente (payment-link → CheckoutSession, externalReference etc. — fora desta fase). */
22
+ planKey: string | null;
23
+ event: NormalizedWebhookEvent;
24
+ /** Instante do fato, ISO — injetado (nunca `Date.now()` aqui). */
25
+ now: string;
26
+ }
27
+ export interface ReconcileResult {
28
+ subscription: Subscription;
29
+ domainEvents: DomainEvent[];
30
+ }
31
+ /**
32
+ * Aplica um evento normalizado de webhook a uma Assinatura. Espelha as regras do
33
+ * dental (RFC §3/§9): (a) a Assinatura interna nunca e criada `canceled`/`past_due`
34
+ * do nada — so atualiza uma existente; (b) `received`/`confirmed` ativa/renova;
35
+ * (c) `planKey` desconhecido → nenhuma reconciliacao (preserva assinaturas de
36
+ * plano-default), sem erro.
37
+ */
38
+ export declare function applySubscriptionEvent(input: ReconcileInput): ReconcileResult;
39
+ /** Muda de plano uma assinatura ATIVA (upgrade/downgrade) — proração fica para v0.2 (RFC §12). */
40
+ export declare function changePlan(current: Subscription, newPlanKey: string, now: string): ReconcileResult;
41
+ /** Cancela uma assinatura. Politica imediato-vs-fim-de-periodo fica para v0.2 (RFC §12) — v0.1 e imediato. */
42
+ export declare function cancelSubscription(current: Subscription, now: string): ReconcileResult;
43
+ /** Inicia um trial (RFC §6/§8) — assinatura nova, sem cobranca ainda. */
44
+ export declare function startTrial(tenantId: string, planKey: string, trialEndsAt: string, now: string): ReconcileResult;
45
+ //# sourceMappingURL=reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/subscription-billing/reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,sBAAsB,EAAE,YAAY,EAAoB,MAAM,YAAY,CAAC;AAEzF;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,yGAAyG;IACzG,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,sBAAsB,CAAC;IAC9B,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AA0CD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAqF7E;AAmBD,kGAAkG;AAClG,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CAclG;AAED,8GAA8G;AAC9G,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CAatF;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CAuB/G"}
@@ -0,0 +1,192 @@
1
+ import { createDomainEvent } from './events.js';
2
+ function newSubscriptionId(tenantId) {
3
+ return `sub_${tenantId}`;
4
+ }
5
+ function itemsFor(planKey) {
6
+ return [{ planKey, quantity: 1 }];
7
+ }
8
+ /**
9
+ * Guard defensivo (Design Review pos-implementacao, achado pre-Golden-Project): v0.1
10
+ * so suporta exatamente 1 item por assinatura, apesar de `items[]` ja ter a forma
11
+ * preparada para o futuro (RFC §12.5/§13, ver `types.ts`). Falha alto e cedo em vez
12
+ * de reconciliar silenciosamente um estado que a v0.1 nao sabe tratar corretamente —
13
+ * multi-item e decisao de v0.2, nao implementada aqui.
14
+ */
15
+ function assertSingleItemCardinality(items) {
16
+ if (items.length > 1) {
17
+ throw new Error(`subscription-billing v0.1: suporta apenas 1 item por assinatura (recebeu ${items.length}). Multi-item e decisao de v0.2 (RFC §12.5).`);
18
+ }
19
+ }
20
+ /**
21
+ * Normaliza data pura (`YYYY-MM-DD`) ou datetime ISO completo para um `Date` comparavel.
22
+ * Existe porque `currentPeriodEnd` e sempre `YYYY-MM-DD` (ver `types.ts`) mas `now` pode
23
+ * chegar como datetime ISO completo dependendo do chamador — comparar as duas strings
24
+ * diretamente (`currentPeriodEnd >= now`) e uma comparacao lexicografica INCORRETA
25
+ * quando os formatos divergem (achado do Design Review pos-implementacao, pre-Golden-Project).
26
+ */
27
+ function parseIso(iso) {
28
+ return /^\d{4}-\d{2}-\d{2}$/.test(iso) ? new Date(`${iso}T00:00:00Z`) : new Date(iso);
29
+ }
30
+ function addOneMonth(iso) {
31
+ const d = parseIso(iso);
32
+ d.setUTCMonth(d.getUTCMonth() + 1);
33
+ return d.toISOString().slice(0, 10);
34
+ }
35
+ /**
36
+ * Aplica um evento normalizado de webhook a uma Assinatura. Espelha as regras do
37
+ * dental (RFC §3/§9): (a) a Assinatura interna nunca e criada `canceled`/`past_due`
38
+ * do nada — so atualiza uma existente; (b) `received`/`confirmed` ativa/renova;
39
+ * (c) `planKey` desconhecido → nenhuma reconciliacao (preserva assinaturas de
40
+ * plano-default), sem erro.
41
+ */
42
+ export function applySubscriptionEvent(input) {
43
+ const { current, tenantId, planKey, event, now } = input;
44
+ if (current)
45
+ assertSingleItemCardinality(current.items);
46
+ const baseSequence = current?.sequence ?? 0;
47
+ const domainEvents = [];
48
+ const causationEventId = event.externalEventId;
49
+ function emit(type, data, subscriptionId) {
50
+ const ev = createDomainEvent({
51
+ type,
52
+ subscriptionId,
53
+ tenantId,
54
+ previousSequence: baseSequence + domainEvents.length,
55
+ occurredAt: now,
56
+ causationEventId,
57
+ data,
58
+ });
59
+ domainEvents.push(ev);
60
+ return ev;
61
+ }
62
+ if (event.kind === 'invoice' && event.invoice) {
63
+ const inv = event.invoice;
64
+ if (inv.status === 'received' || inv.status === 'confirmed') {
65
+ if (!planKey) {
66
+ // Plano desconhecido: nao ha o que ativar com confianca — no-op (RFC §9, guarda do dental).
67
+ return { subscription: current ?? placeholderSubscription(tenantId, now), domainEvents: [] };
68
+ }
69
+ const subscriptionId = current?.subscriptionId ?? newSubscriptionId(tenantId);
70
+ const wasNewOrDormant = !current || current.status === 'canceled' || current.status === 'past_due';
71
+ const wasTrialing = current?.status === 'trialing';
72
+ const wasAlreadyActiveThisPeriod = current?.status === 'active' &&
73
+ current.currentPeriodEnd != null &&
74
+ parseIso(current.currentPeriodEnd).getTime() >= parseIso(now).getTime();
75
+ if (wasAlreadyActiveThisPeriod) {
76
+ // Idempotencia de dominio: efeito ja refletido no estado atual — no-op.
77
+ return { subscription: current, domainEvents: [] };
78
+ }
79
+ const next = {
80
+ subscriptionId,
81
+ tenantId,
82
+ items: itemsFor(planKey),
83
+ status: 'active',
84
+ currentPeriodEnd: addOneMonth(now),
85
+ trialEndsAt: current?.trialEndsAt ?? null,
86
+ sequence: baseSequence,
87
+ canceledAt: null,
88
+ };
89
+ if (wasNewOrDormant || wasTrialing) {
90
+ emit('subscription.activated', { planKey, invoiceExternalId: inv.externalId }, subscriptionId);
91
+ }
92
+ else {
93
+ emit('subscription.renewed', { planKey, invoiceExternalId: inv.externalId }, subscriptionId);
94
+ }
95
+ emit('invoice.paid', { invoiceExternalId: inv.externalId, value: inv.value }, subscriptionId);
96
+ return { subscription: withSequence(next, baseSequence + domainEvents.length), domainEvents };
97
+ }
98
+ if (inv.status === 'overdue') {
99
+ if (!current || current.status === 'canceled')
100
+ return { subscription: current ?? placeholderSubscription(tenantId, now), domainEvents: [] };
101
+ if (current.status === 'past_due')
102
+ return { subscription: current, domainEvents: [] }; // ja refletido — no-op
103
+ const next = { ...current, status: 'past_due' };
104
+ emit('subscription.past_due', { invoiceExternalId: inv.externalId }, current.subscriptionId);
105
+ return { subscription: withSequence(next, baseSequence + domainEvents.length), domainEvents };
106
+ }
107
+ if (inv.status === 'refunded' || inv.status === 'canceled') {
108
+ if (!current || current.status === 'canceled')
109
+ return { subscription: current ?? placeholderSubscription(tenantId, now), domainEvents: [] };
110
+ const next = { ...current, status: 'canceled', canceledAt: now };
111
+ if (inv.status === 'refunded')
112
+ emit('invoice.refunded', { invoiceExternalId: inv.externalId }, current.subscriptionId);
113
+ emit('subscription.canceled', { reason: inv.status }, current.subscriptionId);
114
+ return { subscription: withSequence(next, baseSequence + domainEvents.length), domainEvents };
115
+ }
116
+ }
117
+ // 'pending'/'failed' ou evento nao-invoice: sem reconciliacao de estado nesta v0.1
118
+ // (taxonomia completa de payment_failed → dunning fica para v0.2, RFC §12).
119
+ return { subscription: current ?? placeholderSubscription(tenantId, now), domainEvents: [] };
120
+ }
121
+ function withSequence(sub, sequence) {
122
+ return { ...sub, sequence };
123
+ }
124
+ function placeholderSubscription(tenantId, now) {
125
+ return {
126
+ subscriptionId: newSubscriptionId(tenantId),
127
+ tenantId,
128
+ items: [],
129
+ status: 'canceled',
130
+ currentPeriodEnd: null,
131
+ trialEndsAt: null,
132
+ sequence: 0,
133
+ canceledAt: now,
134
+ };
135
+ }
136
+ /** Muda de plano uma assinatura ATIVA (upgrade/downgrade) — proração fica para v0.2 (RFC §12). */
137
+ export function changePlan(current, newPlanKey, now) {
138
+ assertSingleItemCardinality(current.items);
139
+ const domainEvents = [
140
+ createDomainEvent({
141
+ type: 'subscription.plan_changed',
142
+ subscriptionId: current.subscriptionId,
143
+ tenantId: current.tenantId,
144
+ previousSequence: current.sequence,
145
+ occurredAt: now,
146
+ data: { fromPlanKey: current.items[0]?.planKey ?? null, toPlanKey: newPlanKey },
147
+ }),
148
+ ];
149
+ const next = { ...current, items: itemsFor(newPlanKey), sequence: current.sequence + 1 };
150
+ return { subscription: next, domainEvents };
151
+ }
152
+ /** Cancela uma assinatura. Politica imediato-vs-fim-de-periodo fica para v0.2 (RFC §12) — v0.1 e imediato. */
153
+ export function cancelSubscription(current, now) {
154
+ const domainEvents = [
155
+ createDomainEvent({
156
+ type: 'subscription.canceled',
157
+ subscriptionId: current.subscriptionId,
158
+ tenantId: current.tenantId,
159
+ previousSequence: current.sequence,
160
+ occurredAt: now,
161
+ data: { reason: 'requested' },
162
+ }),
163
+ ];
164
+ const next = { ...current, status: 'canceled', canceledAt: now, sequence: current.sequence + 1 };
165
+ return { subscription: next, domainEvents };
166
+ }
167
+ /** Inicia um trial (RFC §6/§8) — assinatura nova, sem cobranca ainda. */
168
+ export function startTrial(tenantId, planKey, trialEndsAt, now) {
169
+ const subscriptionId = newSubscriptionId(tenantId);
170
+ const domainEvents = [
171
+ createDomainEvent({
172
+ type: 'subscription.trial_started',
173
+ subscriptionId,
174
+ tenantId,
175
+ previousSequence: 0,
176
+ occurredAt: now,
177
+ data: { planKey, trialEndsAt },
178
+ }),
179
+ ];
180
+ const subscription = {
181
+ subscriptionId,
182
+ tenantId,
183
+ items: itemsFor(planKey),
184
+ status: 'trialing',
185
+ currentPeriodEnd: null,
186
+ trialEndsAt,
187
+ sequence: 1,
188
+ canceledAt: null,
189
+ };
190
+ return { subscription, domainEvents };
191
+ }
192
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/subscription-billing/reconcile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ import type { Db, Tx } from '../db/client.js';
2
+ import type { DomainEvent } from './events.js';
3
+ import type { NormalizedInvoiceStatus, Subscription, SubscriptionStatus } from './types.js';
4
+ import { type SaasPlanDef } from './plans.js';
5
+ /**
6
+ * Persistência do Billing SaaS (Concern A) — migração 0020. Espelha o domínio
7
+ * puro de `reconcile.ts`: quem chama carrega o estado atual, aplica a função
8
+ * pura e grava o `next` devolvido por aqui. Idempotência real (dedup por
9
+ * `externalEventId`) vive em `saas_webhook_event` (unique) — ver `service.ts`.
10
+ *
11
+ * Convenção de contexto: funções que recebem `Tx` assumem GUC de tenant OU de
12
+ * operadora já setada (RLS decide); funções que recebem `Db` são globais
13
+ * (catálogo de planos) ou cross-tenant sem RLS (webhook inbound).
14
+ */
15
+ export interface SaasPlanRow {
16
+ /** Produto dono do plano (`product.key`) — ver migração 0022. */
17
+ productKey: string;
18
+ key: string;
19
+ name: string;
20
+ description: string | null;
21
+ amountCents: number;
22
+ currency: string;
23
+ periodicity: 'monthly' | 'quarterly' | 'yearly';
24
+ trialDays: number;
25
+ modules: string[];
26
+ limits: Record<string, number>;
27
+ isPublic: boolean;
28
+ isActive: boolean;
29
+ sortOrder: number;
30
+ }
31
+ /** Materializa o catálogo de planos (seed idempotente — atualiza os campos comerciais). */
32
+ export declare function ensureSaasPlanCatalog(db: Db, plans: readonly SaasPlanDef[]): Promise<void>;
33
+ /**
34
+ * Planos públicos de UM produto. O filtro é obrigatório por construção (com
35
+ * default) para que nenhuma superfície comercial liste, por descuido, o
36
+ * catálogo de outro produto do ecossistema.
37
+ */
38
+ export declare function listPublicPlans(db: Db, productKey?: string): Promise<SaasPlanRow[]>;
39
+ export declare function getPlan(db: Db, key: string, productKey?: string): Promise<SaasPlanRow | null>;
40
+ /**
41
+ * Executa `fn` em transação com a GUC `app.platform_operator` setada — habilita
42
+ * as policies `*_operator` (0020) para leitura/escrita cross-tenant SEM abrir mão
43
+ * da RLS FORCE. Uso EXCLUSIVO: rotas de backoffice (após verificação de operador)
44
+ * e o cron de billing. Nunca exposto a request de tenant.
45
+ */
46
+ export declare function withOperatorContext<T>(db: Db, fn: (tx: Tx) => Promise<T>): Promise<T>;
47
+ /**
48
+ * Serializa escritores de billing do MESMO tenant (webhook × webhook, webhook ×
49
+ * cron, gestão × webhook) via advisory lock transacional — elimina lost update
50
+ * de `sequence`/status sem lock global. Chamar como PRIMEIRA instrução da tx.
51
+ */
52
+ export declare function lockTenantBilling(tx: Tx, tenantId: string): Promise<void>;
53
+ export interface SubscriptionRow extends Subscription {
54
+ /** id físico (uuid) da linha — `subscriptionId` do domínio é `sub_<tenantId>`. */
55
+ rowId: string;
56
+ /** Produto dono da assinatura (`product.key`) — migração 0022. */
57
+ productKey: string;
58
+ planKey: string;
59
+ provider: string | null;
60
+ providerCustomerId: string | null;
61
+ providerSubscriptionId: string | null;
62
+ }
63
+ /**
64
+ * Assinatura do tenant do contexto atual PARA UM PRODUTO (RLS decide a
65
+ * visibilidade). Desde a migração 0022 a unicidade é `(tenant_id, product_key)`
66
+ * — filtrar por produto é obrigatório, senão um tenant com dois produtos leria
67
+ * a assinatura errada (a primeira que o Postgres devolvesse).
68
+ */
69
+ export declare function getSubscription(tx: Tx, productKey?: string): Promise<SubscriptionRow | null>;
70
+ export declare function getSubscriptionByTenant(tx: Tx, tenantId: string, productKey?: string): Promise<SubscriptionRow | null>;
71
+ export interface UpsertSubscriptionInput {
72
+ tenantId: string;
73
+ /** Produto dono da assinatura. Ausente = `contabil` (migração 0022). */
74
+ productKey?: string;
75
+ planKey: string;
76
+ subscription: Subscription;
77
+ provider?: string | null;
78
+ providerCustomerId?: string | null;
79
+ providerSubscriptionId?: string | null;
80
+ }
81
+ /** Grava o `next` devolvido pelo domínio puro (upsert pela invariante 1-por-tenant-e-produto). */
82
+ export declare function upsertSubscription(tx: Tx, input: UpsertSubscriptionInput): Promise<SubscriptionRow>;
83
+ /** Atualiza SOMENTE as referências de provider (checkout) — nunca o estado da assinatura. */
84
+ export declare function setSubscriptionProviderRefs(tx: Tx, tenantId: string, provider: string, providerCustomerId: string): Promise<void>;
85
+ export declare function appendDomainEvents(tx: Tx, subscriptionRowId: string, events: readonly DomainEvent[]): Promise<void>;
86
+ export interface BillingEventRow {
87
+ eventId: string;
88
+ type: string;
89
+ sequence: number;
90
+ occurredAt: string;
91
+ data: Record<string, unknown>;
92
+ }
93
+ export declare function listBillingEvents(tx: Tx, limit?: number): Promise<BillingEventRow[]>;
94
+ export interface SaasInvoiceInput {
95
+ tenantId: string;
96
+ subscriptionRowId: string | null;
97
+ provider: string;
98
+ externalId: string;
99
+ status: NormalizedInvoiceStatus;
100
+ amountCents: number;
101
+ dueDate?: string | null;
102
+ paidAt?: string | null;
103
+ invoiceUrl?: string | null;
104
+ description?: string | null;
105
+ }
106
+ /** Espelha (upsert) uma fatura do gateway — idempotente por (provider, external_id). */
107
+ export declare function upsertInvoice(tx: Tx, input: SaasInvoiceInput): Promise<void>;
108
+ export interface SaasInvoiceRow {
109
+ id: string;
110
+ provider: string;
111
+ externalId: string;
112
+ status: NormalizedInvoiceStatus;
113
+ amountCents: number;
114
+ dueDate: string | null;
115
+ paidAt: string | null;
116
+ invoiceUrl: string | null;
117
+ description: string | null;
118
+ createdAt: string;
119
+ }
120
+ export declare function listInvoices(tx: Tx, limit?: number): Promise<SaasInvoiceRow[]>;
121
+ export interface InsertWebhookEventInput {
122
+ provider: string;
123
+ externalEventId: string;
124
+ eventType: string;
125
+ payload: unknown;
126
+ }
127
+ /**
128
+ * Persiste o evento inbound com dedup por (provider, external_event_id).
129
+ * Retorna o id quando é a PRIMEIRA vez (deve processar) ou null quando duplicado
130
+ * (já recebido — responder 200 e ignorar, regra do 07-billing §6.1).
131
+ */
132
+ export declare function insertWebhookEvent(db: Db, input: InsertWebhookEventInput): Promise<string | null>;
133
+ export declare function markWebhookEvent(db: Db, id: string, status: 'processed' | 'ignored' | 'failed', tenantId?: string | null, error?: string | null): Promise<void>;
134
+ export declare function listExecutedDunningSteps(tx: Tx, subscriptionRowId: string, referenceDate: string): Promise<Set<string>>;
135
+ export declare function recordDunningStep(tx: Tx, input: {
136
+ tenantId: string;
137
+ subscriptionRowId: string;
138
+ stepKey: string;
139
+ referenceDate: string;
140
+ }): Promise<void>;
141
+ export interface BackofficeSubscriptionRow extends SubscriptionRow {
142
+ tenantCode: string;
143
+ tenantName: string;
144
+ tenantStatus: string;
145
+ }
146
+ export declare function listAllSubscriptions(tx: Tx, filter?: {
147
+ status?: SubscriptionStatus;
148
+ limit?: number;
149
+ offset?: number;
150
+ }): Promise<BackofficeSubscriptionRow[]>;
151
+ export interface BackofficeSummary {
152
+ total: number;
153
+ byStatus: Record<string, number>;
154
+ mrrCents: number;
155
+ }
156
+ /** Resumo da operadora: contagem por status + MRR (planos mensais ativos; anuais /12). */
157
+ export declare function backofficeSummary(tx: Tx): Promise<BackofficeSummary>;
158
+ /** Assinaturas que o cron precisa examinar (trial vencendo/vencido, período vencido, past_due). */
159
+ export declare function listSubscriptionsForCron(tx: Tx, today: string): Promise<SubscriptionRow[]>;
160
+ export interface FailedWebhookEventRow {
161
+ id: string;
162
+ provider: string;
163
+ externalEventId: string;
164
+ payload: unknown;
165
+ }
166
+ /** Eventos `failed` recentes (7 dias) para reprocessamento pelo cron. */
167
+ export declare function listFailedWebhookEvents(db: Db, limit?: number): Promise<FailedWebhookEventRow[]>;
168
+ //# sourceMappingURL=repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/subscription-billing/repository.ts"],"names":[],"mappings":"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"}