@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 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/subscription-billing/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAqBvC,mGAAmG;AACnG,MAAM,CAAC,MAAM,qBAAqB,GAAuC,IAAI,GAAG,CAAC;IAC/E,4BAA4B;IAC5B,wBAAwB;IACxB,uBAAuB;IACvB,2BAA2B;IAC3B,uBAAuB;CACxB,CAAC,CAAC;AAgCH,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAkC,KAA8B;IAC/F,OAAO;QACL,OAAO,EAAE,MAAM,EAAE;QACjB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,gBAAgB,GAAG,CAAC;QACpC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAA2B;IAC1D,OAAO,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAWD,MAAM,OAAO,kBAAkB;IAC7B,KAAK,CAAC,OAAO;QACX,gFAAgF;IAClF,CAAC;CACF;AAED,mFAAmF;AACnF,MAAM,OAAO,sBAAsB;IACxB,SAAS,GAAkB,EAAE,CAAC;IAEvC,KAAK,CAAC,OAAO,CAAC,KAAkB;QAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ export type { SubscriptionPeriodicity, PricingModel, Plan, SubscriptionStatus, SubscriptionItem, Subscription, BillingMode, NormalizedInvoiceStatus, NormalizedSubStatus, EnsureCustomerInput, ProviderCustomer, CreateCheckoutInput, ProviderCheckout, ProviderInvoice, EventAttribution, WebhookHeaders, NormalizedWebhookEvent, SubscriptionProviderConfig, PaymentGatewayProvider, ProviderErrorCode, } from './types.js';
2
+ export { isRetryableProviderError, CANONICAL_PROVIDER_ERROR_MESSAGES, SUBSCRIPTION_BILLING_CONTRACT_VERSION } from './types.js';
3
+ export type { SubscriptionEventType, DomainEvent, CreateEventInput, EventPublisher } from './events.js';
4
+ export { createDomainEvent, isMandatoryEvent, MANDATORY_EVENT_TYPES, NoopEventPublisher, InMemoryEventPublisher } from './events.js';
5
+ export type { ReconcileInput, ReconcileResult } from './reconcile.js';
6
+ export { applySubscriptionEvent, changePlan, cancelSubscription, startTrial } from './reconcile.js';
7
+ export { dunningStepsAsEvents } from './dunning.js';
8
+ export { resolveSubscriptionBillingProvider } from './provider/registry.js';
9
+ export type { SubscriptionProviderFactory } from './provider/registry.js';
10
+ export { AsaasSubscriptionProvider } from './provider/asaas.js';
11
+ export { DisabledSubscriptionProvider } from './provider/disabled.js';
12
+ export { SAAS_PLANS, DEFAULT_TRIAL_DAYS } from './plans.js';
13
+ export type { SaasPlanDef } from './plans.js';
14
+ export { ensureSaasPlanCatalog, listPublicPlans, getPlan, getSubscription, getSubscriptionByTenant, upsertSubscription, listInvoices, listBillingEvents, withOperatorContext, } from './repository.js';
15
+ export type { SaasPlanRow, SubscriptionRow, SaasInvoiceRow, BackofficeSubscriptionRow, BackofficeSummary } from './repository.js';
16
+ export { seedSaasPlans, signupSelfService, subscriptionOverview, standingFor, entitlementsForPlan, startCheckout, processWebhook, changePlanForTenant, cancelForTenant, reactivateForTenant, backofficeListSubscriptions, backofficeOverview, backofficeListWebhookEvents, backofficeActivateSubscription, retryFailedWebhookEvents, runBillingCron, } from './service.js';
17
+ export type { SaasBillingConfig, SignupInput, SignupResult, SubscriptionStanding, SubscriptionOverview, CheckoutResult, WebhookProcessResult, CronReport, } from './service.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/subscription-billing/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,uBAAuB,EACvB,YAAY,EACZ,IAAI,EACJ,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,wBAAwB,EAAE,iCAAiC,EAAE,qCAAqC,EAAE,MAAM,YAAY,CAAC;AAEhI,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErI,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAMpG,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,kCAAkC,EAAE,MAAM,wBAAwB,CAAC;AAC5E,YAAY,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,OAAO,EACP,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAClI,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,2BAA2B,EAC3B,kBAAkB,EAClB,2BAA2B,EAC3B,8BAA8B,EAC9B,wBAAwB,EACxB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,UAAU,GACX,MAAM,cAAc,CAAC"}
@@ -0,0 +1,16 @@
1
+ export { isRetryableProviderError, CANONICAL_PROVIDER_ERROR_MESSAGES, SUBSCRIPTION_BILLING_CONTRACT_VERSION } from './types.js';
2
+ export { createDomainEvent, isMandatoryEvent, MANDATORY_EVENT_TYPES, NoopEventPublisher, InMemoryEventPublisher } from './events.js';
3
+ export { applySubscriptionEvent, changePlan, cancelSubscription, startTrial } from './reconcile.js';
4
+ // DEFAULT_DUNNING_STEPS/DunningStep/DunningStepDue sao os MESMOS simbolos ja
5
+ // exportados por `../billing/dunning.js` no barrel do pacote (`src/index.ts`) —
6
+ // nao redeclarados aqui para nao colidir. So a funcao nova (genuina desta
7
+ // Capability) e exportada.
8
+ export { dunningStepsAsEvents } from './dunning.js';
9
+ export { resolveSubscriptionBillingProvider } from './provider/registry.js';
10
+ export { AsaasSubscriptionProvider } from './provider/asaas.js';
11
+ export { DisabledSubscriptionProvider } from './provider/disabled.js';
12
+ // ── BILL-01 (Fase 17): persistência + serviço do Billing SaaS ────────────────
13
+ export { SAAS_PLANS, DEFAULT_TRIAL_DAYS } from './plans.js';
14
+ export { ensureSaasPlanCatalog, listPublicPlans, getPlan, getSubscription, getSubscriptionByTenant, upsertSubscription, listInvoices, listBillingEvents, withOperatorContext, } from './repository.js';
15
+ export { seedSaasPlans, signupSelfService, subscriptionOverview, standingFor, entitlementsForPlan, startCheckout, processWebhook, changePlanForTenant, cancelForTenant, reactivateForTenant, backofficeListSubscriptions, backofficeOverview, backofficeListWebhookEvents, backofficeActivateSubscription, retryFailedWebhookEvents, runBillingCron, } from './service.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/subscription-billing/index.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,wBAAwB,EAAE,iCAAiC,EAAE,qCAAqC,EAAE,MAAM,YAAY,CAAC;AAGhI,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGrI,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEpG,6EAA6E;AAC7E,gFAAgF;AAChF,0EAA0E;AAC1E,2BAA2B;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,kCAAkC,EAAE,MAAM,wBAAwB,CAAC;AAE5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAEtE,gFAAgF;AAChF,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,OAAO,EACP,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,2BAA2B,EAC3B,kBAAkB,EAClB,2BAA2B,EAC3B,8BAA8B,EAC9B,wBAAwB,EACxB,cAAc,GACf,MAAM,cAAc,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Catálogo padrão de planos do SaaS (Concern A). Fonte declarativa — o seed
3
+ * materializa em `saas_plan` de forma idempotente (mesmo padrão de
4
+ * `products/catalog.ts` e do RBAC). Preço em CENTAVOS de BRL (v0.1 flat).
5
+ *
6
+ * `modules` alimenta os Entitlements finos (EntitlementSource 'PLAN');
7
+ * `limits` são as franquias por plano (commercial-catalog: PlanFranchises).
8
+ */
9
+ /**
10
+ * Produto dono do plano (`product.key` — ver `products/catalog.ts`). O motor de
11
+ * Billing é infraestrutura compartilhada do ecossistema; o catálogo comercial
12
+ * não é. Planos do Baruk Office, do Rep, do Ind e do futuro Varejo coexistem na
13
+ * mesma tabela, separados por esta chave, e `key` só precisa ser único dentro
14
+ * do produto.
15
+ */
16
+ export declare const DEFAULT_PRODUCT_KEY = "contabil";
17
+ export interface SaasPlanDef {
18
+ /** Produto dono do plano. Ausente = `contabil` (todo o catálogo atual). */
19
+ productKey?: string;
20
+ key: string;
21
+ name: string;
22
+ description: string;
23
+ amountCents: number;
24
+ periodicity: 'monthly' | 'quarterly' | 'yearly';
25
+ trialDays: number;
26
+ modules: string[];
27
+ limits: Record<string, number>;
28
+ isPublic: boolean;
29
+ isActive: boolean;
30
+ sortOrder: number;
31
+ }
32
+ export declare const DEFAULT_TRIAL_DAYS = 14;
33
+ export declare const SAAS_PLANS: readonly SaasPlanDef[];
34
+ //# sourceMappingURL=plans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../src/subscription-billing/plans.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,eAAO,MAAM,UAAU,EAAE,SAAS,WAAW,EAkE5C,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Catálogo padrão de planos do SaaS (Concern A). Fonte declarativa — o seed
3
+ * materializa em `saas_plan` de forma idempotente (mesmo padrão de
4
+ * `products/catalog.ts` e do RBAC). Preço em CENTAVOS de BRL (v0.1 flat).
5
+ *
6
+ * `modules` alimenta os Entitlements finos (EntitlementSource 'PLAN');
7
+ * `limits` são as franquias por plano (commercial-catalog: PlanFranchises).
8
+ */
9
+ /**
10
+ * Produto dono do plano (`product.key` — ver `products/catalog.ts`). O motor de
11
+ * Billing é infraestrutura compartilhada do ecossistema; o catálogo comercial
12
+ * não é. Planos do Baruk Office, do Rep, do Ind e do futuro Varejo coexistem na
13
+ * mesma tabela, separados por esta chave, e `key` só precisa ser único dentro
14
+ * do produto.
15
+ */
16
+ export const DEFAULT_PRODUCT_KEY = 'contabil';
17
+ export const DEFAULT_TRIAL_DAYS = 14;
18
+ export const SAAS_PLANS = [
19
+ {
20
+ key: 'starter',
21
+ name: 'Starter',
22
+ description: 'Para escritórios começando a digitalizar a operação.',
23
+ amountCents: 9700,
24
+ periodicity: 'monthly',
25
+ trialDays: DEFAULT_TRIAL_DAYS,
26
+ modules: ['clients', 'requests', 'portal'],
27
+ limits: { users: 3, clients: 50, storageGb: 5 },
28
+ isPublic: true,
29
+ isActive: true,
30
+ sortOrder: 1,
31
+ },
32
+ {
33
+ key: 'pro',
34
+ name: 'Pro',
35
+ description: 'Operação completa: portal do cliente, financeiro e auditoria.',
36
+ amountCents: 24700,
37
+ periodicity: 'monthly',
38
+ trialDays: DEFAULT_TRIAL_DAYS,
39
+ modules: ['clients', 'requests', 'portal', 'billing', 'audit', 'notifications'],
40
+ limits: { users: 10, clients: 300, storageGb: 25 },
41
+ isPublic: true,
42
+ isActive: true,
43
+ sortOrder: 2,
44
+ },
45
+ {
46
+ key: 'enterprise',
47
+ name: 'Enterprise',
48
+ description: 'Times grandes, múltiplas unidades e necessidades sob medida.',
49
+ amountCents: 59700,
50
+ periodicity: 'monthly',
51
+ trialDays: DEFAULT_TRIAL_DAYS,
52
+ modules: [
53
+ 'clients',
54
+ 'requests',
55
+ 'portal',
56
+ 'billing',
57
+ 'audit',
58
+ 'notifications',
59
+ 'crm',
60
+ 'compliance',
61
+ ],
62
+ limits: { users: 50, clients: 2000, storageGb: 100 },
63
+ isPublic: true,
64
+ isActive: true,
65
+ sortOrder: 3,
66
+ },
67
+ // Plano anual do Pro — mesma franquia, 2 meses de desconto (12x → 10x).
68
+ // NÃO CONTRATÁVEL na v0.1: o checkout certificado cria link RECURRENT MENSAL
69
+ // (asaas.ts, subscriptionCycle fixo) — vender anual cobraria 12x o valor.
70
+ // Reativar quando o contrato de checkout suportar ciclo (v0.2).
71
+ {
72
+ key: 'pro-anual',
73
+ name: 'Pro Anual',
74
+ description: 'Plano Pro com cobrança anual — economize 2 mensalidades.',
75
+ amountCents: 247000,
76
+ periodicity: 'yearly',
77
+ trialDays: DEFAULT_TRIAL_DAYS,
78
+ modules: ['clients', 'requests', 'portal', 'billing', 'audit', 'notifications'],
79
+ limits: { users: 10, clients: 300, storageGb: 25 },
80
+ isPublic: false,
81
+ isActive: false,
82
+ sortOrder: 4,
83
+ },
84
+ ];
85
+ //# sourceMappingURL=plans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plans.js","sourceRoot":"","sources":["../../src/subscription-billing/plans.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAkB9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,MAAM,CAAC,MAAM,UAAU,GAA2B;IAChD;QACE,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,sDAAsD;QACnE,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,kBAAkB;QAC7B,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC;QAC1C,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE;QAC/C,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,CAAC;KACb;IACD;QACE,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,+DAA+D;QAC5E,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,kBAAkB;QAC7B,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC;QAC/E,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE;QAClD,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,CAAC;KACb;IACD;QACE,GAAG,EAAE,YAAY;QACjB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,8DAA8D;QAC3E,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,kBAAkB;QAC7B,OAAO,EAAE;YACP,SAAS;YACT,UAAU;YACV,QAAQ;YACR,SAAS;YACT,OAAO;YACP,eAAe;YACf,KAAK;YACL,YAAY;SACb;QACD,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;QACpD,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,CAAC;KACb;IACD,wEAAwE;IACxE,6EAA6E;IAC7E,0EAA0E;IAC1E,gEAAgE;IAChE;QACE,GAAG,EAAE,WAAW;QAChB,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,0DAA0D;QACvE,WAAW,EAAE,MAAM;QACnB,WAAW,EAAE,QAAQ;QACrB,SAAS,EAAE,kBAAkB;QAC7B,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC;QAC/E,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE;QAClD,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,CAAC;KACb;CACF,CAAC"}
@@ -0,0 +1,61 @@
1
+ import type { SaasBillingConfig } from './service.js';
2
+ /**
3
+ * Nível 2 do Programa Billing Multi-Produto — **Product Billing**.
4
+ *
5
+ * O Billing Core (nível 1) é só tecnologia: gateway, webhook, checkout, régua,
6
+ * máquina de estados. Ele não sabe o que é "Baruk Office" nem "Dental". Quem
7
+ * sabe é este descritor: cada PRODUTO do ecossistema tem a sua conta de
8
+ * gateway, a sua base pública, o seu remetente e a sua política de suspensão.
9
+ *
10
+ * Isso substitui a configuração global única (`BILLING_API_KEY`,
11
+ * `BARUK_WEB_URL`, …), que tornava impossível dois produtos cobrarem ao mesmo
12
+ * tempo — e, pior, faria o checkout de um produto retornar para o domínio de
13
+ * outro.
14
+ *
15
+ * Isolamento financeiro (decisão de 2026-07-31): produtos compartilham
16
+ * TECNOLOGIA, nunca dinheiro. Cada `ProductBillingConfig` aponta para uma conta
17
+ * de gateway distinta; nenhum caminho de código soma, cruza ou concilia valores
18
+ * entre produtos.
19
+ *
20
+ * O nível 3 (**Tenant Billing** — cada escritório contábil com a sua própria
21
+ * conta ASAAS) entra por trás desta mesma interface: `resolve()` recebe um
22
+ * `tenantId` opcional e hoje o ignora. Quando `payment_provider_account` +
23
+ * Vault existirem, é aqui que a credencial do tenant sobrepõe a do produto, sem
24
+ * que nenhum chamador mude.
25
+ */
26
+ export interface ProductBillingConfig extends SaasBillingConfig {
27
+ /** Produto dono desta configuração (`product.key`). */
28
+ productKey: string;
29
+ }
30
+ /** Contexto de resolução. `tenantId` reservado para o nível 3 (Tenant Billing). */
31
+ export interface BillingConfigScope {
32
+ productKey: string;
33
+ tenantId?: string;
34
+ }
35
+ export interface ProductBillingRegistry {
36
+ /**
37
+ * Configuração financeira do escopo pedido.
38
+ * @throws ValidationError se o produto não estiver configurado — cobrar com a
39
+ * conta errada é pior do que não cobrar.
40
+ */
41
+ resolve(scope: BillingConfigScope): ProductBillingConfig;
42
+ has(productKey: string): boolean;
43
+ /** Produtos configurados, em ordem estável. */
44
+ productKeys(): string[];
45
+ }
46
+ /**
47
+ * Registry imutável a partir de uma lista de configurações por produto.
48
+ *
49
+ * Sem `fallbackProductKey`, pedir um produto não configurado é erro. Com ele, o
50
+ * produto indicado responde pelos demais — usado só na transição, enquanto os
51
+ * ambientes ainda têm uma conta só.
52
+ */
53
+ export declare function createProductBillingRegistry(configs: readonly ProductBillingConfig[], options?: {
54
+ fallbackProductKey?: string;
55
+ }): ProductBillingRegistry;
56
+ /**
57
+ * Registry de um produto só — atalho para ambientes de um produto e para os
58
+ * testes que já existiam antes do multi-produto.
59
+ */
60
+ export declare function singleProductRegistry(config: SaasBillingConfig, productKey?: string): ProductBillingRegistry;
61
+ //# sourceMappingURL=product-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-config.d.ts","sourceRoot":"","sources":["../../src/subscription-billing/product-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,oBAAoB,CAAC;IACzD,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,+CAA+C;IAC/C,WAAW,IAAI,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,SAAS,oBAAoB,EAAE,EACxC,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,sBAAsB,CAgCxB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,UAAU,GAAE,MAA4B,GACvC,sBAAsB,CAIxB"}
@@ -0,0 +1,50 @@
1
+ import { ValidationError } from '@baruk/shared';
2
+ import { DEFAULT_PRODUCT_KEY } from './plans.js';
3
+ /**
4
+ * Registry imutável a partir de uma lista de configurações por produto.
5
+ *
6
+ * Sem `fallbackProductKey`, pedir um produto não configurado é erro. Com ele, o
7
+ * produto indicado responde pelos demais — usado só na transição, enquanto os
8
+ * ambientes ainda têm uma conta só.
9
+ */
10
+ export function createProductBillingRegistry(configs, options = {}) {
11
+ const byKey = new Map();
12
+ for (const cfg of configs) {
13
+ if (!cfg.productKey)
14
+ throw new ValidationError('ProductBillingConfig sem productKey');
15
+ if (byKey.has(cfg.productKey)) {
16
+ throw new ValidationError(`Configuração de billing duplicada para o produto ${cfg.productKey}`);
17
+ }
18
+ byKey.set(cfg.productKey, cfg);
19
+ }
20
+ const fallback = options.fallbackProductKey;
21
+ if (fallback && !byKey.has(fallback)) {
22
+ throw new ValidationError(`fallbackProductKey '${fallback}' não está configurado`);
23
+ }
24
+ return {
25
+ resolve({ productKey }) {
26
+ const direct = byKey.get(productKey);
27
+ if (direct)
28
+ return direct;
29
+ if (fallback) {
30
+ const shared = byKey.get(fallback);
31
+ // A config emprestada responde pelo produto pedido, mas se declara como
32
+ // tal — quem audita um checkout vê o produto real, não o fallback.
33
+ return { ...shared, productKey };
34
+ }
35
+ throw new ValidationError(`Produto sem configuração de billing: ${productKey}`);
36
+ },
37
+ has: (productKey) => byKey.has(productKey),
38
+ productKeys: () => [...byKey.keys()],
39
+ };
40
+ }
41
+ /**
42
+ * Registry de um produto só — atalho para ambientes de um produto e para os
43
+ * testes que já existiam antes do multi-produto.
44
+ */
45
+ export function singleProductRegistry(config, productKey = DEFAULT_PRODUCT_KEY) {
46
+ return createProductBillingRegistry([{ ...config, productKey }], {
47
+ fallbackProductKey: productKey,
48
+ });
49
+ }
50
+ //# sourceMappingURL=product-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-config.js","sourceRoot":"","sources":["../../src/subscription-billing/product-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAiDjD;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAwC,EACxC,UAA2C,EAAE;IAE7C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgC,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,UAAU;YAAE,MAAM,IAAI,eAAe,CAAC,qCAAqC,CAAC,CAAC;QACtF,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,eAAe,CACvB,oDAAoD,GAAG,CAAC,UAAU,EAAE,CACrE,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAC5C,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,eAAe,CAAC,uBAAuB,QAAQ,wBAAwB,CAAC,CAAC;IACrF,CAAC;IAED,OAAO;QACL,OAAO,CAAC,EAAE,UAAU,EAAsB;YACxC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACrC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;YAC1B,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;gBACpC,wEAAwE;gBACxE,mEAAmE;gBACnE,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC;YACnC,CAAC;YACD,MAAM,IAAI,eAAe,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,GAAG,EAAE,CAAC,UAAkB,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;QAClD,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;KACrC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAyB,EACzB,aAAqB,mBAAmB;IAExC,OAAO,4BAA4B,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE;QAC/D,kBAAkB,EAAE,UAAU;KAC/B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { BillingMode, CreateCheckoutInput, EnsureCustomerInput, NormalizedWebhookEvent, PaymentGatewayProvider, ProviderCheckout, SubscriptionProviderConfig, ProviderCustomer, ProviderInvoice, WebhookHeaders } from '../types.js';
2
+ export declare class AsaasSubscriptionProvider implements PaymentGatewayProvider {
3
+ readonly name = "asaas";
4
+ readonly mode: BillingMode;
5
+ private readonly apiKey;
6
+ private readonly webhookSecret?;
7
+ private readonly baseUrl;
8
+ private readonly fetchImpl;
9
+ constructor(config: SubscriptionProviderConfig);
10
+ private call;
11
+ ensureCustomer(input: EnsureCustomerInput): Promise<ProviderCustomer>;
12
+ createCheckout(input: CreateCheckoutInput): Promise<ProviderCheckout>;
13
+ getPayment(externalId: string): Promise<ProviderInvoice | null>;
14
+ /** Autenticidade — SEMPRE antes de `parseWebhookEvent` (RFC §7, passo separado). */
15
+ verifyWebhook(headers: WebhookHeaders, _rawBody: string): boolean;
16
+ /**
17
+ * Reescrito a partir do mapeamento real e ja validado em producao do Golden Project
18
+ * (`dental-platform-engine/gateway/asaas-map.ts`, RFC §10) — a versao anterior
19
+ * zerava `paymentLinkId`/`externalReference`/`externalCustomerId` (nunca extraia do
20
+ * payload real), o que quebraria a atribuicao de tenant (`resolveContext`) de
21
+ * qualquer consumidor que dependesse desses campos. Tambem nao tratava eventos
22
+ * `kind: 'subscription'`, so `kind: 'invoice'`.
23
+ */
24
+ parseWebhookEvent(payload: unknown): NormalizedWebhookEvent | null;
25
+ }
26
+ //# sourceMappingURL=asaas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asaas.d.ts","sourceRoot":"","sources":["../../../src/subscription-billing/provider/asaas.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EAGnB,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,0BAA0B,EAC1B,gBAAgB,EAChB,eAAe,EACf,cAAc,EACf,MAAM,aAAa,CAAC;AA4FrB,qBAAa,yBAA0B,YAAW,sBAAsB;IACtE,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,MAAM,EAAE,0BAA0B;YAShC,IAAI;IAoCZ,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUrE,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgBrE,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAKrE,oFAAoF;IACpF,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOjE;;;;;;;OAOG;IACH,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI;CAmDnE"}
@@ -0,0 +1,229 @@
1
+ import { timingSafeEqual } from 'node:crypto';
2
+ import { AppError } from '@baruk/shared';
3
+ import { logSanitized } from '../../mail/sanitize.js';
4
+ /**
5
+ * Adapter ASAAS — Golden Provider (RFC §7). A Capability NUNCA importa este
6
+ * arquivo fora de `registry.ts` — trocar de gateway e trocar a string
7
+ * registrada, sem tocar em regra de dominio (ADR-ECO-0019, ja validado em
8
+ * `cap.communication.transactional-email` e no `dental-platform-engine`
9
+ * real, RFC §3). `apiKey` nunca hardcoded (vem de `SubscriptionProviderConfig`, Vault na
10
+ * borda do consumidor); `fetchImpl` injetavel para teste sem rede.
11
+ */
12
+ const SANDBOX_BASE = 'https://api-sandbox.asaas.com/v3';
13
+ const LIVE_BASE = 'https://api.asaas.com/v3';
14
+ const TIMEOUT_MS = 12_000;
15
+ class AsaasProviderError extends AppError {
16
+ constructor(message, status = 502) {
17
+ super(`Provider de pagamento: ${message}`, { status, code: 'billing_provider_error' });
18
+ }
19
+ }
20
+ function safeEqual(a, b) {
21
+ const ba = Buffer.from(a);
22
+ const bb = Buffer.from(b);
23
+ if (ba.length !== bb.length)
24
+ return false;
25
+ return timingSafeEqual(ba, bb);
26
+ }
27
+ /**
28
+ * Mapeia o vocabulario do ASAAS para o enum NORMALIZADO PELO DOMINIO (RFC §6) — nunca
29
+ * o contrario. Alinhado ao mapeamento real e ja validado em producao do Golden Project
30
+ * (`dental-platform-engine/gateway/asaas-map.ts`, RFC §10) — cobre `REFUND_REQUESTED`/
31
+ * `CHARGEBACK_*`/`CANCELED` explicito e e case-insensitive (ASAAS nao garante caixa
32
+ * consistente entre ambientes).
33
+ */
34
+ function normalizeAsaasStatus(status) {
35
+ switch ((status ?? '').toUpperCase()) {
36
+ case 'PENDING':
37
+ case 'AWAITING_RISK_ANALYSIS':
38
+ return 'pending';
39
+ case 'CONFIRMED':
40
+ return 'confirmed';
41
+ case 'RECEIVED':
42
+ case 'RECEIVED_IN_CASH':
43
+ return 'received';
44
+ case 'OVERDUE':
45
+ return 'overdue';
46
+ case 'REFUNDED':
47
+ case 'REFUND_REQUESTED':
48
+ case 'CHARGEBACK_REQUESTED':
49
+ case 'CHARGEBACK_DISPUTE':
50
+ return 'refunded';
51
+ case 'DELETED':
52
+ case 'CANCELED':
53
+ return 'canceled';
54
+ default:
55
+ return 'failed';
56
+ }
57
+ }
58
+ /** Mesma origem do mapeamento acima — status de ASSINATURA (evento `kind: 'subscription'`). */
59
+ function normalizeAsaasSubscriptionStatus(status) {
60
+ switch ((status ?? '').toUpperCase()) {
61
+ case 'ACTIVE':
62
+ return 'active';
63
+ case 'EXPIRED':
64
+ case 'OVERDUE':
65
+ return 'past_due';
66
+ case 'INACTIVE':
67
+ case 'CANCELED':
68
+ return 'canceled';
69
+ default:
70
+ return 'active';
71
+ }
72
+ }
73
+ function normalizeAsaasPayment(p) {
74
+ return {
75
+ externalId: String(p['id']),
76
+ status: normalizeAsaasStatus(p['status']),
77
+ value: Number(p['value'] ?? 0),
78
+ billingType: p['billingType'] ?? null,
79
+ dueDate: p['dueDate'] ?? null,
80
+ paidAt: p['paymentDate'] ?? null,
81
+ externalSubscriptionId: p['subscription'] ?? null,
82
+ invoiceUrl: p['invoiceUrl'] ?? null,
83
+ bankSlipUrl: p['bankSlipUrl'] ?? null,
84
+ pixPayload: p['pixCopyAndPaste'] ?? null,
85
+ description: p['description'] ?? null,
86
+ };
87
+ }
88
+ export class AsaasSubscriptionProvider {
89
+ name = 'asaas';
90
+ mode;
91
+ apiKey;
92
+ webhookSecret;
93
+ baseUrl;
94
+ fetchImpl;
95
+ constructor(config) {
96
+ if (!config.apiKey)
97
+ throw new AsaasProviderError('apiKey ausente (configure no Vault).', 500);
98
+ this.apiKey = config.apiKey;
99
+ this.webhookSecret = config.webhookSecret;
100
+ this.mode = config.mode ?? 'sandbox';
101
+ this.baseUrl = config.baseUrl ?? (this.mode === 'live' ? LIVE_BASE : SANDBOX_BASE);
102
+ this.fetchImpl = config.fetchImpl ?? fetch;
103
+ }
104
+ async call(method, path, body) {
105
+ const controller = new AbortController();
106
+ const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
107
+ try {
108
+ const res = await this.fetchImpl(`${this.baseUrl}${path}`, {
109
+ method,
110
+ headers: { 'content-type': 'application/json', access_token: this.apiKey },
111
+ body: body ? JSON.stringify(body) : undefined,
112
+ signal: controller.signal,
113
+ });
114
+ const text = await res.text();
115
+ const json = text ? JSON.parse(text) : {};
116
+ if (!res.ok) {
117
+ // Nunca propaga o corpo bruto do provider (pode conter a propria apiKey ecoada) —
118
+ // mesma invariante ja endurecida em 2 rounds de Certification (mail/, RFC §9).
119
+ const errors = json['errors'];
120
+ const detail = errors?.[0]?.description ?? `HTTP ${res.status}`;
121
+ logSanitized(`[subscription-billing] asaas ${method} ${path} falhou:`, detail, [this.apiKey, this.webhookSecret]);
122
+ throw new AsaasProviderError('falha ao contatar o provider de pagamento.');
123
+ }
124
+ return json;
125
+ }
126
+ catch (err) {
127
+ if (err instanceof AsaasProviderError)
128
+ throw err;
129
+ if (err instanceof Error && err.name === 'AbortError') {
130
+ throw new AsaasProviderError(`timeout apos ${TIMEOUT_MS}ms`, 504);
131
+ }
132
+ logSanitized(`[subscription-billing] asaas ${method} ${path} erro de rede:`, err instanceof Error ? err.message : String(err), [
133
+ this.apiKey,
134
+ this.webhookSecret,
135
+ ]);
136
+ throw new AsaasProviderError('falha de rede ao contatar o provider de pagamento.');
137
+ }
138
+ finally {
139
+ clearTimeout(timer);
140
+ }
141
+ }
142
+ async ensureCustomer(input) {
143
+ const created = await this.call('POST', '/customers', {
144
+ name: input.name,
145
+ email: input.email ?? undefined,
146
+ cpfCnpj: input.taxId ?? undefined,
147
+ externalReference: input.tenantId,
148
+ });
149
+ return { externalId: created.id };
150
+ }
151
+ async createCheckout(input) {
152
+ // Payment link hospedado, recorrente — cobre o caso de subscription (RFC §7).
153
+ // Cobranca direta PIX/boleto sem redirect e do Concern B, fora de escopo (RFC §7).
154
+ const link = await this.call('POST', '/paymentLinks', {
155
+ name: input.description,
156
+ billingType: 'UNDEFINED',
157
+ chargeType: 'RECURRENT',
158
+ subscriptionCycle: 'MONTHLY',
159
+ value: input.amountBRL,
160
+ dueDateLimitDays: 7,
161
+ externalReference: `${input.tenantId}:${input.planKey}`,
162
+ callback: { successUrl: input.returnUrl, autoRedirect: true },
163
+ });
164
+ return { externalId: link.id, url: link.url };
165
+ }
166
+ async getPayment(externalId) {
167
+ const p = await this.call('GET', `/payments/${encodeURIComponent(externalId)}`);
168
+ return normalizeAsaasPayment(p);
169
+ }
170
+ /** Autenticidade — SEMPRE antes de `parseWebhookEvent` (RFC §7, passo separado). */
171
+ verifyWebhook(headers, _rawBody) {
172
+ void _rawBody;
173
+ if (!this.webhookSecret)
174
+ return false; // sem token configurado → nunca confia no evento
175
+ const received = headers['asaas-access-token'] ?? headers['Asaas-Access-Token'] ?? '';
176
+ return typeof received === 'string' && received.length > 0 && safeEqual(received, this.webhookSecret);
177
+ }
178
+ /**
179
+ * Reescrito a partir do mapeamento real e ja validado em producao do Golden Project
180
+ * (`dental-platform-engine/gateway/asaas-map.ts`, RFC §10) — a versao anterior
181
+ * zerava `paymentLinkId`/`externalReference`/`externalCustomerId` (nunca extraia do
182
+ * payload real), o que quebraria a atribuicao de tenant (`resolveContext`) de
183
+ * qualquer consumidor que dependesse desses campos. Tambem nao tratava eventos
184
+ * `kind: 'subscription'`, so `kind: 'invoice'`.
185
+ */
186
+ parseWebhookEvent(payload) {
187
+ const p = payload;
188
+ if (!p || typeof p !== 'object' || !p.event)
189
+ return null;
190
+ const eventType = p.event;
191
+ const paymentId = p.payment?.['id'];
192
+ if (typeof paymentId === 'string') {
193
+ // ASAAS envia o objeto `payment` completo no webhook (mesmo shape de GET /payments/{id}) —
194
+ // reusa o mesmo mapeador do gateway, sem duplicar a normalizacao (RFC §6).
195
+ const invoice = normalizeAsaasPayment(p.payment);
196
+ const externalEventId = p.id ?? `${eventType}:${paymentId}:${p.dateCreated ?? ''}`;
197
+ return {
198
+ externalEventId,
199
+ eventType,
200
+ kind: 'invoice',
201
+ invoice,
202
+ externalCustomerId: p.payment['customer'] ?? null,
203
+ externalReference: p.payment['externalReference'] ?? null,
204
+ paymentLinkId: p.payment['paymentLink'] ?? null,
205
+ };
206
+ }
207
+ if (p.subscription?.id) {
208
+ const externalEventId = p.id ?? `${eventType}:${p.subscription.id}:${p.dateCreated ?? ''}`;
209
+ return {
210
+ externalEventId,
211
+ eventType,
212
+ kind: 'subscription',
213
+ subscription: {
214
+ externalId: p.subscription.id,
215
+ status: normalizeAsaasSubscriptionStatus(p.subscription.status),
216
+ },
217
+ externalCustomerId: p.subscription.customer ?? null,
218
+ externalReference: p.subscription.externalReference ?? null,
219
+ };
220
+ }
221
+ // Evento reconhecido mas sem recurso acionavel → 'unknown' (ainda assim deduplicavel/logavel).
222
+ return {
223
+ externalEventId: p.id ?? `${eventType}:${p.dateCreated ?? ''}`,
224
+ eventType,
225
+ kind: 'unknown',
226
+ };
227
+ }
228
+ }
229
+ //# sourceMappingURL=asaas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asaas.js","sourceRoot":"","sources":["../../../src/subscription-billing/provider/asaas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { CreateCheckoutInput, EnsureCustomerInput, NormalizedWebhookEvent, PaymentGatewayProvider, ProviderCheckout, ProviderCustomer, ProviderInvoice, WebhookHeaders } from '../types.js';
2
+ /**
3
+ * Provider `disabled` — estado de primeira classe (RFC §7): sem apiKey
4
+ * configurada, o registry resolve para este stub. NUNCA toca a rede, nunca
5
+ * cobra. Preserva o comportamento de dry-run que o `dental-platform-engine`
6
+ * ja usa em producao hoje (RFC §3).
7
+ *
8
+ * `name` e injetavel (default `'disabled'`) para preservar qual provider FOI
9
+ * PEDIDO mesmo sem chave configurada (ex.: `resolveSubscriptionBillingProvider('asaas', {})`
10
+ * → `name: 'asaas'`) — o Golden Project (`dental`) grava `provider.name` em registros
11
+ * de DB (`CheckoutSession`, `BillingCustomer` etc.) e precisa do nome pedido, nao do
12
+ * literal `'disabled'`, para manter consistencia quando a chave for configurada depois.
13
+ */
14
+ export declare class DisabledSubscriptionProvider implements PaymentGatewayProvider {
15
+ readonly name: string;
16
+ readonly mode: "disabled";
17
+ constructor(name?: string);
18
+ /**
19
+ * Lanca erro deliberadamente (nao devolve stub) — contrato ja validado e testado no
20
+ * Golden Project (`dental-platform-engine`, RFC §10): `ensureCustomer` so e chamado
21
+ * apos o chamador checar `mode !== 'disabled'`; chegar aqui e um bug de chamada, e
22
+ * falhar alto e melhor do que persistir um `externalId` fake que parece real.
23
+ */
24
+ ensureCustomer(_input: EnsureCustomerInput): Promise<ProviderCustomer>;
25
+ createCheckout(_input: CreateCheckoutInput): Promise<ProviderCheckout>;
26
+ getPayment(_externalId: string): Promise<ProviderInvoice | null>;
27
+ verifyWebhook(_headers: WebhookHeaders, _rawBody: string): boolean;
28
+ parseWebhookEvent(_payload: unknown): NormalizedWebhookEvent | null;
29
+ }
30
+ //# sourceMappingURL=disabled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disabled.d.ts","sourceRoot":"","sources":["../../../src/subscription-billing/provider/disabled.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACf,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;GAWG;AACH,qBAAa,4BAA6B,YAAW,sBAAsB;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;gBAExB,IAAI,SAAa;IAI7B;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAKtE,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAItE,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAItE,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIlE,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI;CAGpE"}