@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,704 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ingestFiscalDocuments = ingestFiscalDocuments;
4
+ exports.reingestPreservedItem = reingestPreservedItem;
5
+ exports.reconcileFiscalPendingEvents = reconcileFiscalPendingEvents;
6
+ const shared_1 = require("@baruk/shared");
7
+ const checksum_js_1 = require("../../storage/checksum.js");
8
+ const key_js_1 = require("../../storage/key.js");
9
+ const audit_js_1 = require("../../audit/audit.js");
10
+ const eligibility_js_1 = require("../eligibility.js");
11
+ const direction_js_1 = require("./direction.js");
12
+ const provider_js_1 = require("./provider.js");
13
+ /**
14
+ * `synthetic` no motor de elegibilidade e no ambiente do adapter são o mesmo
15
+ * eixo, então a conversão é identidade — declarada explicitamente para que uma
16
+ * divergência futura entre os dois vocabulários quebre a compilação em vez de
17
+ * abrir um fallback silencioso.
18
+ */
19
+ const ENVIRONMENT_MAP = {
20
+ synthetic: 'synthetic',
21
+ homologation: 'homologation',
22
+ production: 'production',
23
+ };
24
+ async function ingestFiscalDocuments(tx, deps, request) {
25
+ const now = request.now ?? new Date();
26
+ const env = ENVIRONMENT_MAP[request.environment];
27
+ const { adapter } = deps;
28
+ const blocked = (outcome, detail, errorClass = null, cursorBefore = null) => ({
29
+ outcome,
30
+ documentsFetched: 0,
31
+ documentsNew: 0,
32
+ documentsDuplicate: 0,
33
+ documentsFailed: 0,
34
+ eventsPending: 0,
35
+ eventsReconciled: 0,
36
+ eventsApplied: 0,
37
+ cursorBefore,
38
+ cursorAfter: cursorBefore,
39
+ allItemsPreserved: true,
40
+ errorClass,
41
+ detail,
42
+ documentIds: [],
43
+ });
44
+ // ── 1 · O adapter sabe operar neste ambiente? ────────────────────────────
45
+ if (!adapter.environments.includes(env)) {
46
+ // Não é erro de configuração do escritório: é um adapter sendo usado onde
47
+ // não se declarou capaz. Fechar aqui impede que um adapter sintético seja
48
+ // apontado para produção por engano de fiação.
49
+ return blocked('blocked_contract', `adapter "${adapter.source}" não opera o ambiente "${env}"`);
50
+ }
51
+ // ── 2 · Elegibilidade e credencial, nesta ordem ──────────────────────────
52
+ const eligibility = await (0, eligibility_js_1.evaluateFiscalEligibility)(tx, {
53
+ clientId: request.clientId,
54
+ documentType: request.documentType,
55
+ environment: request.environment,
56
+ });
57
+ if (!eligibility.eligible) {
58
+ // Credencial é motivo SEPARADO de elegibilidade, mesmo sendo uma das
59
+ // camadas dela: "falta o certificado" e "este escritório não ligou a
60
+ // automação" pedem ações de pessoas diferentes.
61
+ const onlyCredential = eligibility.reasons.length === 1 && eligibility.reasons[0] === 'credential_not_ready';
62
+ return blocked(onlyCredential ? 'blocked_credential' : 'blocked_eligibility', eligibility.detail);
63
+ }
64
+ // ── 3 · Cursor e espera obrigatória ──────────────────────────────────────
65
+ const cursor = await loadCursor(tx, request, adapter.source, env);
66
+ const cursorBefore = cursor?.last_nsu ?? null;
67
+ if (cursor?.next_attempt_after && cursor.next_attempt_after > now) {
68
+ // A espera é do provedor, não nossa. Insistir aqui é o caminho direto para
69
+ // o 656 — e o bloqueio recai sobre o CNPJ do cliente.
70
+ return blocked('throttled', `espera obrigatória do provedor até ${cursor.next_attempt_after.toISOString()}`, 'throttled', cursorBefore);
71
+ }
72
+ // ── 4 · Busca ────────────────────────────────────────────────────────────
73
+ let fetched;
74
+ try {
75
+ fetched = await adapter.fetchBatch({
76
+ actorDocument: request.actorDocument,
77
+ fromNsu: cursorBefore,
78
+ environment: env,
79
+ batchLimit: adapter.batchLimit,
80
+ });
81
+ }
82
+ catch (err) {
83
+ const provider = err instanceof provider_js_1.FiscalProviderError
84
+ ? err
85
+ : new provider_js_1.FiscalProviderError('unknown', 'falha não classificada do provedor');
86
+ await recordFailure(tx, request, adapter.source, env, provider, now, cursorBefore, adapter.contractVersion ?? null);
87
+ return {
88
+ ...blocked('provider_error', describeProviderError(provider), provider.errorClass, cursorBefore),
89
+ outcome: 'provider_error',
90
+ };
91
+ }
92
+ // ── 5 · Persistência, item a item ────────────────────────────────────────
93
+ //
94
+ // Um documento ilegível no meio do lote NÃO derruba o lote — mas também não
95
+ // é descartado: ele vai para a caixa de entrada com os bytes originais, e é
96
+ // ISSO que autoriza o cursor a passar por cima dele. Travar a carteira
97
+ // inteira num único XML malformado seria pior; perdê-lo seria pior ainda.
98
+ let novos = 0;
99
+ let duplicados = 0;
100
+ let falhos = 0;
101
+ let pendentes = 0;
102
+ let aplicados = 0;
103
+ const ids = [];
104
+ let ultimoOk = cursorBefore;
105
+ let todosPreservados = true;
106
+ let primeiraFalhaDeGuarda = null;
107
+ for (const doc of fetched.documents) {
108
+ const disposition = await handleItem(tx, deps, request, adapter, env, doc, now);
109
+ switch (disposition.kind) {
110
+ case 'document_created':
111
+ novos += 1;
112
+ ids.push(disposition.id);
113
+ break;
114
+ case 'document_duplicate':
115
+ duplicados += 1;
116
+ break;
117
+ case 'event_applied':
118
+ aplicados += 1;
119
+ ids.push(disposition.id);
120
+ break;
121
+ case 'event_pending':
122
+ pendentes += 1;
123
+ break;
124
+ case 'event_duplicate':
125
+ duplicados += 1;
126
+ break;
127
+ case 'invalid_preserved':
128
+ falhos += 1;
129
+ break;
130
+ case 'unpreserved':
131
+ falhos += 1;
132
+ break;
133
+ }
134
+ if (disposition.kind === 'unpreserved') {
135
+ // O cursor é marca d'água: nada depois deste item pode ser commitado,
136
+ // mesmo que grave com sucesso. Parar aqui é o que impede o buraco.
137
+ todosPreservados = false;
138
+ primeiraFalhaDeGuarda = disposition.reason;
139
+ break;
140
+ }
141
+ ultimoOk = doc.nsu;
142
+ }
143
+ // ── 6 · Reconciliação: quem estava esperando já tem alvo? ────────────────
144
+ //
145
+ // Depois do lote, e não durante: um evento pode chegar no NSU 100 e o
146
+ // documento no 101, dentro do MESMO lote. Varrer no fim cobre esse caso e
147
+ // também o evento guardado por uma execução anterior — inclusive uma que
148
+ // morreu antes de reconciliar.
149
+ const reconciliados = await reconcileFiscalPendingEvents(tx, deps, request);
150
+ // ── 7 · COMMIT do cursor, por último ─────────────────────────────────────
151
+ //
152
+ // A posição do servidor só é adotada quando TUDO ficou preservado. Adotá-la
153
+ // com um buraco no meio do lote é exatamente como o NSU de um evento sumia.
154
+ const cursorAfter = todosPreservados ? (fetched.lastNsu ?? ultimoOk) : ultimoOk;
155
+ const exhausted = todosPreservados &&
156
+ (fetched.exhausted || (cursorAfter !== null && cursorAfter === fetched.maxNsu));
157
+ const nextAttempt = exhausted
158
+ ? new Date(now.getTime() + adapter.exhaustedBackoffSeconds * 1000)
159
+ : todosPreservados
160
+ ? null
161
+ : // Item não preservável é determinístico: repetir de imediato seria o
162
+ // laço que o cStat 656 pune. Recua como falha transitória.
163
+ new Date(now.getTime() + 300_000);
164
+ await saveCursor(tx, request, adapter.source, env, {
165
+ lastNsu: cursorAfter,
166
+ maxNsu: fetched.maxNsu,
167
+ lastSuccessAt: now,
168
+ nextAttemptAfter: nextAttempt,
169
+ preserved: todosPreservados,
170
+ });
171
+ const outcome = !todosPreservados
172
+ ? 'failed'
173
+ : fetched.documents.length === 0
174
+ ? 'no_documents'
175
+ : 'completed';
176
+ const report = {
177
+ outcome,
178
+ documentsFetched: fetched.documents.length,
179
+ documentsNew: novos,
180
+ documentsDuplicate: duplicados,
181
+ documentsFailed: falhos,
182
+ eventsPending: pendentes,
183
+ eventsReconciled: reconciliados,
184
+ eventsApplied: aplicados,
185
+ cursorBefore,
186
+ cursorAfter,
187
+ allItemsPreserved: todosPreservados,
188
+ errorClass: todosPreservados ? null : 'transient',
189
+ detail: !todosPreservados
190
+ ? `cursor retido: item não pôde ser preservado (${primeiraFalhaDeGuarda ?? 'motivo não classificado'})`
191
+ : exhausted
192
+ ? 'lote concluído; provedor sem mais documentos'
193
+ : 'lote concluído',
194
+ documentIds: ids,
195
+ };
196
+ await recordRun(tx, request, adapter.source, env, report, now, adapter.contractVersion ?? null);
197
+ await (0, audit_js_1.appendAudit)(tx, {
198
+ actorType: 'system',
199
+ actorId: request.actorId ?? null,
200
+ action: 'fiscal.documents.synced',
201
+ resourceType: 'client',
202
+ resourceId: request.clientId,
203
+ // Contadores e cursor. Nunca XML, nunca nome de emitente, nunca valor.
204
+ metadata: {
205
+ source: adapter.source,
206
+ environment: env,
207
+ documentType: request.documentType,
208
+ fetched: report.documentsFetched,
209
+ created: report.documentsNew,
210
+ duplicate: report.documentsDuplicate,
211
+ failed: report.documentsFailed,
212
+ pending: report.eventsPending,
213
+ reconciled: report.eventsReconciled,
214
+ cursorBefore,
215
+ cursorAfter,
216
+ allItemsPreserved: report.allItemsPreserved,
217
+ },
218
+ });
219
+ return report;
220
+ }
221
+ /**
222
+ * Um item do lote, do XML bruto ao desfecho.
223
+ *
224
+ * Toda saída deste caminho é um desfecho NOMEADO. Não há `return` silencioso, e
225
+ * é por isso que o cursor pode confiar no resultado: `unpreserved` é a única
226
+ * forma de o item não ter deixado rastro, e ela para o cursor.
227
+ *
228
+ * ## Por que SAVEPOINT, e não só `try`
229
+ *
230
+ * A ingestão inteira roda numa transação. No PostgreSQL, um comando que falha
231
+ * **aborta a transação**: daí em diante todo comando devolve `25P02`, inclusive
232
+ * o INSERT da quarentena. Sem savepoint, o primeiro XML que violasse uma
233
+ * restrição derrubaria o lote inteiro E impediria a preservação do item que o
234
+ * derrubou — o pior dos dois mundos. Com savepoint, só a tentativa daquele item
235
+ * é desfeita, e o que já foi gravado antes dele permanece.
236
+ */
237
+ async function handleItem(tx, deps, req, adapter, env, doc, now) {
238
+ let parsed = null;
239
+ try {
240
+ parsed = adapter.parse(doc);
241
+ }
242
+ catch (err) {
243
+ return quarantine(tx, req, adapter.source, env, doc, classOf(err), now);
244
+ }
245
+ const interpretado = parsed;
246
+ try {
247
+ return await tx.savepoint((sp) => interpretado.event
248
+ ? persistEvent(sp, deps, req, adapter.source, env, doc, interpretado, now)
249
+ : persistDocument(sp, deps, req, adapter.source, env, doc, interpretado, now));
250
+ }
251
+ catch (err) {
252
+ return quarantine(tx, req, adapter.source, env, doc, classOf(err), now, interpretado);
253
+ }
254
+ }
255
+ /**
256
+ * Reprocessa UM item já preservado — sem tocar no cursor.
257
+ *
258
+ * ## Por que o cursor fica de fora, e por que isso é a garantia
259
+ *
260
+ * O item já está guardado; a posição do provedor já passou por ele há muito
261
+ * tempo. Mexer no cursor aqui só poderia FAZER MAL: retrocedê-lo republicaria
262
+ * lotes inteiros, e adiantá-lo pularia itens que ainda não foram vistos. O
263
+ * reprocessamento é sobre bytes que já temos, e o cursor é sobre bytes que ainda
264
+ * não pedimos — são eixos independentes.
265
+ *
266
+ * ## Idempotência vem do banco, como no caminho normal
267
+ *
268
+ * `persistDocument` e `persistEvent` gravam com `ON CONFLICT DO NOTHING` sobre
269
+ * os índices de deduplicação. Reprocessar dez vezes o mesmo item produz uma
270
+ * linha e nove `duplicate` — sem `SELECT` prévio, logo sem janela entre
271
+ * verificar e inserir.
272
+ */
273
+ async function reingestPreservedItem(tx, deps, request, doc) {
274
+ const now = request.now ?? new Date();
275
+ const env = ENVIRONMENT_MAP[request.environment];
276
+ const disposition = await handleItem(tx, deps, request, deps.adapter, env, doc, now);
277
+ switch (disposition.kind) {
278
+ case 'document_created':
279
+ return { kind: 'document_created', documentId: disposition.id };
280
+ case 'document_duplicate':
281
+ return { kind: 'document_duplicate' };
282
+ case 'event_applied':
283
+ return { kind: 'event_applied', eventId: disposition.id };
284
+ case 'event_pending':
285
+ return { kind: 'event_pending' };
286
+ case 'event_duplicate':
287
+ return { kind: 'event_duplicate' };
288
+ case 'invalid_preserved':
289
+ case 'unpreserved':
290
+ return { kind: 'still_invalid', reason: disposition.reason };
291
+ }
292
+ }
293
+ /** Classe do motivo. Nunca a mensagem do provedor, nunca trecho de XML. */
294
+ function classOf(err) {
295
+ if (err instanceof provider_js_1.FiscalProviderError) {
296
+ return err.providerCode ? `${err.errorClass}:${err.providerCode}` : err.errorClass;
297
+ }
298
+ return 'unhandled';
299
+ }
300
+ /** Mensagem para a trilha: classe e código, jamais a resposta do provedor. */
301
+ function describeProviderError(err) {
302
+ return err.providerCode ? `${err.errorClass} (${err.providerCode})` : err.errorClass;
303
+ }
304
+ async function loadCursor(tx, req, source, env) {
305
+ const rows = await tx `
306
+ SELECT id, last_nsu, max_nsu, next_attempt_after, consecutive_failures
307
+ FROM fiscal_sync_cursor
308
+ WHERE client_id = ${req.clientId} AND source = ${source} AND environment = ${env}
309
+ `;
310
+ return rows[0];
311
+ }
312
+ async function saveCursor(tx, req, source, env, next) {
313
+ // Lote com item não preservado não zera o contador de falhas nem apaga a
314
+ // classe do erro: quem olha a tela precisa ver que algo ficou para trás.
315
+ const errorClass = next.preserved ? null : 'transient';
316
+ await tx `
317
+ INSERT INTO fiscal_sync_cursor (id, tenant_id, client_id, source, environment,
318
+ last_nsu, max_nsu, last_success_at, next_attempt_after,
319
+ consecutive_failures, last_error_class, updated_at)
320
+ VALUES (${(0, shared_1.uuidv7)()}, ${req.tenantId}, ${req.clientId}, ${source}, ${env},
321
+ ${next.lastNsu}, ${next.maxNsu}, ${next.lastSuccessAt}, ${next.nextAttemptAfter},
322
+ ${next.preserved ? 0 : 1}, ${errorClass}, now())
323
+ ON CONFLICT (tenant_id, client_id, source, environment)
324
+ DO UPDATE SET last_nsu = EXCLUDED.last_nsu,
325
+ max_nsu = EXCLUDED.max_nsu,
326
+ last_success_at = EXCLUDED.last_success_at,
327
+ next_attempt_after = EXCLUDED.next_attempt_after,
328
+ consecutive_failures = CASE WHEN ${next.preserved} THEN 0
329
+ ELSE fiscal_sync_cursor.consecutive_failures + 1 END,
330
+ last_error_class = ${errorClass},
331
+ updated_at = now()
332
+ `;
333
+ }
334
+ /**
335
+ * Falha do provedor: conta, classifica e — quando a norma manda — recua.
336
+ *
337
+ * O cursor NÃO anda. `throttled` e `auth` recebem espera; `transient` recebe
338
+ * backoff exponencial com teto, porque insistir a cada minuto contra um serviço
339
+ * paralisado é o comportamento que o 656 existe para punir.
340
+ */
341
+ async function recordFailure(tx, req, source, env, err, now, cursorBefore, contractVersion) {
342
+ const backoff = err.retryAfter ?? computeBackoff(err.errorClass, now);
343
+ await tx `
344
+ INSERT INTO fiscal_sync_cursor (id, tenant_id, client_id, source, environment,
345
+ last_nsu, next_attempt_after, consecutive_failures,
346
+ last_error_class, updated_at)
347
+ VALUES (${(0, shared_1.uuidv7)()}, ${req.tenantId}, ${req.clientId}, ${source}, ${env},
348
+ ${cursorBefore}, ${backoff}, 1, ${err.errorClass}, now())
349
+ ON CONFLICT (tenant_id, client_id, source, environment)
350
+ DO UPDATE SET next_attempt_after = ${backoff},
351
+ consecutive_failures = fiscal_sync_cursor.consecutive_failures + 1,
352
+ last_error_class = ${err.errorClass},
353
+ updated_at = now()
354
+ `;
355
+ await tx `
356
+ INSERT INTO fiscal_sync_run (id, tenant_id, client_id, source, environment, outcome,
357
+ cursor_before, cursor_after, error_class, detail,
358
+ contract_version,
359
+ job_name, job_version, lease_id, retryable, retry_after,
360
+ finished_at)
361
+ VALUES (${(0, shared_1.uuidv7)()}, ${req.tenantId}, ${req.clientId}, ${source}, ${env}, 'provider_error',
362
+ ${cursorBefore}, ${cursorBefore}, ${err.errorClass},
363
+ ${describeProviderError(err)},
364
+ -- A versão do contrato importa MAIS na falha do que no sucesso: um
365
+ -- PROTOCOL_CONTRACT_MISMATCH só é investigável se a linha disser
366
+ -- contra qual contrato a resposta foi conferida.
367
+ ${contractVersion},
368
+ ${req.job?.name ?? null}, ${req.job?.version ?? null}, ${req.job?.leaseId ?? null},
369
+ -- Classes "auth" e "not_allowed" não são retentáveis: só uma pessoa
370
+ -- as resolve, e a trilha precisa dizer isso sem que alguém
371
+ -- reconstrua a decisão a partir da classe do erro.
372
+ ${err.errorClass !== 'auth' && err.errorClass !== 'not_allowed'},
373
+ ${backoff},
374
+ now())
375
+ `;
376
+ }
377
+ /** Espera por classe de erro. `auth` é longo porque só uma pessoa o resolve. */
378
+ function computeBackoff(cls, now) {
379
+ const seconds = cls === 'throttled' ? 3600 : cls === 'auth' ? 3600 : cls === 'not_allowed' ? 3600 : 300;
380
+ return new Date(now.getTime() + seconds * 1000);
381
+ }
382
+ async function recordRun(tx, req, source, env, report, now, contractVersion) {
383
+ // Duração MEDIDA, e não zero fixo. O valor constante que estava aqui fazia a
384
+ // coluna existir sem informar nada — pior do que ausente, porque um painel a
385
+ // apresentaria como "todo lote leva 0ms".
386
+ const durationMs = Math.max(0, Date.now() - now.getTime());
387
+ await tx `
388
+ INSERT INTO fiscal_sync_run (id, tenant_id, client_id, source, environment, outcome,
389
+ documents_fetched, documents_new, documents_duplicate,
390
+ documents_failed, events_pending, events_applied,
391
+ events_reconciled, cursor_before, cursor_after, error_class,
392
+ detail, contract_version, job_name, job_version, lease_id,
393
+ started_at, finished_at, duration_ms)
394
+ VALUES (${(0, shared_1.uuidv7)()}, ${req.tenantId}, ${req.clientId}, ${source}, ${env}, ${report.outcome},
395
+ ${report.documentsFetched}, ${report.documentsNew}, ${report.documentsDuplicate},
396
+ ${report.documentsFailed}, ${report.eventsPending}, ${report.eventsApplied},
397
+ ${report.eventsReconciled}, ${report.cursorBefore}, ${report.cursorAfter},
398
+ ${report.errorClass}, ${report.detail}, ${contractVersion},
399
+ ${req.job?.name ?? null}, ${req.job?.version ?? null}, ${req.job?.leaseId ?? null},
400
+ ${now}, now(), ${durationMs})
401
+ `;
402
+ }
403
+ /**
404
+ * Guarda o XML original e devolve o `blob`.
405
+ *
406
+ * O RAW nunca é reescrito: o que vai para o storage são os bytes que o provedor
407
+ * entregou, e o sha256 é deles. É esse arquivo que tem valor probatório — o
408
+ * normalizado é conveniência de leitura, e não substitui o documento.
409
+ */
410
+ async function persistRaw(tx, deps, req, doc, competenceLabel) {
411
+ const sha256 = (0, checksum_js_1.sha256Hex)(doc.raw);
412
+ if (!deps.storage)
413
+ return null;
414
+ const key = (0, key_js_1.buildStorageKey)({
415
+ tenantId: req.tenantId,
416
+ clientId: req.clientId,
417
+ categoryKey: 'fiscal',
418
+ documentId: sha256.slice(0, 32),
419
+ versionNo: 1,
420
+ competenceLabel: competenceLabel ?? undefined,
421
+ });
422
+ // Mesmo conteúdo já guardado = mesmo blob. O sha256 é a identidade, e
423
+ // reenviar bytes idênticos ao storage é desperdício com risco de divergência.
424
+ const existing = await tx `
425
+ SELECT id FROM blob WHERE checksum_sha256 = ${sha256} LIMIT 1
426
+ `;
427
+ if (existing[0])
428
+ return { blobId: existing[0].id, sha256 };
429
+ await deps.storage.put({ key, body: doc.raw, contentType: doc.mimeType });
430
+ const blobId = (0, shared_1.uuidv7)();
431
+ await tx `
432
+ INSERT INTO blob (id, tenant_id, checksum_sha256, size_bytes, mime_type,
433
+ storage_provider, storage_key, av_status)
434
+ VALUES (${blobId}, ${req.tenantId}, ${sha256}, ${doc.raw.byteLength}, ${doc.mimeType},
435
+ ${deps.storage.key}, ${key}, 'skipped')
436
+ `;
437
+ return { blobId, sha256 };
438
+ }
439
+ async function persistDocument(tx, deps, req, source, env, doc, parsed, _now) {
440
+ const raw = await persistRaw(tx, deps, req, doc, parsed.competenceLabel ?? null);
441
+ if (parsed.contentKind === 'full' && !raw) {
442
+ // Um documento declarado COMPLETO sem o original guardado é uma afirmação
443
+ // sem lastro — o banco recusa a linha, e recusar aqui devolve um motivo
444
+ // legível em vez de uma violação de CHECK contada como "documento ilegível".
445
+ // Sem storage configurado, a ingestão de documento completo não acontece —
446
+ // mas o item ainda vai para a caixa de entrada, e nada se perde.
447
+ throw new provider_js_1.FiscalProviderError('invalid', 'documento completo exige storage configurado para preservar o XML original', 'RAW_STORAGE_REQUIRED');
448
+ }
449
+ // A direção sai do CONFRONTO com o ator consultado, não de um default. Ver
450
+ // `direction.ts`: `issued` fixo trocava receita por despesa no fechamento.
451
+ const veredito = (0, direction_js_1.classifyFiscalDirection)({
452
+ actorDocument: req.actorDocument,
453
+ issuerDocument: parsed.issuerDocument,
454
+ recipientDocument: parsed.recipientDocument,
455
+ intermediaryDocument: parsed.intermediaryDocument,
456
+ });
457
+ const id = (0, shared_1.uuidv7)();
458
+ const normalized = {
459
+ ...parsed.normalized,
460
+ // Como se chegou à direção fica gravado junto: auditar uma classificação
461
+ // não pode exigir reabrir o XML.
462
+ directionBasis: veredito.basis,
463
+ };
464
+ // `ON CONFLICT DO NOTHING` sobre o índice de deduplicação: a idempotência é
465
+ // do BANCO, não de um `SELECT` anterior. Dois workers no mesmo lote não
466
+ // conseguem criar duas notas para o mesmo documento — não há janela entre
467
+ // verificar e inserir porque não há dois momentos.
468
+ const inserted = await tx `
469
+ INSERT INTO fiscal_document (
470
+ id, tenant_id, client_id, document_type, direction, source, source_environment,
471
+ source_nsu, access_key, document_number, series, issuer_document, issuer_name,
472
+ recipient_document, recipient_name, issued_at, competence_label, gross_amount,
473
+ content_kind, raw_blob_id, raw_sha256, normalized, dedupe_key
474
+ ) VALUES (
475
+ ${id}, ${req.tenantId}, ${req.clientId}, ${parsed.documentType}, ${veredito.direction},
476
+ ${source}, ${env}, ${doc.nsu}, ${parsed.accessKey ?? null},
477
+ ${parsed.documentNumber ?? null}, ${parsed.series ?? null},
478
+ ${parsed.issuerDocument ?? null}, ${parsed.issuerName ?? null},
479
+ ${parsed.recipientDocument ?? null}, ${parsed.recipientName ?? null},
480
+ ${parsed.issuedAt ?? null}, ${parsed.competenceLabel ?? null},
481
+ ${parsed.grossAmount ?? null}, ${parsed.contentKind},
482
+ ${raw?.blobId ?? null}, ${raw?.sha256 ?? null},
483
+ ${tx.json(normalized)}, ${parsed.dedupeKey}
484
+ )
485
+ ON CONFLICT (tenant_id, client_id, dedupe_key) DO NOTHING
486
+ RETURNING id
487
+ `;
488
+ return inserted[0]
489
+ ? { kind: 'document_created', id: inserted[0].id }
490
+ : { kind: 'document_duplicate' };
491
+ }
492
+ /**
493
+ * Evento sobre um documento.
494
+ *
495
+ * Cancelar não apaga. A nota permanece, com `status='cancelled'` — ela existiu,
496
+ * alguém a contabilizou, e some do painel só se uma pessoa decidir escondê-la.
497
+ *
498
+ * ## O evento cujo documento ainda não chegou
499
+ *
500
+ * O ambiente nacional ordena a distribuição por RECEPÇÃO, não por emissão, e
501
+ * portanto o evento pode legitimamente vir antes. Ele NÃO é duplicata, não é
502
+ * erro e não pode ser ignorado: é informação fiscal válida ainda não
503
+ * reconciliada. Vai para a caixa de entrada com os bytes originais e sai de lá
504
+ * quando o alvo chegar (`reconcileFiscalPendingEvents`).
505
+ */
506
+ async function persistEvent(tx, deps, req, source, env, doc, parsed, now) {
507
+ const ev = parsed.event;
508
+ // A busca do alvo é por (cliente, chave) — e é essa dupla que impede o evento
509
+ // de um cliente de alcançar o documento homônimo de outro.
510
+ const target = await tx `
511
+ SELECT id FROM fiscal_document
512
+ WHERE client_id = ${req.clientId} AND access_key = ${ev.targetAccessKey}
513
+ LIMIT 1
514
+ `;
515
+ if (!target[0])
516
+ return enqueuePendingEvent(tx, req, source, env, doc, parsed, now);
517
+ const raw = await persistRaw(tx, deps, req, doc, parsed.competenceLabel ?? null);
518
+ const applied = await applyEventToDocument(tx, req.tenantId, {
519
+ documentId: target[0].id,
520
+ eventType: ev.type,
521
+ eventCode: ev.code ?? null,
522
+ occurredAt: ev.occurredAt ?? null,
523
+ sourceNsu: doc.nsu,
524
+ rawBlobId: raw?.blobId ?? null,
525
+ payload: parsed.normalized,
526
+ dedupeKey: parsed.dedupeKey,
527
+ });
528
+ return applied.created
529
+ ? { kind: 'event_applied', id: applied.id }
530
+ : // Duplicata DE VERDADE: o evento já está gravado sobre este documento.
531
+ // É o único caso que merece esse nome.
532
+ { kind: 'event_duplicate' };
533
+ }
534
+ /**
535
+ * Grava o evento no documento e aplica o efeito de estado.
536
+ *
537
+ * Idempotente pelo índice de deduplicação do banco: reprocessar o mesmo evento
538
+ * não cria segunda linha nem reaplica efeito. Quando o `INSERT` não retorna
539
+ * nada, o id é buscado — a linha existe, e quem chama precisa dela para marcar
540
+ * a caixa de entrada como aplicada.
541
+ */
542
+ async function applyEventToDocument(tx, tenantId, input) {
543
+ const id = (0, shared_1.uuidv7)();
544
+ const inserted = await tx `
545
+ INSERT INTO fiscal_document_event (
546
+ id, tenant_id, fiscal_document_id, event_type, event_code, occurred_at,
547
+ source_nsu, raw_blob_id, payload, dedupe_key
548
+ ) VALUES (
549
+ ${id}, ${tenantId}, ${input.documentId}, ${input.eventType}, ${input.eventCode},
550
+ ${input.occurredAt}, ${input.sourceNsu}, ${input.rawBlobId},
551
+ ${tx.json(input.payload)}, ${input.dedupeKey}
552
+ )
553
+ ON CONFLICT (tenant_id, fiscal_document_id, dedupe_key) DO NOTHING
554
+ RETURNING id
555
+ `;
556
+ if (!inserted[0]) {
557
+ const [existing] = await tx `
558
+ SELECT id FROM fiscal_document_event
559
+ WHERE fiscal_document_id = ${input.documentId} AND dedupe_key = ${input.dedupeKey}
560
+ LIMIT 1
561
+ `;
562
+ return { created: false, id: existing.id };
563
+ }
564
+ if (input.eventType === 'cancellation') {
565
+ await tx `UPDATE fiscal_document SET status = 'cancelled', updated_at = now()
566
+ WHERE id = ${input.documentId}`;
567
+ }
568
+ else if (input.eventType === 'replacement') {
569
+ await tx `UPDATE fiscal_document SET status = 'replaced', updated_at = now()
570
+ WHERE id = ${input.documentId}`;
571
+ }
572
+ return { created: true, id: inserted[0].id };
573
+ }
574
+ /**
575
+ * Guarda o evento que ainda não tem alvo.
576
+ *
577
+ * Os BYTES vão inteiros para a linha, e não para o storage. Não é economia: é
578
+ * a única forma de a preservação e o avanço do cursor acontecerem na MESMA
579
+ * transação. Com o RAW num objeto externo existiria a janela entre o `PUT` e o
580
+ * commit — e uma janela nesse ponto é exatamente o defeito que esta correção
581
+ * fecha.
582
+ */
583
+ async function enqueuePendingEvent(tx, req, source, env, doc, parsed, _now) {
584
+ const ev = parsed.event;
585
+ const inserted = await tx `
586
+ INSERT INTO fiscal_ingestion_inbox (
587
+ id, tenant_id, client_id, source, source_environment, source_nsu, state,
588
+ document_type, event_type, event_code, event_sequence, occurred_at,
589
+ target_access_key, raw, raw_sha256, normalized, dedupe_key
590
+ ) VALUES (
591
+ ${(0, shared_1.uuidv7)()}, ${req.tenantId}, ${req.clientId}, ${source}, ${env}, ${doc.nsu},
592
+ 'pending_target', ${parsed.documentType}, ${ev.type}, ${ev.code ?? null},
593
+ ${ev.sequence ?? null}, ${ev.occurredAt ?? null}, ${ev.targetAccessKey},
594
+ ${Buffer.from(doc.raw)}, ${(0, checksum_js_1.sha256Hex)(doc.raw)},
595
+ ${tx.json(parsed.normalized)}, ${parsed.dedupeKey}
596
+ )
597
+ ON CONFLICT (tenant_id, client_id, dedupe_key) DO NOTHING
598
+ RETURNING id
599
+ `;
600
+ // Sem linha nova, o evento JÁ estava guardado (ou já foi aplicado): a
601
+ // deduplicação é do banco, não de memória, e sobrevive a replay e a crash.
602
+ return inserted[0] ? { kind: 'event_pending' } : { kind: 'event_duplicate' };
603
+ }
604
+ /**
605
+ * Guarda o item que não pôde ser interpretado.
606
+ *
607
+ * `invalid` não é "descartado": os bytes ficam, com o NSU e a classe do motivo,
608
+ * e é isso que permite a recuperação pontual (`consNSU`) sem pedir nada ao
609
+ * provedor. Se nem esta gravação for possível, o item é declarado NÃO
610
+ * preservado e o cursor para — a única saída honesta.
611
+ */
612
+ async function quarantine(tx, req, source, env, doc, reason, _now, parsed) {
613
+ const sha = (0, checksum_js_1.sha256Hex)(doc.raw);
614
+ try {
615
+ await tx.savepoint((sp) => sp `
616
+ INSERT INTO fiscal_ingestion_inbox (
617
+ id, tenant_id, client_id, source, source_environment, source_nsu, state,
618
+ document_type, event_type, event_code, event_sequence, occurred_at,
619
+ target_access_key, raw, raw_sha256, normalized, reject_reason, dedupe_key
620
+ ) VALUES (
621
+ ${(0, shared_1.uuidv7)()}, ${req.tenantId}, ${req.clientId}, ${source}, ${env}, ${doc.nsu},
622
+ 'invalid', ${parsed?.documentType ?? null}, ${null}, ${null}, ${null}, ${null},
623
+ ${null}, ${Buffer.from(doc.raw)}, ${sha}, ${tx.json({})},
624
+ ${reason}, ${`raw:${sha}`}
625
+ )
626
+ ON CONFLICT (tenant_id, client_id, dedupe_key) DO NOTHING
627
+ `);
628
+ return { kind: 'invalid_preserved', reason };
629
+ }
630
+ catch {
631
+ return { kind: 'unpreserved', reason };
632
+ }
633
+ }
634
+ /**
635
+ * Aplica os eventos guardados cujo documento-alvo já existe.
636
+ *
637
+ * ## O `JOIN` é a prova de isolamento
638
+ *
639
+ * A junção é por `(tenant_id, client_id, access_key)`. Um evento do Cliente A
640
+ * não alcança o documento do Cliente B mesmo com a MESMA chave de acesso, e
641
+ * nenhum evento atravessa escritórios — antes da RLS, que fecha por cima.
642
+ *
643
+ * ## A ordem importa
644
+ *
645
+ * Dois eventos sobre a mesma nota (cancelamento e depois análise fiscal, por
646
+ * exemplo) mudam o estado final conforme a sequência. Aplicar na ordem de
647
+ * ocorrência, com o NSU e a sequência do leiaute como desempate, é o que faz o
648
+ * resultado da reconciliação ser igual ao de tê-los recebido em ordem.
649
+ *
650
+ * Exportada porque um varredor futuro precisa dela sem repetir a lógica.
651
+ */
652
+ async function reconcileFiscalPendingEvents(tx, _deps, req) {
653
+ const pendentes = await tx `
654
+ SELECT i.id, d.id AS document_id, i.event_type, i.event_code, i.occurred_at,
655
+ i.source_nsu, i.normalized, i.dedupe_key
656
+ FROM fiscal_ingestion_inbox i
657
+ JOIN fiscal_document d
658
+ ON d.tenant_id = i.tenant_id
659
+ AND d.client_id = i.client_id
660
+ AND d.access_key = i.target_access_key
661
+ WHERE i.client_id = ${req.clientId}
662
+ AND i.state = 'pending_target'
663
+ ORDER BY i.occurred_at NULLS LAST,
664
+ CASE WHEN i.source_nsu ~ '^[0-9]+$' THEN i.source_nsu::numeric END NULLS LAST,
665
+ CASE WHEN i.event_sequence ~ '^[0-9]+$' THEN i.event_sequence::numeric END NULLS LAST,
666
+ i.received_at
667
+ `;
668
+ let aplicados = 0;
669
+ for (const p of pendentes) {
670
+ try {
671
+ // Um savepoint por evento: um pendente problemático não pode desfazer a
672
+ // reconciliação dos outros nem abortar o lote que acabou de ser gravado.
673
+ // Ele simplesmente CONTINUA pendente, e a próxima varredura tenta de novo.
674
+ await tx.savepoint(async (sp) => {
675
+ const resultado = await applyEventToDocument(sp, req.tenantId, {
676
+ documentId: p.document_id,
677
+ eventType: p.event_type,
678
+ eventCode: p.event_code,
679
+ occurredAt: p.occurred_at,
680
+ sourceNsu: p.source_nsu,
681
+ // O blob do evento reconciliado fica nulo: os bytes originais
682
+ // continuam na caixa de entrada, que é onde foram preservados.
683
+ // Duplicá-los no storage não acrescentaria garantia nenhuma.
684
+ rawBlobId: null,
685
+ payload: p.normalized,
686
+ dedupeKey: p.dedupe_key,
687
+ });
688
+ // `applied` mesmo quando o evento já existia: o que a caixa registra é
689
+ // que este item saiu da espera, não que ele criou a linha.
690
+ await sp `
691
+ UPDATE fiscal_ingestion_inbox
692
+ SET state = 'applied', applied_at = now(), applied_event_id = ${resultado.id}
693
+ WHERE id = ${p.id}
694
+ `;
695
+ });
696
+ aplicados += 1;
697
+ }
698
+ catch {
699
+ // Segue pendente. Nada é perdido, e a caixa de entrada mostra a idade.
700
+ }
701
+ }
702
+ return aplicados;
703
+ }
704
+ //# sourceMappingURL=pipeline.js.map