@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,300 @@
1
+ -- 0055 — o contrato de capacidade dos JOBS, e a elegibilidade fiscal default-deny.
2
+ --
3
+ -- ═══ O que a Onda A fechou, e o que ficou aberto ═══════════════════════════
4
+ --
5
+ -- A Onda A fechou o skew de release entre a tela e a API: `GET /v1/capabilities`
6
+ -- declara o que aquele build serve, o console exige o que vai usar, e a
7
+ -- requisição condenada não parte (0054 / docs/architecture/141).
8
+ --
9
+ -- Isso protege a superfície HTTP. Não protege NADA que roda sem navegador.
10
+ --
11
+ -- Os dois crons deste produto (`baruk-collection-cron`, `baruk-billing-cron`)
12
+ -- publicam na Render como serviços SEPARADOS do serviço web, a partir da mesma
13
+ -- imagem mas com deploys independentes — e as migrations rodam no
14
+ -- `preDeployCommand` do serviço WEB, não no cron. A ordem entre "a imagem nova
15
+ -- do cron subiu" e "o schema novo foi aplicado" não é garantida por nada.
16
+ --
17
+ -- Então existem os dois lados da janela:
18
+ --
19
+ -- worker NOVO + schema VELHO → o job depende de coluna/tabela que ainda não
20
+ -- existe. Hoje isso aparece como exceção no meio do loop, DEPOIS de já ter
21
+ -- escrito no tenant anterior — estado parcial, que é exatamente o que a
22
+ -- ingestão fiscal não pode produzir.
23
+ --
24
+ -- worker VELHO + schema NOVO → o job escreve linhas sem o que o schema novo
25
+ -- passou a esperar. Aditivo sobrevive; obrigatório não.
26
+ --
27
+ -- ═══ Por que capacidade, e não SHA — de novo, e por outro motivo ═══════════
28
+ --
29
+ -- Para a tela, a contraparte é a API. Para um worker, a contraparte é o BANCO:
30
+ -- é a única superfície que os dois lados enxergam. Comparar o commit da imagem
31
+ -- do cron com o commit do serviço web acoplaria o job ao processo de release e
32
+ -- reprovaria um hotfix inofensivo.
33
+ --
34
+ -- Por isso o registro vive AQUI, no banco, e quem o escreve é a MIGRATION —
35
+ -- isto é, o mesmo ato que cria a capacidade. Uma capacidade não pode ser
36
+ -- declarada por quem a consome: `baruk_app` recebe apenas SELECT nesta tabela
37
+ -- (ver `db/migrate.ts`). Autoridade escrita pelo controlado não é autoridade,
38
+ -- e um worker que pudesse declarar a própria capacidade teria um portão com a
39
+ -- chave do lado de dentro.
40
+
41
+ -- ── 1 · Registro de capacidades da PLATAFORMA ──────────────────────────────
42
+ --
43
+ -- Global, sem `tenant_id`: a capacidade é do schema, não do escritório. Sem RLS
44
+ -- pelo mesmo motivo que `fiscal_attribute_definition` — e, como lá, a proteção
45
+ -- é o privilégio, não a policy.
46
+ --
47
+ -- Chave IMUTÁVEL, igual ao contrato HTTP: mudança incompatível ganha `.v2`, e a
48
+ -- `.v1` só sai quando nenhum worker em produção ainda a exigir. É essa regra
49
+ -- que faz `worker velho + schema novo` ser seguro: o registro só CRESCE, e
50
+ -- compatibilidade é continência de conjunto.
51
+ CREATE TABLE IF NOT EXISTS platform_capability (
52
+ key text PRIMARY KEY,
53
+ label text NOT NULL,
54
+ -- Versão do FORMATO do contrato, não da capacidade. Um worker que não
55
+ -- reconhece a versão trata tudo como indisponível: fail-closed é a única
56
+ -- leitura segura de um contrato que não se sabe ler.
57
+ contract_version int NOT NULL,
58
+ -- Qual migration declarou. Não é decoração: é como se responde "desde qual
59
+ -- deploy esta capacidade existe?" sem depender de git em tempo de execução.
60
+ declared_by_migration text NOT NULL,
61
+ declared_at timestamptz NOT NULL DEFAULT now(),
62
+ CONSTRAINT platform_capability_key_format
63
+ CHECK (key ~ '^[a-z0-9]+(-[a-z0-9]+)*(\.[a-z0-9]+(-[a-z0-9]+)*)+\.v[0-9]+$')
64
+ );
65
+
66
+ COMMENT ON TABLE platform_capability IS
67
+ 'O que ESTE schema sabe fazer. Escrito só por migration (baruk_app tem apenas SELECT): quem consome a capacidade não pode declará-la.';
68
+
69
+ INSERT INTO platform_capability (key, label, contract_version, declared_by_migration) VALUES
70
+ ('office.job-contract.v1',
71
+ 'Contrato de capacidade para jobs e workers', 1, '0055'),
72
+ ('office.collection-cycle.v1',
73
+ 'Ciclo diário de cobrança: geração de recebíveis da competência + régua', 1, '0055'),
74
+ ('office.saas-billing-cycle.v1',
75
+ 'Ciclo do Billing SaaS: trial, renovação, régua e suspensão', 1, '0055')
76
+ ON CONFLICT (key) DO NOTHING;
77
+
78
+ -- ── 2 · Cursor do job, por tenant ──────────────────────────────────────────
79
+ --
80
+ -- Existe para que "não consumir cursor irreversivelmente" seja uma propriedade
81
+ -- verificável, e não uma promessa. O cursor só avança quando o lote INTEIRO
82
+ -- termina sob um contrato compatível; run bloqueado não o toca.
83
+ --
84
+ -- `contract_version` grava sob qual contrato aquela posição foi alcançada. Um
85
+ -- worker que leia um cursor gravado sob contrato que ele não reconhece PARA —
86
+ -- em vez de reinterpretar a posição com semântica diferente.
87
+ CREATE TABLE IF NOT EXISTS job_cursor (
88
+ id uuid PRIMARY KEY,
89
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
90
+ job_name text NOT NULL,
91
+ position text NOT NULL,
92
+ contract_version int NOT NULL,
93
+ updated_at timestamptz NOT NULL DEFAULT now(),
94
+ CONSTRAINT job_cursor_tenant_id_uq UNIQUE (tenant_id, id)
95
+ );
96
+
97
+ CREATE UNIQUE INDEX IF NOT EXISTS job_cursor_uq ON job_cursor (tenant_id, job_name);
98
+
99
+ ALTER TABLE job_cursor ENABLE ROW LEVEL SECURITY;
100
+ ALTER TABLE job_cursor FORCE ROW LEVEL SECURITY;
101
+ CREATE POLICY job_cursor_tenant_isolation ON job_cursor
102
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
103
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
104
+
105
+ -- ── 3 · Trilha de execução do job ──────────────────────────────────────────
106
+ --
107
+ -- Um job bloqueado por incompatibilidade não pode falhar em silêncio. Esta
108
+ -- tabela é o registro nomeado do bloqueio: qual job, qual versão, o que exigia,
109
+ -- o que o schema declarava, e quando.
110
+ --
111
+ -- Sem PII e sem segredo por construção: só nomes de capacidade e contadores.
112
+ CREATE TABLE IF NOT EXISTS job_run (
113
+ id uuid PRIMARY KEY,
114
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
115
+ job_name text NOT NULL,
116
+ job_version int NOT NULL,
117
+ -- Os cinco estados. `TEMPORARILY_UNAVAILABLE` é deliberadamente separado de
118
+ -- `INCOMPATIBLE`: o primeiro volta sozinho e merece retry; o segundo exige um
119
+ -- deploy, e insistir nele é gastar orçamento contra uma parede.
120
+ readiness text NOT NULL CHECK (readiness IN (
121
+ 'READY', 'TEMPORARILY_UNAVAILABLE', 'INCOMPATIBLE',
122
+ 'DISABLED', 'BLOCKED_BY_TENANT_CONFIG')),
123
+ status text NOT NULL CHECK (status IN ('completed', 'blocked', 'failed')),
124
+ contract_version int,
125
+ required_capabilities text[] NOT NULL DEFAULT '{}',
126
+ observed_capabilities text[] NOT NULL DEFAULT '{}',
127
+ missing_capabilities text[] NOT NULL DEFAULT '{}',
128
+ mutations int NOT NULL DEFAULT 0 CHECK (mutations >= 0),
129
+ cursor_advanced boolean NOT NULL DEFAULT false,
130
+ detail text,
131
+ started_at timestamptz NOT NULL DEFAULT now(),
132
+ finished_at timestamptz,
133
+ CONSTRAINT job_run_tenant_id_uq UNIQUE (tenant_id, id),
134
+ -- O fail-closed vira invariante do BANCO, não promessa do TypeScript: é
135
+ -- impossível registrar um run bloqueado que tenha mutado ou avançado cursor.
136
+ -- Um refactor futuro que erre a ordem das operações não passa daqui.
137
+ CONSTRAINT job_run_blocked_is_inert
138
+ CHECK (status <> 'blocked' OR (mutations = 0 AND cursor_advanced = false)),
139
+ -- `READY` e bloqueio são mutuamente exclusivos: um run bloqueado tem de dizer
140
+ -- POR QUE, e 'READY' não é um motivo.
141
+ CONSTRAINT job_run_blocked_has_reason
142
+ CHECK (status <> 'blocked' OR readiness <> 'READY')
143
+ );
144
+
145
+ CREATE INDEX IF NOT EXISTS job_run_tenant_job_idx
146
+ ON job_run (tenant_id, job_name, started_at DESC);
147
+
148
+ ALTER TABLE job_run ENABLE ROW LEVEL SECURITY;
149
+ ALTER TABLE job_run FORCE ROW LEVEL SECURITY;
150
+ CREATE POLICY job_run_tenant_isolation ON job_run
151
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
152
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
153
+
154
+ COMMENT ON CONSTRAINT job_run_blocked_is_inert ON job_run IS
155
+ 'Fail-closed como invariante de banco: run bloqueado com mutação ou cursor avançado não é gravável.';
156
+
157
+ -- ═══ 4 · Elegibilidade fiscal — default deny em três camadas ════════════════
158
+ --
159
+ -- O achado que motiva isto: hoje NADA no produto distingue "cliente que existe"
160
+ -- de "cliente que pode entrar em automação fiscal". Um job futuro que
161
+ -- selecionasse por `deleted_at IS NULL` alcançaria, no tenant da SC, dois
162
+ -- cadastros que foram criados em teste — e alcançaria a carteira real inteira
163
+ -- no dia seguinte a uma importação.
164
+ --
165
+ -- É a mesma lição da 0047 (liberação do destinatário), aplicada a documento
166
+ -- fiscal em vez de e-mail: a ausência tem de ser a barreira. Um default "entra
167
+ -- quem ninguém proibiu" transforma omissão em autorização — e omissão é o
168
+ -- estado natural de todo cliente que acabou de entrar.
169
+ --
170
+ -- Três camadas, porque três coisas diferentes podem estar erradas:
171
+ -- tenant → o ESCRITÓRIO ligou automação fiscal? em qual ambiente?
172
+ -- cliente → ESTE cliente foi inscrito, para ESTE tipo de documento?
173
+ -- credencial → existe insumo para operar em nome dele? verificado?
174
+ --
175
+ -- E uma quarta, que não é tabela: o estado de operação real
176
+ -- (`tenant_pilot_milestone.real_pilot_start`, 0047). Ambiente `production`
177
+ -- exige o marco declarado; `synthetic` não — é o que mantém desenvolvimento e
178
+ -- homologação possíveis sem abrir a porta da carteira real.
179
+
180
+ -- ── 4.1 · O escritório liga a automação, e declara em qual ambiente ────────
181
+ --
182
+ -- Ausência de linha = `disabled`. Não existe valor que signifique "herda".
183
+ --
184
+ -- `mode` é ambiente E chave ao mesmo tempo, de propósito: separá-los criaria o
185
+ -- estado `enabled=true, environment=null`, que alguém teria de interpretar — e
186
+ -- interpretação é onde documento de homologação vira documento real.
187
+ CREATE TABLE IF NOT EXISTS tenant_fiscal_automation (
188
+ tenant_id uuid PRIMARY KEY REFERENCES tenant(id),
189
+ mode text NOT NULL DEFAULT 'disabled'
190
+ CHECK (mode IN ('disabled', 'synthetic', 'production')),
191
+ enabled_at timestamptz,
192
+ enabled_by uuid REFERENCES "user"(id),
193
+ note text,
194
+ updated_at timestamptz NOT NULL DEFAULT now(),
195
+ -- Ligar exige autor e data: "quem ligou isto?" é a única pergunta que a
196
+ -- linha existe para responder, e ela não pode ficar sem resposta.
197
+ CONSTRAINT tenant_fiscal_automation_enable_coherent
198
+ CHECK (mode = 'disabled' OR (enabled_at IS NOT NULL AND enabled_by IS NOT NULL))
199
+ );
200
+
201
+ ALTER TABLE tenant_fiscal_automation ENABLE ROW LEVEL SECURITY;
202
+ ALTER TABLE tenant_fiscal_automation FORCE ROW LEVEL SECURITY;
203
+ CREATE POLICY tenant_fiscal_automation_tenant_isolation ON tenant_fiscal_automation
204
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
205
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
206
+
207
+ COMMENT ON TABLE tenant_fiscal_automation IS
208
+ 'Ausência de linha = automação fiscal desligada. Nenhuma migration liga escritório nenhum; ligar é ato humano com autor e data.';
209
+
210
+ -- ── 4.2 · A inscrição do cliente, por tipo de documento ────────────────────
211
+ --
212
+ -- Por TIPO, e não um booleano no cliente: um escritório pode acompanhar a NFS-e
213
+ -- de um cliente sem tocar na NF-e dele, e o inverso. Um booleano forçaria tudo
214
+ -- ou nada, e "tudo" é sempre a escolha errada quando o insumo é documento
215
+ -- fiscal de terceiro.
216
+ --
217
+ -- Revogação é lógica e mantém o histórico: quem esteve inscrito e saiu é um
218
+ -- fato que a trilha precisa preservar.
219
+ CREATE TABLE IF NOT EXISTS client_fiscal_enrollment (
220
+ id uuid PRIMARY KEY,
221
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
222
+ client_id uuid NOT NULL,
223
+ document_type text NOT NULL CHECK (document_type IN ('nfe', 'nfse', 'cte', 'nfce')),
224
+ enrolled_at timestamptz NOT NULL DEFAULT now(),
225
+ enrolled_by uuid REFERENCES "user"(id),
226
+ revoked_at timestamptz,
227
+ revoked_by uuid REFERENCES "user"(id),
228
+ note text,
229
+ CONSTRAINT client_fiscal_enrollment_tenant_id_uq UNIQUE (tenant_id, id),
230
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
231
+ CONSTRAINT client_fiscal_enrollment_revoke_coherent
232
+ CHECK ((revoked_at IS NULL) = (revoked_by IS NULL))
233
+ );
234
+
235
+ -- Uma inscrição VIVA por (cliente, tipo). Revogadas coexistem: são histórico.
236
+ CREATE UNIQUE INDEX IF NOT EXISTS client_fiscal_enrollment_live_uq
237
+ ON client_fiscal_enrollment (tenant_id, client_id, document_type)
238
+ WHERE revoked_at IS NULL;
239
+
240
+ ALTER TABLE client_fiscal_enrollment ENABLE ROW LEVEL SECURITY;
241
+ ALTER TABLE client_fiscal_enrollment FORCE ROW LEVEL SECURITY;
242
+ CREATE POLICY client_fiscal_enrollment_tenant_isolation ON client_fiscal_enrollment
243
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
244
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
245
+
246
+ -- ── 4.3 · Prontidão da credencial ──────────────────────────────────────────
247
+ --
248
+ -- Esta fase NÃO exige certificado A1. Ela define o conceito e o lugar.
249
+ --
250
+ -- O estado `no_credential` não está no CHECK de propósito: ele é a AUSÊNCIA de
251
+ -- linha, como em `client.communication_cleared_at`. Um enum com `no_credential`
252
+ -- permitiria a linha existir dizendo "não tem" — e daí alguém a criaria por
253
+ -- conveniência, e "não tem" viraria um estado configurável em vez do estado
254
+ -- natural de todo cliente.
255
+ --
256
+ -- `secret_ref` é referência do cofre (`vault://<nome>`), nunca o segredo. O
257
+ -- certificado é do CLIENTE, não do escritório e nem nosso: o que guardamos é
258
+ -- para onde apontar.
259
+ CREATE TABLE IF NOT EXISTS client_fiscal_credential (
260
+ id uuid PRIMARY KEY,
261
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
262
+ client_id uuid NOT NULL,
263
+ kind text NOT NULL CHECK (kind IN ('certificate_a1', 'municipal_portal')),
264
+ status text NOT NULL
265
+ CHECK (status IN ('configured_not_verified', 'verified', 'expired', 'revoked')),
266
+ secret_ref text,
267
+ verified_at timestamptz,
268
+ expires_on date,
269
+ updated_at timestamptz NOT NULL DEFAULT now(),
270
+ CONSTRAINT client_fiscal_credential_tenant_id_uq UNIQUE (tenant_id, id),
271
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
272
+ -- `verified` sem data de verificação é uma afirmação sem prova.
273
+ CONSTRAINT client_fiscal_credential_verified_coherent
274
+ CHECK (status <> 'verified' OR verified_at IS NOT NULL),
275
+ -- Referência do cofre, jamais material. Um `-----BEGIN` aqui é acidente
276
+ -- grave; o banco recusa antes de virar um vazamento em backup.
277
+ CONSTRAINT client_fiscal_credential_ref_is_reference
278
+ CHECK (secret_ref IS NULL OR secret_ref ~ '^vault://[A-Za-z0-9_.:-]+$')
279
+ );
280
+
281
+ CREATE UNIQUE INDEX IF NOT EXISTS client_fiscal_credential_uq
282
+ ON client_fiscal_credential (tenant_id, client_id, kind);
283
+
284
+ ALTER TABLE client_fiscal_credential ENABLE ROW LEVEL SECURITY;
285
+ ALTER TABLE client_fiscal_credential FORCE ROW LEVEL SECURITY;
286
+ CREATE POLICY client_fiscal_credential_tenant_isolation ON client_fiscal_credential
287
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
288
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
289
+
290
+ COMMENT ON COLUMN client_fiscal_credential.secret_ref IS
291
+ 'Referência do cofre (vault://…). NUNCA o certificado nem a senha dele — o material é do cliente e não passa por aqui.';
292
+
293
+ -- ── 5 · Nenhum cliente existente nasce elegível ────────────────────────────
294
+ --
295
+ -- Não há UPDATE, INSERT ou backfill nesta migration que torne alguém elegível.
296
+ -- É a afirmação central do gate e ela é verificável: as três tabelas acima
297
+ -- nascem VAZIAS, e vazio significa negado nas três camadas.
298
+ --
299
+ -- Vale para os 13 registros da SC e para os tenants sintéticos de certificação
300
+ -- pelo mesmo motivo — nenhum deles é mencionado, então nenhum deles é ligado.
@@ -0,0 +1,337 @@
1
+ -- 0056 — o documento fiscal como registro canônico, e o cursor que o busca.
2
+ --
3
+ -- ═══ O problema operacional, na frase de quem o tem ════════════════════════
4
+ --
5
+ -- A proprietária da SC precisa chegar mais cedo ou sair mais tarde para "fazer
6
+ -- baixa de nota fiscal de cliente". Essa expressão não descreve UMA rotina: ela
7
+ -- cobre buscar NFS-e emitidas no portal do município, buscar NF-e destinadas ao
8
+ -- cliente no ambiente nacional, salvar XML, conferir contra o que o cliente
9
+ -- mandou, e classificar por competência. Fluxos diferentes, sistemas
10
+ -- diferentes, e só o último é trabalho de contador.
11
+ --
12
+ -- Esta migration cria onde o resultado dessa busca cabe — e nada além disso.
13
+ -- Capturar documento NÃO é escriturar: apuração, obrigação e fechamento
14
+ -- continuam em outros domínios, e é deliberado que esta tabela não os toque.
15
+ --
16
+ -- ═══ Por que um modelo só para NF-e, NFS-e e CT-e ══════════════════════════
17
+ --
18
+ -- A pesquisa oficial desta onda mediu que os três compartilham a MESMA forma de
19
+ -- distribuição:
20
+ --
21
+ -- NF-e NT 2014.002 v1.02c (ago/2020) — WS `NFeDistribuicaoDFe`,
22
+ -- `distNSU`/`consNSU`/`consChNFe`, lote de até 50, `ultNSU`/`maxNSU`,
23
+ -- `docZip` gZip+base64.
24
+ -- CT-e NT 2015.002 — WS `CTeDistribuicaoDFe`, `distNSU`/`consNSU`,
25
+ -- `ultNSU`/`maxNSU`, `docZip`. Mesma semântica, outro documento.
26
+ -- NFS-e Manual dos Contribuintes do ADN v1.0 (12/02/2026) —
27
+ -- `GET /DFe/{NSU}` e `GET /NFSe/{ChaveAcesso}/Eventos`. REST em vez de
28
+ -- SOAP, e o MESMO conceito de NSU.
29
+ --
30
+ -- Um cursor NSU sobre um ator identificado por documento serve aos três. Modelar
31
+ -- só NFS-e agora criaria retrabalho garantido, e modelar cada um em tabela
32
+ -- própria triplicaria dedupe, cursor e trilha. Um registro canônico com
33
+ -- `document_type`, e o específico no payload normalizado.
34
+
35
+ -- ── 1 · O documento fiscal ─────────────────────────────────────────────────
36
+ --
37
+ -- RAW e NORMALIZED coexistem, e nenhum dos dois é derivável do outro em
38
+ -- produção: o XML original é o que tem valor probatório e o que a Receita
39
+ -- reconhece; o normalizado é o que a tela lê sem reparsear XML a cada render.
40
+ -- Normalizar NUNCA destrói o original — `raw_blob_id` aponta para `blob`, que
41
+ -- já carrega sha256, tamanho e chave de storage particionada por
42
+ -- {tenant}/{client}/{yyyy}/{mm}.
43
+ --
44
+ -- `normalized` é jsonb e não colunas por campo. Isso não é preguiça de
45
+ -- modelagem: a reforma tributária acrescenta IBS e CBS aos leiautes, e um
46
+ -- schema rígido demais hoje descartaria em silêncio campos que ainda não
47
+ -- existem. O que é consultado vira coluna; o resto sobrevive no jsonb e no XML.
48
+ CREATE TABLE IF NOT EXISTS fiscal_document (
49
+ id uuid PRIMARY KEY,
50
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
51
+ client_id uuid NOT NULL,
52
+
53
+ document_type text NOT NULL CHECK (document_type IN ('nfse', 'nfe', 'cte', 'nfce')),
54
+ -- `received` é o caso que a NT 2014.002 privilegia: "Documentos emitidos pela
55
+ -- própria empresa NÃO estarão disponíveis para consulta" no DF-e da NF-e. Já
56
+ -- o ADN da NFS-e devolve documentos em que o contribuinte é emitente,
57
+ -- tomador OU intermediário. A coluna existe porque a resposta é diferente por
58
+ -- documento, e tratar tudo como "nota do cliente" perderia a distinção que
59
+ -- decide o que se faz com ela.
60
+ direction text NOT NULL CHECK (direction IN ('issued', 'received', 'intermediary')),
61
+
62
+ source text NOT NULL,
63
+ -- Sem fallback entre ambientes, nos dois sentidos (Gate B0 §4). Documento de
64
+ -- homologação nunca vira documento real por omissão de coluna.
65
+ source_environment text NOT NULL
66
+ CHECK (source_environment IN ('synthetic', 'homologation', 'production')),
67
+ -- Posição do cursor que entregou este documento. Texto e não bigint: o NSU da
68
+ -- NT 2014.002 tem até 15 dígitos e o do ADN não promete ser numérico.
69
+ source_nsu text,
70
+
71
+ access_key text,
72
+ document_number text,
73
+ series text,
74
+ issuer_document text,
75
+ issuer_name text,
76
+ recipient_document text,
77
+ recipient_name text,
78
+ issued_at timestamptz,
79
+ -- Competência CONTÁBIL, separada da emissão de propósito: nota emitida em
80
+ -- 02/10 pode pertencer à competência 2026-09, e assumir que as duas são a
81
+ -- mesma coisa é como o fechamento mensal sai errado.
82
+ competence_label text CHECK (competence_label IS NULL OR competence_label ~ '^\d{4}-\d{2}$'),
83
+ gross_amount numeric(14,2),
84
+ currency text NOT NULL DEFAULT 'BRL',
85
+
86
+ -- Cancelada não é apagada. A nota existiu, foi contabilizada por alguém, e
87
+ -- some do painel só se alguém decidir escondê-la — nunca por efeito colateral
88
+ -- de um evento.
89
+ status text NOT NULL DEFAULT 'active'
90
+ CHECK (status IN ('active', 'cancelled', 'replaced', 'denied')),
91
+ -- `summary` é o `resNFe`: o que o ambiente nacional entrega ao destinatário
92
+ -- ANTES da manifestação. `full` é o `procNFe`. A distinção é do leiaute, não
93
+ -- nossa, e o produto precisa dizer qual tem — um resumo apresentado como
94
+ -- documento completo é uma mentira sobre o que o escritório possui.
95
+ content_kind text NOT NULL DEFAULT 'summary' CHECK (content_kind IN ('summary', 'full')),
96
+
97
+ raw_blob_id uuid,
98
+ raw_sha256 text CHECK (raw_sha256 IS NULL OR raw_sha256 ~ '^[a-f0-9]{64}$'),
99
+ normalized jsonb NOT NULL DEFAULT '{}'::jsonb,
100
+
101
+ -- Identidade de deduplicação. Calculada pelo adapter conforme o tipo: chave de
102
+ -- acesso quando existe, senão o par (fonte, identificador do provedor), senão
103
+ -- o hash do conteúdo. Nunca o NSU sozinho — o mesmo documento pode reaparecer
104
+ -- sob outro NSU num replay, e é exatamente esse o caso que a dedupe existe
105
+ -- para absorver.
106
+ dedupe_key text NOT NULL,
107
+
108
+ ingested_at timestamptz NOT NULL DEFAULT now(),
109
+ updated_at timestamptz NOT NULL DEFAULT now(),
110
+
111
+ CONSTRAINT fiscal_document_tenant_id_uq UNIQUE (tenant_id, id),
112
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
113
+ FOREIGN KEY (tenant_id, raw_blob_id) REFERENCES blob (tenant_id, id),
114
+ -- Um documento marcado `full` sem original guardado é uma afirmação sem
115
+ -- lastro. `summary` pode não ter blob: o resumo cabe no normalizado.
116
+ CONSTRAINT fiscal_document_full_has_raw
117
+ CHECK (content_kind <> 'full' OR raw_blob_id IS NOT NULL)
118
+ );
119
+
120
+ -- A dedupe é por (tenant, cliente, chave). Cliente entra porque a MESMA nota
121
+ -- pode ser destinada a um cliente e emitida por outro dentro do mesmo
122
+ -- escritório — são dois fatos contábeis distintos sobre o mesmo XML.
123
+ CREATE UNIQUE INDEX IF NOT EXISTS fiscal_document_dedupe_uq
124
+ ON fiscal_document (tenant_id, client_id, dedupe_key);
125
+
126
+ CREATE INDEX IF NOT EXISTS fiscal_document_client_idx
127
+ ON fiscal_document (tenant_id, client_id, issued_at DESC);
128
+ CREATE INDEX IF NOT EXISTS fiscal_document_competence_idx
129
+ ON fiscal_document (tenant_id, competence_label, document_type);
130
+
131
+ ALTER TABLE fiscal_document ENABLE ROW LEVEL SECURITY;
132
+ ALTER TABLE fiscal_document FORCE ROW LEVEL SECURITY;
133
+ -- Duas fronteiras, não uma. O ramo aberto de `app.current_client` é o mesmo
134
+ -- padrão das demais tabelas client-scoped: staff vê o escritório inteiro, o
135
+ -- portal vê só o próprio cliente.
136
+ CREATE POLICY fiscal_document_tenant_isolation ON fiscal_document
137
+ USING (
138
+ tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
139
+ AND (
140
+ NULLIF(current_setting('app.current_client', true), '') IS NULL
141
+ OR client_id = NULLIF(current_setting('app.current_client', true), '')::uuid
142
+ )
143
+ )
144
+ WITH CHECK (
145
+ tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
146
+ AND (
147
+ NULLIF(current_setting('app.current_client', true), '') IS NULL
148
+ OR client_id = NULLIF(current_setting('app.current_client', true), '')::uuid
149
+ )
150
+ );
151
+
152
+ COMMENT ON COLUMN fiscal_document.competence_label IS
153
+ 'Competência CONTÁBIL (YYYY-MM), separada de issued_at: emissão e competência divergem, e assumir que são a mesma coisa erra o fechamento.';
154
+ COMMENT ON COLUMN fiscal_document.content_kind IS
155
+ 'summary = resNFe (o que o ambiente nacional entrega antes da manifestação); full = procNFe. Apresentar resumo como documento completo é mentir sobre o que o escritório possui.';
156
+
157
+ -- ── 2 · Eventos do documento ───────────────────────────────────────────────
158
+ --
159
+ -- Cancelamento, substituição e correção são EVENTOS, e o documento continua
160
+ -- existindo. A NT 2014.002 é explícita: o cancelamento é entregue mesmo sem
161
+ -- manifestação do destinatário, justamente porque ele muda o que a nota
162
+ -- significa sem apagá-la.
163
+ CREATE TABLE IF NOT EXISTS fiscal_document_event (
164
+ id uuid PRIMARY KEY,
165
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
166
+ fiscal_document_id uuid NOT NULL,
167
+ event_type text NOT NULL
168
+ CHECK (event_type IN ('cancellation', 'replacement', 'correction',
169
+ 'manifestation', 'other')),
170
+ event_code text,
171
+ occurred_at timestamptz,
172
+ source_nsu text,
173
+ raw_blob_id uuid,
174
+ payload jsonb NOT NULL DEFAULT '{}'::jsonb,
175
+ dedupe_key text NOT NULL,
176
+ ingested_at timestamptz NOT NULL DEFAULT now(),
177
+ CONSTRAINT fiscal_document_event_tenant_id_uq UNIQUE (tenant_id, id),
178
+ FOREIGN KEY (tenant_id, fiscal_document_id) REFERENCES fiscal_document (tenant_id, id),
179
+ FOREIGN KEY (tenant_id, raw_blob_id) REFERENCES blob (tenant_id, id)
180
+ );
181
+
182
+ CREATE UNIQUE INDEX IF NOT EXISTS fiscal_document_event_dedupe_uq
183
+ ON fiscal_document_event (tenant_id, fiscal_document_id, dedupe_key);
184
+
185
+ ALTER TABLE fiscal_document_event ENABLE ROW LEVEL SECURITY;
186
+ ALTER TABLE fiscal_document_event FORCE ROW LEVEL SECURITY;
187
+ CREATE POLICY fiscal_document_event_tenant_isolation ON fiscal_document_event
188
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
189
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
190
+
191
+ -- ── 3 · O cursor de sincronização ──────────────────────────────────────────
192
+ --
193
+ -- Por (tenant, cliente, fonte, ambiente), e não por job: o NSU do ambiente
194
+ -- nacional é POR CNPJ consultado. O `job_cursor` do Gate B0 é por tenant e não
195
+ -- tem essa granularidade — reaproveitá-lo colapsaria a posição de todos os
196
+ -- clientes numa só e o primeiro cliente sincronizado apagaria a posição dos
197
+ -- outros.
198
+ --
199
+ -- ═══ `next_attempt_after` é a defesa contra o cStat 656 ════════════════════
200
+ --
201
+ -- A NT 2014.002 §3.5 é explícita: "A empresa deverá aguardar um tempo mínimo de
202
+ -- UMA HORA para efetuar uma nova solicitação de distribuição caso receba a
203
+ -- indicação que não existem mais documentos" (`ultNSU` == `maxNSU`, cStat 137).
204
+ -- Consultar antes disso é "consumo indevido" e o ambiente nacional rejeita com
205
+ -- **cStat 656**, bloqueando o CNPJ.
206
+ --
207
+ -- E o CNPJ bloqueado é o DO CLIENTE, não o nosso. Um laço mal escrito aqui
208
+ -- produz dano num terceiro que não pediu nada — por isso a espera é uma coluna
209
+ -- do banco e não um `sleep` no processo. Processo morre; linha não.
210
+ CREATE TABLE IF NOT EXISTS fiscal_sync_cursor (
211
+ id uuid PRIMARY KEY,
212
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
213
+ client_id uuid NOT NULL,
214
+ source text NOT NULL,
215
+ environment text NOT NULL
216
+ CHECK (environment IN ('synthetic', 'homologation', 'production')),
217
+ -- Última posição CONFIRMADAMENTE persistida. Nunca adiantada antes do commit
218
+ -- dos documentos daquele lote.
219
+ last_nsu text,
220
+ -- Maior NSU que o provedor declarou existir. `last_nsu = max_nsu` é a
221
+ -- condição que arma a espera de uma hora.
222
+ max_nsu text,
223
+ last_success_at timestamptz,
224
+ -- Antes deste instante, nenhuma requisição sai. É o que impede o 656.
225
+ next_attempt_after timestamptz,
226
+ consecutive_failures int NOT NULL DEFAULT 0 CHECK (consecutive_failures >= 0),
227
+ last_error_class text,
228
+ contract_version int NOT NULL DEFAULT 1,
229
+ created_at timestamptz NOT NULL DEFAULT now(),
230
+ updated_at timestamptz NOT NULL DEFAULT now(),
231
+ CONSTRAINT fiscal_sync_cursor_tenant_id_uq UNIQUE (tenant_id, id),
232
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id)
233
+ );
234
+
235
+ CREATE UNIQUE INDEX IF NOT EXISTS fiscal_sync_cursor_uq
236
+ ON fiscal_sync_cursor (tenant_id, client_id, source, environment);
237
+
238
+ ALTER TABLE fiscal_sync_cursor ENABLE ROW LEVEL SECURITY;
239
+ ALTER TABLE fiscal_sync_cursor FORCE ROW LEVEL SECURITY;
240
+ CREATE POLICY fiscal_sync_cursor_tenant_isolation ON fiscal_sync_cursor
241
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
242
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
243
+
244
+ COMMENT ON COLUMN fiscal_sync_cursor.next_attempt_after IS
245
+ 'Defesa contra o cStat 656 da NT 2014.002: uma hora de espera depois de cStat 137. O CNPJ que o 656 bloqueia é o do CLIENTE — por isso a espera é linha de banco, não sleep de processo.';
246
+
247
+ -- ── 4 · A trilha do lote ───────────────────────────────────────────────────
248
+ --
249
+ -- `job_run` (Gate B0) responde "o worker pôde rodar?". Esta responde "o que a
250
+ -- busca trouxe?" — são perguntas diferentes e uma não substitui a outra.
251
+ --
252
+ -- Sem XML e sem PII: contadores, classe de erro e as duas pontas do cursor.
253
+ CREATE TABLE IF NOT EXISTS fiscal_sync_run (
254
+ id uuid PRIMARY KEY,
255
+ tenant_id uuid NOT NULL REFERENCES tenant(id),
256
+ client_id uuid NOT NULL,
257
+ source text NOT NULL,
258
+ environment text NOT NULL
259
+ CHECK (environment IN ('synthetic', 'homologation', 'production')),
260
+ outcome text NOT NULL
261
+ CHECK (outcome IN ('completed', 'no_documents', 'throttled',
262
+ 'blocked_eligibility', 'blocked_credential',
263
+ 'blocked_contract', 'provider_error', 'failed')),
264
+ documents_fetched int NOT NULL DEFAULT 0 CHECK (documents_fetched >= 0),
265
+ documents_new int NOT NULL DEFAULT 0 CHECK (documents_new >= 0),
266
+ documents_duplicate int NOT NULL DEFAULT 0 CHECK (documents_duplicate >= 0),
267
+ documents_failed int NOT NULL DEFAULT 0 CHECK (documents_failed >= 0),
268
+ cursor_before text,
269
+ cursor_after text,
270
+ error_class text,
271
+ detail text,
272
+ started_at timestamptz NOT NULL DEFAULT now(),
273
+ finished_at timestamptz,
274
+ duration_ms int,
275
+ CONSTRAINT fiscal_sync_run_tenant_id_uq UNIQUE (tenant_id, id),
276
+ FOREIGN KEY (tenant_id, client_id) REFERENCES client (tenant_id, id),
277
+ -- A mesma invariante do `job_run`, aplicada ao dado: um lote bloqueado não
278
+ -- trouxe documento e não moveu cursor. O banco recusa a linha incoerente em
279
+ -- vez de confiar na ordem das operações do TypeScript.
280
+ CONSTRAINT fiscal_sync_run_blocked_is_inert
281
+ CHECK (outcome NOT IN ('blocked_eligibility', 'blocked_credential', 'blocked_contract', 'throttled')
282
+ OR (documents_fetched = 0 AND documents_new = 0 AND cursor_after IS NOT DISTINCT FROM cursor_before))
283
+ );
284
+
285
+ CREATE INDEX IF NOT EXISTS fiscal_sync_run_idx
286
+ ON fiscal_sync_run (tenant_id, client_id, started_at DESC);
287
+
288
+ ALTER TABLE fiscal_sync_run ENABLE ROW LEVEL SECURITY;
289
+ ALTER TABLE fiscal_sync_run FORCE ROW LEVEL SECURITY;
290
+ CREATE POLICY fiscal_sync_run_tenant_isolation ON fiscal_sync_run
291
+ USING (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid)
292
+ WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant', true), '')::uuid);
293
+
294
+ -- ── 5 · A capacidade que o worker fiscal vai exigir ────────────────────────
295
+ --
296
+ -- Declarada AQUI, na mesma migration que cria o schema que a sustenta — é a
297
+ -- regra expand → declare → deploy → contract do doc 142. Antes disso o worker
298
+ -- fica INCOMPATIBLE e não escreve; depois passa sozinho.
299
+ INSERT INTO platform_capability (key, label, contract_version, declared_by_migration) VALUES
300
+ ('office.fiscal-ingestion.v1',
301
+ 'Ingestão de documentos fiscais: registro canônico, eventos, cursor e trilha', 1, '0056')
302
+ ON CONFLICT (key) DO NOTHING;
303
+
304
+ -- ── 6 · O terceiro ambiente ────────────────────────────────────────────────
305
+ --
306
+ -- A 0055 modelou dois: `synthetic` e `production`. A pesquisa desta onda mostrou
307
+ -- que faltava um, e que ele é o mais importante do meio do caminho: a
308
+ -- **produção restrita** do ADN (`adn.producaorestrita.nfse.gov.br`) e a
309
+ -- homologação da SEFAZ não são nem laboratório nem produção. São ambientes
310
+ -- OFICIAIS, que respondem como o real, com documento que não vale nada.
311
+ --
312
+ -- Sem essa distinção, ligar homologação exigiria declarar o escritório em
313
+ -- `production` — e aí um adapter apontado para produção de verdade passaria a
314
+ -- elegibilidade que alguém abriu para ensaiar. É o fallback silencioso que o
315
+ -- Gate B0 proibiu, entrando pela porta do vocabulário.
316
+ ALTER TABLE tenant_fiscal_automation DROP CONSTRAINT IF EXISTS tenant_fiscal_automation_mode_check;
317
+ ALTER TABLE tenant_fiscal_automation ADD CONSTRAINT tenant_fiscal_automation_mode_check
318
+ CHECK (mode IN ('disabled', 'synthetic', 'homologation', 'production'));
319
+
320
+ COMMENT ON COLUMN tenant_fiscal_automation.mode IS
321
+ 'disabled (ausência de linha também) | synthetic (fixture) | homologation (ambiente OFICIAL de teste, documento sem valor) | production. Sem fallback entre eles, em nenhuma direção.';
322
+
323
+ -- ── 6 · Retirada de `client_fiscal_credential` ─────────────────────────────
324
+ --
325
+ -- Criada ontem, na 0055, e é invenção: o domínio de certificado já existe em
326
+ -- `digital_certificate` (vertical contábil, migration 1002), COM consumidores
327
+ -- vivos — a rota de compliance e o painel do piloto. Duas tabelas para o mesmo
328
+ -- fato dariam duas respostas para "este cliente tem certificado?", e elas
329
+ -- divergiriam na primeira vez que alguém atualizasse só uma.
330
+ --
331
+ -- A remoção é segura e foi medida antes: em produção a tabela tem
332
+ -- `n_tup_ins = 0` — nenhuma inserção desde a criação, não apenas nenhuma linha
333
+ -- viva. Nada é perdido porque nada foi escrito.
334
+ --
335
+ -- A prontidão passa a sair de `digital_certificate`, que ganha o que lhe
336
+ -- faltava para responder à pergunta (ver a migration 1004 da vertical).
337
+ DROP TABLE IF EXISTS client_fiscal_credential;