@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,51 @@
1
+ -- 0012 — Vault Engine: cofre de credenciais por tenant. Todo segredo (API keys,
2
+ -- OAuth, SMTP, certificados, tokens gov/receita, billing) é armazenado
3
+ -- CRIPTOGRAFADO (AES-256-GCM) — a coluna `ciphertext` é bytea; a chave-mestra
4
+ -- NUNCA vive no banco, apenas no ambiente da aplicação. O papel `baruk_app` só
5
+ -- enxerga o texto cifrado; a decifração exige a permissão `vault.credential.decrypt`
6
+ -- na camada de aplicação. Tenant-scoped com RLS FORCE (motor agnóstico — o Core
7
+ -- não conhece "certificado A1 contábil"; isso é apenas uma `category`).
8
+
9
+ CREATE TABLE vault_credential (
10
+ id uuid PRIMARY KEY,
11
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
12
+ -- Opcionalmente amarra a credencial a um cliente do escritório (ex.: certificado
13
+ -- digital do cliente). NULL = credencial do próprio tenant (ex.: SMTP do escritório).
14
+ client_id uuid,
15
+ name text NOT NULL, -- rótulo humano ("SMTP Resend", "Cert A1 Cliente X")
16
+ category text NOT NULL DEFAULT 'generic'
17
+ CHECK (category IN ('api_key','oauth','smtp','certificate','token',
18
+ 'gov','billing','database','webhook','generic')),
19
+ provider text, -- 'asaas','openai','google','resend','gov_br'…
20
+ -- Envelope AES-256-GCM: nonce (iv) + tag de autenticação + texto cifrado + versão
21
+ -- da chave-mestra (permite rotação de KEK sem re-cifrar tudo de uma vez).
22
+ ciphertext bytea NOT NULL,
23
+ iv bytea NOT NULL,
24
+ auth_tag bytea NOT NULL,
25
+ key_version int NOT NULL DEFAULT 1,
26
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb, -- campos não sensíveis (usuário, host, escopo)
27
+ expires_at timestamptz, -- vencimento (certificados, tokens)
28
+ rotated_at timestamptz,
29
+ created_at timestamptz NOT NULL DEFAULT now(),
30
+ updated_at timestamptz NOT NULL DEFAULT now(),
31
+ deleted_at timestamptz,
32
+ created_by uuid REFERENCES "user"(id),
33
+ updated_by uuid REFERENCES "user"(id),
34
+ version int NOT NULL DEFAULT 1,
35
+ CONSTRAINT vault_credential_tenant_id_uq UNIQUE (tenant_id, id),
36
+ -- Se amarrada a um cliente, garante mesmo-tenant por integridade referencial.
37
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id)
38
+ );
39
+ -- Nome único por tenant (+client) enquanto não deletada.
40
+ CREATE UNIQUE INDEX vault_credential_name_uq
41
+ ON vault_credential (tenant_id, coalesce(client_id, '00000000-0000-0000-0000-000000000000'::uuid), lower(name))
42
+ WHERE deleted_at IS NULL;
43
+ CREATE INDEX vault_credential_tenant_idx ON vault_credential (tenant_id, category);
44
+ CREATE INDEX vault_credential_expiry_idx ON vault_credential (tenant_id, expires_at)
45
+ WHERE deleted_at IS NULL AND expires_at IS NOT NULL;
46
+
47
+ ALTER TABLE vault_credential ENABLE ROW LEVEL SECURITY;
48
+ ALTER TABLE vault_credential FORCE ROW LEVEL SECURITY;
49
+ CREATE POLICY vault_credential_tenant_isolation ON vault_credential
50
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
51
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
@@ -0,0 +1,67 @@
1
+ -- 0013 — CRM Engine: funil comercial agnóstico de segmento. Um `lead` percorre
2
+ -- estágios (Lead → Contato → Proposta → Ganho/Perdido) e, ao ser ganho, pode ser
3
+ -- convertido em `client` (FK composta same-tenant). `crm_activity` é a timeline
4
+ -- imutável de histórico/tarefas/comentários. Tenant-scoped com RLS FORCE.
5
+ -- O Core não conhece "regime tributário" — o lead é um contato comercial genérico.
6
+
7
+ CREATE TABLE lead (
8
+ id uuid PRIMARY KEY,
9
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
10
+ name text NOT NULL,
11
+ company text,
12
+ email citext,
13
+ phone text,
14
+ source text, -- origem: 'site','indicacao','ads','inbound'…
15
+ stage text NOT NULL DEFAULT 'lead'
16
+ CHECK (stage IN ('lead','contact','proposal','won','lost')),
17
+ status text NOT NULL DEFAULT 'open'
18
+ CHECK (status IN ('open','won','lost')),
19
+ estimated_value numeric(14,2), -- valor esperado do negócio
20
+ probability int NOT NULL DEFAULT 0 CHECK (probability BETWEEN 0 AND 100),
21
+ owner_user_id uuid REFERENCES "user"(id), -- responsável comercial
22
+ tags jsonb NOT NULL DEFAULT '[]'::jsonb,
23
+ notes text,
24
+ lost_reason text,
25
+ -- Ao converter (won), amarra ao cliente criado (same-tenant por integridade).
26
+ client_id uuid,
27
+ created_by uuid REFERENCES "user"(id),
28
+ created_at timestamptz NOT NULL DEFAULT now(),
29
+ updated_at timestamptz NOT NULL DEFAULT now(),
30
+ deleted_at timestamptz,
31
+ version int NOT NULL DEFAULT 1,
32
+ CONSTRAINT lead_tenant_id_uq UNIQUE (tenant_id, id),
33
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id)
34
+ );
35
+ CREATE INDEX lead_tenant_stage_idx ON lead (tenant_id, stage, status);
36
+ CREATE INDEX lead_tenant_owner_idx ON lead (tenant_id, owner_user_id);
37
+
38
+ -- Timeline do lead: notas, ligações, e-mails, mudanças de estágio, TAREFAS (due_date).
39
+ CREATE TABLE crm_activity (
40
+ id uuid PRIMARY KEY,
41
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
42
+ lead_id uuid NOT NULL,
43
+ kind text NOT NULL DEFAULT 'note'
44
+ CHECK (kind IN ('note','call','email','meeting','task','stage_change','system')),
45
+ body text,
46
+ due_date timestamptz, -- para kind='task'
47
+ done_at timestamptz,
48
+ author_user_id uuid REFERENCES "user"(id),
49
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
50
+ created_at timestamptz NOT NULL DEFAULT now(),
51
+ FOREIGN KEY (tenant_id, lead_id) REFERENCES lead (tenant_id, id)
52
+ );
53
+ CREATE INDEX crm_activity_lead_idx ON crm_activity (tenant_id, lead_id, created_at DESC);
54
+ CREATE INDEX crm_activity_task_idx ON crm_activity (tenant_id, due_date)
55
+ WHERE kind = 'task' AND done_at IS NULL;
56
+
57
+ ALTER TABLE lead ENABLE ROW LEVEL SECURITY;
58
+ ALTER TABLE lead FORCE ROW LEVEL SECURITY;
59
+ CREATE POLICY lead_tenant_isolation ON lead
60
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
61
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
62
+
63
+ ALTER TABLE crm_activity ENABLE ROW LEVEL SECURITY;
64
+ ALTER TABLE crm_activity FORCE ROW LEVEL SECURITY;
65
+ CREATE POLICY crm_activity_tenant_isolation ON crm_activity
66
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
67
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
@@ -0,0 +1,146 @@
1
+ -- 0014 — Billing Engine: honorários, cobranças, assinaturas e régua de
2
+ -- inadimplência. AGNÓSTICO de gateway: a coluna `provider` guarda apenas o
3
+ -- identificador do adapter ('manual','asaas','stripe',…) e `external_id` o id no
4
+ -- gateway. O Core NUNCA conhece a API de um provider específico — isso vive nos
5
+ -- adapters (Provider Pattern). Tenant-scoped com RLS FORCE.
6
+
7
+ -- ── fee_agreement (acordo de honorários) ────────────────────────────────────
8
+ CREATE TABLE fee_agreement (
9
+ id uuid PRIMARY KEY,
10
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
11
+ client_id uuid NOT NULL,
12
+ description text NOT NULL DEFAULT 'Honorários',
13
+ amount numeric(14,2) NOT NULL,
14
+ periodicity text NOT NULL DEFAULT 'monthly'
15
+ CHECK (periodicity IN ('monthly','quarterly','yearly','one_time')),
16
+ due_day int CHECK (due_day BETWEEN 1 AND 28),
17
+ billing_method text NOT NULL DEFAULT 'pix'
18
+ CHECK (billing_method IN ('pix','boleto','card','manual')),
19
+ discount numeric(14,2) NOT NULL DEFAULT 0,
20
+ fine_percent numeric(6,3) NOT NULL DEFAULT 0, -- multa por atraso (%)
21
+ interest_percent numeric(6,3) NOT NULL DEFAULT 0, -- juros ao mês (%)
22
+ status text NOT NULL DEFAULT 'active'
23
+ CHECK (status IN ('active','suspended','canceled')),
24
+ starts_on date,
25
+ ends_on date,
26
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
27
+ created_by uuid REFERENCES "user"(id),
28
+ created_at timestamptz NOT NULL DEFAULT now(),
29
+ updated_at timestamptz NOT NULL DEFAULT now(),
30
+ deleted_at timestamptz,
31
+ version int NOT NULL DEFAULT 1,
32
+ CONSTRAINT fee_agreement_tenant_id_uq UNIQUE (tenant_id, id),
33
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id)
34
+ );
35
+ CREATE INDEX fee_agreement_client_idx ON fee_agreement (tenant_id, client_id, status);
36
+
37
+ -- ── charge (cobrança individual) ────────────────────────────────────────────
38
+ CREATE TABLE charge (
39
+ id uuid PRIMARY KEY,
40
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
41
+ client_id uuid NOT NULL,
42
+ fee_agreement_id uuid,
43
+ provider text NOT NULL DEFAULT 'manual', -- adapter que emitiu ('manual','asaas',…)
44
+ external_id text, -- id no gateway (idempotência)
45
+ method text NOT NULL DEFAULT 'pix'
46
+ CHECK (method IN ('pix','boleto','card','manual')),
47
+ amount numeric(14,2) NOT NULL,
48
+ status text NOT NULL DEFAULT 'pending'
49
+ CHECK (status IN ('pending','sent','paid','overdue','canceled','refunded')),
50
+ description text,
51
+ due_date date,
52
+ paid_at timestamptz,
53
+ -- Dados do gateway não sensíveis: url do boleto, payload PIX copia-e-cola, etc.
54
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
55
+ created_by uuid REFERENCES "user"(id),
56
+ created_at timestamptz NOT NULL DEFAULT now(),
57
+ updated_at timestamptz NOT NULL DEFAULT now(),
58
+ deleted_at timestamptz,
59
+ version int NOT NULL DEFAULT 1,
60
+ CONSTRAINT charge_tenant_id_uq UNIQUE (tenant_id, id),
61
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
62
+ FOREIGN KEY (tenant_id, fee_agreement_id) REFERENCES fee_agreement (tenant_id, id)
63
+ );
64
+ CREATE INDEX charge_client_idx ON charge (tenant_id, client_id, status);
65
+ CREATE INDEX charge_status_due_idx ON charge (tenant_id, status, due_date);
66
+ -- Idempotência por gateway: um external_id não repete por provider/tenant.
67
+ CREATE UNIQUE INDEX charge_external_uq ON charge (tenant_id, provider, external_id)
68
+ WHERE external_id IS NOT NULL AND deleted_at IS NULL;
69
+
70
+ -- ── subscription (recorrência delegada ao gateway) ──────────────────────────
71
+ CREATE TABLE subscription (
72
+ id uuid PRIMARY KEY,
73
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
74
+ client_id uuid NOT NULL,
75
+ fee_agreement_id uuid,
76
+ provider text NOT NULL DEFAULT 'manual',
77
+ external_id text,
78
+ status text NOT NULL DEFAULT 'active'
79
+ CHECK (status IN ('active','paused','canceled')),
80
+ next_charge_on date,
81
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
82
+ created_at timestamptz NOT NULL DEFAULT now(),
83
+ updated_at timestamptz NOT NULL DEFAULT now(),
84
+ CONSTRAINT subscription_tenant_id_uq UNIQUE (tenant_id, id),
85
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
86
+ FOREIGN KEY (tenant_id, fee_agreement_id) REFERENCES fee_agreement (tenant_id, id)
87
+ );
88
+ CREATE INDEX subscription_client_idx ON subscription (tenant_id, client_id, status);
89
+
90
+ -- ── dunning_rule (régua de inadimplência) ───────────────────────────────────
91
+ -- `steps` é um array de passos: [{ "offsetDays": -3, "channel": "whatsapp", "template": "lembrete" }, …]
92
+ -- offsetDays negativo = antes do vencimento; 0 = no dia; positivo = após.
93
+ CREATE TABLE dunning_rule (
94
+ id uuid PRIMARY KEY,
95
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
96
+ name text NOT NULL,
97
+ steps jsonb NOT NULL DEFAULT '[]'::jsonb,
98
+ active boolean NOT NULL DEFAULT true,
99
+ created_at timestamptz NOT NULL DEFAULT now(),
100
+ updated_at timestamptz NOT NULL DEFAULT now(),
101
+ CONSTRAINT dunning_rule_tenant_id_uq UNIQUE (tenant_id, id)
102
+ );
103
+ CREATE INDEX dunning_rule_tenant_idx ON dunning_rule (tenant_id, active);
104
+
105
+ -- Log de passos de dunning já executados por cobrança (idempotência do disparo).
106
+ CREATE TABLE dunning_event (
107
+ id uuid PRIMARY KEY,
108
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
109
+ charge_id uuid NOT NULL,
110
+ step_key text NOT NULL, -- ex.: 'D-3:whatsapp'
111
+ channel text NOT NULL,
112
+ created_at timestamptz NOT NULL DEFAULT now(),
113
+ FOREIGN KEY (tenant_id, charge_id) REFERENCES charge (tenant_id, id)
114
+ );
115
+ CREATE UNIQUE INDEX dunning_event_uq ON dunning_event (tenant_id, charge_id, step_key);
116
+
117
+ -- ── RLS FORCE em todas ──────────────────────────────────────────────────────
118
+ ALTER TABLE fee_agreement ENABLE ROW LEVEL SECURITY;
119
+ ALTER TABLE fee_agreement FORCE ROW LEVEL SECURITY;
120
+ CREATE POLICY fee_agreement_tenant_isolation ON fee_agreement
121
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
122
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
123
+
124
+ ALTER TABLE charge ENABLE ROW LEVEL SECURITY;
125
+ ALTER TABLE charge FORCE ROW LEVEL SECURITY;
126
+ CREATE POLICY charge_tenant_isolation ON charge
127
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
128
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
129
+
130
+ ALTER TABLE subscription ENABLE ROW LEVEL SECURITY;
131
+ ALTER TABLE subscription FORCE ROW LEVEL SECURITY;
132
+ CREATE POLICY subscription_tenant_isolation ON subscription
133
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
134
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
135
+
136
+ ALTER TABLE dunning_rule ENABLE ROW LEVEL SECURITY;
137
+ ALTER TABLE dunning_rule FORCE ROW LEVEL SECURITY;
138
+ CREATE POLICY dunning_rule_tenant_isolation ON dunning_rule
139
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
140
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
141
+
142
+ ALTER TABLE dunning_event ENABLE ROW LEVEL SECURITY;
143
+ ALTER TABLE dunning_event FORCE ROW LEVEL SECURITY;
144
+ CREATE POLICY dunning_event_tenant_isolation ON dunning_event
145
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
146
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
@@ -0,0 +1,201 @@
1
+ -- 0015 — Merchant Billing Core: Accounts Receivable (M0 — RFC-CAPABILITY-
2
+ -- MERCHANT-BILLING-CORE-001 §4/§20). Migração ADITIVA sobre 0014_billing.sql —
3
+ -- não altera fee_agreement/charge/subscription existentes. Adiciona a camada de
4
+ -- AR que faltava: Receivable (conta a receber, NUNCA o instrumento `charge`) →
5
+ -- Payment (dinheiro recebido) → Settlement (liquidação) → Reconciliation
6
+ -- (conciliação). Tenant-scoped com RLS FORCE, mesmo padrão de 0014.
7
+ --
8
+ -- Apenas schema nesta migração (M0) — a lógica de domínio (máquina de estados,
9
+ -- geração por competência, repositório) é M1 ("Merchant Billing Core"), fora
10
+ -- do escopo autorizado nesta sessão.
11
+
12
+ -- ── receivable (conta a receber — NUNCA o instrumento de cobrança) ──────────
13
+ CREATE TABLE receivable (
14
+ id uuid PRIMARY KEY,
15
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
16
+ client_id uuid NOT NULL,
17
+ fee_agreement_id uuid, -- null = cobrança avulsa
18
+ competence text CHECK (competence ~ '^\d{4}-\d{2}$'), -- YYYY-MM
19
+ amount numeric(14,2) NOT NULL,
20
+ status text NOT NULL DEFAULT 'open'
21
+ CHECK (status IN ('open','partially_paid','paid','overdue','canceled','renegotiated','written_off')),
22
+ due_date date,
23
+ issued_at timestamptz NOT NULL DEFAULT now(),
24
+ renegotiated_from_id uuid, -- aponta para a Receivable original, se houver
25
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
26
+ created_by uuid REFERENCES "user"(id),
27
+ created_at timestamptz NOT NULL DEFAULT now(),
28
+ updated_at timestamptz NOT NULL DEFAULT now(),
29
+ deleted_at timestamptz,
30
+ version int NOT NULL DEFAULT 1,
31
+ CONSTRAINT receivable_tenant_id_uq UNIQUE (tenant_id, id),
32
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
33
+ FOREIGN KEY (tenant_id, fee_agreement_id) REFERENCES fee_agreement (tenant_id, id),
34
+ FOREIGN KEY (tenant_id, renegotiated_from_id) REFERENCES receivable (tenant_id, id)
35
+ );
36
+ CREATE INDEX receivable_client_idx ON receivable (tenant_id, client_id, status);
37
+ CREATE INDEX receivable_status_due_idx ON receivable (tenant_id, status, due_date);
38
+ CREATE INDEX receivable_competence_idx ON receivable (tenant_id, fee_agreement_id, competence);
39
+ -- Um FeeAgreement gera no máximo 1 Receivable por competência (invariante de
40
+ -- idempotência da geração — a função que gera é M1, mas a garantia é do schema).
41
+ CREATE UNIQUE INDEX receivable_fee_competence_uq ON receivable (tenant_id, fee_agreement_id, competence)
42
+ WHERE fee_agreement_id IS NOT NULL AND competence IS NOT NULL AND deleted_at IS NULL;
43
+
44
+ -- ── receivable_item (rastreabilidade: o que compõe a Receivable) ───────────
45
+ CREATE TABLE receivable_item (
46
+ id uuid PRIMARY KEY,
47
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
48
+ receivable_id uuid NOT NULL,
49
+ description text NOT NULL,
50
+ amount numeric(14,2) NOT NULL,
51
+ -- Ligação futura ao ServiceItem (dental/contabilidade) — não modelado neste M0
52
+ -- (RFC §3: preparado pelo contrato, implementado depois). Evita migração de
53
+ -- forma quando o ServiceItem chegar.
54
+ service_item_ref text,
55
+ created_at timestamptz NOT NULL DEFAULT now(),
56
+ CONSTRAINT receivable_item_tenant_id_uq UNIQUE (tenant_id, id),
57
+ FOREIGN KEY (tenant_id, receivable_id) REFERENCES receivable (tenant_id, id)
58
+ );
59
+ CREATE INDEX receivable_item_receivable_idx ON receivable_item (tenant_id, receivable_id);
60
+
61
+ -- ── payment (dinheiro recebido — pode ser parcial) ─────────────────────────
62
+ CREATE TABLE payment (
63
+ id uuid PRIMARY KEY,
64
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
65
+ receivable_id uuid NOT NULL,
66
+ charge_id uuid, -- null = baixa manual sem Charge
67
+ amount numeric(14,2) NOT NULL,
68
+ method text NOT NULL DEFAULT 'pix'
69
+ CHECK (method IN ('pix','boleto','card','manual')),
70
+ status text NOT NULL DEFAULT 'detected'
71
+ CHECK (status IN ('detected','confirmed','refunded')),
72
+ paid_at timestamptz NOT NULL DEFAULT now(),
73
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
74
+ created_at timestamptz NOT NULL DEFAULT now(),
75
+ CONSTRAINT payment_tenant_id_uq UNIQUE (tenant_id, id),
76
+ FOREIGN KEY (tenant_id, receivable_id) REFERENCES receivable (tenant_id, id),
77
+ FOREIGN KEY (tenant_id, charge_id) REFERENCES charge (tenant_id, id)
78
+ );
79
+ CREATE INDEX payment_receivable_idx ON payment (tenant_id, receivable_id, status);
80
+
81
+ -- ── settlement (liquidação — o dinheiro caiu na conta do tenant) ───────────
82
+ CREATE TABLE settlement (
83
+ id uuid PRIMARY KEY,
84
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
85
+ payment_id uuid NOT NULL,
86
+ provider text NOT NULL,
87
+ external_id text,
88
+ net_amount numeric(14,2) NOT NULL, -- valor líquido após taxas do provider
89
+ settled_at timestamptz NOT NULL,
90
+ created_at timestamptz NOT NULL DEFAULT now(),
91
+ CONSTRAINT settlement_tenant_id_uq UNIQUE (tenant_id, id),
92
+ FOREIGN KEY (tenant_id, payment_id) REFERENCES payment (tenant_id, id)
93
+ );
94
+ CREATE INDEX settlement_payment_idx ON settlement (tenant_id, payment_id);
95
+
96
+ -- ── reconciliation (casar provider ↔ receivable/charge) ────────────────────
97
+ CREATE TABLE reconciliation (
98
+ id uuid PRIMARY KEY,
99
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
100
+ charge_id uuid,
101
+ receivable_id uuid,
102
+ provider text NOT NULL,
103
+ external_id text,
104
+ status text NOT NULL DEFAULT 'pending'
105
+ CHECK (status IN ('matched','mismatched','pending')),
106
+ detail jsonb NOT NULL DEFAULT '{}'::jsonb,
107
+ created_at timestamptz NOT NULL DEFAULT now(),
108
+ CONSTRAINT reconciliation_tenant_id_uq UNIQUE (tenant_id, id),
109
+ FOREIGN KEY (tenant_id, charge_id) REFERENCES charge (tenant_id, id),
110
+ FOREIGN KEY (tenant_id, receivable_id) REFERENCES receivable (tenant_id, id)
111
+ );
112
+ CREATE INDEX reconciliation_provider_idx ON reconciliation (tenant_id, provider, external_id);
113
+
114
+ -- ── payment_provider_account (a conta do TENANT no provider — nunca uma chave global) ──
115
+ -- Hoje o Asaas é uma única chave de plataforma (registry global). Esta tabela
116
+ -- introduz o modelo por-tenant (RFC §9/§20): credencial/carteira/recebedor
117
+ -- pertencem ao tenant. A credencial em si NUNCA vive aqui — só a referência ao
118
+ -- Vault (`ctx.devplatform.vault`).
119
+ CREATE TABLE payment_provider_account (
120
+ id uuid PRIMARY KEY,
121
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
122
+ provider text NOT NULL,
123
+ account_reference text, -- recebedor/id da conta no provider
124
+ environment text NOT NULL DEFAULT 'sandbox' CHECK (environment IN ('sandbox','live')),
125
+ supported_capabilities jsonb NOT NULL DEFAULT '[]'::jsonb, -- ex.: ["pix","boleto"]
126
+ status text NOT NULL DEFAULT 'pending_validation'
127
+ CHECK (status IN ('active','disabled','pending_validation','revoked')),
128
+ credential_ref text, -- referência ao Vault — NUNCA a credencial
129
+ config_version int NOT NULL DEFAULT 1,
130
+ last_validated_at timestamptz,
131
+ rotated_at timestamptz,
132
+ revoked_at timestamptz,
133
+ created_at timestamptz NOT NULL DEFAULT now(),
134
+ updated_at timestamptz NOT NULL DEFAULT now(),
135
+ CONSTRAINT payment_provider_account_tenant_id_uq UNIQUE (tenant_id, id)
136
+ );
137
+ -- No máximo 1 conta ativa/pendente por (tenant, provider) — revogada não conta.
138
+ CREATE UNIQUE INDEX payment_provider_account_provider_uq ON payment_provider_account (tenant_id, provider)
139
+ WHERE status <> 'revoked';
140
+ CREATE INDEX payment_provider_account_tenant_idx ON payment_provider_account (tenant_id, status);
141
+
142
+ ALTER TABLE payment_provider_account ENABLE ROW LEVEL SECURITY;
143
+ ALTER TABLE payment_provider_account FORCE ROW LEVEL SECURITY;
144
+ CREATE POLICY payment_provider_account_tenant_isolation ON payment_provider_account
145
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
146
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
147
+
148
+ -- ── webhook_event (idempotência de webhook — CROSS-TENANT, de propósito) ───
149
+ -- Mesmo padrão do subscription-billing (dental): o webhook chega ANTES de o
150
+ -- tenant ser resolvido (a rota é `/webhooks/:provider`, não por tenant — quem
151
+ -- resolve o tenant é resolveContext, a partir do payload/conta). Por isso:
152
+ -- (a) tenant_id é NULLABLE (preenchido depois de resolvido);
153
+ -- (b) a chave de idempotência é (provider, external_event_id) SEM tenant_id —
154
+ -- não dá para confiar em tenant no momento do dedup;
155
+ -- (c) esta tabela NÃO tem RLS FORCE — é escrita em contexto de sistema
156
+ -- (SystemDb), antes de `current_tenant` existir na sessão.
157
+ CREATE TABLE webhook_event (
158
+ id uuid PRIMARY KEY,
159
+ tenant_id uuid REFERENCES tenant(id),
160
+ provider text NOT NULL,
161
+ external_event_id text NOT NULL,
162
+ event_type text NOT NULL,
163
+ status text NOT NULL DEFAULT 'received'
164
+ CHECK (status IN ('received','processed','ignored','failed')),
165
+ payload jsonb,
166
+ processed_at timestamptz,
167
+ created_at timestamptz NOT NULL DEFAULT now()
168
+ );
169
+ CREATE UNIQUE INDEX webhook_event_idempotency_uq ON webhook_event (provider, external_event_id);
170
+ CREATE INDEX webhook_event_tenant_idx ON webhook_event (tenant_id) WHERE tenant_id IS NOT NULL;
171
+
172
+ -- ── RLS FORCE nas tabelas tenant-scoped novas ────────────────────────────────
173
+ ALTER TABLE receivable ENABLE ROW LEVEL SECURITY;
174
+ ALTER TABLE receivable FORCE ROW LEVEL SECURITY;
175
+ CREATE POLICY receivable_tenant_isolation ON receivable
176
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
177
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
178
+
179
+ ALTER TABLE receivable_item ENABLE ROW LEVEL SECURITY;
180
+ ALTER TABLE receivable_item FORCE ROW LEVEL SECURITY;
181
+ CREATE POLICY receivable_item_tenant_isolation ON receivable_item
182
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
183
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
184
+
185
+ ALTER TABLE payment ENABLE ROW LEVEL SECURITY;
186
+ ALTER TABLE payment FORCE ROW LEVEL SECURITY;
187
+ CREATE POLICY payment_tenant_isolation ON payment
188
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
189
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
190
+
191
+ ALTER TABLE settlement ENABLE ROW LEVEL SECURITY;
192
+ ALTER TABLE settlement FORCE ROW LEVEL SECURITY;
193
+ CREATE POLICY settlement_tenant_isolation ON settlement
194
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
195
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
196
+
197
+ ALTER TABLE reconciliation ENABLE ROW LEVEL SECURITY;
198
+ ALTER TABLE reconciliation FORCE ROW LEVEL SECURITY;
199
+ CREATE POLICY reconciliation_tenant_isolation ON reconciliation
200
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
201
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
@@ -0,0 +1,162 @@
1
+ -- 0016 — Office onboarding persistence foundation.
2
+ -- Processo operacional tenant-scoped; documentos são apenas referências lógicas.
3
+
4
+ CREATE TABLE onboarding_instance (
5
+ id uuid PRIMARY KEY,
6
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
7
+ client_id uuid NOT NULL,
8
+ status text NOT NULL DEFAULT 'draft'
9
+ CHECK (status IN ('draft', 'active', 'blocked', 'completed', 'cancelled')),
10
+ owner_id uuid REFERENCES "user"(id),
11
+ started_at timestamptz,
12
+ due_at timestamptz,
13
+ blocked_at timestamptz,
14
+ completed_at timestamptz,
15
+ cancelled_at timestamptz,
16
+ blocked_reason text,
17
+ cancellation_reason text,
18
+ version int NOT NULL DEFAULT 1 CHECK (version > 0),
19
+ created_at timestamptz NOT NULL DEFAULT now(),
20
+ updated_at timestamptz NOT NULL DEFAULT now(),
21
+ CONSTRAINT onboarding_instance_tenant_id_uq UNIQUE (tenant_id, id),
22
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
23
+ CHECK (due_at IS NULL OR due_at >= created_at),
24
+ CHECK ((status <> 'blocked') OR blocked_reason IS NOT NULL),
25
+ CHECK ((status <> 'cancelled') OR cancellation_reason IS NOT NULL)
26
+ );
27
+ CREATE INDEX onboarding_instance_tenant_status_idx
28
+ ON onboarding_instance (tenant_id, status, due_at);
29
+ CREATE INDEX onboarding_instance_tenant_client_idx
30
+ ON onboarding_instance (tenant_id, client_id, created_at DESC);
31
+
32
+ CREATE TABLE onboarding_item (
33
+ id uuid PRIMARY KEY,
34
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
35
+ onboarding_id uuid NOT NULL,
36
+ client_id uuid NOT NULL,
37
+ title text NOT NULL,
38
+ description text,
39
+ status text NOT NULL DEFAULT 'pending'
40
+ CHECK (status IN ('pending', 'in_progress', 'completed', 'rejected', 'not_applicable')),
41
+ required boolean NOT NULL DEFAULT true,
42
+ assigned_to uuid REFERENCES "user"(id),
43
+ due_at timestamptz,
44
+ completed_at timestamptz,
45
+ rejection_reason text,
46
+ item_order int NOT NULL DEFAULT 0,
47
+ visibility text NOT NULL DEFAULT 'internal' CHECK (visibility IN ('internal', 'portal')),
48
+ version int NOT NULL DEFAULT 1 CHECK (version > 0),
49
+ created_at timestamptz NOT NULL DEFAULT now(),
50
+ updated_at timestamptz NOT NULL DEFAULT now(),
51
+ CONSTRAINT onboarding_item_tenant_id_uq UNIQUE (tenant_id, id),
52
+ FOREIGN KEY (tenant_id, onboarding_id) REFERENCES onboarding_instance (tenant_id, id)
53
+ ON DELETE CASCADE,
54
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
55
+ CHECK ((status <> 'rejected') OR rejection_reason IS NOT NULL)
56
+ );
57
+ CREATE INDEX onboarding_item_onboarding_idx
58
+ ON onboarding_item (tenant_id, onboarding_id, item_order);
59
+
60
+ CREATE TABLE onboarding_task (
61
+ id uuid PRIMARY KEY,
62
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
63
+ onboarding_id uuid NOT NULL,
64
+ client_id uuid NOT NULL,
65
+ title text NOT NULL,
66
+ description text,
67
+ status text NOT NULL DEFAULT 'pending'
68
+ CHECK (status IN ('pending', 'in_progress', 'completed', 'cancelled')),
69
+ priority text NOT NULL DEFAULT 'normal'
70
+ CHECK (priority IN ('low', 'normal', 'high', 'urgent')),
71
+ assigned_to uuid REFERENCES "user"(id),
72
+ due_at timestamptz,
73
+ completed_at timestamptz,
74
+ version int NOT NULL DEFAULT 1 CHECK (version > 0),
75
+ created_at timestamptz NOT NULL DEFAULT now(),
76
+ updated_at timestamptz NOT NULL DEFAULT now(),
77
+ CONSTRAINT onboarding_task_tenant_id_uq UNIQUE (tenant_id, id),
78
+ FOREIGN KEY (tenant_id, onboarding_id) REFERENCES onboarding_instance (tenant_id, id)
79
+ ON DELETE CASCADE,
80
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id)
81
+ );
82
+ CREATE INDEX onboarding_task_due_idx
83
+ ON onboarding_task (tenant_id, status, due_at);
84
+
85
+ CREATE TABLE onboarding_document_requirement (
86
+ id uuid PRIMARY KEY,
87
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
88
+ onboarding_id uuid NOT NULL,
89
+ client_id uuid NOT NULL,
90
+ type text NOT NULL,
91
+ label text NOT NULL,
92
+ status text NOT NULL DEFAULT 'requested'
93
+ CHECK (status IN ('requested', 'received', 'validated', 'rejected')),
94
+ requested_at timestamptz NOT NULL DEFAULT now(),
95
+ received_at timestamptz,
96
+ validated_at timestamptz,
97
+ rejected_at timestamptz,
98
+ rejection_reason text,
99
+ expires_at timestamptz,
100
+ canonical_document_id uuid,
101
+ CONSTRAINT onboarding_document_requirement_tenant_id_uq UNIQUE (tenant_id, id),
102
+ FOREIGN KEY (tenant_id, onboarding_id) REFERENCES onboarding_instance (tenant_id, id)
103
+ ON DELETE CASCADE,
104
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
105
+ CHECK ((status <> 'rejected') OR rejection_reason IS NOT NULL)
106
+ );
107
+ CREATE INDEX onboarding_document_requirement_status_idx
108
+ ON onboarding_document_requirement (tenant_id, onboarding_id, status);
109
+
110
+ CREATE TABLE onboarding_event (
111
+ event_id uuid PRIMARY KEY,
112
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
113
+ onboarding_id uuid NOT NULL,
114
+ client_id uuid NOT NULL,
115
+ actor_id uuid REFERENCES "user"(id),
116
+ event_type text NOT NULL,
117
+ event_version int NOT NULL DEFAULT 1 CHECK (event_version = 1),
118
+ occurred_at timestamptz NOT NULL,
119
+ correlation_id uuid NOT NULL,
120
+ causation_id uuid,
121
+ entity_type text NOT NULL,
122
+ entity_id uuid NOT NULL,
123
+ payload jsonb NOT NULL DEFAULT '{}'::jsonb,
124
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
125
+ FOREIGN KEY (tenant_id, onboarding_id) REFERENCES onboarding_instance (tenant_id, id)
126
+ ON DELETE CASCADE,
127
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id)
128
+ );
129
+ CREATE INDEX onboarding_event_timeline_idx
130
+ ON onboarding_event (tenant_id, onboarding_id, occurred_at, event_id);
131
+
132
+ -- Todas as tabelas são FORCE RLS. O client scope é resolvido pelo servidor via
133
+ -- app.current_client; sem tenant context nenhuma linha é visível/escrevível.
134
+ DO $$
135
+ DECLARE
136
+ table_name text;
137
+ BEGIN
138
+ FOREACH table_name IN ARRAY ARRAY[
139
+ 'onboarding_instance', 'onboarding_item', 'onboarding_task',
140
+ 'onboarding_document_requirement', 'onboarding_event'
141
+ ] LOOP
142
+ EXECUTE format('ALTER TABLE %I ENABLE ROW LEVEL SECURITY', table_name);
143
+ EXECUTE format('ALTER TABLE %I FORCE ROW LEVEL SECURITY', table_name);
144
+ EXECUTE format($policy$
145
+ CREATE POLICY %I_tenant_client_isolation ON %I
146
+ USING (
147
+ tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
148
+ AND (
149
+ NULLIF(current_setting('app.current_client', true), '') IS NULL
150
+ OR client_id = NULLIF(current_setting('app.current_client', true), '')::uuid
151
+ )
152
+ )
153
+ WITH CHECK (
154
+ tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
155
+ AND (
156
+ NULLIF(current_setting('app.current_client', true), '') IS NULL
157
+ OR client_id = NULLIF(current_setting('app.current_client', true), '')::uuid
158
+ )
159
+ )
160
+ $policy$, table_name, table_name);
161
+ END LOOP;
162
+ END $$;
@@ -0,0 +1,21 @@
1
+ -- 0017 — Idempotência das mutações da API de onboarding.
2
+ -- Registro tenant-scoped; não substitui os mecanismos de Billing.
3
+
4
+ CREATE TABLE onboarding_api_idempotency (
5
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
6
+ operation text NOT NULL,
7
+ idempotency_key text NOT NULL,
8
+ request_fingerprint text NOT NULL,
9
+ response jsonb,
10
+ created_at timestamptz NOT NULL DEFAULT now(),
11
+ completed_at timestamptz,
12
+ PRIMARY KEY (tenant_id, operation, idempotency_key)
13
+ );
14
+ CREATE INDEX onboarding_api_idempotency_created_idx
15
+ ON onboarding_api_idempotency (tenant_id, created_at);
16
+
17
+ ALTER TABLE onboarding_api_idempotency ENABLE ROW LEVEL SECURITY;
18
+ ALTER TABLE onboarding_api_idempotency FORCE ROW LEVEL SECURITY;
19
+ CREATE POLICY onboarding_api_idempotency_tenant_isolation ON onboarding_api_idempotency
20
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
21
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);