@baruk/core 0.1.0 → 0.3.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 +63 -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 +43 -0
  213. package/dist/commercial-catalog/coupon.d.ts.map +1 -0
  214. package/dist/commercial-catalog/coupon.js +57 -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 +175 -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,336 @@
1
+ import { uuidv7 } from '@baruk/shared';
2
+ import { DEFAULT_PRODUCT_KEY } from './plans.js';
3
+ function parseJsonb(value, fallback) {
4
+ if (value == null)
5
+ return fallback;
6
+ if (typeof value === 'string') {
7
+ try {
8
+ return JSON.parse(value);
9
+ }
10
+ catch {
11
+ return fallback;
12
+ }
13
+ }
14
+ return value;
15
+ }
16
+ function mapPlan(r) {
17
+ return {
18
+ productKey: r.product_key ?? DEFAULT_PRODUCT_KEY,
19
+ key: r.key,
20
+ name: r.name,
21
+ description: r.description ?? null,
22
+ amountCents: Number(r.amount_cents),
23
+ currency: r.currency,
24
+ periodicity: r.periodicity,
25
+ trialDays: Number(r.trial_days),
26
+ modules: parseJsonb(r.modules, []),
27
+ limits: parseJsonb(r.limits, {}),
28
+ isPublic: Boolean(r.is_public),
29
+ isActive: Boolean(r.is_active),
30
+ sortOrder: Number(r.sort_order),
31
+ };
32
+ }
33
+ /** Materializa o catálogo de planos (seed idempotente — atualiza os campos comerciais). */
34
+ export async function ensureSaasPlanCatalog(db, plans) {
35
+ for (const p of plans) {
36
+ await db `
37
+ INSERT INTO saas_plan (id, product_key, key, name, description, amount_cents, periodicity, trial_days,
38
+ modules, limits, is_public, is_active, sort_order)
39
+ VALUES (${uuidv7()}, ${p.productKey ?? DEFAULT_PRODUCT_KEY}, ${p.key}, ${p.name}, ${p.description}, ${p.amountCents}, ${p.periodicity},
40
+ ${p.trialDays}, ${JSON.stringify(p.modules)}::jsonb, ${JSON.stringify(p.limits)}::jsonb,
41
+ ${p.isPublic}, ${p.isActive}, ${p.sortOrder})
42
+ ON CONFLICT (product_key, key) DO UPDATE SET
43
+ name = EXCLUDED.name, description = EXCLUDED.description,
44
+ amount_cents = EXCLUDED.amount_cents, periodicity = EXCLUDED.periodicity,
45
+ trial_days = EXCLUDED.trial_days, modules = EXCLUDED.modules, limits = EXCLUDED.limits,
46
+ is_public = EXCLUDED.is_public, is_active = EXCLUDED.is_active,
47
+ sort_order = EXCLUDED.sort_order, updated_at = now()
48
+ `;
49
+ }
50
+ }
51
+ /**
52
+ * Planos públicos de UM produto. O filtro é obrigatório por construção (com
53
+ * default) para que nenhuma superfície comercial liste, por descuido, o
54
+ * catálogo de outro produto do ecossistema.
55
+ */
56
+ export async function listPublicPlans(db, productKey = DEFAULT_PRODUCT_KEY) {
57
+ const rows = await db `
58
+ SELECT * FROM saas_plan
59
+ WHERE is_public = true AND is_active = true AND product_key = ${productKey}
60
+ ORDER BY sort_order
61
+ `;
62
+ return rows.map(mapPlan);
63
+ }
64
+ export async function getPlan(db, key, productKey = DEFAULT_PRODUCT_KEY) {
65
+ const rows = await db `
66
+ SELECT * FROM saas_plan WHERE key = ${key} AND product_key = ${productKey}
67
+ `;
68
+ return rows[0] ? mapPlan(rows[0]) : null;
69
+ }
70
+ // ── Contexto de operadora (backoffice / cron) ─────────────────────────────────
71
+ /**
72
+ * Executa `fn` em transação com a GUC `app.platform_operator` setada — habilita
73
+ * as policies `*_operator` (0020) para leitura/escrita cross-tenant SEM abrir mão
74
+ * da RLS FORCE. Uso EXCLUSIVO: rotas de backoffice (após verificação de operador)
75
+ * e o cron de billing. Nunca exposto a request de tenant.
76
+ */
77
+ export async function withOperatorContext(db, fn) {
78
+ const result = await db.begin(async (tx) => {
79
+ await tx `select set_config('app.platform_operator', 'true', true)`;
80
+ return fn(tx);
81
+ });
82
+ return result;
83
+ }
84
+ /**
85
+ * Serializa escritores de billing do MESMO tenant (webhook × webhook, webhook ×
86
+ * cron, gestão × webhook) via advisory lock transacional — elimina lost update
87
+ * de `sequence`/status sem lock global. Chamar como PRIMEIRA instrução da tx.
88
+ */
89
+ export async function lockTenantBilling(tx, tenantId) {
90
+ await tx `SELECT pg_advisory_xact_lock(hashtext('saas_billing:' || ${tenantId}))`;
91
+ }
92
+ /** Coluna `date` → 'YYYY-MM-DD' (o driver pode devolver Date OU string). */
93
+ function isoDate(value) {
94
+ if (value == null)
95
+ return null;
96
+ if (value instanceof Date)
97
+ return value.toISOString().slice(0, 10);
98
+ return String(value).slice(0, 10);
99
+ }
100
+ function mapSubscription(r) {
101
+ const tenantId = r.tenant_id;
102
+ return {
103
+ rowId: r.id,
104
+ subscriptionId: `sub_${tenantId}`,
105
+ tenantId,
106
+ productKey: r.product_key ?? DEFAULT_PRODUCT_KEY,
107
+ planKey: r.plan_key,
108
+ items: [{ planKey: r.plan_key, quantity: 1 }],
109
+ status: r.status,
110
+ currentPeriodEnd: isoDate(r.current_period_end),
111
+ trialEndsAt: isoDate(r.trial_ends_at),
112
+ sequence: Number(r.sequence),
113
+ canceledAt: r.canceled_at ? new Date(r.canceled_at).toISOString() : null,
114
+ provider: r.provider ?? null,
115
+ providerCustomerId: r.provider_customer_id ?? null,
116
+ providerSubscriptionId: r.provider_subscription_id ?? null,
117
+ };
118
+ }
119
+ /**
120
+ * Assinatura do tenant do contexto atual PARA UM PRODUTO (RLS decide a
121
+ * visibilidade). Desde a migração 0022 a unicidade é `(tenant_id, product_key)`
122
+ * — filtrar por produto é obrigatório, senão um tenant com dois produtos leria
123
+ * a assinatura errada (a primeira que o Postgres devolvesse).
124
+ */
125
+ export async function getSubscription(tx, productKey = DEFAULT_PRODUCT_KEY) {
126
+ const rows = await tx `
127
+ SELECT * FROM saas_subscription
128
+ WHERE tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
129
+ AND product_key = ${productKey}
130
+ `;
131
+ return rows[0] ? mapSubscription(rows[0]) : null;
132
+ }
133
+ export async function getSubscriptionByTenant(tx, tenantId, productKey = DEFAULT_PRODUCT_KEY) {
134
+ const rows = await tx `
135
+ SELECT * FROM saas_subscription
136
+ WHERE tenant_id = ${tenantId} AND product_key = ${productKey}
137
+ `;
138
+ return rows[0] ? mapSubscription(rows[0]) : null;
139
+ }
140
+ /** Grava o `next` devolvido pelo domínio puro (upsert pela invariante 1-por-tenant-e-produto). */
141
+ export async function upsertSubscription(tx, input) {
142
+ const s = input.subscription;
143
+ const rows = await tx `
144
+ INSERT INTO saas_subscription
145
+ (id, tenant_id, product_key, plan_key, status, current_period_end, trial_ends_at, canceled_at, sequence,
146
+ provider, provider_customer_id, provider_subscription_id)
147
+ VALUES
148
+ (${uuidv7()}, ${input.tenantId}, ${input.productKey ?? DEFAULT_PRODUCT_KEY}, ${input.planKey}, ${s.status}, ${s.currentPeriodEnd},
149
+ ${s.trialEndsAt}, ${s.canceledAt}, ${s.sequence}, ${input.provider ?? null},
150
+ ${input.providerCustomerId ?? null}, ${input.providerSubscriptionId ?? null})
151
+ ON CONFLICT (tenant_id, product_key) DO UPDATE SET
152
+ plan_key = EXCLUDED.plan_key, status = EXCLUDED.status,
153
+ current_period_end = EXCLUDED.current_period_end, trial_ends_at = EXCLUDED.trial_ends_at,
154
+ canceled_at = EXCLUDED.canceled_at, sequence = EXCLUDED.sequence,
155
+ provider = COALESCE(EXCLUDED.provider, saas_subscription.provider),
156
+ provider_customer_id = COALESCE(EXCLUDED.provider_customer_id, saas_subscription.provider_customer_id),
157
+ provider_subscription_id = COALESCE(EXCLUDED.provider_subscription_id, saas_subscription.provider_subscription_id),
158
+ updated_at = now()
159
+ RETURNING *
160
+ `;
161
+ return mapSubscription(rows[0]);
162
+ }
163
+ /** Atualiza SOMENTE as referências de provider (checkout) — nunca o estado da assinatura. */
164
+ export async function setSubscriptionProviderRefs(tx, tenantId, provider, providerCustomerId) {
165
+ await tx `
166
+ UPDATE saas_subscription
167
+ SET provider = ${provider}, provider_customer_id = ${providerCustomerId}, updated_at = now()
168
+ WHERE tenant_id = ${tenantId}
169
+ `;
170
+ }
171
+ // ── Eventos de domínio ────────────────────────────────────────────────────────
172
+ export async function appendDomainEvents(tx, subscriptionRowId, events) {
173
+ for (const ev of events) {
174
+ await tx `
175
+ INSERT INTO saas_billing_event (id, subscription_id, tenant_id, type, sequence, occurred_at, causation_event_id, data)
176
+ VALUES (${ev.eventId}, ${subscriptionRowId}, ${ev.tenantId}, ${ev.type}, ${ev.sequence},
177
+ ${ev.occurredAt}, ${ev.causationEventId ?? null}, ${JSON.stringify(ev.data)}::jsonb)
178
+ ON CONFLICT (subscription_id, sequence) DO NOTHING
179
+ `;
180
+ }
181
+ }
182
+ export async function listBillingEvents(tx, limit = 50) {
183
+ const rows = await tx `
184
+ SELECT id, type, sequence, occurred_at, data FROM saas_billing_event
185
+ ORDER BY occurred_at DESC LIMIT ${limit}
186
+ `;
187
+ return rows.map((r) => ({
188
+ eventId: r.id,
189
+ type: r.type,
190
+ sequence: Number(r.sequence),
191
+ occurredAt: new Date(r.occurred_at).toISOString(),
192
+ data: r.data ?? {},
193
+ }));
194
+ }
195
+ /** Espelha (upsert) uma fatura do gateway — idempotente por (provider, external_id). */
196
+ export async function upsertInvoice(tx, input) {
197
+ await tx `
198
+ INSERT INTO saas_invoice (id, tenant_id, subscription_id, provider, external_id, status,
199
+ amount_cents, due_date, paid_at, invoice_url, description)
200
+ VALUES (${uuidv7()}, ${input.tenantId}, ${input.subscriptionRowId}, ${input.provider},
201
+ ${input.externalId}, ${input.status}, ${input.amountCents}, ${input.dueDate ?? null},
202
+ ${input.paidAt ?? null}, ${input.invoiceUrl ?? null}, ${input.description ?? null})
203
+ ON CONFLICT (provider, external_id) DO UPDATE SET
204
+ status = EXCLUDED.status, paid_at = EXCLUDED.paid_at,
205
+ invoice_url = COALESCE(EXCLUDED.invoice_url, saas_invoice.invoice_url),
206
+ updated_at = now()
207
+ `;
208
+ }
209
+ export async function listInvoices(tx, limit = 50) {
210
+ const rows = await tx `
211
+ SELECT * FROM saas_invoice ORDER BY created_at DESC LIMIT ${limit}
212
+ `;
213
+ return rows.map((r) => ({
214
+ id: r.id,
215
+ provider: r.provider,
216
+ externalId: r.external_id,
217
+ status: r.status,
218
+ amountCents: Number(r.amount_cents),
219
+ dueDate: isoDate(r.due_date),
220
+ paidAt: r.paid_at ? new Date(r.paid_at).toISOString() : null,
221
+ invoiceUrl: r.invoice_url ?? null,
222
+ description: r.description ?? null,
223
+ createdAt: new Date(r.created_at).toISOString(),
224
+ }));
225
+ }
226
+ /**
227
+ * Persiste o evento inbound com dedup por (provider, external_event_id).
228
+ * Retorna o id quando é a PRIMEIRA vez (deve processar) ou null quando duplicado
229
+ * (já recebido — responder 200 e ignorar, regra do 07-billing §6.1).
230
+ */
231
+ export async function insertWebhookEvent(db, input) {
232
+ // Conflito com evento anterior FAILED → reabre para reprocessar (o retry do
233
+ // gateway reenvia o MESMO event.id; sem isso o pagamento se perderia até o
234
+ // cron). processed/ignored continuam devolvendo null (dedup normal).
235
+ const rows = await db `
236
+ INSERT INTO saas_webhook_event (id, provider, external_event_id, event_type, payload)
237
+ VALUES (${uuidv7()}, ${input.provider}, ${input.externalEventId}, ${input.eventType},
238
+ ${JSON.stringify(input.payload ?? null)}::jsonb)
239
+ ON CONFLICT (provider, external_event_id) DO UPDATE
240
+ SET status = 'received', error = NULL
241
+ WHERE saas_webhook_event.status = 'failed'
242
+ RETURNING id
243
+ `;
244
+ return rows[0]?.id ?? null;
245
+ }
246
+ export async function markWebhookEvent(db, id, status, tenantId, error) {
247
+ await db `
248
+ UPDATE saas_webhook_event
249
+ SET status = ${status}, tenant_id = ${tenantId ?? null}, error = ${error ?? null}, processed_at = now()
250
+ WHERE id = ${id}
251
+ `;
252
+ }
253
+ // ── Régua de inadimplência ───────────────────────────────────────────────────
254
+ export async function listExecutedDunningSteps(tx, subscriptionRowId, referenceDate) {
255
+ const rows = await tx `
256
+ SELECT step_key FROM saas_dunning_event
257
+ WHERE subscription_id = ${subscriptionRowId} AND reference_date = ${referenceDate}
258
+ `;
259
+ return new Set(rows.map((r) => r.step_key));
260
+ }
261
+ export async function recordDunningStep(tx, input) {
262
+ await tx `
263
+ INSERT INTO saas_dunning_event (id, tenant_id, subscription_id, step_key, reference_date)
264
+ VALUES (${uuidv7()}, ${input.tenantId}, ${input.subscriptionRowId}, ${input.stepKey}, ${input.referenceDate})
265
+ ON CONFLICT (subscription_id, reference_date, step_key) DO NOTHING
266
+ `;
267
+ }
268
+ export async function listAllSubscriptions(tx, filter = {}) {
269
+ const limit = filter.limit ?? 100;
270
+ const offset = filter.offset ?? 0;
271
+ const rows = filter.status
272
+ ? await tx `
273
+ SELECT s.*, t.code AS tenant_code, t.display_name AS tenant_name, t.status AS tenant_status
274
+ FROM saas_subscription s JOIN tenant t ON t.id = s.tenant_id
275
+ WHERE s.status = ${filter.status}
276
+ ORDER BY s.updated_at DESC LIMIT ${limit} OFFSET ${offset}
277
+ `
278
+ : await tx `
279
+ SELECT s.*, t.code AS tenant_code, t.display_name AS tenant_name, t.status AS tenant_status
280
+ FROM saas_subscription s JOIN tenant t ON t.id = s.tenant_id
281
+ ORDER BY s.updated_at DESC LIMIT ${limit} OFFSET ${offset}
282
+ `;
283
+ return rows.map((r) => ({
284
+ ...mapSubscription(r),
285
+ tenantCode: r.tenant_code,
286
+ tenantName: r.tenant_name,
287
+ tenantStatus: r.tenant_status,
288
+ }));
289
+ }
290
+ /** Resumo da operadora: contagem por status + MRR (planos mensais ativos; anuais /12). */
291
+ export async function backofficeSummary(tx) {
292
+ const byStatusRows = await tx `
293
+ SELECT status, count(*)::int AS n FROM saas_subscription GROUP BY status
294
+ `;
295
+ const mrrRows = await tx `
296
+ SELECT COALESCE(ROUND(SUM(CASE p.periodicity
297
+ WHEN 'monthly' THEN p.amount_cents::numeric
298
+ WHEN 'quarterly' THEN p.amount_cents::numeric / 3
299
+ WHEN 'yearly' THEN p.amount_cents::numeric / 12
300
+ END)), 0)::bigint AS mrr
301
+ FROM saas_subscription s JOIN saas_plan p ON p.key = s.plan_key
302
+ WHERE s.status IN ('active', 'trialing')
303
+ `;
304
+ const byStatus = {};
305
+ let total = 0;
306
+ for (const r of byStatusRows) {
307
+ byStatus[r.status] = Number(r.n);
308
+ total += Number(r.n);
309
+ }
310
+ return { total, byStatus, mrrCents: Number(mrrRows[0]?.mrr ?? 0) };
311
+ }
312
+ /** Assinaturas que o cron precisa examinar (trial vencendo/vencido, período vencido, past_due). */
313
+ export async function listSubscriptionsForCron(tx, today) {
314
+ const rows = await tx `
315
+ SELECT * FROM saas_subscription
316
+ WHERE (status = 'trialing' AND trial_ends_at IS NOT NULL AND trial_ends_at < ${today})
317
+ OR (status = 'active' AND current_period_end IS NOT NULL AND current_period_end < ${today})
318
+ OR status = 'past_due'
319
+ `;
320
+ return rows.map(mapSubscription);
321
+ }
322
+ /** Eventos `failed` recentes (7 dias) para reprocessamento pelo cron. */
323
+ export async function listFailedWebhookEvents(db, limit = 25) {
324
+ const rows = await db `
325
+ SELECT id, provider, external_event_id, payload FROM saas_webhook_event
326
+ WHERE status = 'failed' AND created_at > now() - interval '7 days'
327
+ ORDER BY created_at ASC LIMIT ${limit}
328
+ `;
329
+ return rows.map((r) => ({
330
+ id: r.id,
331
+ provider: r.provider,
332
+ externalEventId: r.external_event_id,
333
+ payload: typeof r.payload === 'string' ? JSON.parse(r.payload) : r.payload,
334
+ }));
335
+ }
336
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/subscription-billing/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAIvC,OAAO,EAAE,mBAAmB,EAAoB,MAAM,YAAY,CAAC;AAgCnE,SAAS,UAAU,CAAI,KAAc,EAAE,QAAW;IAChD,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,QAAQ,CAAC;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAM,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,KAAU,CAAC;AACpB,CAAC;AAED,SAAS,OAAO,CAAC,CAA0B;IACzC,OAAO;QACL,UAAU,EAAG,CAAC,CAAC,WAAsB,IAAI,mBAAmB;QAC5D,GAAG,EAAE,CAAC,CAAC,GAAa;QACpB,IAAI,EAAE,CAAC,CAAC,IAAc;QACtB,WAAW,EAAG,CAAC,CAAC,WAA6B,IAAI,IAAI;QACrD,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;QACnC,QAAQ,EAAE,CAAC,CAAC,QAAkB;QAC9B,WAAW,EAAE,CAAC,CAAC,WAAyC;QACxD,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;QAC/B,OAAO,EAAE,UAAU,CAAW,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,EAAE,UAAU,CAAyB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACxD,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9B,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAM,EAAE,KAA6B;IAC/E,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,EAAE,CAAA;;;gBAGI,MAAM,EAAE,KAAK,CAAC,CAAC,UAAU,IAAI,mBAAmB,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;gBAC3H,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC7E,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,SAAS;;;;;;;KAOpD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAM,EACN,aAAqB,mBAAmB;IAExC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;oEAE6C,UAAU;;GAE3E,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,EAAM,EACN,GAAW,EACX,aAAqB,mBAAmB;IAExC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;0CACmB,GAAG,sBAAsB,UAAU;GAC1E,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAED,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAI,EAAM,EAAE,EAA0B;IAC7E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACzC,MAAM,EAAE,CAAA,0DAA0D,CAAC;QACnE,OAAO,EAAE,CAAC,EAAmB,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,OAAO,MAAW,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAM,EAAE,QAAgB;IAC9D,MAAM,EAAE,CAAA,4DAA4D,QAAQ,IAAI,CAAC;AACnF,CAAC;AAeD,4EAA4E;AAC5E,SAAS,OAAO,CAAC,KAAc;IAC7B,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,eAAe,CAAC,CAA0B;IACjD,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAmB,CAAC;IACvC,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,EAAY;QACrB,cAAc,EAAE,OAAO,QAAQ,EAAE;QACjC,QAAQ;QACR,UAAU,EAAG,CAAC,CAAC,WAAsB,IAAI,mBAAmB;QAC5D,OAAO,EAAE,CAAC,CAAC,QAAkB;QAC7B,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,QAAkB,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACvD,MAAM,EAAE,CAAC,CAAC,MAA4B;QACtC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAC/C,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;QACrC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5B,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,WAAqB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;QAClF,QAAQ,EAAG,CAAC,CAAC,QAA0B,IAAI,IAAI;QAC/C,kBAAkB,EAAG,CAAC,CAAC,oBAAsC,IAAI,IAAI;QACrE,sBAAsB,EAAG,CAAC,CAAC,wBAA0C,IAAI,IAAI;KAC9E,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAM,EACN,aAAqB,mBAAmB;IAExC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;;0BAGG,UAAU;GACjC,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAM,EACN,QAAgB,EAChB,aAAqB,mBAAmB;IAExC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;wBAEC,QAAQ,sBAAsB,UAAU;GAC7D,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAaD,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAM,EACN,KAA8B;IAE9B,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;;;;SAKd,MAAM,EAAE,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,UAAU,IAAI,mBAAmB,KAAK,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,gBAAgB;SAC7H,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,IAAI;SACxE,KAAK,CAAC,kBAAkB,IAAI,IAAI,KAAK,KAAK,CAAC,sBAAsB,IAAI,IAAI;;;;;;;;;;GAU/E,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;AACnC,CAAC;AAED,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,EAAM,EACN,QAAgB,EAChB,QAAgB,EAChB,kBAA0B;IAE1B,MAAM,EAAE,CAAA;;qBAEW,QAAQ,4BAA4B,kBAAkB;wBACnD,QAAQ;GAC7B,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAM,EACN,iBAAyB,EACzB,MAA8B;IAE9B,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,EAAE,CAAA;;gBAEI,EAAE,CAAC,OAAO,KAAK,iBAAiB,KAAK,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,QAAQ;gBAC5E,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,gBAAgB,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC;;KAEpF,CAAC;IACJ,CAAC;AACH,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAM,EAAE,KAAK,GAAG,EAAE;IACxD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;sCAEe,KAAK;GACxC,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,OAAO,EAAE,CAAC,CAAC,EAAY;QACvB,IAAI,EAAE,CAAC,CAAC,IAAc;QACtB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5B,UAAU,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,WAAqB,CAAC,CAAC,WAAW,EAAE;QAC3D,IAAI,EAAG,CAAC,CAAC,IAAgC,IAAI,EAAE;KAChD,CAAC,CAAC,CAAC;AACN,CAAC;AAiBD,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAM,EAAE,KAAuB;IACjE,MAAM,EAAE,CAAA;;;cAGI,MAAM,EAAE,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,iBAAiB,KAAK,KAAK,CAAC,QAAQ;cAC1E,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,OAAO,IAAI,IAAI;cACjF,KAAK,CAAC,MAAM,IAAI,IAAI,KAAK,KAAK,CAAC,UAAU,IAAI,IAAI,KAAK,KAAK,CAAC,WAAW,IAAI,IAAI;;;;;GAK1F,CAAC;AACJ,CAAC;AAeD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAM,EAAE,KAAK,GAAG,EAAE;IACnD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;gEACyC,KAAK;GAClE,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,EAAE,EAAE,CAAC,CAAC,EAAY;QAClB,QAAQ,EAAE,CAAC,CAAC,QAAkB;QAC9B,UAAU,EAAE,CAAC,CAAC,WAAqB;QACnC,MAAM,EAAE,CAAC,CAAC,MAAiC;QAC3C,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAiB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;QACtE,UAAU,EAAG,CAAC,CAAC,WAA6B,IAAI,IAAI;QACpD,WAAW,EAAG,CAAC,CAAC,WAA6B,IAAI,IAAI;QACrD,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAoB,CAAC,CAAC,WAAW,EAAE;KAC1D,CAAC,CAAC,CAAC;AACN,CAAC;AAWD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAM,EACN,KAA8B;IAE9B,4EAA4E;IAC5E,2EAA2E;IAC3E,qEAAqE;IACrE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;cAET,MAAM,EAAE,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,eAAe,KAAK,KAAK,CAAC,SAAS;cACzE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC;;;;;GAKhD,CAAC;IACF,OAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,EAAyB,IAAI,IAAI,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAM,EACN,EAAU,EACV,MAA0C,EAC1C,QAAwB,EACxB,KAAqB;IAErB,MAAM,EAAE,CAAA;;mBAES,MAAM,iBAAiB,QAAQ,IAAI,IAAI,aAAa,KAAK,IAAI,IAAI;iBACnE,EAAE;GAChB,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,EAAM,EACN,iBAAyB,EACzB,aAAqB;IAErB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;8BAEO,iBAAiB,yBAAyB,aAAa;GAClF,CAAC;IACF,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAkB,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAM,EACN,KAA8F;IAE9F,MAAM,EAAE,CAAA;;cAEI,MAAM,EAAE,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,iBAAiB,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,aAAa;;GAE5G,CAAC;AACJ,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAM,EACN,SAA2E,EAAE;IAE7E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM;QACxB,CAAC,CAAC,MAAM,EAAE,CAAA;;;2BAGa,MAAM,CAAC,MAAM;2CACG,KAAK,WAAW,MAAM;OAC1D;QACH,CAAC,CAAC,MAAM,EAAE,CAAA;;;2CAG6B,KAAK,WAAW,MAAM;OAC1D,CAAC;IACN,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,GAAG,eAAe,CAAC,CAAC,CAAC;QACrB,UAAU,EAAE,CAAC,CAAC,WAAqB;QACnC,UAAU,EAAE,CAAC,CAAC,WAAqB;QACnC,YAAY,EAAE,CAAC,CAAC,aAAuB;KACxC,CAAC,CAAC,CAAC;AACN,CAAC;AAQD,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAM;IAC5C,MAAM,YAAY,GAAG,MAAM,EAAE,CAAA;;GAE5B,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAA;;;;;;;;GAQvB,CAAC;IACF,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,QAAQ,CAAC,CAAC,CAAC,MAAgB,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,mGAAmG;AACnG,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,EAAM,EAAE,KAAa;IAClE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;mFAE4D,KAAK;2FACG,KAAK;;GAE7F,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AACnC,CAAC;AASD,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAM,EACN,KAAK,GAAG,EAAE;IAEV,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;;oCAGa,KAAK;GACtC,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,EAAE,EAAE,CAAC,CAAC,EAAY;QAClB,QAAQ,EAAE,CAAC,CAAC,QAAkB;QAC9B,eAAe,EAAE,CAAC,CAAC,iBAA2B;QAC9C,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;KACrF,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,175 @@
1
+ import type { Db } from '../db/client.js';
2
+ import type { EntitlementRecord } from '../entitlements/types.js';
3
+ import type { BillingMode, SubscriptionStatus, WebhookHeaders } from './types.js';
4
+ import { ensureSaasPlanCatalog, getPlan, listBillingEvents, listInvoices, listPublicPlans, type SaasPlanRow, type SubscriptionRow } from './repository.js';
5
+ import { type ProductBillingRegistry } from './product-config.js';
6
+ /**
7
+ * Serviço do Billing SaaS (Concern A) — orquestra o domínio puro (`reconcile.ts`,
8
+ * `dunning.ts`, `derive.ts`) sobre a persistência (`repository.ts`) e o Provider
9
+ * Pattern (`provider/registry.ts`). Toda transição de assinatura é auditada.
10
+ *
11
+ * Config do gateway é DA PLATAFORMA (uma credencial, env → futura entrada no
12
+ * Vault), diferente do Merchant Billing onde a credencial é POR TENANT.
13
+ */
14
+ export interface SaasBillingConfig {
15
+ provider: string;
16
+ mode: BillingMode;
17
+ apiKey?: string;
18
+ webhookSecret?: string;
19
+ /** Base pública do app comercial (retornos de checkout). */
20
+ webBaseUrl: string;
21
+ resendApiKey?: string;
22
+ emailFrom: string;
23
+ /** Dias em atraso até suspensão automática do tenant. */
24
+ suspendAfterDays: number;
25
+ /** Override da base do gateway (testes/simulação; produção usa o default por mode). */
26
+ baseUrl?: string;
27
+ /** Injeção de fetch para testes — parte do contrato SubscriptionProviderConfig. */
28
+ fetchImpl?: typeof fetch;
29
+ }
30
+ /**
31
+ * Fonte de configuração aceita pelas operações de billing.
32
+ *
33
+ * Um `SaasBillingConfig` cru continua válido — é tratado como um registry de um
34
+ * produto só. Isso mantém os chamadores antigos funcionando enquanto os
35
+ * ambientes migram para uma conta de gateway por produto.
36
+ */
37
+ export type BillingConfigSource = SaasBillingConfig | ProductBillingRegistry;
38
+ export { listPublicPlans, getPlan, ensureSaasPlanCatalog };
39
+ /** Seed do catálogo padrão (chamado pelo seed do core). */
40
+ export declare function seedSaasPlans(db: Db): Promise<void>;
41
+ export interface SignupInput {
42
+ companyName: string;
43
+ fullName: string;
44
+ email: string;
45
+ password: string;
46
+ planKey: string;
47
+ ip?: string | null;
48
+ userAgent?: string | null;
49
+ }
50
+ export interface SignupResult {
51
+ tenantId: string;
52
+ tenantCode: string;
53
+ userId: string;
54
+ planKey: string;
55
+ trialEndsAt: string;
56
+ }
57
+ /**
58
+ * Cadastro self-service (Fase 17): cria usuário + tenant em TRIAL + organização +
59
+ * membership com papel `owner` + entitlement do produto + assinatura `trialing`.
60
+ * Idempotência: e-mail já cadastrado → 409 (nunca sobrescreve credencial existente).
61
+ */
62
+ export declare function signupSelfService(db: Db, input: SignupInput, nowIso: string): Promise<SignupResult>;
63
+ export interface SubscriptionStanding {
64
+ ok: boolean;
65
+ reason: 'ok' | 'trialing' | 'past_due' | 'canceled' | 'paused' | 'none';
66
+ }
67
+ export declare function standingFor(sub: SubscriptionRow | null): SubscriptionStanding;
68
+ /** Entitlements finos derivados do plano (EntitlementSource 'PLAN', v0.1 stateless). */
69
+ export declare function entitlementsForPlan(sub: SubscriptionRow | null, plan: SaasPlanRow | null, nowIso: string): EntitlementRecord[];
70
+ export interface SubscriptionOverview {
71
+ subscription: SubscriptionRow | null;
72
+ plan: SaasPlanRow | null;
73
+ standing: SubscriptionStanding;
74
+ invoices: Awaited<ReturnType<typeof listInvoices>>;
75
+ entitlements: EntitlementRecord[];
76
+ events: Awaited<ReturnType<typeof listBillingEvents>>;
77
+ }
78
+ export declare function subscriptionOverview(db: Db, ctx: {
79
+ tenantId: string;
80
+ userId: string;
81
+ }, nowIso: string): Promise<SubscriptionOverview>;
82
+ export interface CheckoutResult {
83
+ mode: BillingMode;
84
+ provider: string;
85
+ /** URL hospedada do gateway; null em modo 'disabled' (ativação manual/backoffice). */
86
+ url: string | null;
87
+ }
88
+ /**
89
+ * Inicia o checkout do plano no gateway da plataforma. A atribuição do webhook
90
+ * de volta ao tenant usa `externalReference = "<tenantId>:<planKey>"` (RFC §9).
91
+ * Em modo 'disabled' não há gateway: o fluxo comercial segue e a ativação é
92
+ * manual (backoffice) — nunca cobra por falta de configuração.
93
+ */
94
+ export declare function startCheckout(db: Db, ctx: {
95
+ tenantId: string;
96
+ userId: string;
97
+ }, source: BillingConfigSource, planKey: string, _nowIso: string, productKey?: string): Promise<CheckoutResult>;
98
+ export interface WebhookProcessResult {
99
+ outcome: 'processed' | 'duplicate' | 'ignored' | 'unauthorized' | 'failed';
100
+ tenantId?: string | null;
101
+ }
102
+ /**
103
+ * Processa um webhook do gateway: verifica autenticidade → dedup por
104
+ * `externalEventId` → resolve tenant via `externalReference` → reconcilia via
105
+ * domínio puro → espelha fatura → sincroniza tenant.status → audita.
106
+ * A rota SEMPRE responde 200 após o dedup (regra dos 15 não-200 do ASAAS).
107
+ */
108
+ export declare function processWebhook(db: Db, source: BillingConfigSource, headers: WebhookHeaders, rawBody: string, payload: unknown, nowIso: string, productKey?: string): Promise<WebhookProcessResult>;
109
+ export declare function changePlanForTenant(db: Db, ctx: {
110
+ tenantId: string;
111
+ userId: string;
112
+ }, newPlanKey: string, nowIso: string): Promise<SubscriptionRow>;
113
+ export declare function cancelForTenant(db: Db, ctx: {
114
+ tenantId: string;
115
+ userId: string;
116
+ }, nowIso: string): Promise<SubscriptionRow>;
117
+ /**
118
+ * Reativação: assinatura cancelada/past_due volta pelo PAGAMENTO (checkout →
119
+ * webhook `received` reativa via reconcile). Este método só valida o estado e
120
+ * devolve o checkout; em modo 'disabled' a reativação é manual (backoffice).
121
+ */
122
+ export declare function reactivateForTenant(db: Db, ctx: {
123
+ tenantId: string;
124
+ userId: string;
125
+ }, source: BillingConfigSource, nowIso: string, productKey?: string): Promise<CheckoutResult>;
126
+ export declare function backofficeListSubscriptions(db: Db, filter?: {
127
+ status?: SubscriptionStatus;
128
+ limit?: number;
129
+ offset?: number;
130
+ }): Promise<import("./repository.js").BackofficeSubscriptionRow[]>;
131
+ export declare function backofficeOverview(db: Db): Promise<import("./repository.js").BackofficeSummary>;
132
+ export declare function backofficeListWebhookEvents(db: Db, limit?: number): Promise<{
133
+ id: string;
134
+ tenantId: string | null;
135
+ provider: string;
136
+ externalEventId: string;
137
+ eventType: string;
138
+ status: string;
139
+ error: string | null;
140
+ processedAt: string | null;
141
+ createdAt: string;
142
+ }[]>;
143
+ /**
144
+ * Ativação manual pela operadora (modo 'disabled' ou pagamento fora do gateway):
145
+ * simula uma fatura `received` e reconcilia pelo MESMO caminho do webhook —
146
+ * nenhuma transição de estado fora do domínio puro.
147
+ */
148
+ export declare function backofficeActivateSubscription(db: Db, operatorEmail: string, tenantId: string, planKey: string, nowIso: string): Promise<SubscriptionRow>;
149
+ /**
150
+ * Reprocessa eventos de webhook `failed` recentes (rede de segurança para o
151
+ * caso "falhou após o dedup e respondemos 200"). Idempotente: reconciliar um
152
+ * efeito já refletido é no-op de domínio; o passo é chamado pelo cron.
153
+ */
154
+ export declare function retryFailedWebhookEvents(db: Db, source: BillingConfigSource, nowIso: string, limit?: number, productKey?: string): Promise<{
155
+ retried: number;
156
+ recovered: number;
157
+ }>;
158
+ export interface CronReport {
159
+ examined: number;
160
+ trialsExpired: number;
161
+ periodsExpired: number;
162
+ dunningStepsExecuted: number;
163
+ tenantsSuspended: number;
164
+ emailsSent: number;
165
+ webhooksRetried: number;
166
+ webhooksRecovered: number;
167
+ }
168
+ /**
169
+ * Executor de política temporal — idempotente, seguro para rodar a cada hora
170
+ * (Render Cron). Trial vencido → `past_due`; período vencido → `past_due`;
171
+ * `past_due` → régua de inadimplência (stepKey idempotente) + e-mail best-effort;
172
+ * atraso ≥ `suspendAfterDays` → tenant `suspended`.
173
+ */
174
+ export declare function runBillingCron(db: Db, source: BillingConfigSource, nowIso: string): Promise<CronReport>;
175
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/subscription-billing/service.ts"],"names":[],"mappings":"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"}