@baruk/core 0.3.1 → 0.5.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 (1047) hide show
  1. package/.baruk-provenance.json +10 -0
  2. package/CHANGELOG.md +127 -0
  3. package/dist/audit/repository.d.ts +33 -1
  4. package/dist/audit/repository.d.ts.map +1 -1
  5. package/dist/audit/repository.js +41 -7
  6. package/dist/audit/repository.js.map +1 -1
  7. package/dist/auth/password-reset.d.ts +30 -1
  8. package/dist/auth/password-reset.d.ts.map +1 -1
  9. package/dist/auth/password-reset.js +139 -11
  10. package/dist/auth/password-reset.js.map +1 -1
  11. package/dist/auth/service.d.ts +60 -2
  12. package/dist/auth/service.d.ts.map +1 -1
  13. package/dist/auth/service.js +121 -11
  14. package/dist/auth/service.js.map +1 -1
  15. package/dist/billing/ar-repository.d.ts +374 -0
  16. package/dist/billing/ar-repository.d.ts.map +1 -0
  17. package/dist/billing/ar-repository.js +783 -0
  18. package/dist/billing/ar-repository.js.map +1 -0
  19. package/dist/billing/auto-generation.d.ts +87 -0
  20. package/dist/billing/auto-generation.d.ts.map +1 -0
  21. package/dist/billing/auto-generation.js +181 -0
  22. package/dist/billing/auto-generation.js.map +1 -0
  23. package/dist/billing/live-guard.d.ts +64 -0
  24. package/dist/billing/live-guard.d.ts.map +1 -0
  25. package/dist/billing/live-guard.js +68 -0
  26. package/dist/billing/live-guard.js.map +1 -0
  27. package/dist/billing/payment-means-catalog.d.ts +17 -0
  28. package/dist/billing/payment-means-catalog.d.ts.map +1 -0
  29. package/dist/billing/payment-means-catalog.js +21 -0
  30. package/dist/billing/payment-means-catalog.js.map +1 -0
  31. package/dist/billing/payment-means.d.ts +38 -0
  32. package/dist/billing/payment-means.d.ts.map +1 -0
  33. package/dist/billing/payment-means.js +29 -0
  34. package/dist/billing/payment-means.js.map +1 -0
  35. package/dist/billing/payment-rail.d.ts +118 -0
  36. package/dist/billing/payment-rail.d.ts.map +1 -0
  37. package/dist/billing/payment-rail.js +295 -0
  38. package/dist/billing/payment-rail.js.map +1 -0
  39. package/dist/billing/provider/asaas.d.ts +46 -1
  40. package/dist/billing/provider/asaas.d.ts.map +1 -1
  41. package/dist/billing/provider/asaas.js +194 -14
  42. package/dist/billing/provider/asaas.js.map +1 -1
  43. package/dist/billing/provider/manual.js +1 -1
  44. package/dist/billing/provider/manual.js.map +1 -1
  45. package/dist/billing/provider/types.d.ts +115 -8
  46. package/dist/billing/provider/types.d.ts.map +1 -1
  47. package/dist/billing/provider-account.d.ts +127 -0
  48. package/dist/billing/provider-account.d.ts.map +1 -0
  49. package/dist/billing/provider-account.js +217 -0
  50. package/dist/billing/provider-account.js.map +1 -0
  51. package/dist/billing/provider-onboarding.d.ts +67 -0
  52. package/dist/billing/provider-onboarding.d.ts.map +1 -0
  53. package/dist/billing/provider-onboarding.js +234 -0
  54. package/dist/billing/provider-onboarding.js.map +1 -0
  55. package/dist/billing/receivable.d.ts +5 -1
  56. package/dist/billing/receivable.d.ts.map +1 -1
  57. package/dist/billing/reconcile.d.ts +58 -0
  58. package/dist/billing/reconcile.d.ts.map +1 -0
  59. package/dist/billing/reconcile.js +138 -0
  60. package/dist/billing/reconcile.js.map +1 -0
  61. package/dist/billing/repository.d.ts +134 -1
  62. package/dist/billing/repository.d.ts.map +1 -1
  63. package/dist/billing/repository.js +193 -20
  64. package/dist/billing/repository.js.map +1 -1
  65. package/dist/cjs/audit/repository.js +41 -7
  66. package/dist/cjs/audit/repository.js.map +1 -1
  67. package/dist/cjs/auth/password-reset.js +141 -11
  68. package/dist/cjs/auth/password-reset.js.map +1 -1
  69. package/dist/cjs/auth/service.js +121 -10
  70. package/dist/cjs/auth/service.js.map +1 -1
  71. package/dist/cjs/billing/ar-repository.js +804 -0
  72. package/dist/cjs/billing/ar-repository.js.map +1 -0
  73. package/dist/cjs/billing/auto-generation.js +186 -0
  74. package/dist/cjs/billing/auto-generation.js.map +1 -0
  75. package/dist/cjs/billing/live-guard.js +72 -0
  76. package/dist/cjs/billing/live-guard.js.map +1 -0
  77. package/dist/cjs/billing/payment-means-catalog.js +25 -0
  78. package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
  79. package/dist/cjs/billing/payment-means.js +33 -0
  80. package/dist/cjs/billing/payment-means.js.map +1 -0
  81. package/dist/cjs/billing/payment-rail.js +301 -0
  82. package/dist/cjs/billing/payment-rail.js.map +1 -0
  83. package/dist/cjs/billing/provider/asaas.js +194 -14
  84. package/dist/cjs/billing/provider/asaas.js.map +1 -1
  85. package/dist/cjs/billing/provider/manual.js +1 -1
  86. package/dist/cjs/billing/provider/manual.js.map +1 -1
  87. package/dist/cjs/billing/provider-account.js +229 -0
  88. package/dist/cjs/billing/provider-account.js.map +1 -0
  89. package/dist/cjs/billing/provider-onboarding.js +239 -0
  90. package/dist/cjs/billing/provider-onboarding.js.map +1 -0
  91. package/dist/cjs/billing/reconcile.js +143 -0
  92. package/dist/cjs/billing/reconcile.js.map +1 -0
  93. package/dist/cjs/billing/repository.js +197 -19
  94. package/dist/cjs/billing/repository.js.map +1 -1
  95. package/dist/cjs/clients/ibge.js +103 -0
  96. package/dist/cjs/clients/ibge.js.map +1 -0
  97. package/dist/cjs/clients/repository.js +276 -23
  98. package/dist/cjs/clients/repository.js.map +1 -1
  99. package/dist/cjs/collection/branding.js +330 -0
  100. package/dist/cjs/collection/branding.js.map +1 -0
  101. package/dist/cjs/collection/channel-accounts.js +137 -0
  102. package/dist/cjs/collection/channel-accounts.js.map +1 -0
  103. package/dist/cjs/collection/channel.js +17 -0
  104. package/dist/cjs/collection/channel.js.map +1 -0
  105. package/dist/cjs/collection/clearance-store.js +74 -0
  106. package/dist/cjs/collection/clearance-store.js.map +1 -0
  107. package/dist/cjs/collection/communication-bridge.js +140 -0
  108. package/dist/cjs/collection/communication-bridge.js.map +1 -0
  109. package/dist/cjs/collection/communication-runtime.js +256 -0
  110. package/dist/cjs/collection/communication-runtime.js.map +1 -0
  111. package/dist/cjs/collection/consent-repository.js +84 -0
  112. package/dist/cjs/collection/consent-repository.js.map +1 -0
  113. package/dist/cjs/collection/copy.js +125 -0
  114. package/dist/cjs/collection/copy.js.map +1 -0
  115. package/dist/cjs/collection/delivery-callback.js +151 -0
  116. package/dist/cjs/collection/delivery-callback.js.map +1 -0
  117. package/dist/cjs/collection/email-layout.js +252 -0
  118. package/dist/cjs/collection/email-layout.js.map +1 -0
  119. package/dist/cjs/collection/engine.js +434 -0
  120. package/dist/cjs/collection/engine.js.map +1 -0
  121. package/dist/cjs/collection/format.js +76 -0
  122. package/dist/cjs/collection/format.js.map +1 -0
  123. package/dist/cjs/collection/payment-block.js +3 -0
  124. package/dist/cjs/collection/payment-block.js.map +1 -0
  125. package/dist/cjs/collection/policy.js +175 -0
  126. package/dist/cjs/collection/policy.js.map +1 -0
  127. package/dist/cjs/collection/repository.js +260 -0
  128. package/dist/cjs/collection/repository.js.map +1 -0
  129. package/dist/cjs/collection/subject.js +104 -0
  130. package/dist/cjs/collection/subject.js.map +1 -0
  131. package/dist/cjs/collection/template-catalog.js +165 -0
  132. package/dist/cjs/collection/template-catalog.js.map +1 -0
  133. package/dist/cjs/collection/template.js +78 -0
  134. package/dist/cjs/collection/template.js.map +1 -0
  135. package/dist/cjs/communication/adapters/email.js +132 -0
  136. package/dist/cjs/communication/adapters/email.js.map +1 -0
  137. package/dist/cjs/communication/adapters/sms.js +127 -0
  138. package/dist/cjs/communication/adapters/sms.js.map +1 -0
  139. package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
  140. package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
  141. package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
  142. package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
  143. package/dist/cjs/communication/adapters/whatsapp.js +213 -0
  144. package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
  145. package/dist/cjs/communication/audit.js +61 -0
  146. package/dist/cjs/communication/audit.js.map +1 -0
  147. package/dist/cjs/communication/capabilities.js +76 -0
  148. package/dist/cjs/communication/capabilities.js.map +1 -0
  149. package/dist/cjs/communication/channel.js +53 -0
  150. package/dist/cjs/communication/channel.js.map +1 -0
  151. package/dist/cjs/communication/claim.js +228 -0
  152. package/dist/cjs/communication/claim.js.map +1 -0
  153. package/dist/cjs/communication/clearance.js +18 -0
  154. package/dist/cjs/communication/clearance.js.map +1 -0
  155. package/dist/cjs/communication/consent.js +43 -0
  156. package/dist/cjs/communication/consent.js.map +1 -0
  157. package/dist/cjs/communication/context.js +45 -0
  158. package/dist/cjs/communication/context.js.map +1 -0
  159. package/dist/cjs/communication/credentials.js +121 -0
  160. package/dist/cjs/communication/credentials.js.map +1 -0
  161. package/dist/cjs/communication/dry-run-scenario.js +166 -0
  162. package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
  163. package/dist/cjs/communication/dry-run.js +97 -0
  164. package/dist/cjs/communication/dry-run.js.map +1 -0
  165. package/dist/cjs/communication/engine.js +495 -0
  166. package/dist/cjs/communication/engine.js.map +1 -0
  167. package/dist/cjs/communication/graph.js +50 -0
  168. package/dist/cjs/communication/graph.js.map +1 -0
  169. package/dist/cjs/communication/idempotency.js +26 -0
  170. package/dist/cjs/communication/idempotency.js.map +1 -0
  171. package/dist/cjs/communication/identity.js +110 -0
  172. package/dist/cjs/communication/identity.js.map +1 -0
  173. package/dist/cjs/communication/index.js +135 -0
  174. package/dist/cjs/communication/index.js.map +1 -0
  175. package/dist/cjs/communication/onboarding.js +297 -0
  176. package/dist/cjs/communication/onboarding.js.map +1 -0
  177. package/dist/cjs/communication/policy.js +16 -0
  178. package/dist/cjs/communication/policy.js.map +1 -0
  179. package/dist/cjs/communication/routing.js +77 -0
  180. package/dist/cjs/communication/routing.js.map +1 -0
  181. package/dist/cjs/communication/sender-profile.js +128 -0
  182. package/dist/cjs/communication/sender-profile.js.map +1 -0
  183. package/dist/cjs/communication/status.js +86 -0
  184. package/dist/cjs/communication/status.js.map +1 -0
  185. package/dist/cjs/communication/stores/onboarding.js +135 -0
  186. package/dist/cjs/communication/stores/onboarding.js.map +1 -0
  187. package/dist/cjs/communication/stores/postgres.js +458 -0
  188. package/dist/cjs/communication/stores/postgres.js.map +1 -0
  189. package/dist/cjs/communication/stores/routing.js +334 -0
  190. package/dist/cjs/communication/stores/routing.js.map +1 -0
  191. package/dist/cjs/communication/stores/secrets.js +126 -0
  192. package/dist/cjs/communication/stores/secrets.js.map +1 -0
  193. package/dist/cjs/communication/template-provider.js +22 -0
  194. package/dist/cjs/communication/template-provider.js.map +1 -0
  195. package/dist/cjs/communication/template.js +63 -0
  196. package/dist/cjs/communication/template.js.map +1 -0
  197. package/dist/cjs/communication/webhook-subscription.js +258 -0
  198. package/dist/cjs/communication/webhook-subscription.js.map +1 -0
  199. package/dist/cjs/communication/webhook.js +292 -0
  200. package/dist/cjs/communication/webhook.js.map +1 -0
  201. package/dist/cjs/competence/business-days.js +155 -0
  202. package/dist/cjs/competence/business-days.js.map +1 -0
  203. package/dist/cjs/competence/catalog-validation.js +174 -0
  204. package/dist/cjs/competence/catalog-validation.js.map +1 -0
  205. package/dist/cjs/competence/obligation-preview.js +190 -0
  206. package/dist/cjs/competence/obligation-preview.js.map +1 -0
  207. package/dist/cjs/competence/repository.js +622 -0
  208. package/dist/cjs/competence/repository.js.map +1 -0
  209. package/dist/cjs/contacts/phone.js +192 -0
  210. package/dist/cjs/contacts/phone.js.map +1 -0
  211. package/dist/cjs/dashboard/pilot-panel.js +90 -0
  212. package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
  213. package/dist/cjs/dashboard/repository.js +11 -1
  214. package/dist/cjs/dashboard/repository.js.map +1 -1
  215. package/dist/cjs/db/client.js +17 -11
  216. package/dist/cjs/db/client.js.map +1 -1
  217. package/dist/cjs/db/provision-e2e-identity.js +111 -0
  218. package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
  219. package/dist/cjs/db/seed-catalog.js +48 -0
  220. package/dist/cjs/db/seed-catalog.js.map +1 -0
  221. package/dist/cjs/db/seed.js +15 -7
  222. package/dist/cjs/db/seed.js.map +1 -1
  223. package/dist/cjs/documents/repository.js +244 -0
  224. package/dist/cjs/documents/repository.js.map +1 -0
  225. package/dist/cjs/documents/requests.js +136 -0
  226. package/dist/cjs/documents/requests.js.map +1 -0
  227. package/dist/cjs/fiscal/applicability.js +164 -0
  228. package/dist/cjs/fiscal/applicability.js.map +1 -0
  229. package/dist/cjs/fiscal/conditions.js +198 -0
  230. package/dist/cjs/fiscal/conditions.js.map +1 -0
  231. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
  232. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  233. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
  234. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  235. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
  236. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  237. package/dist/cjs/fiscal/coverage/model.js +127 -0
  238. package/dist/cjs/fiscal/coverage/model.js.map +1 -0
  239. package/dist/cjs/fiscal/coverage/requests.js +99 -0
  240. package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
  241. package/dist/cjs/fiscal/credentials/material.js +168 -0
  242. package/dist/cjs/fiscal/credentials/material.js.map +1 -0
  243. package/dist/cjs/fiscal/credentials/readiness.js +163 -0
  244. package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
  245. package/dist/cjs/fiscal/eligibility.js +199 -0
  246. package/dist/cjs/fiscal/eligibility.js.map +1 -0
  247. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
  248. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  249. package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
  250. package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
  251. package/dist/cjs/fiscal/ingestion/direction.js +36 -0
  252. package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
  253. package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
  254. package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
  255. package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
  256. package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
  257. package/dist/cjs/fiscal/ingestion/provider.js +51 -0
  258. package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
  259. package/dist/cjs/fiscal/ingestion/repository.js +132 -0
  260. package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
  261. package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
  262. package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
  263. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
  264. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  265. package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
  266. package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
  267. package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
  268. package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
  269. package/dist/cjs/fiscal/repository.js +470 -0
  270. package/dist/cjs/fiscal/repository.js.map +1 -0
  271. package/dist/cjs/fiscal/sync/circuit.js +124 -0
  272. package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
  273. package/dist/cjs/fiscal/sync/intervention.js +140 -0
  274. package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
  275. package/dist/cjs/fiscal/sync/lease.js +146 -0
  276. package/dist/cjs/fiscal/sync/lease.js.map +1 -0
  277. package/dist/cjs/fiscal/sync/observability.js +244 -0
  278. package/dist/cjs/fiscal/sync/observability.js.map +1 -0
  279. package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
  280. package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
  281. package/dist/cjs/fiscal/sync/policy.js +143 -0
  282. package/dist/cjs/fiscal/sync/policy.js.map +1 -0
  283. package/dist/cjs/fiscal/sync/reprocess.js +241 -0
  284. package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
  285. package/dist/cjs/fiscal/sync/retry.js +183 -0
  286. package/dist/cjs/fiscal/sync/retry.js.map +1 -0
  287. package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
  288. package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
  289. package/dist/cjs/fiscal/transport/https.js +309 -0
  290. package/dist/cjs/fiscal/transport/https.js.map +1 -0
  291. package/dist/cjs/fiscal/transport/synthetic-tls.js +328 -0
  292. package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
  293. package/dist/cjs/fiscal/transport/types.js +93 -0
  294. package/dist/cjs/fiscal/transport/types.js.map +1 -0
  295. package/dist/cjs/import/br-documents.js +85 -0
  296. package/dist/cjs/import/br-documents.js.map +1 -0
  297. package/dist/cjs/import/clients-import.js +347 -40
  298. package/dist/cjs/import/clients-import.js.map +1 -1
  299. package/dist/cjs/index.js +711 -39
  300. package/dist/cjs/index.js.map +1 -1
  301. package/dist/cjs/legal/documents.js +224 -17
  302. package/dist/cjs/legal/documents.js.map +1 -1
  303. package/dist/cjs/legal/index.js +3 -1
  304. package/dist/cjs/legal/index.js.map +1 -1
  305. package/dist/cjs/legal/types.js +1 -0
  306. package/dist/cjs/legal/types.js.map +1 -1
  307. package/dist/cjs/mail/auth-templates.js +29 -0
  308. package/dist/cjs/mail/auth-templates.js.map +1 -0
  309. package/dist/cjs/mail/dedup-store.js +12 -51
  310. package/dist/cjs/mail/dedup-store.js.map +1 -1
  311. package/dist/cjs/mail/index.js +16 -4
  312. package/dist/cjs/mail/index.js.map +1 -1
  313. package/dist/cjs/mail/provider.js +12 -247
  314. package/dist/cjs/mail/provider.js.map +1 -1
  315. package/dist/cjs/mail/resend.js +14 -18
  316. package/dist/cjs/mail/resend.js.map +1 -1
  317. package/dist/cjs/mail/sender-resolver.js +12 -11
  318. package/dist/cjs/mail/sender-resolver.js.map +1 -1
  319. package/dist/cjs/mail/template-renderer.js +11 -16
  320. package/dist/cjs/mail/template-renderer.js.map +1 -1
  321. package/dist/cjs/mail/transactional-outbound.js +117 -0
  322. package/dist/cjs/mail/transactional-outbound.js.map +1 -0
  323. package/dist/cjs/mail/types.js +8 -35
  324. package/dist/cjs/mail/types.js.map +1 -1
  325. package/dist/cjs/onboarding/persistence.js +4 -4
  326. package/dist/cjs/onboarding/persistence.js.map +1 -1
  327. package/dist/cjs/pilot/go-live-checklist.js +212 -0
  328. package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
  329. package/dist/cjs/pilot/milestone.js +79 -0
  330. package/dist/cjs/pilot/milestone.js.map +1 -0
  331. package/dist/cjs/platform/capabilities.js +144 -0
  332. package/dist/cjs/platform/capabilities.js.map +1 -0
  333. package/dist/cjs/platform/job-contract.js +411 -0
  334. package/dist/cjs/platform/job-contract.js.map +1 -0
  335. package/dist/cjs/portal/provisioning.js +144 -0
  336. package/dist/cjs/portal/provisioning.js.map +1 -0
  337. package/dist/cjs/pricing-engine/canonical.js +42 -0
  338. package/dist/cjs/pricing-engine/canonical.js.map +1 -0
  339. package/dist/cjs/pricing-engine/errors.js +6 -1
  340. package/dist/cjs/pricing-engine/errors.js.map +1 -1
  341. package/dist/cjs/pricing-engine/index.js +12 -1
  342. package/dist/cjs/pricing-engine/index.js.map +1 -1
  343. package/dist/cjs/pricing-engine/pipeline.js +200 -26
  344. package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
  345. package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
  346. package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
  347. package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
  348. package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
  349. package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
  350. package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
  351. package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
  352. package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
  353. package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
  354. package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
  355. package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
  356. package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
  357. package/dist/cjs/rbac/authorize.js +28 -0
  358. package/dist/cjs/rbac/authorize.js.map +1 -1
  359. package/dist/cjs/rbac/catalog.js +101 -1
  360. package/dist/cjs/rbac/catalog.js.map +1 -1
  361. package/dist/cjs/rbac/workload-provisioning.js +160 -0
  362. package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
  363. package/dist/cjs/rbac/workload.js +191 -0
  364. package/dist/cjs/rbac/workload.js.map +1 -0
  365. package/dist/cjs/storage/checksum.js +15 -0
  366. package/dist/cjs/storage/checksum.js.map +1 -0
  367. package/dist/cjs/storage/key.js +72 -0
  368. package/dist/cjs/storage/key.js.map +1 -0
  369. package/dist/cjs/storage/local.js +100 -0
  370. package/dist/cjs/storage/local.js.map +1 -0
  371. package/dist/cjs/storage/r2.js +181 -0
  372. package/dist/cjs/storage/r2.js.map +1 -0
  373. package/dist/cjs/storage/registry.js +41 -0
  374. package/dist/cjs/storage/registry.js.map +1 -0
  375. package/dist/cjs/storage/types.js +50 -0
  376. package/dist/cjs/storage/types.js.map +1 -0
  377. package/dist/cjs/subscription-billing/index.js +2 -1
  378. package/dist/cjs/subscription-billing/index.js.map +1 -1
  379. package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
  380. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
  381. package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
  382. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
  383. package/dist/cjs/subscription-billing/provider/registry.js +17 -0
  384. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
  385. package/dist/cjs/subscription-billing/service.js +208 -83
  386. package/dist/cjs/subscription-billing/service.js.map +1 -1
  387. package/dist/cjs/subscription-billing/types.js.map +1 -1
  388. package/dist/cjs/tenancy/features.js +131 -0
  389. package/dist/cjs/tenancy/features.js.map +1 -0
  390. package/dist/cjs/tenancy/provisioning.js +32 -8
  391. package/dist/cjs/tenancy/provisioning.js.map +1 -1
  392. package/dist/cjs/tenancy/settings.js +224 -0
  393. package/dist/cjs/tenancy/settings.js.map +1 -0
  394. package/dist/cjs/users/repository.js +143 -3
  395. package/dist/cjs/users/repository.js.map +1 -1
  396. package/dist/cjs/vault/repository.js +81 -0
  397. package/dist/cjs/vault/repository.js.map +1 -1
  398. package/dist/clients/ibge.d.ts +17 -0
  399. package/dist/clients/ibge.d.ts.map +1 -0
  400. package/dist/clients/ibge.js +98 -0
  401. package/dist/clients/ibge.js.map +1 -0
  402. package/dist/clients/repository.d.ts +196 -0
  403. package/dist/clients/repository.d.ts.map +1 -1
  404. package/dist/clients/repository.js +270 -24
  405. package/dist/clients/repository.js.map +1 -1
  406. package/dist/collection/branding.d.ts +137 -0
  407. package/dist/collection/branding.d.ts.map +1 -0
  408. package/dist/collection/branding.js +322 -0
  409. package/dist/collection/branding.js.map +1 -0
  410. package/dist/collection/channel-accounts.d.ts +57 -0
  411. package/dist/collection/channel-accounts.d.ts.map +1 -0
  412. package/dist/collection/channel-accounts.js +133 -0
  413. package/dist/collection/channel-accounts.js.map +1 -0
  414. package/dist/collection/channel.d.ts +24 -0
  415. package/dist/collection/channel.d.ts.map +1 -0
  416. package/dist/collection/channel.js +16 -0
  417. package/dist/collection/channel.js.map +1 -0
  418. package/dist/collection/clearance-store.d.ts +39 -0
  419. package/dist/collection/clearance-store.d.ts.map +1 -0
  420. package/dist/collection/clearance-store.js +69 -0
  421. package/dist/collection/clearance-store.js.map +1 -0
  422. package/dist/collection/communication-bridge.d.ts +66 -0
  423. package/dist/collection/communication-bridge.d.ts.map +1 -0
  424. package/dist/collection/communication-bridge.js +134 -0
  425. package/dist/collection/communication-bridge.js.map +1 -0
  426. package/dist/collection/communication-runtime.d.ts +132 -0
  427. package/dist/collection/communication-runtime.d.ts.map +1 -0
  428. package/dist/collection/communication-runtime.js +249 -0
  429. package/dist/collection/communication-runtime.js.map +1 -0
  430. package/dist/collection/consent-repository.d.ts +32 -0
  431. package/dist/collection/consent-repository.d.ts.map +1 -0
  432. package/dist/collection/consent-repository.js +79 -0
  433. package/dist/collection/consent-repository.js.map +1 -0
  434. package/dist/collection/copy.d.ts +50 -0
  435. package/dist/collection/copy.d.ts.map +1 -0
  436. package/dist/collection/copy.js +122 -0
  437. package/dist/collection/copy.js.map +1 -0
  438. package/dist/collection/delivery-callback.d.ts +49 -0
  439. package/dist/collection/delivery-callback.d.ts.map +1 -0
  440. package/dist/collection/delivery-callback.js +147 -0
  441. package/dist/collection/delivery-callback.js.map +1 -0
  442. package/dist/collection/email-layout.d.ts +45 -0
  443. package/dist/collection/email-layout.d.ts.map +1 -0
  444. package/dist/collection/email-layout.js +247 -0
  445. package/dist/collection/email-layout.js.map +1 -0
  446. package/dist/collection/engine.d.ts +200 -0
  447. package/dist/collection/engine.d.ts.map +1 -0
  448. package/dist/collection/engine.js +427 -0
  449. package/dist/collection/engine.js.map +1 -0
  450. package/dist/collection/format.d.ts +32 -0
  451. package/dist/collection/format.d.ts.map +1 -0
  452. package/dist/collection/format.js +70 -0
  453. package/dist/collection/format.js.map +1 -0
  454. package/dist/collection/payment-block.d.ts +24 -0
  455. package/dist/collection/payment-block.d.ts.map +1 -0
  456. package/dist/collection/payment-block.js +2 -0
  457. package/dist/collection/payment-block.js.map +1 -0
  458. package/dist/collection/policy.d.ts +78 -0
  459. package/dist/collection/policy.d.ts.map +1 -0
  460. package/dist/collection/policy.js +168 -0
  461. package/dist/collection/policy.js.map +1 -0
  462. package/dist/collection/repository.d.ts +129 -0
  463. package/dist/collection/repository.d.ts.map +1 -0
  464. package/dist/collection/repository.js +246 -0
  465. package/dist/collection/repository.js.map +1 -0
  466. package/dist/collection/subject.d.ts +66 -0
  467. package/dist/collection/subject.d.ts.map +1 -0
  468. package/dist/collection/subject.js +99 -0
  469. package/dist/collection/subject.js.map +1 -0
  470. package/dist/collection/template-catalog.d.ts +16 -0
  471. package/dist/collection/template-catalog.d.ts.map +1 -0
  472. package/dist/collection/template-catalog.js +162 -0
  473. package/dist/collection/template-catalog.js.map +1 -0
  474. package/dist/collection/template.d.ts +37 -0
  475. package/dist/collection/template.d.ts.map +1 -0
  476. package/dist/collection/template.js +73 -0
  477. package/dist/collection/template.js.map +1 -0
  478. package/dist/communication/adapters/email.d.ts +28 -0
  479. package/dist/communication/adapters/email.d.ts.map +1 -0
  480. package/dist/communication/adapters/email.js +129 -0
  481. package/dist/communication/adapters/email.js.map +1 -0
  482. package/dist/communication/adapters/sms.d.ts +95 -0
  483. package/dist/communication/adapters/sms.d.ts.map +1 -0
  484. package/dist/communication/adapters/sms.js +121 -0
  485. package/dist/communication/adapters/sms.js.map +1 -0
  486. package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
  487. package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
  488. package/dist/communication/adapters/whatsapp-language.js +36 -0
  489. package/dist/communication/adapters/whatsapp-language.js.map +1 -0
  490. package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
  491. package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
  492. package/dist/communication/adapters/whatsapp-templates.js +97 -0
  493. package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
  494. package/dist/communication/adapters/whatsapp.d.ts +29 -0
  495. package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
  496. package/dist/communication/adapters/whatsapp.js +210 -0
  497. package/dist/communication/adapters/whatsapp.js.map +1 -0
  498. package/dist/communication/audit.d.ts +105 -0
  499. package/dist/communication/audit.d.ts.map +1 -0
  500. package/dist/communication/audit.js +56 -0
  501. package/dist/communication/audit.js.map +1 -0
  502. package/dist/communication/capabilities.d.ts +88 -0
  503. package/dist/communication/capabilities.d.ts.map +1 -0
  504. package/dist/communication/capabilities.js +72 -0
  505. package/dist/communication/capabilities.js.map +1 -0
  506. package/dist/communication/channel.d.ts +125 -0
  507. package/dist/communication/channel.d.ts.map +1 -0
  508. package/dist/communication/channel.js +47 -0
  509. package/dist/communication/channel.js.map +1 -0
  510. package/dist/communication/claim.d.ts +368 -0
  511. package/dist/communication/claim.d.ts.map +1 -0
  512. package/dist/communication/claim.js +224 -0
  513. package/dist/communication/claim.js.map +1 -0
  514. package/dist/communication/clearance.d.ts +53 -0
  515. package/dist/communication/clearance.d.ts.map +1 -0
  516. package/dist/communication/clearance.js +15 -0
  517. package/dist/communication/clearance.js.map +1 -0
  518. package/dist/communication/consent.d.ts +65 -0
  519. package/dist/communication/consent.d.ts.map +1 -0
  520. package/dist/communication/consent.js +40 -0
  521. package/dist/communication/consent.js.map +1 -0
  522. package/dist/communication/context.d.ts +48 -0
  523. package/dist/communication/context.d.ts.map +1 -0
  524. package/dist/communication/context.js +41 -0
  525. package/dist/communication/context.js.map +1 -0
  526. package/dist/communication/credentials.d.ts +74 -0
  527. package/dist/communication/credentials.d.ts.map +1 -0
  528. package/dist/communication/credentials.js +115 -0
  529. package/dist/communication/credentials.js.map +1 -0
  530. package/dist/communication/dry-run-scenario.d.ts +37 -0
  531. package/dist/communication/dry-run-scenario.d.ts.map +1 -0
  532. package/dist/communication/dry-run-scenario.js +163 -0
  533. package/dist/communication/dry-run-scenario.js.map +1 -0
  534. package/dist/communication/dry-run.d.ts +40 -0
  535. package/dist/communication/dry-run.d.ts.map +1 -0
  536. package/dist/communication/dry-run.js +92 -0
  537. package/dist/communication/dry-run.js.map +1 -0
  538. package/dist/communication/engine.d.ts +163 -0
  539. package/dist/communication/engine.d.ts.map +1 -0
  540. package/dist/communication/engine.js +492 -0
  541. package/dist/communication/engine.js.map +1 -0
  542. package/dist/communication/graph.d.ts +38 -0
  543. package/dist/communication/graph.d.ts.map +1 -0
  544. package/dist/communication/graph.js +45 -0
  545. package/dist/communication/graph.js.map +1 -0
  546. package/dist/communication/idempotency.d.ts +33 -0
  547. package/dist/communication/idempotency.d.ts.map +1 -0
  548. package/dist/communication/idempotency.js +23 -0
  549. package/dist/communication/idempotency.js.map +1 -0
  550. package/dist/communication/identity.d.ts +127 -0
  551. package/dist/communication/identity.d.ts.map +1 -0
  552. package/dist/communication/identity.js +105 -0
  553. package/dist/communication/identity.js.map +1 -0
  554. package/dist/communication/index.d.ts +66 -0
  555. package/dist/communication/index.d.ts.map +1 -0
  556. package/dist/communication/index.js +42 -0
  557. package/dist/communication/index.js.map +1 -0
  558. package/dist/communication/onboarding.d.ts +223 -0
  559. package/dist/communication/onboarding.d.ts.map +1 -0
  560. package/dist/communication/onboarding.js +287 -0
  561. package/dist/communication/onboarding.js.map +1 -0
  562. package/dist/communication/policy.d.ts +115 -0
  563. package/dist/communication/policy.d.ts.map +1 -0
  564. package/dist/communication/policy.js +13 -0
  565. package/dist/communication/policy.js.map +1 -0
  566. package/dist/communication/routing.d.ts +99 -0
  567. package/dist/communication/routing.d.ts.map +1 -0
  568. package/dist/communication/routing.js +73 -0
  569. package/dist/communication/routing.js.map +1 -0
  570. package/dist/communication/sender-profile.d.ts +100 -0
  571. package/dist/communication/sender-profile.d.ts.map +1 -0
  572. package/dist/communication/sender-profile.js +123 -0
  573. package/dist/communication/sender-profile.js.map +1 -0
  574. package/dist/communication/status.d.ts +48 -0
  575. package/dist/communication/status.d.ts.map +1 -0
  576. package/dist/communication/status.js +79 -0
  577. package/dist/communication/status.js.map +1 -0
  578. package/dist/communication/stores/onboarding.d.ts +88 -0
  579. package/dist/communication/stores/onboarding.d.ts.map +1 -0
  580. package/dist/communication/stores/onboarding.js +127 -0
  581. package/dist/communication/stores/onboarding.js.map +1 -0
  582. package/dist/communication/stores/postgres.d.ts +81 -0
  583. package/dist/communication/stores/postgres.d.ts.map +1 -0
  584. package/dist/communication/stores/postgres.js +453 -0
  585. package/dist/communication/stores/postgres.js.map +1 -0
  586. package/dist/communication/stores/routing.d.ts +169 -0
  587. package/dist/communication/stores/routing.d.ts.map +1 -0
  588. package/dist/communication/stores/routing.js +324 -0
  589. package/dist/communication/stores/routing.js.map +1 -0
  590. package/dist/communication/stores/secrets.d.ts +89 -0
  591. package/dist/communication/stores/secrets.d.ts.map +1 -0
  592. package/dist/communication/stores/secrets.js +122 -0
  593. package/dist/communication/stores/secrets.js.map +1 -0
  594. package/dist/communication/template-provider.d.ts +85 -0
  595. package/dist/communication/template-provider.d.ts.map +1 -0
  596. package/dist/communication/template-provider.js +21 -0
  597. package/dist/communication/template-provider.js.map +1 -0
  598. package/dist/communication/template.d.ts +87 -0
  599. package/dist/communication/template.d.ts.map +1 -0
  600. package/dist/communication/template.js +59 -0
  601. package/dist/communication/template.js.map +1 -0
  602. package/dist/communication/webhook-subscription.d.ts +156 -0
  603. package/dist/communication/webhook-subscription.d.ts.map +1 -0
  604. package/dist/communication/webhook-subscription.js +252 -0
  605. package/dist/communication/webhook-subscription.js.map +1 -0
  606. package/dist/communication/webhook.d.ts +121 -0
  607. package/dist/communication/webhook.d.ts.map +1 -0
  608. package/dist/communication/webhook.js +283 -0
  609. package/dist/communication/webhook.js.map +1 -0
  610. package/dist/competence/business-days.d.ts +51 -0
  611. package/dist/competence/business-days.d.ts.map +1 -0
  612. package/dist/competence/business-days.js +145 -0
  613. package/dist/competence/business-days.js.map +1 -0
  614. package/dist/competence/catalog-validation.d.ts +86 -0
  615. package/dist/competence/catalog-validation.d.ts.map +1 -0
  616. package/dist/competence/catalog-validation.js +168 -0
  617. package/dist/competence/catalog-validation.js.map +1 -0
  618. package/dist/competence/obligation-preview.d.ts +103 -0
  619. package/dist/competence/obligation-preview.d.ts.map +1 -0
  620. package/dist/competence/obligation-preview.js +184 -0
  621. package/dist/competence/obligation-preview.js.map +1 -0
  622. package/dist/competence/repository.d.ts +285 -0
  623. package/dist/competence/repository.d.ts.map +1 -0
  624. package/dist/competence/repository.js +602 -0
  625. package/dist/competence/repository.js.map +1 -0
  626. package/dist/contacts/phone.d.ts +70 -0
  627. package/dist/contacts/phone.d.ts.map +1 -0
  628. package/dist/contacts/phone.js +186 -0
  629. package/dist/contacts/phone.js.map +1 -0
  630. package/dist/dashboard/pilot-panel.d.ts +100 -0
  631. package/dist/dashboard/pilot-panel.d.ts.map +1 -0
  632. package/dist/dashboard/pilot-panel.js +87 -0
  633. package/dist/dashboard/pilot-panel.js.map +1 -0
  634. package/dist/dashboard/repository.d.ts.map +1 -1
  635. package/dist/dashboard/repository.js +11 -1
  636. package/dist/dashboard/repository.js.map +1 -1
  637. package/dist/db/client.d.ts +45 -0
  638. package/dist/db/client.d.ts.map +1 -1
  639. package/dist/db/client.js +16 -11
  640. package/dist/db/client.js.map +1 -1
  641. package/dist/db/migrate.d.ts +36 -1
  642. package/dist/db/migrate.d.ts.map +1 -1
  643. package/dist/db/migrate.js +208 -35
  644. package/dist/db/migrate.js.map +1 -1
  645. package/dist/db/provision-e2e-identity.d.ts +2 -0
  646. package/dist/db/provision-e2e-identity.d.ts.map +1 -0
  647. package/dist/db/provision-e2e-identity.js +109 -0
  648. package/dist/db/provision-e2e-identity.js.map +1 -0
  649. package/dist/db/seed-catalog.d.ts +18 -0
  650. package/dist/db/seed-catalog.d.ts.map +1 -0
  651. package/dist/db/seed-catalog.js +45 -0
  652. package/dist/db/seed-catalog.js.map +1 -0
  653. package/dist/db/seed.js +16 -8
  654. package/dist/db/seed.js.map +1 -1
  655. package/dist/documents/repository.d.ts +97 -0
  656. package/dist/documents/repository.d.ts.map +1 -0
  657. package/dist/documents/repository.js +236 -0
  658. package/dist/documents/repository.js.map +1 -0
  659. package/dist/documents/requests.d.ts +73 -0
  660. package/dist/documents/requests.d.ts.map +1 -0
  661. package/dist/documents/requests.js +127 -0
  662. package/dist/documents/requests.js.map +1 -0
  663. package/dist/fiscal/applicability.d.ts +73 -0
  664. package/dist/fiscal/applicability.d.ts.map +1 -0
  665. package/dist/fiscal/applicability.js +160 -0
  666. package/dist/fiscal/applicability.js.map +1 -0
  667. package/dist/fiscal/conditions.d.ts +99 -0
  668. package/dist/fiscal/conditions.d.ts.map +1 -0
  669. package/dist/fiscal/conditions.js +190 -0
  670. package/dist/fiscal/conditions.js.map +1 -0
  671. package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
  672. package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
  673. package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
  674. package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  675. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
  676. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
  677. package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
  678. package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  679. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
  680. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
  681. package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
  682. package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  683. package/dist/fiscal/coverage/model.d.ts +86 -0
  684. package/dist/fiscal/coverage/model.d.ts.map +1 -0
  685. package/dist/fiscal/coverage/model.js +120 -0
  686. package/dist/fiscal/coverage/model.js.map +1 -0
  687. package/dist/fiscal/coverage/requests.d.ts +70 -0
  688. package/dist/fiscal/coverage/requests.d.ts.map +1 -0
  689. package/dist/fiscal/coverage/requests.js +95 -0
  690. package/dist/fiscal/coverage/requests.js.map +1 -0
  691. package/dist/fiscal/credentials/material.d.ts +81 -0
  692. package/dist/fiscal/credentials/material.d.ts.map +1 -0
  693. package/dist/fiscal/credentials/material.js +164 -0
  694. package/dist/fiscal/credentials/material.js.map +1 -0
  695. package/dist/fiscal/credentials/readiness.d.ts +92 -0
  696. package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
  697. package/dist/fiscal/credentials/readiness.js +159 -0
  698. package/dist/fiscal/credentials/readiness.js.map +1 -0
  699. package/dist/fiscal/eligibility.d.ts +106 -0
  700. package/dist/fiscal/eligibility.d.ts.map +1 -0
  701. package/dist/fiscal/eligibility.js +194 -0
  702. package/dist/fiscal/eligibility.js.map +1 -0
  703. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
  704. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
  705. package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
  706. package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  707. package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
  708. package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
  709. package/dist/fiscal/ingestion/adn-transport.js +220 -0
  710. package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
  711. package/dist/fiscal/ingestion/direction.d.ts +60 -0
  712. package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
  713. package/dist/fiscal/ingestion/direction.js +32 -0
  714. package/dist/fiscal/ingestion/direction.js.map +1 -0
  715. package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
  716. package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
  717. package/dist/fiscal/ingestion/nfse-adn.js +222 -0
  718. package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
  719. package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
  720. package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
  721. package/dist/fiscal/ingestion/pipeline.js +699 -0
  722. package/dist/fiscal/ingestion/pipeline.js.map +1 -0
  723. package/dist/fiscal/ingestion/provider.d.ts +206 -0
  724. package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
  725. package/dist/fiscal/ingestion/provider.js +47 -0
  726. package/dist/fiscal/ingestion/provider.js.map +1 -0
  727. package/dist/fiscal/ingestion/repository.d.ts +82 -0
  728. package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
  729. package/dist/fiscal/ingestion/repository.js +127 -0
  730. package/dist/fiscal/ingestion/repository.js.map +1 -0
  731. package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
  732. package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
  733. package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
  734. package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
  735. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
  736. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
  737. package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
  738. package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  739. package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
  740. package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
  741. package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
  742. package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
  743. package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
  744. package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
  745. package/dist/fiscal/ingestion/xml-reader.js +112 -0
  746. package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
  747. package/dist/fiscal/repository.d.ts +220 -0
  748. package/dist/fiscal/repository.d.ts.map +1 -0
  749. package/dist/fiscal/repository.js +449 -0
  750. package/dist/fiscal/repository.js.map +1 -0
  751. package/dist/fiscal/sync/circuit.d.ts +86 -0
  752. package/dist/fiscal/sync/circuit.d.ts.map +1 -0
  753. package/dist/fiscal/sync/circuit.js +118 -0
  754. package/dist/fiscal/sync/circuit.js.map +1 -0
  755. package/dist/fiscal/sync/intervention.d.ts +81 -0
  756. package/dist/fiscal/sync/intervention.d.ts.map +1 -0
  757. package/dist/fiscal/sync/intervention.js +135 -0
  758. package/dist/fiscal/sync/intervention.js.map +1 -0
  759. package/dist/fiscal/sync/lease.d.ts +118 -0
  760. package/dist/fiscal/sync/lease.d.ts.map +1 -0
  761. package/dist/fiscal/sync/lease.js +139 -0
  762. package/dist/fiscal/sync/lease.js.map +1 -0
  763. package/dist/fiscal/sync/observability.d.ts +148 -0
  764. package/dist/fiscal/sync/observability.d.ts.map +1 -0
  765. package/dist/fiscal/sync/observability.js +239 -0
  766. package/dist/fiscal/sync/observability.js.map +1 -0
  767. package/dist/fiscal/sync/orchestrator.d.ts +132 -0
  768. package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
  769. package/dist/fiscal/sync/orchestrator.js +487 -0
  770. package/dist/fiscal/sync/orchestrator.js.map +1 -0
  771. package/dist/fiscal/sync/policy.d.ts +87 -0
  772. package/dist/fiscal/sync/policy.d.ts.map +1 -0
  773. package/dist/fiscal/sync/policy.js +136 -0
  774. package/dist/fiscal/sync/policy.js.map +1 -0
  775. package/dist/fiscal/sync/reprocess.d.ts +76 -0
  776. package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
  777. package/dist/fiscal/sync/reprocess.js +237 -0
  778. package/dist/fiscal/sync/reprocess.js.map +1 -0
  779. package/dist/fiscal/sync/retry.d.ts +82 -0
  780. package/dist/fiscal/sync/retry.d.ts.map +1 -0
  781. package/dist/fiscal/sync/retry.js +176 -0
  782. package/dist/fiscal/sync/retry.js.map +1 -0
  783. package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
  784. package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
  785. package/dist/fiscal/sync/secret-boundary.js +116 -0
  786. package/dist/fiscal/sync/secret-boundary.js.map +1 -0
  787. package/dist/fiscal/transport/https.d.ts +86 -0
  788. package/dist/fiscal/transport/https.d.ts.map +1 -0
  789. package/dist/fiscal/transport/https.js +303 -0
  790. package/dist/fiscal/transport/https.js.map +1 -0
  791. package/dist/fiscal/transport/synthetic-tls.d.ts +80 -0
  792. package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
  793. package/dist/fiscal/transport/synthetic-tls.js +323 -0
  794. package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
  795. package/dist/fiscal/transport/types.d.ts +134 -0
  796. package/dist/fiscal/transport/types.d.ts.map +1 -0
  797. package/dist/fiscal/transport/types.js +88 -0
  798. package/dist/fiscal/transport/types.js.map +1 -0
  799. package/dist/import/br-documents.d.ts +26 -0
  800. package/dist/import/br-documents.d.ts.map +1 -0
  801. package/dist/import/br-documents.js +78 -0
  802. package/dist/import/br-documents.js.map +1 -0
  803. package/dist/import/clients-import.d.ts +122 -4
  804. package/dist/import/clients-import.d.ts.map +1 -1
  805. package/dist/import/clients-import.js +341 -41
  806. package/dist/import/clients-import.js.map +1 -1
  807. package/dist/index.d.ts +217 -17
  808. package/dist/index.d.ts.map +1 -1
  809. package/dist/index.js +196 -11
  810. package/dist/index.js.map +1 -1
  811. package/dist/legal/documents.d.ts +12 -1
  812. package/dist/legal/documents.d.ts.map +1 -1
  813. package/dist/legal/documents.js +222 -16
  814. package/dist/legal/documents.js.map +1 -1
  815. package/dist/legal/index.d.ts +2 -2
  816. package/dist/legal/index.d.ts.map +1 -1
  817. package/dist/legal/index.js +1 -1
  818. package/dist/legal/index.js.map +1 -1
  819. package/dist/legal/types.d.ts +69 -3
  820. package/dist/legal/types.d.ts.map +1 -1
  821. package/dist/legal/types.js +1 -0
  822. package/dist/legal/types.js.map +1 -1
  823. package/dist/mail/auth-templates.d.ts +15 -0
  824. package/dist/mail/auth-templates.d.ts.map +1 -0
  825. package/dist/mail/auth-templates.js +26 -0
  826. package/dist/mail/auth-templates.js.map +1 -0
  827. package/dist/mail/dedup-store.d.ts +1 -24
  828. package/dist/mail/dedup-store.d.ts.map +1 -1
  829. package/dist/mail/dedup-store.js +9 -48
  830. package/dist/mail/dedup-store.js.map +1 -1
  831. package/dist/mail/index.d.ts +2 -1
  832. package/dist/mail/index.d.ts.map +1 -1
  833. package/dist/mail/index.js +13 -2
  834. package/dist/mail/index.js.map +1 -1
  835. package/dist/mail/provider.d.ts +2 -30
  836. package/dist/mail/provider.d.ts.map +1 -1
  837. package/dist/mail/provider.js +10 -246
  838. package/dist/mail/provider.js.map +1 -1
  839. package/dist/mail/resend.d.ts +2 -12
  840. package/dist/mail/resend.d.ts.map +1 -1
  841. package/dist/mail/resend.js +11 -17
  842. package/dist/mail/resend.js.map +1 -1
  843. package/dist/mail/sender-resolver.d.ts +1 -7
  844. package/dist/mail/sender-resolver.d.ts.map +1 -1
  845. package/dist/mail/sender-resolver.js +11 -10
  846. package/dist/mail/sender-resolver.js.map +1 -1
  847. package/dist/mail/template-renderer.d.ts +1 -9
  848. package/dist/mail/template-renderer.d.ts.map +1 -1
  849. package/dist/mail/template-renderer.js +10 -15
  850. package/dist/mail/template-renderer.js.map +1 -1
  851. package/dist/mail/transactional-outbound.d.ts +115 -0
  852. package/dist/mail/transactional-outbound.d.ts.map +1 -0
  853. package/dist/mail/transactional-outbound.js +113 -0
  854. package/dist/mail/transactional-outbound.js.map +1 -0
  855. package/dist/mail/types.d.ts +2 -142
  856. package/dist/mail/types.d.ts.map +1 -1
  857. package/dist/mail/types.js +1 -33
  858. package/dist/mail/types.js.map +1 -1
  859. package/dist/onboarding/persistence.d.ts +10 -1
  860. package/dist/onboarding/persistence.d.ts.map +1 -1
  861. package/dist/onboarding/persistence.js +4 -4
  862. package/dist/onboarding/persistence.js.map +1 -1
  863. package/dist/pilot/go-live-checklist.d.ts +41 -0
  864. package/dist/pilot/go-live-checklist.d.ts.map +1 -0
  865. package/dist/pilot/go-live-checklist.js +209 -0
  866. package/dist/pilot/go-live-checklist.js.map +1 -0
  867. package/dist/pilot/milestone.d.ts +56 -0
  868. package/dist/pilot/milestone.d.ts.map +1 -0
  869. package/dist/pilot/milestone.js +74 -0
  870. package/dist/pilot/milestone.js.map +1 -0
  871. package/dist/platform/capabilities.d.ts +88 -0
  872. package/dist/platform/capabilities.d.ts.map +1 -0
  873. package/dist/platform/capabilities.js +140 -0
  874. package/dist/platform/capabilities.js.map +1 -0
  875. package/dist/platform/job-contract.d.ts +232 -0
  876. package/dist/platform/job-contract.d.ts.map +1 -0
  877. package/dist/platform/job-contract.js +403 -0
  878. package/dist/platform/job-contract.js.map +1 -0
  879. package/dist/portal/provisioning.d.ts +58 -0
  880. package/dist/portal/provisioning.d.ts.map +1 -0
  881. package/dist/portal/provisioning.js +139 -0
  882. package/dist/portal/provisioning.js.map +1 -0
  883. package/dist/pricing-engine/canonical.d.ts +14 -0
  884. package/dist/pricing-engine/canonical.d.ts.map +1 -0
  885. package/dist/pricing-engine/canonical.js +39 -0
  886. package/dist/pricing-engine/canonical.js.map +1 -0
  887. package/dist/pricing-engine/errors.d.ts.map +1 -1
  888. package/dist/pricing-engine/errors.js +6 -1
  889. package/dist/pricing-engine/errors.js.map +1 -1
  890. package/dist/pricing-engine/index.d.ts +12 -2
  891. package/dist/pricing-engine/index.d.ts.map +1 -1
  892. package/dist/pricing-engine/index.js +6 -1
  893. package/dist/pricing-engine/index.js.map +1 -1
  894. package/dist/pricing-engine/pipeline.d.ts.map +1 -1
  895. package/dist/pricing-engine/pipeline.js +202 -28
  896. package/dist/pricing-engine/pipeline.js.map +1 -1
  897. package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
  898. package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
  899. package/dist/pricing-engine/shadow-adapter.js +75 -0
  900. package/dist/pricing-engine/shadow-adapter.js.map +1 -0
  901. package/dist/pricing-engine/shadow-diff.d.ts +26 -0
  902. package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
  903. package/dist/pricing-engine/shadow-diff.js +52 -0
  904. package/dist/pricing-engine/shadow-diff.js.map +1 -0
  905. package/dist/pricing-engine/shadow-facade.d.ts +42 -0
  906. package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
  907. package/dist/pricing-engine/shadow-facade.js +82 -0
  908. package/dist/pricing-engine/shadow-facade.js.map +1 -0
  909. package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
  910. package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
  911. package/dist/pricing-engine/shadow-legacy-types.js +18 -0
  912. package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
  913. package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
  914. package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
  915. package/dist/pricing-engine/shadow-metrics.js +31 -0
  916. package/dist/pricing-engine/shadow-metrics.js.map +1 -0
  917. package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
  918. package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
  919. package/dist/pricing-engine/shadow-normalizer.js +39 -0
  920. package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
  921. package/dist/pricing-engine/types.d.ts +2 -0
  922. package/dist/pricing-engine/types.d.ts.map +1 -1
  923. package/dist/rbac/authorize.d.ts +12 -0
  924. package/dist/rbac/authorize.d.ts.map +1 -1
  925. package/dist/rbac/authorize.js +27 -0
  926. package/dist/rbac/authorize.js.map +1 -1
  927. package/dist/rbac/catalog.d.ts.map +1 -1
  928. package/dist/rbac/catalog.js +101 -1
  929. package/dist/rbac/catalog.js.map +1 -1
  930. package/dist/rbac/workload-provisioning.d.ts +66 -0
  931. package/dist/rbac/workload-provisioning.d.ts.map +1 -0
  932. package/dist/rbac/workload-provisioning.js +153 -0
  933. package/dist/rbac/workload-provisioning.js.map +1 -0
  934. package/dist/rbac/workload.d.ts +124 -0
  935. package/dist/rbac/workload.d.ts.map +1 -0
  936. package/dist/rbac/workload.js +184 -0
  937. package/dist/rbac/workload.js.map +1 -0
  938. package/dist/storage/checksum.d.ts +9 -0
  939. package/dist/storage/checksum.d.ts.map +1 -0
  940. package/dist/storage/checksum.js +12 -0
  941. package/dist/storage/checksum.js.map +1 -0
  942. package/dist/storage/key.d.ts +37 -0
  943. package/dist/storage/key.d.ts.map +1 -0
  944. package/dist/storage/key.js +67 -0
  945. package/dist/storage/key.js.map +1 -0
  946. package/dist/storage/local.d.ts +40 -0
  947. package/dist/storage/local.d.ts.map +1 -0
  948. package/dist/storage/local.js +96 -0
  949. package/dist/storage/local.js.map +1 -0
  950. package/dist/storage/r2.d.ts +43 -0
  951. package/dist/storage/r2.d.ts.map +1 -0
  952. package/dist/storage/r2.js +177 -0
  953. package/dist/storage/r2.js.map +1 -0
  954. package/dist/storage/registry.d.ts +23 -0
  955. package/dist/storage/registry.d.ts.map +1 -0
  956. package/dist/storage/registry.js +37 -0
  957. package/dist/storage/registry.js.map +1 -0
  958. package/dist/storage/types.d.ts +67 -0
  959. package/dist/storage/types.d.ts.map +1 -0
  960. package/dist/storage/types.js +45 -0
  961. package/dist/storage/types.js.map +1 -0
  962. package/dist/subscription-billing/index.d.ts +6 -5
  963. package/dist/subscription-billing/index.d.ts.map +1 -1
  964. package/dist/subscription-billing/index.js +3 -3
  965. package/dist/subscription-billing/index.js.map +1 -1
  966. package/dist/subscription-billing/provider/asaas.d.ts +14 -0
  967. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
  968. package/dist/subscription-billing/provider/asaas.js +32 -7
  969. package/dist/subscription-billing/provider/asaas.js.map +1 -1
  970. package/dist/subscription-billing/provider/disabled.d.ts +9 -0
  971. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
  972. package/dist/subscription-billing/provider/disabled.js +8 -0
  973. package/dist/subscription-billing/provider/disabled.js.map +1 -1
  974. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  975. package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
  976. package/dist/subscription-billing/provider/registry.js +17 -0
  977. package/dist/subscription-billing/provider/registry.js.map +1 -1
  978. package/dist/subscription-billing/service.d.ts +38 -1
  979. package/dist/subscription-billing/service.d.ts.map +1 -1
  980. package/dist/subscription-billing/service.js +147 -23
  981. package/dist/subscription-billing/service.js.map +1 -1
  982. package/dist/subscription-billing/types.d.ts +13 -0
  983. package/dist/subscription-billing/types.d.ts.map +1 -1
  984. package/dist/subscription-billing/types.js.map +1 -1
  985. package/dist/tenancy/features.d.ts +69 -0
  986. package/dist/tenancy/features.d.ts.map +1 -0
  987. package/dist/tenancy/features.js +123 -0
  988. package/dist/tenancy/features.js.map +1 -0
  989. package/dist/tenancy/provisioning.d.ts.map +1 -1
  990. package/dist/tenancy/provisioning.js +32 -8
  991. package/dist/tenancy/provisioning.js.map +1 -1
  992. package/dist/tenancy/settings.d.ts +63 -0
  993. package/dist/tenancy/settings.d.ts.map +1 -0
  994. package/dist/tenancy/settings.js +218 -0
  995. package/dist/tenancy/settings.js.map +1 -0
  996. package/dist/users/repository.d.ts +54 -1
  997. package/dist/users/repository.d.ts.map +1 -1
  998. package/dist/users/repository.js +142 -4
  999. package/dist/users/repository.js.map +1 -1
  1000. package/dist/vault/repository.d.ts +67 -0
  1001. package/dist/vault/repository.d.ts.map +1 -1
  1002. package/dist/vault/repository.js +78 -0
  1003. package/dist/vault/repository.js.map +1 -1
  1004. package/package.json +20 -4
  1005. package/src/db/migrations/0023_user_invite_activation.sql +15 -0
  1006. package/src/db/migrations/0024_set_user_password_function.sql +32 -0
  1007. package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
  1008. package/src/db/migrations/0026_documents_and_competence.sql +353 -0
  1009. package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
  1010. package/src/db/migrations/0028_collection_engine.sql +94 -0
  1011. package/src/db/migrations/0029_payment_rail.sql +107 -0
  1012. package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
  1013. package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
  1014. package/src/db/migrations/0032_settlement_reversal.sql +76 -0
  1015. package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
  1016. package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
  1017. package/src/db/migrations/0035_payment_account_environments.sql +61 -0
  1018. package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
  1019. package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
  1020. package/src/db/migrations/0038_notification_channels.sql +175 -0
  1021. package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
  1022. package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
  1023. package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
  1024. package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
  1025. package/src/db/migrations/0043_workload_identity.sql +105 -0
  1026. package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
  1027. package/src/db/migrations/0045_role_write_scope.sql +122 -0
  1028. package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
  1029. package/src/db/migrations/0047_recipient_clearance.sql +89 -0
  1030. package/src/db/migrations/0048_item_type_note.sql +16 -0
  1031. package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
  1032. package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
  1033. package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
  1034. package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
  1035. package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
  1036. package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
  1037. package/src/db/migrations/0055_job_capability_contract.sql +300 -0
  1038. package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
  1039. package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
  1040. package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
  1041. package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
  1042. package/dist/cjs/mail/resend-client.js +0 -103
  1043. package/dist/cjs/mail/resend-client.js.map +0 -1
  1044. package/dist/mail/resend-client.d.ts +0 -16
  1045. package/dist/mail/resend-client.d.ts.map +0 -1
  1046. package/dist/mail/resend-client.js +0 -100
  1047. package/dist/mail/resend-client.js.map +0 -1
@@ -0,0 +1,353 @@
1
+ -- 0026 — Documents + Competência (ADR 0007 e ADR 0008).
2
+ --
3
+ -- Fecha a lacuna central do produto: até aqui nenhuma tabela guardava arquivo, e
4
+ -- "competência" era texto livre em três colunas com três nomes. O ciclo
5
+ -- "pedir → receber → conferir → provar" não fechava porque o documento trafegava
6
+ -- fora do sistema e só a declaração de entrega era registrada.
7
+ --
8
+ -- Invariantes (ADR 0007):
9
+ -- documento (registro de negócio) ≠ versão (imutável) ≠ blob (bytes).
10
+ -- Nada é sobrescrito: substituir é criar versão nova e mover o ponteiro.
11
+ -- Dedup de bytes é POR TENANT — nunca global, senão o checksum vira oráculo
12
+ -- de existência de arquivo alheio.
13
+ --
14
+ -- Invariante (ADR 0008):
15
+ -- a unicidade É a garantia de idempotência, não o código. Mesmo princípio já
16
+ -- aplicado em receivable_fee_competence_uq (0015).
17
+
18
+ -- ---------------------------------------------------------------------------
19
+ -- Competência
20
+ -- ---------------------------------------------------------------------------
21
+
22
+ CREATE TABLE competence (
23
+ id uuid PRIMARY KEY,
24
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
25
+ client_id uuid NOT NULL,
26
+ -- Rótulo canônico YYYY-MM (ADR 0008 D2). text + regex, não date nem par de
27
+ -- inteiros: ordenável lexicograficamente, comparável com <=, imune a fuso.
28
+ label text NOT NULL CHECK (label ~ '^\d{4}-\d{2}$'),
29
+ status text NOT NULL DEFAULT 'open'
30
+ CHECK (status IN ('open', 'in_progress', 'awaiting_client', 'review', 'closed', 'reopened')),
31
+ opened_at timestamptz NOT NULL DEFAULT now(),
32
+ closed_at timestamptz,
33
+ closed_by uuid REFERENCES "user"(id),
34
+ reopened_at timestamptz,
35
+ reopened_by uuid REFERENCES "user"(id),
36
+ notes text,
37
+ version int NOT NULL DEFAULT 1 CHECK (version > 0),
38
+ created_at timestamptz NOT NULL DEFAULT now(),
39
+ updated_at timestamptz NOT NULL DEFAULT now(),
40
+ deleted_at timestamptz,
41
+ CONSTRAINT competence_tenant_id_uq UNIQUE (tenant_id, id),
42
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
43
+ CHECK ((status <> 'closed') OR closed_at IS NOT NULL)
44
+ );
45
+
46
+ -- Uma competência por cliente por mês. É o que impede abrir julho/2026 duas vezes.
47
+ CREATE UNIQUE INDEX competence_client_label_uq
48
+ ON competence (tenant_id, client_id, label)
49
+ WHERE deleted_at IS NULL;
50
+ CREATE INDEX competence_tenant_status_idx ON competence (tenant_id, status, label DESC);
51
+
52
+ -- ---------------------------------------------------------------------------
53
+ -- Catálogo de itens recorrentes (ADR 0008 D3)
54
+ -- ---------------------------------------------------------------------------
55
+
56
+ -- tenant_id NULL = template do sistema; preenchido = override do escritório.
57
+ -- Mesma forma que `role` já usa para papéis de sistema (0003).
58
+ CREATE TABLE recurring_item_type (
59
+ id uuid PRIMARY KEY,
60
+ tenant_id uuid REFERENCES tenant(id),
61
+ key text NOT NULL,
62
+ label text NOT NULL,
63
+ -- obrigação = dever externo com prazo legal e risco de penalidade.
64
+ -- tarefa = trabalho interno com prazo acordado (ADR 0008 D6).
65
+ nature text NOT NULL CHECK (nature IN ('obligation', 'task')),
66
+ sphere text CHECK (sphere IN ('federal', 'estadual', 'municipal', 'trabalhista')),
67
+ category text,
68
+ periodicity text NOT NULL DEFAULT 'monthly'
69
+ CHECK (periodicity IN ('monthly', 'quarterly', 'yearly', 'eventual')),
70
+ -- Ex.: {"kind":"day_of_next_month","day":20}. Interpretada na aplicação.
71
+ due_rule jsonb NOT NULL DEFAULT '{}'::jsonb,
72
+ -- Regimes aos quais se aplica; [] = todos (ADR 0008 D5).
73
+ applies_to_regime jsonb NOT NULL DEFAULT '[]'::jsonb,
74
+ requires_document boolean NOT NULL DEFAULT false,
75
+ active boolean NOT NULL DEFAULT true,
76
+ created_at timestamptz NOT NULL DEFAULT now(),
77
+ updated_at timestamptz NOT NULL DEFAULT now(),
78
+ deleted_at timestamptz,
79
+ CONSTRAINT recurring_item_type_tenant_id_uq UNIQUE (tenant_id, id)
80
+ );
81
+
82
+ CREATE UNIQUE INDEX recurring_item_type_system_key_uq
83
+ ON recurring_item_type (key) WHERE tenant_id IS NULL AND deleted_at IS NULL;
84
+ CREATE UNIQUE INDEX recurring_item_type_tenant_key_uq
85
+ ON recurring_item_type (tenant_id, key) WHERE tenant_id IS NOT NULL AND deleted_at IS NULL;
86
+
87
+ CREATE TABLE recurring_instance (
88
+ id uuid PRIMARY KEY,
89
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
90
+ client_id uuid NOT NULL,
91
+ competence_id uuid NOT NULL,
92
+ item_type_id uuid NOT NULL REFERENCES recurring_item_type(id),
93
+ label text NOT NULL,
94
+ nature text NOT NULL CHECK (nature IN ('obligation', 'task')),
95
+ due_date date,
96
+ responsible_user_id uuid REFERENCES "user"(id),
97
+ status text NOT NULL DEFAULT 'pending'
98
+ CHECK (status IN ('pending', 'in_progress', 'awaiting_client', 'done', 'not_applicable', 'canceled')),
99
+ completed_at timestamptz,
100
+ completed_by uuid REFERENCES "user"(id),
101
+ amount numeric(14, 2),
102
+ notes text,
103
+ version int NOT NULL DEFAULT 1 CHECK (version > 0),
104
+ -- Preservação da origem quando a linha vem da migração de fiscal_obligation
105
+ -- (ADR 0008 D8). Nunca é preenchido por criação normal.
106
+ legacy_source text,
107
+ legacy_source_id uuid,
108
+ created_at timestamptz NOT NULL DEFAULT now(),
109
+ updated_at timestamptz NOT NULL DEFAULT now(),
110
+ deleted_at timestamptz,
111
+ CONSTRAINT recurring_instance_tenant_id_uq UNIQUE (tenant_id, id),
112
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
113
+ FOREIGN KEY (tenant_id, competence_id) REFERENCES competence (tenant_id, id),
114
+ CHECK ((status <> 'done') OR completed_at IS NOT NULL)
115
+ );
116
+
117
+ -- A GARANTIA de idempotência da geração (ADR 0008 D4). O gerador roda
118
+ -- ON CONFLICT DO NOTHING; executá-lo N vezes produz exatamente uma instância.
119
+ -- É o que hoje falta e permite lançar a mesma DAS de julho três vezes.
120
+ CREATE UNIQUE INDEX recurring_instance_competence_type_uq
121
+ ON recurring_instance (tenant_id, client_id, competence_id, item_type_id)
122
+ WHERE deleted_at IS NULL;
123
+ CREATE INDEX recurring_instance_due_idx
124
+ ON recurring_instance (tenant_id, status, due_date)
125
+ WHERE deleted_at IS NULL;
126
+ CREATE INDEX recurring_instance_client_idx
127
+ ON recurring_instance (tenant_id, client_id, competence_id);
128
+
129
+ -- ---------------------------------------------------------------------------
130
+ -- Documentos (ADR 0007)
131
+ -- ---------------------------------------------------------------------------
132
+
133
+ -- Taxonomia configurável por tenant, semeada pela vertical. O Core não sabe o
134
+ -- que é "DARF" (ADR 0007 D3).
135
+ CREATE TABLE document_category (
136
+ id uuid PRIMARY KEY,
137
+ tenant_id uuid REFERENCES tenant(id),
138
+ key text NOT NULL,
139
+ label text NOT NULL,
140
+ retention_months int CHECK (retention_months IS NULL OR retention_months > 0),
141
+ active boolean NOT NULL DEFAULT true,
142
+ created_at timestamptz NOT NULL DEFAULT now(),
143
+ CONSTRAINT document_category_tenant_id_uq UNIQUE (tenant_id, id)
144
+ );
145
+ CREATE UNIQUE INDEX document_category_system_key_uq
146
+ ON document_category (key) WHERE tenant_id IS NULL;
147
+ CREATE UNIQUE INDEX document_category_tenant_key_uq
148
+ ON document_category (tenant_id, key) WHERE tenant_id IS NOT NULL;
149
+
150
+ -- Bytes físicos. Imutável: nunca sofre UPDATE de conteúdo.
151
+ -- Dedup por (tenant, checksum) — jamais global, ver cabeçalho.
152
+ CREATE TABLE blob (
153
+ id uuid PRIMARY KEY,
154
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
155
+ checksum_sha256 text NOT NULL CHECK (checksum_sha256 ~ '^[a-f0-9]{64}$'),
156
+ size_bytes bigint NOT NULL CHECK (size_bytes > 0),
157
+ mime_type text NOT NULL,
158
+ storage_provider text NOT NULL CHECK (storage_provider IN ('local', 'r2', 's3')),
159
+ storage_key text NOT NULL,
160
+ -- Antivírus assíncrono: o download é bloqueado enquanto não estiver clean
161
+ -- (ADR 0007 D8). O pipeline em si é fase posterior.
162
+ av_status text NOT NULL DEFAULT 'pending'
163
+ CHECK (av_status IN ('pending', 'clean', 'infected', 'skipped')),
164
+ created_at timestamptz NOT NULL DEFAULT now(),
165
+ CONSTRAINT blob_tenant_id_uq UNIQUE (tenant_id, id)
166
+ );
167
+ CREATE UNIQUE INDEX blob_tenant_checksum_uq ON blob (tenant_id, checksum_sha256);
168
+
169
+ CREATE TABLE document (
170
+ id uuid PRIMARY KEY,
171
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
172
+ client_id uuid NOT NULL,
173
+ competence_id uuid,
174
+ category_id uuid,
175
+ title text NOT NULL,
176
+ status text NOT NULL DEFAULT 'active'
177
+ CHECK (status IN ('active', 'superseded', 'archived')),
178
+ current_version_id uuid,
179
+ version int NOT NULL DEFAULT 1 CHECK (version > 0),
180
+ created_by uuid REFERENCES "user"(id),
181
+ created_at timestamptz NOT NULL DEFAULT now(),
182
+ updated_at timestamptz NOT NULL DEFAULT now(),
183
+ deleted_at timestamptz,
184
+ deleted_by uuid REFERENCES "user"(id),
185
+ CONSTRAINT document_tenant_id_uq UNIQUE (tenant_id, id),
186
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
187
+ FOREIGN KEY (tenant_id, competence_id) REFERENCES competence (tenant_id, id)
188
+ );
189
+ CREATE INDEX document_client_idx
190
+ ON document (tenant_id, client_id, created_at DESC) WHERE deleted_at IS NULL;
191
+ CREATE INDEX document_competence_idx
192
+ ON document (tenant_id, competence_id) WHERE deleted_at IS NULL;
193
+
194
+ -- Versão imutável. version_no monotônico por documento.
195
+ CREATE TABLE document_version (
196
+ id uuid PRIMARY KEY,
197
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
198
+ document_id uuid NOT NULL,
199
+ blob_id uuid NOT NULL,
200
+ version_no int NOT NULL CHECK (version_no > 0),
201
+ original_filename text NOT NULL,
202
+ uploaded_by uuid REFERENCES "user"(id),
203
+ -- De onde veio: quem enviou pelo portal é o cliente; pelo console, o escritório.
204
+ uploaded_via text NOT NULL DEFAULT 'console'
205
+ CHECK (uploaded_via IN ('console', 'portal', 'import', 'system')),
206
+ uploaded_at timestamptz NOT NULL DEFAULT now(),
207
+ CONSTRAINT document_version_tenant_id_uq UNIQUE (tenant_id, id),
208
+ FOREIGN KEY (tenant_id, document_id) REFERENCES document (tenant_id, id),
209
+ FOREIGN KEY (tenant_id, blob_id) REFERENCES blob (tenant_id, id)
210
+ );
211
+ CREATE UNIQUE INDEX document_version_no_uq
212
+ ON document_version (tenant_id, document_id, version_no);
213
+
214
+ ALTER TABLE document
215
+ ADD CONSTRAINT document_current_version_fk
216
+ FOREIGN KEY (tenant_id, current_version_id) REFERENCES document_version (tenant_id, id)
217
+ DEFERRABLE INITIALLY DEFERRED;
218
+
219
+ -- ---------------------------------------------------------------------------
220
+ -- Pedido de documento (o que destrava o ciclo)
221
+ -- ---------------------------------------------------------------------------
222
+
223
+ -- Difere de onboarding_document_requirement por NÃO exigir um onboarding: o
224
+ -- pedido vive por cliente e competência, que é o eixo do trabalho recorrente.
225
+ CREATE TABLE document_request (
226
+ id uuid PRIMARY KEY,
227
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
228
+ client_id uuid NOT NULL,
229
+ competence_id uuid,
230
+ recurring_instance_id uuid,
231
+ category_id uuid,
232
+ title text NOT NULL,
233
+ description text,
234
+ status text NOT NULL DEFAULT 'requested'
235
+ CHECK (status IN ('requested', 'received', 'validated', 'rejected', 'canceled')),
236
+ due_date date,
237
+ requested_by uuid REFERENCES "user"(id),
238
+ requested_at timestamptz NOT NULL DEFAULT now(),
239
+ received_at timestamptz,
240
+ validated_at timestamptz,
241
+ validated_by uuid REFERENCES "user"(id),
242
+ rejected_at timestamptz,
243
+ rejected_by uuid REFERENCES "user"(id),
244
+ rejection_reason text,
245
+ -- O documento que satisfez o pedido. Diferente do ponteiro órfão que existia
246
+ -- em onboarding_document_requirement, este tem FK de verdade.
247
+ document_id uuid,
248
+ version int NOT NULL DEFAULT 1 CHECK (version > 0),
249
+ created_at timestamptz NOT NULL DEFAULT now(),
250
+ updated_at timestamptz NOT NULL DEFAULT now(),
251
+ deleted_at timestamptz,
252
+ CONSTRAINT document_request_tenant_id_uq UNIQUE (tenant_id, id),
253
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
254
+ FOREIGN KEY (tenant_id, competence_id) REFERENCES competence (tenant_id, id),
255
+ FOREIGN KEY (tenant_id, recurring_instance_id) REFERENCES recurring_instance (tenant_id, id),
256
+ FOREIGN KEY (tenant_id, document_id) REFERENCES document (tenant_id, id),
257
+ CHECK ((status <> 'rejected') OR rejection_reason IS NOT NULL),
258
+ CHECK ((status NOT IN ('received', 'validated')) OR document_id IS NOT NULL)
259
+ );
260
+ CREATE INDEX document_request_client_idx
261
+ ON document_request (tenant_id, client_id, status) WHERE deleted_at IS NULL;
262
+ CREATE INDEX document_request_due_idx
263
+ ON document_request (tenant_id, status, due_date) WHERE deleted_at IS NULL;
264
+ CREATE INDEX document_request_competence_idx
265
+ ON document_request (tenant_id, competence_id) WHERE deleted_at IS NULL;
266
+
267
+ -- ---------------------------------------------------------------------------
268
+ -- O ponteiro órfão do onboarding ganha destino (ADR 0007)
269
+ -- ---------------------------------------------------------------------------
270
+
271
+ -- canonical_document_id existia desde 0016 como uuid sem FK e sempre nulo.
272
+ -- Agora aponta para document de verdade. Nenhuma linha existente é alterada:
273
+ -- todas têm o campo nulo, então a constraint é satisfeita de imediato.
274
+ ALTER TABLE onboarding_document_requirement
275
+ ADD CONSTRAINT onboarding_document_requirement_canonical_document_fk
276
+ FOREIGN KEY (tenant_id, canonical_document_id) REFERENCES document (tenant_id, id);
277
+
278
+ -- ---------------------------------------------------------------------------
279
+ -- RLS — FORCE em todas, com escopo de cliente onde a tabela é por-cliente
280
+ -- ---------------------------------------------------------------------------
281
+
282
+ -- Tabelas por-cliente: o portal enxerga apenas o próprio cliente.
283
+ DO $$
284
+ DECLARE
285
+ t text;
286
+ BEGIN
287
+ FOREACH t IN ARRAY ARRAY[
288
+ 'competence', 'recurring_instance', 'document', 'document_request'
289
+ ] LOOP
290
+ EXECUTE format('ALTER TABLE %I ENABLE ROW LEVEL SECURITY', t);
291
+ EXECUTE format('ALTER TABLE %I FORCE ROW LEVEL SECURITY', t);
292
+ EXECUTE format($policy$
293
+ CREATE POLICY %I_tenant_client_isolation ON %I
294
+ USING (
295
+ tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
296
+ AND (
297
+ NULLIF(current_setting('app.current_client', true), '') IS NULL
298
+ OR client_id = NULLIF(current_setting('app.current_client', true), '')::uuid
299
+ )
300
+ )
301
+ WITH CHECK (
302
+ tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
303
+ AND (
304
+ NULLIF(current_setting('app.current_client', true), '') IS NULL
305
+ OR client_id = NULLIF(current_setting('app.current_client', true), '')::uuid
306
+ )
307
+ )
308
+ $policy$, t, t);
309
+ END LOOP;
310
+ END $$;
311
+
312
+ -- Tabelas sem client_id: isolamento apenas por tenant.
313
+ -- document_version e blob são alcançados por FK composta a partir de document,
314
+ -- que já é client-scoped — o escopo de cliente é herdado por navegação.
315
+ DO $$
316
+ DECLARE
317
+ t text;
318
+ BEGIN
319
+ FOREACH t IN ARRAY ARRAY['blob', 'document_version'] LOOP
320
+ EXECUTE format('ALTER TABLE %I ENABLE ROW LEVEL SECURITY', t);
321
+ EXECUTE format('ALTER TABLE %I FORCE ROW LEVEL SECURITY', t);
322
+ EXECUTE format($policy$
323
+ CREATE POLICY %I_tenant_isolation ON %I
324
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
325
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
326
+ $policy$, t, t);
327
+ END LOOP;
328
+ END $$;
329
+
330
+ -- Catálogos: template do sistema (tenant_id NULL) é visível a todos; override
331
+ -- só ao dono. Mesma forma da policy de `role` (0006).
332
+ ALTER TABLE recurring_item_type ENABLE ROW LEVEL SECURITY;
333
+ ALTER TABLE recurring_item_type FORCE ROW LEVEL SECURITY;
334
+ CREATE POLICY recurring_item_type_visibility ON recurring_item_type
335
+ USING (tenant_id IS NULL OR tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
336
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
337
+
338
+ ALTER TABLE document_category ENABLE ROW LEVEL SECURITY;
339
+ ALTER TABLE document_category FORCE ROW LEVEL SECURITY;
340
+ CREATE POLICY document_category_visibility ON document_category
341
+ USING (tenant_id IS NULL OR tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
342
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
343
+
344
+ -- Versão é imutável: nenhum UPDATE/DELETE, no mesmo padrão de audit_log (0005).
345
+ CREATE OR REPLACE FUNCTION document_version_immutable() RETURNS trigger AS $$
346
+ BEGIN
347
+ RAISE EXCEPTION 'document_version é imutável: crie uma nova versão';
348
+ END;
349
+ $$ LANGUAGE plpgsql;
350
+
351
+ CREATE TRIGGER document_version_no_update
352
+ BEFORE UPDATE OR DELETE ON document_version
353
+ FOR EACH ROW EXECUTE FUNCTION document_version_immutable();
@@ -0,0 +1,58 @@
1
+ -- 0027 — Isolamento por CLIENTE nas tabelas de Accounts Receivable.
2
+ --
3
+ -- O M0 (0015) criou as policies de AR filtrando apenas por tenant. Enquanto o AR
4
+ -- não tinha leitura pelo Portal, isso bastava. Ao abrir a visão financeira do
5
+ -- contribuinte (Onda 1A), a lacuna vira vazamento: um usuário de portal com o id
6
+ -- de um recebível alheio recebia HTTP 200 — o mesmo formato do defeito corrigido
7
+ -- na PR #69, agora numa tabela diferente.
8
+ --
9
+ -- O predicado adotado é o mesmo já usado em `document`/`service_request`:
10
+ --
11
+ -- current_client IS NULL → staff, vê o tenant inteiro
12
+ -- current_client = X → portal, vê apenas o cliente X
13
+ --
14
+ -- `receivable_item` e `payment` não carregam `client_id`; herdam o recorte do
15
+ -- `receivable` a que pertencem, via EXISTS. É mais caro que uma comparação
16
+ -- direta, mas evita desnormalizar `client_id` em três tabelas só para a policy —
17
+ -- e o índice `receivable_client_idx` já cobre o lookup.
18
+
19
+ -- ── receivable ───────────────────────────────────────────────────────────────
20
+ DROP POLICY IF EXISTS receivable_tenant_isolation ON receivable;
21
+ CREATE POLICY receivable_tenant_client_isolation ON receivable
22
+ USING (
23
+ tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
24
+ AND (
25
+ NULLIF(current_setting('app.current_client', true), '') IS NULL
26
+ OR client_id = NULLIF(current_setting('app.current_client', true), '')::uuid
27
+ )
28
+ );
29
+
30
+ -- ── receivable_item ──────────────────────────────────────────────────────────
31
+ DROP POLICY IF EXISTS receivable_item_tenant_isolation ON receivable_item;
32
+ CREATE POLICY receivable_item_tenant_client_isolation ON receivable_item
33
+ USING (
34
+ tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
35
+ AND (
36
+ NULLIF(current_setting('app.current_client', true), '') IS NULL
37
+ OR EXISTS (
38
+ SELECT 1 FROM receivable r
39
+ WHERE r.id = receivable_item.receivable_id
40
+ AND r.client_id = NULLIF(current_setting('app.current_client', true), '')::uuid
41
+ )
42
+ )
43
+ );
44
+
45
+ -- ── payment ──────────────────────────────────────────────────────────────────
46
+ DROP POLICY IF EXISTS payment_tenant_isolation ON payment;
47
+ CREATE POLICY payment_tenant_client_isolation ON payment
48
+ USING (
49
+ tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
50
+ AND (
51
+ NULLIF(current_setting('app.current_client', true), '') IS NULL
52
+ OR EXISTS (
53
+ SELECT 1 FROM receivable r
54
+ WHERE r.id = payment.receivable_id
55
+ AND r.client_id = NULLIF(current_setting('app.current_client', true), '')::uuid
56
+ )
57
+ )
58
+ );
@@ -0,0 +1,94 @@
1
+ -- 0028 — Motor de cobrança: `dunning_event` passa a ancorar no Receivable.
2
+ --
3
+ -- O NÓ: `dunning_event` nasceu (0014) amarrada a `charge` — FK composta
4
+ -- `(tenant_id, charge_id) → charge` e único `(tenant_id, charge_id, step_key)`.
5
+ -- Mas `charge` é o INSTRUMENTO (boleto/pix), e a Onda 1A criou os recebíveis
6
+ -- deliberadamente SEM instrumento. Resultado: a régua não tinha em que se
7
+ -- ancorar, e a idempotência apontava para uma linha que não existe.
8
+ --
9
+ -- POR QUE ESTENDER EM VEZ DE CRIAR TABELA NOVA: a semântica de `dunning_event`
10
+ -- ("este passo da régua já foi executado para esta dívida") é exatamente a que o
11
+ -- motor precisa, e a FK composta já é tenant-safe. Criar uma segunda tabela
12
+ -- deixaria duas fontes de verdade para idempotência de cobrança — que é
13
+ -- precisamente o tipo de ambiguidade que produz cobrança duplicada.
14
+ --
15
+ -- A âncora vira exclusiva: OU `charge_id` OU `receivable_id`, nunca ambos, nunca
16
+ -- nenhum. Os índices únicos são PARCIAIS, um por caso, porque um único índice
17
+ -- sobre colunas nulas não impede duplicata (NULL nunca é igual a NULL).
18
+
19
+ ALTER TABLE dunning_event ADD COLUMN IF NOT EXISTS receivable_id uuid;
20
+ ALTER TABLE dunning_event ALTER COLUMN charge_id DROP NOT NULL;
21
+
22
+ ALTER TABLE dunning_event
23
+ ADD CONSTRAINT dunning_event_receivable_fk
24
+ FOREIGN KEY (tenant_id, receivable_id) REFERENCES receivable (tenant_id, id);
25
+
26
+ ALTER TABLE dunning_event
27
+ ADD CONSTRAINT dunning_event_anchor_ck
28
+ CHECK ((charge_id IS NULL) <> (receivable_id IS NULL));
29
+
30
+ -- O único original cobria `(tenant, charge, step)` com charge NOT NULL. Agora
31
+ -- que charge é nulo no caminho novo, ele deixa de proteger — daí os parciais.
32
+ DROP INDEX IF EXISTS dunning_event_uq;
33
+ CREATE UNIQUE INDEX dunning_event_charge_uq
34
+ ON dunning_event (tenant_id, charge_id, step_key) WHERE charge_id IS NOT NULL;
35
+ CREATE UNIQUE INDEX dunning_event_receivable_uq
36
+ ON dunning_event (tenant_id, receivable_id, step_key) WHERE receivable_id IS NOT NULL;
37
+
38
+ -- ── Ciclo de vida da ação ───────────────────────────────────────────────────
39
+ --
40
+ -- A tabela deixa de ser só um log do que saiu e passa a carregar o que está
41
+ -- AGENDADO. Sem isso não há como responder "o que vou cobrar hoje" nem como
42
+ -- cancelar o que ainda não foi enviado quando o cliente paga.
43
+ ALTER TABLE dunning_event ADD COLUMN IF NOT EXISTS status text NOT NULL DEFAULT 'sent'
44
+ CHECK (status IN ('scheduled','sent','failed','canceled','escalated'));
45
+ ALTER TABLE dunning_event ADD COLUMN IF NOT EXISTS scheduled_for date;
46
+ ALTER TABLE dunning_event ADD COLUMN IF NOT EXISTS template text;
47
+ ALTER TABLE dunning_event ADD COLUMN IF NOT EXISTS attempts int NOT NULL DEFAULT 0;
48
+ ALTER TABLE dunning_event ADD COLUMN IF NOT EXISTS last_error text;
49
+ ALTER TABLE dunning_event ADD COLUMN IF NOT EXISTS sent_at timestamptz;
50
+ ALTER TABLE dunning_event ADD COLUMN IF NOT EXISTS closed_at timestamptz;
51
+ -- Motivo em vocabulário fechado: 'paid', 'canceled', 'rule_disabled',
52
+ -- 'permanent_failure', 'escalated'. Texto livre aqui viraria relatório que
53
+ -- ninguém consegue agregar.
54
+ ALTER TABLE dunning_event ADD COLUMN IF NOT EXISTS closed_reason text;
55
+ -- Referência LÓGICA do destinatário (e-mail do contato, telefone). Guardada para
56
+ -- a trilha responder "para onde foi" sem depender de o cadastro do cliente
57
+ -- continuar igual seis meses depois.
58
+ ALTER TABLE dunning_event ADD COLUMN IF NOT EXISTS recipient_ref text;
59
+ -- Saldo no momento do disparo. Uma cobrança precisa poder provar QUAL valor
60
+ -- anunciou — depois de uma baixa parcial, o saldo de hoje não é o de ontem.
61
+ ALTER TABLE dunning_event ADD COLUMN IF NOT EXISTS amount_at_send numeric(14,2);
62
+
63
+ CREATE INDEX IF NOT EXISTS dunning_event_due_idx
64
+ ON dunning_event (tenant_id, status, scheduled_for);
65
+ CREATE INDEX IF NOT EXISTS dunning_event_receivable_idx
66
+ ON dunning_event (tenant_id, receivable_id, status);
67
+
68
+ -- ── RLS: tenant E cliente ───────────────────────────────────────────────────
69
+ --
70
+ -- Mesmo padrão da 0027. A tabela não carrega `client_id`; herda o recorte do
71
+ -- receivable. O caminho `charge` mantém só o corte por tenant, porque `charge`
72
+ -- não é exposto ao Portal.
73
+ DROP POLICY IF EXISTS dunning_event_tenant_isolation ON dunning_event;
74
+ CREATE POLICY dunning_event_tenant_client_isolation ON dunning_event
75
+ USING (
76
+ tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
77
+ AND (
78
+ NULLIF(current_setting('app.current_client', true), '') IS NULL
79
+ OR EXISTS (
80
+ SELECT 1 FROM receivable r
81
+ WHERE r.id = dunning_event.receivable_id
82
+ AND r.client_id = NULLIF(current_setting('app.current_client', true), '')::uuid
83
+ )
84
+ )
85
+ );
86
+
87
+ -- ── Política de cobrança por tenant ─────────────────────────────────────────
88
+ --
89
+ -- `dunning_rule` (0014) já guarda `steps jsonb` por tenant e é reaproveitada —
90
+ -- não há tabela nova de política. Só falta marcar qual é a padrão do escritório
91
+ -- quando houver mais de uma.
92
+ ALTER TABLE dunning_rule ADD COLUMN IF NOT EXISTS is_default boolean NOT NULL DEFAULT false;
93
+ CREATE UNIQUE INDEX IF NOT EXISTS dunning_rule_default_uq
94
+ ON dunning_rule (tenant_id) WHERE is_default AND active;
@@ -0,0 +1,107 @@
1
+ -- 0029 — Payment Rail: o elo entre o recebível interno e a cobrança no provider.
2
+ --
3
+ -- O M0 (0015) já modelou `payment_provider_account` por tenant, `receivable`,
4
+ -- `payment` e `webhook_event`. O que faltava era ligar a ponta: uma `charge`
5
+ -- não sabia a qual recebível pertencia nem por qual conta foi emitida — e sem
6
+ -- isso o webhook do provider não tem como achar o recebível a dar baixa.
7
+ --
8
+ -- Aditiva e reversível: nenhuma coluna existente muda de tipo ou de nulidade,
9
+ -- nenhuma linha é reescrita. Cobranças antigas ficam com os campos novos nulos,
10
+ -- que é a verdade sobre elas — nasceram sem recebível.
11
+
12
+ -- ── Segredo de webhook, ao lado da credencial de API ─────────────────────────
13
+ --
14
+ -- `credential_ref` guarda a chave que EMITE cobrança. O token que AUTENTICA o
15
+ -- webhook é outro segredo, com outro ciclo de rotação, e precisa de referência
16
+ -- própria — sem ela a rota pública não tem como se fechar.
17
+ ALTER TABLE payment_provider_account
18
+ ADD COLUMN IF NOT EXISTS webhook_credential_ref text;
19
+
20
+ -- ── charge → receivable ──────────────────────────────────────────────────────
21
+ ALTER TABLE charge ADD COLUMN IF NOT EXISTS receivable_id uuid;
22
+ ALTER TABLE charge ADD COLUMN IF NOT EXISTS provider_account_id uuid;
23
+
24
+ DO $$
25
+ BEGIN
26
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'charge_receivable_fk') THEN
27
+ ALTER TABLE charge ADD CONSTRAINT charge_receivable_fk
28
+ FOREIGN KEY (tenant_id, receivable_id) REFERENCES receivable (tenant_id, id);
29
+ END IF;
30
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'charge_provider_account_fk') THEN
31
+ ALTER TABLE charge ADD CONSTRAINT charge_provider_account_fk
32
+ FOREIGN KEY (tenant_id, provider_account_id)
33
+ REFERENCES payment_provider_account (tenant_id, id);
34
+ END IF;
35
+ END $$;
36
+
37
+ -- Idempotência estrutural: no máximo UMA cobrança viva por recebível.
38
+ --
39
+ -- O código também protege, mas retry, job repetido, deploy no meio da chamada e
40
+ -- clique duplo são exatamente os casos em que o código perde. Aqui o banco
41
+ -- recusa a segunda cobrança, e o chamador trata a violação buscando a que já
42
+ -- existe. Cobrança cancelada/estornada não conta — depois de cancelar, o
43
+ -- escritório precisa poder emitir outra.
44
+ CREATE UNIQUE INDEX IF NOT EXISTS charge_active_per_receivable_uq
45
+ ON charge (tenant_id, receivable_id)
46
+ WHERE receivable_id IS NOT NULL
47
+ AND deleted_at IS NULL
48
+ AND status NOT IN ('canceled', 'refunded');
49
+
50
+ CREATE INDEX IF NOT EXISTS charge_receivable_idx
51
+ ON charge (tenant_id, receivable_id) WHERE receivable_id IS NOT NULL;
52
+
53
+ -- ── Cliente do tenant ↔ customer no provider ─────────────────────────────────
54
+ --
55
+ -- O Asaas (como todo gateway) exige um `customer` próprio antes de aceitar uma
56
+ -- cobrança. Recriá-lo a cada emissão produziria clientes duplicados na conta do
57
+ -- escritório e quebraria o histórico dele lá dentro. Este mapa é a memória de
58
+ -- "quem já foi provisionado", e é POR CONTA: o mesmo cliente pode existir em
59
+ -- duas contas diferentes com ids diferentes.
60
+ CREATE TABLE IF NOT EXISTS payment_customer (
61
+ id uuid PRIMARY KEY,
62
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
63
+ client_id uuid NOT NULL,
64
+ provider_account_id uuid NOT NULL,
65
+ provider text NOT NULL,
66
+ external_id text NOT NULL,
67
+ created_at timestamptz NOT NULL DEFAULT now(),
68
+ updated_at timestamptz NOT NULL DEFAULT now(),
69
+ CONSTRAINT payment_customer_tenant_id_uq UNIQUE (tenant_id, id),
70
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
71
+ FOREIGN KEY (tenant_id, provider_account_id)
72
+ REFERENCES payment_provider_account (tenant_id, id)
73
+ );
74
+
75
+ CREATE UNIQUE INDEX IF NOT EXISTS payment_customer_account_client_uq
76
+ ON payment_customer (tenant_id, provider_account_id, client_id);
77
+
78
+ ALTER TABLE payment_customer ENABLE ROW LEVEL SECURITY;
79
+ ALTER TABLE payment_customer FORCE ROW LEVEL SECURITY;
80
+ DROP POLICY IF EXISTS payment_customer_tenant_isolation ON payment_customer;
81
+ CREATE POLICY payment_customer_tenant_isolation ON payment_customer
82
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
83
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
84
+
85
+ -- ── Pagamento: de onde veio a confirmação ────────────────────────────────────
86
+ --
87
+ -- `payment.metadata` já guardaria isso, mas o id do pagamento no provider é a
88
+ -- chave de reconciliação e de investigação — merece coluna, índice e unicidade.
89
+ -- Webhook duplicado é a regra, não a exceção: o gateway reenvia até receber 200.
90
+ ALTER TABLE payment ADD COLUMN IF NOT EXISTS provider text;
91
+ ALTER TABLE payment ADD COLUMN IF NOT EXISTS provider_payment_id text;
92
+
93
+ CREATE UNIQUE INDEX IF NOT EXISTS payment_provider_payment_uq
94
+ ON payment (tenant_id, provider, provider_payment_id)
95
+ WHERE provider_payment_id IS NOT NULL;
96
+
97
+ -- ── Dedup de webhook por conta ───────────────────────────────────────────────
98
+ --
99
+ -- `webhook_event` já tinha unicidade por (provider, external_event_id). Falta
100
+ -- saber QUAL conta recebeu o evento: dois escritórios no mesmo provider podem,
101
+ -- em tese, receber ids que só são únicos dentro da própria conta. Sem esta
102
+ -- coluna, o evento de um tenant poderia bloquear o de outro pelo índice.
103
+ ALTER TABLE webhook_event ADD COLUMN IF NOT EXISTS provider_account_id uuid;
104
+
105
+ DROP INDEX IF EXISTS webhook_event_idempotency_uq;
106
+ CREATE UNIQUE INDEX IF NOT EXISTS webhook_event_idempotency_uq
107
+ ON webhook_event (provider, COALESCE(provider_account_id, '00000000-0000-0000-0000-000000000000'::uuid), external_event_id);
@@ -0,0 +1,22 @@
1
+ -- 0030 — Duas organizações não podem receber na mesma conta.
2
+ --
3
+ -- Esta regra nasceu como uma consulta em código, e a consulta não funcionava:
4
+ -- `payment_provider_account` tem RLS FORCE, então um `SELECT ... WHERE
5
+ -- tenant_id <> $atual` devolve **sempre zero linhas** — a política esconde
6
+ -- exatamente as linhas que a checagem precisava encontrar. O guard parecia
7
+ -- proteger e não protegia.
8
+ --
9
+ -- Índice único opera acima da RLS: ele enxerga a tabela inteira e recusa o
10
+ -- INSERT mesmo quando quem insere não pode ver a linha conflitante. É a única
11
+ -- forma de a garantia ser real aqui.
12
+ --
13
+ -- Por que a regra importa: `account_reference` identifica a conta no gateway.
14
+ -- Dois escritórios apontando para a mesma conta significa o dinheiro de um
15
+ -- caindo na conta do outro — o pior desfecho possível deste produto.
16
+ --
17
+ -- Conta revogada não ocupa a vaga: depois de desconectar, a mesma conta pode
18
+ -- ser reconectada, inclusive por outra organização (troca de contador, por
19
+ -- exemplo).
20
+ CREATE UNIQUE INDEX IF NOT EXISTS payment_provider_account_reference_uq
21
+ ON payment_provider_account (provider, account_reference)
22
+ WHERE account_reference IS NOT NULL AND status <> 'revoked';
@@ -0,0 +1,21 @@
1
+ -- 0031 — A unicidade da conta financeira precisa incluir o AMBIENTE.
2
+ --
3
+ -- Dois problemas encontrados ao revalidar a conta sandbox da SC:
4
+ --
5
+ -- 1. `account_reference` ficou NULL, porque o `/myAccount` do Asaas não expõe
6
+ -- `walletId` nem `id` nessa conta. O índice de unicidade é PARCIAL
7
+ -- (`WHERE account_reference IS NOT NULL`), então o guard que impede duas
8
+ -- organizações de receberem na mesma conta estava **inativo na configuração
9
+ -- real** — parecia proteger e não protegia.
10
+ --
11
+ -- O adapter passa a derivar a referência do documento quando o gateway não
12
+ -- dá id próprio. Documento é o que identifica o titular do dinheiro, que é
13
+ -- justamente o que o guard precisa comparar.
14
+ --
15
+ -- 2. Sem o ambiente na chave, a mesma empresa não conseguiria conectar `live`
16
+ -- tendo passado por `sandbox` com a referência derivada do mesmo documento.
17
+ -- A "mesma conta" em ambientes diferentes é conta diferente.
18
+ DROP INDEX IF EXISTS payment_provider_account_reference_uq;
19
+ CREATE UNIQUE INDEX IF NOT EXISTS payment_provider_account_reference_uq
20
+ ON payment_provider_account (provider, environment, account_reference)
21
+ WHERE account_reference IS NOT NULL AND status <> 'revoked';