@baruk/core 0.4.2 → 0.6.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 (576) hide show
  1. package/.baruk-provenance.json +4 -4
  2. package/CHANGELOG.md +42 -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/service.d.ts +21 -0
  8. package/dist/auth/service.d.ts.map +1 -1
  9. package/dist/auth/service.js +46 -1
  10. package/dist/auth/service.js.map +1 -1
  11. package/dist/billing/ar-repository.d.ts +41 -1
  12. package/dist/billing/ar-repository.d.ts.map +1 -1
  13. package/dist/billing/ar-repository.js +82 -6
  14. package/dist/billing/ar-repository.js.map +1 -1
  15. package/dist/billing/provider-account.d.ts +38 -0
  16. package/dist/billing/provider-account.d.ts.map +1 -1
  17. package/dist/billing/provider-account.js +58 -2
  18. package/dist/billing/provider-account.js.map +1 -1
  19. package/dist/billing/repository.d.ts +44 -0
  20. package/dist/billing/repository.d.ts.map +1 -1
  21. package/dist/billing/repository.js +49 -5
  22. package/dist/billing/repository.js.map +1 -1
  23. package/dist/cjs/audit/repository.js +41 -7
  24. package/dist/cjs/audit/repository.js.map +1 -1
  25. package/dist/cjs/auth/service.js +46 -1
  26. package/dist/cjs/auth/service.js.map +1 -1
  27. package/dist/cjs/billing/ar-repository.js +82 -6
  28. package/dist/cjs/billing/ar-repository.js.map +1 -1
  29. package/dist/cjs/billing/provider-account.js +60 -1
  30. package/dist/cjs/billing/provider-account.js.map +1 -1
  31. package/dist/cjs/billing/repository.js +51 -5
  32. package/dist/cjs/billing/repository.js.map +1 -1
  33. package/dist/cjs/clients/ibge.js +117 -0
  34. package/dist/cjs/clients/ibge.js.map +1 -0
  35. package/dist/cjs/clients/registry/http.js +157 -0
  36. package/dist/cjs/clients/registry/http.js.map +1 -0
  37. package/dist/cjs/clients/registry/ibge-municipios.js +28 -0
  38. package/dist/cjs/clients/registry/ibge-municipios.js.map +1 -0
  39. package/dist/cjs/clients/registry/ibge.js +63 -0
  40. package/dist/cjs/clients/registry/ibge.js.map +1 -0
  41. package/dist/cjs/clients/registry/lookup.js +191 -0
  42. package/dist/cjs/clients/registry/lookup.js.map +1 -0
  43. package/dist/cjs/clients/registry/provider.js +34 -0
  44. package/dist/cjs/clients/registry/provider.js.map +1 -0
  45. package/dist/cjs/clients/registry/resolve.js +47 -0
  46. package/dist/cjs/clients/registry/resolve.js.map +1 -0
  47. package/dist/cjs/clients/registry/serpro.js +149 -0
  48. package/dist/cjs/clients/registry/serpro.js.map +1 -0
  49. package/dist/cjs/clients/registry/service.js +230 -0
  50. package/dist/cjs/clients/registry/service.js.map +1 -0
  51. package/dist/cjs/clients/registry/synthetic.js +165 -0
  52. package/dist/cjs/clients/registry/synthetic.js.map +1 -0
  53. package/dist/cjs/clients/repository.js +190 -9
  54. package/dist/cjs/clients/repository.js.map +1 -1
  55. package/dist/cjs/collection/branding.js +190 -0
  56. package/dist/cjs/collection/branding.js.map +1 -1
  57. package/dist/cjs/collection/clearance-store.js +74 -0
  58. package/dist/cjs/collection/clearance-store.js.map +1 -0
  59. package/dist/cjs/collection/communication-runtime.js +65 -2
  60. package/dist/cjs/collection/communication-runtime.js.map +1 -1
  61. package/dist/cjs/collection/engine.js +20 -0
  62. package/dist/cjs/collection/engine.js.map +1 -1
  63. package/dist/cjs/collection/policy.js +29 -1
  64. package/dist/cjs/collection/policy.js.map +1 -1
  65. package/dist/cjs/communication/clearance.js +18 -0
  66. package/dist/cjs/communication/clearance.js.map +1 -0
  67. package/dist/cjs/communication/dry-run-scenario.js +5 -0
  68. package/dist/cjs/communication/dry-run-scenario.js.map +1 -1
  69. package/dist/cjs/communication/engine.js +12 -0
  70. package/dist/cjs/communication/engine.js.map +1 -1
  71. package/dist/cjs/communication/policy.js.map +1 -1
  72. package/dist/cjs/competence/business-days.js +155 -0
  73. package/dist/cjs/competence/business-days.js.map +1 -0
  74. package/dist/cjs/competence/catalog-validation.js +174 -0
  75. package/dist/cjs/competence/catalog-validation.js.map +1 -0
  76. package/dist/cjs/competence/obligation-preview.js +190 -0
  77. package/dist/cjs/competence/obligation-preview.js.map +1 -0
  78. package/dist/cjs/competence/repository.js +330 -17
  79. package/dist/cjs/competence/repository.js.map +1 -1
  80. package/dist/cjs/dashboard/pilot-panel.js +90 -0
  81. package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
  82. package/dist/cjs/dashboard/repository.js +11 -1
  83. package/dist/cjs/dashboard/repository.js.map +1 -1
  84. package/dist/cjs/db/client.js +17 -11
  85. package/dist/cjs/db/client.js.map +1 -1
  86. package/dist/cjs/db/provision-e2e-identity.js +116 -0
  87. package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
  88. package/dist/cjs/fiscal/applicability.js +164 -0
  89. package/dist/cjs/fiscal/applicability.js.map +1 -0
  90. package/dist/cjs/fiscal/collection/authorization.js +186 -0
  91. package/dist/cjs/fiscal/collection/authorization.js.map +1 -0
  92. package/dist/cjs/fiscal/collection/competence.js +97 -0
  93. package/dist/cjs/fiscal/collection/competence.js.map +1 -0
  94. package/dist/cjs/fiscal/collection/first-contact.js +204 -0
  95. package/dist/cjs/fiscal/collection/first-contact.js.map +1 -0
  96. package/dist/cjs/fiscal/collection/plan.js +122 -0
  97. package/dist/cjs/fiscal/collection/plan.js.map +1 -0
  98. package/dist/cjs/fiscal/conditions.js +198 -0
  99. package/dist/cjs/fiscal/conditions.js.map +1 -0
  100. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
  101. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  102. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
  103. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  104. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
  105. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  106. package/dist/cjs/fiscal/coverage/model.js +137 -0
  107. package/dist/cjs/fiscal/coverage/model.js.map +1 -0
  108. package/dist/cjs/fiscal/coverage/requests.js +99 -0
  109. package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
  110. package/dist/cjs/fiscal/credentials/inspect.js +182 -0
  111. package/dist/cjs/fiscal/credentials/inspect.js.map +1 -0
  112. package/dist/cjs/fiscal/credentials/material.js +168 -0
  113. package/dist/cjs/fiscal/credentials/material.js.map +1 -0
  114. package/dist/cjs/fiscal/credentials/onboarding.js +266 -0
  115. package/dist/cjs/fiscal/credentials/onboarding.js.map +1 -0
  116. package/dist/cjs/fiscal/credentials/readiness.js +190 -0
  117. package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
  118. package/dist/cjs/fiscal/eligibility.js +199 -0
  119. package/dist/cjs/fiscal/eligibility.js.map +1 -0
  120. package/dist/cjs/fiscal/enrollment.js +134 -0
  121. package/dist/cjs/fiscal/enrollment.js.map +1 -0
  122. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
  123. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  124. package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
  125. package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
  126. package/dist/cjs/fiscal/ingestion/direction.js +36 -0
  127. package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
  128. package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
  129. package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
  130. package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
  131. package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
  132. package/dist/cjs/fiscal/ingestion/provider.js +51 -0
  133. package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
  134. package/dist/cjs/fiscal/ingestion/repository.js +132 -0
  135. package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
  136. package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
  137. package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
  138. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
  139. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  140. package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
  141. package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
  142. package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
  143. package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
  144. package/dist/cjs/fiscal/repository.js +470 -0
  145. package/dist/cjs/fiscal/repository.js.map +1 -0
  146. package/dist/cjs/fiscal/sync/circuit.js +124 -0
  147. package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
  148. package/dist/cjs/fiscal/sync/intervention.js +140 -0
  149. package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
  150. package/dist/cjs/fiscal/sync/lease.js +146 -0
  151. package/dist/cjs/fiscal/sync/lease.js.map +1 -0
  152. package/dist/cjs/fiscal/sync/observability.js +244 -0
  153. package/dist/cjs/fiscal/sync/observability.js.map +1 -0
  154. package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
  155. package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
  156. package/dist/cjs/fiscal/sync/policy.js +143 -0
  157. package/dist/cjs/fiscal/sync/policy.js.map +1 -0
  158. package/dist/cjs/fiscal/sync/reprocess.js +241 -0
  159. package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
  160. package/dist/cjs/fiscal/sync/retry.js +183 -0
  161. package/dist/cjs/fiscal/sync/retry.js.map +1 -0
  162. package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
  163. package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
  164. package/dist/cjs/fiscal/transport/https.js +309 -0
  165. package/dist/cjs/fiscal/transport/https.js.map +1 -0
  166. package/dist/cjs/fiscal/transport/synthetic-tls.js +380 -0
  167. package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
  168. package/dist/cjs/fiscal/transport/types.js +93 -0
  169. package/dist/cjs/fiscal/transport/types.js.map +1 -0
  170. package/dist/cjs/import/br-documents.js +85 -0
  171. package/dist/cjs/import/br-documents.js.map +1 -0
  172. package/dist/cjs/import/clients-import.js +347 -40
  173. package/dist/cjs/import/clients-import.js.map +1 -1
  174. package/dist/cjs/index.js +461 -73
  175. package/dist/cjs/index.js.map +1 -1
  176. package/dist/cjs/legal/documents.js +164 -19
  177. package/dist/cjs/legal/documents.js.map +1 -1
  178. package/dist/cjs/legal/index.js +3 -1
  179. package/dist/cjs/legal/index.js.map +1 -1
  180. package/dist/cjs/legal/types.js.map +1 -1
  181. package/dist/cjs/onboarding/persistence.js +4 -4
  182. package/dist/cjs/onboarding/persistence.js.map +1 -1
  183. package/dist/cjs/pilot/go-live-checklist.js +212 -0
  184. package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
  185. package/dist/cjs/pilot/milestone.js +79 -0
  186. package/dist/cjs/pilot/milestone.js.map +1 -0
  187. package/dist/cjs/platform/capabilities.js +173 -0
  188. package/dist/cjs/platform/capabilities.js.map +1 -0
  189. package/dist/cjs/platform/job-contract.js +411 -0
  190. package/dist/cjs/platform/job-contract.js.map +1 -0
  191. package/dist/cjs/rbac/catalog.js +110 -0
  192. package/dist/cjs/rbac/catalog.js.map +1 -1
  193. package/dist/cjs/subscription-billing/index.js +9 -1
  194. package/dist/cjs/subscription-billing/index.js.map +1 -1
  195. package/dist/cjs/subscription-billing/platform-exemption.js +121 -0
  196. package/dist/cjs/subscription-billing/platform-exemption.js.map +1 -0
  197. package/dist/cjs/subscription-billing/service.js +246 -78
  198. package/dist/cjs/subscription-billing/service.js.map +1 -1
  199. package/dist/cjs/tenancy/features.js +131 -0
  200. package/dist/cjs/tenancy/features.js.map +1 -0
  201. package/dist/cjs/tenancy/settings.js +224 -0
  202. package/dist/cjs/tenancy/settings.js.map +1 -0
  203. package/dist/cjs/users/repository.js +24 -1
  204. package/dist/cjs/users/repository.js.map +1 -1
  205. package/dist/cjs/vault/repository.js +92 -5
  206. package/dist/cjs/vault/repository.js.map +1 -1
  207. package/dist/clients/ibge.d.ts +17 -0
  208. package/dist/clients/ibge.d.ts.map +1 -0
  209. package/dist/clients/ibge.js +112 -0
  210. package/dist/clients/ibge.js.map +1 -0
  211. package/dist/clients/registry/http.d.ts +61 -0
  212. package/dist/clients/registry/http.d.ts.map +1 -0
  213. package/dist/clients/registry/http.js +151 -0
  214. package/dist/clients/registry/http.js.map +1 -0
  215. package/dist/clients/registry/ibge-municipios.d.ts +25 -0
  216. package/dist/clients/registry/ibge-municipios.d.ts.map +1 -0
  217. package/dist/clients/registry/ibge-municipios.js +25 -0
  218. package/dist/clients/registry/ibge-municipios.js.map +1 -0
  219. package/dist/clients/registry/ibge.d.ts +62 -0
  220. package/dist/clients/registry/ibge.d.ts.map +1 -0
  221. package/dist/clients/registry/ibge.js +57 -0
  222. package/dist/clients/registry/ibge.js.map +1 -0
  223. package/dist/clients/registry/lookup.d.ts +94 -0
  224. package/dist/clients/registry/lookup.d.ts.map +1 -0
  225. package/dist/clients/registry/lookup.js +184 -0
  226. package/dist/clients/registry/lookup.js.map +1 -0
  227. package/dist/clients/registry/provider.d.ts +124 -0
  228. package/dist/clients/registry/provider.d.ts.map +1 -0
  229. package/dist/clients/registry/provider.js +39 -0
  230. package/dist/clients/registry/provider.js.map +1 -0
  231. package/dist/clients/registry/resolve.d.ts +36 -0
  232. package/dist/clients/registry/resolve.d.ts.map +1 -0
  233. package/dist/clients/registry/resolve.js +44 -0
  234. package/dist/clients/registry/resolve.js.map +1 -0
  235. package/dist/clients/registry/serpro.d.ts +57 -0
  236. package/dist/clients/registry/serpro.d.ts.map +1 -0
  237. package/dist/clients/registry/serpro.js +143 -0
  238. package/dist/clients/registry/serpro.js.map +1 -0
  239. package/dist/clients/registry/service.d.ts +59 -0
  240. package/dist/clients/registry/service.d.ts.map +1 -0
  241. package/dist/clients/registry/service.js +225 -0
  242. package/dist/clients/registry/service.js.map +1 -0
  243. package/dist/clients/registry/synthetic.d.ts +30 -0
  244. package/dist/clients/registry/synthetic.d.ts.map +1 -0
  245. package/dist/clients/registry/synthetic.js +161 -0
  246. package/dist/clients/registry/synthetic.js.map +1 -0
  247. package/dist/clients/repository.d.ts +158 -0
  248. package/dist/clients/repository.d.ts.map +1 -1
  249. package/dist/clients/repository.js +186 -9
  250. package/dist/clients/repository.js.map +1 -1
  251. package/dist/collection/branding.d.ts +65 -0
  252. package/dist/collection/branding.d.ts.map +1 -1
  253. package/dist/collection/branding.js +186 -0
  254. package/dist/collection/branding.js.map +1 -1
  255. package/dist/collection/clearance-store.d.ts +39 -0
  256. package/dist/collection/clearance-store.d.ts.map +1 -0
  257. package/dist/collection/clearance-store.js +69 -0
  258. package/dist/collection/clearance-store.js.map +1 -0
  259. package/dist/collection/communication-runtime.d.ts +37 -0
  260. package/dist/collection/communication-runtime.d.ts.map +1 -1
  261. package/dist/collection/communication-runtime.js +63 -1
  262. package/dist/collection/communication-runtime.js.map +1 -1
  263. package/dist/collection/engine.d.ts +23 -0
  264. package/dist/collection/engine.d.ts.map +1 -1
  265. package/dist/collection/engine.js +20 -0
  266. package/dist/collection/engine.js.map +1 -1
  267. package/dist/collection/policy.d.ts +25 -0
  268. package/dist/collection/policy.d.ts.map +1 -1
  269. package/dist/collection/policy.js +27 -0
  270. package/dist/collection/policy.js.map +1 -1
  271. package/dist/communication/clearance.d.ts +53 -0
  272. package/dist/communication/clearance.d.ts.map +1 -0
  273. package/dist/communication/clearance.js +15 -0
  274. package/dist/communication/clearance.js.map +1 -0
  275. package/dist/communication/dry-run-scenario.d.ts.map +1 -1
  276. package/dist/communication/dry-run-scenario.js +5 -0
  277. package/dist/communication/dry-run-scenario.js.map +1 -1
  278. package/dist/communication/engine.d.ts +10 -0
  279. package/dist/communication/engine.d.ts.map +1 -1
  280. package/dist/communication/engine.js +12 -0
  281. package/dist/communication/engine.js.map +1 -1
  282. package/dist/communication/policy.d.ts +16 -0
  283. package/dist/communication/policy.d.ts.map +1 -1
  284. package/dist/communication/policy.js.map +1 -1
  285. package/dist/competence/business-days.d.ts +51 -0
  286. package/dist/competence/business-days.d.ts.map +1 -0
  287. package/dist/competence/business-days.js +145 -0
  288. package/dist/competence/business-days.js.map +1 -0
  289. package/dist/competence/catalog-validation.d.ts +86 -0
  290. package/dist/competence/catalog-validation.d.ts.map +1 -0
  291. package/dist/competence/catalog-validation.js +168 -0
  292. package/dist/competence/catalog-validation.js.map +1 -0
  293. package/dist/competence/obligation-preview.d.ts +103 -0
  294. package/dist/competence/obligation-preview.d.ts.map +1 -0
  295. package/dist/competence/obligation-preview.js +184 -0
  296. package/dist/competence/obligation-preview.js.map +1 -0
  297. package/dist/competence/repository.d.ts +139 -1
  298. package/dist/competence/repository.d.ts.map +1 -1
  299. package/dist/competence/repository.js +325 -17
  300. package/dist/competence/repository.js.map +1 -1
  301. package/dist/dashboard/pilot-panel.d.ts +100 -0
  302. package/dist/dashboard/pilot-panel.d.ts.map +1 -0
  303. package/dist/dashboard/pilot-panel.js +87 -0
  304. package/dist/dashboard/pilot-panel.js.map +1 -0
  305. package/dist/dashboard/repository.d.ts.map +1 -1
  306. package/dist/dashboard/repository.js +11 -1
  307. package/dist/dashboard/repository.js.map +1 -1
  308. package/dist/db/client.d.ts +45 -0
  309. package/dist/db/client.d.ts.map +1 -1
  310. package/dist/db/client.js +16 -11
  311. package/dist/db/client.js.map +1 -1
  312. package/dist/db/migrate.d.ts +36 -1
  313. package/dist/db/migrate.d.ts.map +1 -1
  314. package/dist/db/migrate.js +199 -32
  315. package/dist/db/migrate.js.map +1 -1
  316. package/dist/db/provision-e2e-identity.d.ts +2 -0
  317. package/dist/db/provision-e2e-identity.d.ts.map +1 -0
  318. package/dist/db/provision-e2e-identity.js +114 -0
  319. package/dist/db/provision-e2e-identity.js.map +1 -0
  320. package/dist/fiscal/applicability.d.ts +73 -0
  321. package/dist/fiscal/applicability.d.ts.map +1 -0
  322. package/dist/fiscal/applicability.js +160 -0
  323. package/dist/fiscal/applicability.js.map +1 -0
  324. package/dist/fiscal/collection/authorization.d.ts +152 -0
  325. package/dist/fiscal/collection/authorization.d.ts.map +1 -0
  326. package/dist/fiscal/collection/authorization.js +178 -0
  327. package/dist/fiscal/collection/authorization.js.map +1 -0
  328. package/dist/fiscal/collection/competence.d.ts +66 -0
  329. package/dist/fiscal/collection/competence.d.ts.map +1 -0
  330. package/dist/fiscal/collection/competence.js +90 -0
  331. package/dist/fiscal/collection/competence.js.map +1 -0
  332. package/dist/fiscal/collection/first-contact.d.ts +103 -0
  333. package/dist/fiscal/collection/first-contact.d.ts.map +1 -0
  334. package/dist/fiscal/collection/first-contact.js +201 -0
  335. package/dist/fiscal/collection/first-contact.js.map +1 -0
  336. package/dist/fiscal/collection/plan.d.ts +74 -0
  337. package/dist/fiscal/collection/plan.d.ts.map +1 -0
  338. package/dist/fiscal/collection/plan.js +119 -0
  339. package/dist/fiscal/collection/plan.js.map +1 -0
  340. package/dist/fiscal/conditions.d.ts +99 -0
  341. package/dist/fiscal/conditions.d.ts.map +1 -0
  342. package/dist/fiscal/conditions.js +190 -0
  343. package/dist/fiscal/conditions.js.map +1 -0
  344. package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
  345. package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
  346. package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
  347. package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  348. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
  349. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
  350. package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
  351. package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  352. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
  353. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
  354. package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
  355. package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  356. package/dist/fiscal/coverage/model.d.ts +114 -0
  357. package/dist/fiscal/coverage/model.d.ts.map +1 -0
  358. package/dist/fiscal/coverage/model.js +130 -0
  359. package/dist/fiscal/coverage/model.js.map +1 -0
  360. package/dist/fiscal/coverage/requests.d.ts +70 -0
  361. package/dist/fiscal/coverage/requests.d.ts.map +1 -0
  362. package/dist/fiscal/coverage/requests.js +95 -0
  363. package/dist/fiscal/coverage/requests.js.map +1 -0
  364. package/dist/fiscal/credentials/inspect.d.ts +114 -0
  365. package/dist/fiscal/credentials/inspect.d.ts.map +1 -0
  366. package/dist/fiscal/credentials/inspect.js +178 -0
  367. package/dist/fiscal/credentials/inspect.js.map +1 -0
  368. package/dist/fiscal/credentials/material.d.ts +81 -0
  369. package/dist/fiscal/credentials/material.d.ts.map +1 -0
  370. package/dist/fiscal/credentials/material.js +164 -0
  371. package/dist/fiscal/credentials/material.js.map +1 -0
  372. package/dist/fiscal/credentials/onboarding.d.ts +119 -0
  373. package/dist/fiscal/credentials/onboarding.d.ts.map +1 -0
  374. package/dist/fiscal/credentials/onboarding.js +259 -0
  375. package/dist/fiscal/credentials/onboarding.js.map +1 -0
  376. package/dist/fiscal/credentials/readiness.d.ts +119 -0
  377. package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
  378. package/dist/fiscal/credentials/readiness.js +186 -0
  379. package/dist/fiscal/credentials/readiness.js.map +1 -0
  380. package/dist/fiscal/eligibility.d.ts +106 -0
  381. package/dist/fiscal/eligibility.d.ts.map +1 -0
  382. package/dist/fiscal/eligibility.js +194 -0
  383. package/dist/fiscal/eligibility.js.map +1 -0
  384. package/dist/fiscal/enrollment.d.ts +91 -0
  385. package/dist/fiscal/enrollment.d.ts.map +1 -0
  386. package/dist/fiscal/enrollment.js +126 -0
  387. package/dist/fiscal/enrollment.js.map +1 -0
  388. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
  389. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
  390. package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
  391. package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  392. package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
  393. package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
  394. package/dist/fiscal/ingestion/adn-transport.js +220 -0
  395. package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
  396. package/dist/fiscal/ingestion/direction.d.ts +60 -0
  397. package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
  398. package/dist/fiscal/ingestion/direction.js +32 -0
  399. package/dist/fiscal/ingestion/direction.js.map +1 -0
  400. package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
  401. package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
  402. package/dist/fiscal/ingestion/nfse-adn.js +222 -0
  403. package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
  404. package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
  405. package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
  406. package/dist/fiscal/ingestion/pipeline.js +699 -0
  407. package/dist/fiscal/ingestion/pipeline.js.map +1 -0
  408. package/dist/fiscal/ingestion/provider.d.ts +206 -0
  409. package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
  410. package/dist/fiscal/ingestion/provider.js +47 -0
  411. package/dist/fiscal/ingestion/provider.js.map +1 -0
  412. package/dist/fiscal/ingestion/repository.d.ts +82 -0
  413. package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
  414. package/dist/fiscal/ingestion/repository.js +127 -0
  415. package/dist/fiscal/ingestion/repository.js.map +1 -0
  416. package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
  417. package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
  418. package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
  419. package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
  420. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
  421. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
  422. package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
  423. package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  424. package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
  425. package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
  426. package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
  427. package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
  428. package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
  429. package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
  430. package/dist/fiscal/ingestion/xml-reader.js +112 -0
  431. package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
  432. package/dist/fiscal/repository.d.ts +220 -0
  433. package/dist/fiscal/repository.d.ts.map +1 -0
  434. package/dist/fiscal/repository.js +449 -0
  435. package/dist/fiscal/repository.js.map +1 -0
  436. package/dist/fiscal/sync/circuit.d.ts +86 -0
  437. package/dist/fiscal/sync/circuit.d.ts.map +1 -0
  438. package/dist/fiscal/sync/circuit.js +118 -0
  439. package/dist/fiscal/sync/circuit.js.map +1 -0
  440. package/dist/fiscal/sync/intervention.d.ts +81 -0
  441. package/dist/fiscal/sync/intervention.d.ts.map +1 -0
  442. package/dist/fiscal/sync/intervention.js +135 -0
  443. package/dist/fiscal/sync/intervention.js.map +1 -0
  444. package/dist/fiscal/sync/lease.d.ts +118 -0
  445. package/dist/fiscal/sync/lease.d.ts.map +1 -0
  446. package/dist/fiscal/sync/lease.js +139 -0
  447. package/dist/fiscal/sync/lease.js.map +1 -0
  448. package/dist/fiscal/sync/observability.d.ts +148 -0
  449. package/dist/fiscal/sync/observability.d.ts.map +1 -0
  450. package/dist/fiscal/sync/observability.js +239 -0
  451. package/dist/fiscal/sync/observability.js.map +1 -0
  452. package/dist/fiscal/sync/orchestrator.d.ts +132 -0
  453. package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
  454. package/dist/fiscal/sync/orchestrator.js +487 -0
  455. package/dist/fiscal/sync/orchestrator.js.map +1 -0
  456. package/dist/fiscal/sync/policy.d.ts +87 -0
  457. package/dist/fiscal/sync/policy.d.ts.map +1 -0
  458. package/dist/fiscal/sync/policy.js +136 -0
  459. package/dist/fiscal/sync/policy.js.map +1 -0
  460. package/dist/fiscal/sync/reprocess.d.ts +76 -0
  461. package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
  462. package/dist/fiscal/sync/reprocess.js +237 -0
  463. package/dist/fiscal/sync/reprocess.js.map +1 -0
  464. package/dist/fiscal/sync/retry.d.ts +82 -0
  465. package/dist/fiscal/sync/retry.d.ts.map +1 -0
  466. package/dist/fiscal/sync/retry.js +176 -0
  467. package/dist/fiscal/sync/retry.js.map +1 -0
  468. package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
  469. package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
  470. package/dist/fiscal/sync/secret-boundary.js +116 -0
  471. package/dist/fiscal/sync/secret-boundary.js.map +1 -0
  472. package/dist/fiscal/transport/https.d.ts +86 -0
  473. package/dist/fiscal/transport/https.d.ts.map +1 -0
  474. package/dist/fiscal/transport/https.js +303 -0
  475. package/dist/fiscal/transport/https.js.map +1 -0
  476. package/dist/fiscal/transport/synthetic-tls.d.ts +99 -0
  477. package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
  478. package/dist/fiscal/transport/synthetic-tls.js +374 -0
  479. package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
  480. package/dist/fiscal/transport/types.d.ts +134 -0
  481. package/dist/fiscal/transport/types.d.ts.map +1 -0
  482. package/dist/fiscal/transport/types.js +88 -0
  483. package/dist/fiscal/transport/types.js.map +1 -0
  484. package/dist/import/br-documents.d.ts +26 -0
  485. package/dist/import/br-documents.d.ts.map +1 -0
  486. package/dist/import/br-documents.js +78 -0
  487. package/dist/import/br-documents.js.map +1 -0
  488. package/dist/import/clients-import.d.ts +122 -4
  489. package/dist/import/clients-import.d.ts.map +1 -1
  490. package/dist/import/clients-import.js +341 -41
  491. package/dist/import/clients-import.js.map +1 -1
  492. package/dist/index.d.ts +145 -13
  493. package/dist/index.d.ts.map +1 -1
  494. package/dist/index.js +120 -7
  495. package/dist/index.js.map +1 -1
  496. package/dist/legal/documents.d.ts +12 -1
  497. package/dist/legal/documents.d.ts.map +1 -1
  498. package/dist/legal/documents.js +162 -18
  499. package/dist/legal/documents.js.map +1 -1
  500. package/dist/legal/index.d.ts +2 -2
  501. package/dist/legal/index.d.ts.map +1 -1
  502. package/dist/legal/index.js +1 -1
  503. package/dist/legal/index.js.map +1 -1
  504. package/dist/legal/types.d.ts +114 -2
  505. package/dist/legal/types.d.ts.map +1 -1
  506. package/dist/legal/types.js.map +1 -1
  507. package/dist/onboarding/persistence.d.ts +10 -1
  508. package/dist/onboarding/persistence.d.ts.map +1 -1
  509. package/dist/onboarding/persistence.js +4 -4
  510. package/dist/onboarding/persistence.js.map +1 -1
  511. package/dist/pilot/go-live-checklist.d.ts +41 -0
  512. package/dist/pilot/go-live-checklist.d.ts.map +1 -0
  513. package/dist/pilot/go-live-checklist.js +209 -0
  514. package/dist/pilot/go-live-checklist.js.map +1 -0
  515. package/dist/pilot/milestone.d.ts +56 -0
  516. package/dist/pilot/milestone.d.ts.map +1 -0
  517. package/dist/pilot/milestone.js +74 -0
  518. package/dist/pilot/milestone.js.map +1 -0
  519. package/dist/platform/capabilities.d.ts +88 -0
  520. package/dist/platform/capabilities.d.ts.map +1 -0
  521. package/dist/platform/capabilities.js +169 -0
  522. package/dist/platform/capabilities.js.map +1 -0
  523. package/dist/platform/job-contract.d.ts +232 -0
  524. package/dist/platform/job-contract.d.ts.map +1 -0
  525. package/dist/platform/job-contract.js +403 -0
  526. package/dist/platform/job-contract.js.map +1 -0
  527. package/dist/rbac/catalog.d.ts.map +1 -1
  528. package/dist/rbac/catalog.js +110 -0
  529. package/dist/rbac/catalog.js.map +1 -1
  530. package/dist/subscription-billing/index.d.ts +8 -5
  531. package/dist/subscription-billing/index.d.ts.map +1 -1
  532. package/dist/subscription-billing/index.js +4 -3
  533. package/dist/subscription-billing/index.js.map +1 -1
  534. package/dist/subscription-billing/platform-exemption.d.ts +89 -0
  535. package/dist/subscription-billing/platform-exemption.d.ts.map +1 -0
  536. package/dist/subscription-billing/platform-exemption.js +113 -0
  537. package/dist/subscription-billing/platform-exemption.js.map +1 -0
  538. package/dist/subscription-billing/service.d.ts +74 -0
  539. package/dist/subscription-billing/service.d.ts.map +1 -1
  540. package/dist/subscription-billing/service.js +182 -16
  541. package/dist/subscription-billing/service.js.map +1 -1
  542. package/dist/tenancy/features.d.ts +69 -0
  543. package/dist/tenancy/features.d.ts.map +1 -0
  544. package/dist/tenancy/features.js +123 -0
  545. package/dist/tenancy/features.js.map +1 -0
  546. package/dist/tenancy/settings.d.ts +63 -0
  547. package/dist/tenancy/settings.d.ts.map +1 -0
  548. package/dist/tenancy/settings.js +218 -0
  549. package/dist/tenancy/settings.js.map +1 -0
  550. package/dist/users/repository.d.ts +16 -1
  551. package/dist/users/repository.d.ts.map +1 -1
  552. package/dist/users/repository.js +24 -1
  553. package/dist/users/repository.js.map +1 -1
  554. package/dist/vault/repository.d.ts +69 -1
  555. package/dist/vault/repository.d.ts.map +1 -1
  556. package/dist/vault/repository.js +88 -5
  557. package/dist/vault/repository.js.map +1 -1
  558. package/package.json +10 -2
  559. package/src/db/migrations/0045_role_write_scope.sql +122 -0
  560. package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
  561. package/src/db/migrations/0047_recipient_clearance.sql +89 -0
  562. package/src/db/migrations/0048_item_type_note.sql +16 -0
  563. package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
  564. package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
  565. package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
  566. package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
  567. package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
  568. package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
  569. package/src/db/migrations/0055_job_capability_contract.sql +300 -0
  570. package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
  571. package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
  572. package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
  573. package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
  574. package/src/db/migrations/0060_fiscal_credential_vault_and_run_authorization.sql +321 -0
  575. package/src/db/migrations/0061_client_official_registry_provenance.sql +193 -0
  576. package/src/db/migrations/0062_first_contact_and_capability_truth.sql +119 -0
@@ -0,0 +1,139 @@
1
+ import { uuidv7 } from '@baruk/shared';
2
+ /**
3
+ * Prazo padrão da vez.
4
+ *
5
+ * Dez minutos: mais do que qualquer lote de 50 documentos precisa, e menos do
6
+ * que o intervalo entre ciclos diários — de modo que um worker morto nunca
7
+ * atrase o cliente para o dia seguinte. Lotes longos renovam com `heartbeat`.
8
+ */
9
+ export const DEFAULT_LEASE_TTL_MS = 10 * 60_000;
10
+ /**
11
+ * Toma a vez. Devolve `null` quando outro processo VIVO a tem.
12
+ *
13
+ * `null` não é erro e não merece log de erro: é a resposta correta e frequente
14
+ * quando dois workers percorrem a mesma carteira.
15
+ */
16
+ export async function acquireFiscalSyncLease(tx, input) {
17
+ const now = input.now ?? new Date();
18
+ const expiresAt = new Date(now.getTime() + (input.ttlMs ?? DEFAULT_LEASE_TTL_MS));
19
+ const { stream } = input;
20
+ // A CTE fotografa o titular ANTERIOR. Ela não participa da exclusão — quem
21
+ // exclui é o `ON CONFLICT` —, serve só para dizer se esta tomada veio de uma
22
+ // vez devolvida (caminho normal) ou arrancada de um titular vencido (worker
23
+ // morto). Sob disputa real a segunda transação nem chega aqui: ela bloqueia
24
+ // na linha e depois reprova no `WHERE`.
25
+ const rows = await tx `
26
+ WITH anterior AS (
27
+ SELECT released_at
28
+ FROM fiscal_sync_lease
29
+ WHERE tenant_id = ${input.tenantId} AND client_id = ${stream.clientId}
30
+ AND source = ${stream.source} AND environment = ${stream.environment}
31
+ AND document_type = ${stream.documentType}
32
+ )
33
+ INSERT INTO fiscal_sync_lease (
34
+ id, tenant_id, client_id, source, environment, document_type,
35
+ holder, run_id, acquired_at, heartbeat_at, expires_at, released_at, updated_at
36
+ ) VALUES (
37
+ ${uuidv7()}, ${input.tenantId}, ${stream.clientId}, ${stream.source},
38
+ ${stream.environment}, ${stream.documentType},
39
+ ${input.holder}, ${input.runId ?? null}, ${now}, ${now}, ${expiresAt}, NULL, now()
40
+ )
41
+ ON CONFLICT (tenant_id, client_id, source, environment, document_type)
42
+ DO UPDATE SET
43
+ holder = EXCLUDED.holder,
44
+ run_id = EXCLUDED.run_id,
45
+ acquired_at = EXCLUDED.acquired_at,
46
+ heartbeat_at = EXCLUDED.heartbeat_at,
47
+ expires_at = EXCLUDED.expires_at,
48
+ released_at = NULL,
49
+ -- Só conta como RETOMADA quando o titular anterior não devolveu. Uma vez
50
+ -- livre e devolvida é o caminho normal, e inflá-lo apagaria o sinal de
51
+ -- que existe um worker morrendo no meio do lote.
52
+ recovered_count = fiscal_sync_lease.recovered_count
53
+ + CASE WHEN fiscal_sync_lease.released_at IS NULL THEN 1 ELSE 0 END,
54
+ updated_at = now()
55
+ WHERE fiscal_sync_lease.released_at IS NOT NULL
56
+ OR fiscal_sync_lease.expires_at <= ${now}
57
+ RETURNING id, holder, acquired_at, expires_at, recovered_count,
58
+ (SELECT released_at IS NULL FROM anterior) AS recovered
59
+ `;
60
+ const r = rows[0];
61
+ if (!r)
62
+ return null;
63
+ return {
64
+ id: r.id,
65
+ holder: r.holder,
66
+ acquiredAt: r.acquired_at,
67
+ expiresAt: r.expires_at,
68
+ recoveredCount: r.recovered_count,
69
+ // Sem linha anterior a CTE devolve NULL: é uma vez nova, não uma retomada.
70
+ recovered: r.recovered === true,
71
+ };
72
+ }
73
+ /**
74
+ * Renova o prazo — e confirma que a vez ainda é nossa.
75
+ *
76
+ * O `WHERE holder = ...` não é zelo: um lote que demorou mais do que o prazo já
77
+ * PERDEU a vez para outro worker, e continuar escrevendo depois disso é
78
+ * exatamente a corrida que o lease existe para impedir. `false` significa
79
+ * "pare agora", e quem chama tem de obedecer.
80
+ */
81
+ export async function heartbeatFiscalSyncLease(tx, input) {
82
+ const now = input.now ?? new Date();
83
+ const expiresAt = new Date(now.getTime() + (input.ttlMs ?? DEFAULT_LEASE_TTL_MS));
84
+ const rows = await tx `
85
+ UPDATE fiscal_sync_lease
86
+ SET heartbeat_at = ${now}, expires_at = ${expiresAt}, updated_at = now()
87
+ WHERE id = ${input.leaseId}
88
+ AND holder = ${input.holder}
89
+ AND released_at IS NULL
90
+ AND expires_at > ${now}
91
+ RETURNING id
92
+ `;
93
+ return rows.length > 0;
94
+ }
95
+ /**
96
+ * Devolve a vez.
97
+ *
98
+ * Idempotente e tolerante: devolver uma vez que já foi tomada por outro não é
99
+ * erro, é o desfecho normal de um worker que demorou demais. Devolve `false`
100
+ * para que a trilha saiba, sem lançar.
101
+ */
102
+ export async function releaseFiscalSyncLease(tx, input) {
103
+ const now = input.now ?? new Date();
104
+ const rows = await tx `
105
+ UPDATE fiscal_sync_lease
106
+ SET released_at = ${now}, updated_at = now()
107
+ WHERE id = ${input.leaseId} AND holder = ${input.holder} AND released_at IS NULL
108
+ RETURNING id
109
+ `;
110
+ return rows.length > 0;
111
+ }
112
+ /**
113
+ * As vezes vencidas que ninguém devolveu.
114
+ *
115
+ * A retomada não depende desta função — `acquire` já toma o que venceu. Ela
116
+ * existe para OBSERVAÇÃO: uma lista que nunca esvazia é um worker que morre
117
+ * sempre no mesmo cliente, e isso é uma pergunta que nenhum contador agregado
118
+ * responde.
119
+ */
120
+ export async function listStaleFiscalSyncLeases(tx, now = new Date()) {
121
+ const rows = await tx `
122
+ SELECT id, client_id, source, environment, document_type, holder,
123
+ expires_at, recovered_count
124
+ FROM fiscal_sync_lease
125
+ WHERE released_at IS NULL AND expires_at <= ${now}
126
+ ORDER BY expires_at
127
+ `;
128
+ return rows.map((r) => ({
129
+ id: r.id,
130
+ clientId: r.client_id,
131
+ source: r.source,
132
+ environment: r.environment,
133
+ documentType: r.document_type,
134
+ holder: r.holder,
135
+ expiresAt: r.expires_at,
136
+ recoveredCount: r.recovered_count,
137
+ }));
138
+ }
139
+ //# sourceMappingURL=lease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lease.js","sourceRoot":"","sources":["../../../src/fiscal/sync/lease.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ import type { Tx } from '../../db/client.js';
2
+ import type { FiscalDocumentType } from '../ingestion/provider.js';
3
+ /**
4
+ * O que aconteceu, contado a partir do banco — e nunca a partir de estimativa.
5
+ *
6
+ * ## Toda métrica aqui é FACTUAL
7
+ *
8
+ * Cada número sai de linhas gravadas por execuções que de fato ocorreram. Não há
9
+ * contador em memória (que zera a cada deploy e mente sobre o histórico), nem
10
+ * valor derivado de suposição sobre comportamento humano.
11
+ *
12
+ * Essa disciplina custa: a métrica que o produto mais gostaria de mostrar —
13
+ * "minutos de trabalho economizados" — não existe aqui, porque ela exige um
14
+ * baseline humano que ninguém mediu. Inventar um multiplicador ("cada nota
15
+ * baixada à mão leva 4 minutos") produziria um número bonito, citável e falso, e
16
+ * a primeira pessoa a cronometrar o próprio trabalho descobriria a fraude.
17
+ *
18
+ * O que existe é a MEDIÇÃO PRONTA: o denominador e o numerador estão
19
+ * registrados, e no dia em que alguém cronometrar o trabalho manual real, a
20
+ * conta fecha sem precisar de schema novo.
21
+ */
22
+ export interface FiscalOperationalMetrics {
23
+ /** Execuções registradas, por desfecho. */
24
+ runsTotal: number;
25
+ runsSuccess: number;
26
+ runsFailure: number;
27
+ runsBlocked: number;
28
+ documentsFetched: number;
29
+ documentsNew: number;
30
+ documentsDuplicate: number;
31
+ documentsFailed: number;
32
+ eventsPending: number;
33
+ eventsApplied: number;
34
+ eventsReconciled: number;
35
+ providerErrors: number;
36
+ /** Milissegundos. `null` quando nenhuma execução mediu duração. */
37
+ syncDurationMsP50: number | null;
38
+ syncDurationMsMax: number | null;
39
+ lastSuccessfulSyncAt: string | null;
40
+ /** Vezes tomadas de titulares que não as devolveram. Worker morrendo. */
41
+ leaseRecoveries: number;
42
+ staleLeases: number;
43
+ openInterventions: number;
44
+ openCircuits: number;
45
+ }
46
+ export declare function fiscalOperationalMetrics(tx: Tx, now?: Date): Promise<FiscalOperationalMetrics>;
47
+ /**
48
+ * As métricas de VALOR — e a honestidade sobre o que cada uma prova.
49
+ *
50
+ * Cada campo vem com o que ele significa exatamente, porque a diferença entre
51
+ * "documento coletado" e "download evitado" é onde um painel de produto começa a
52
+ * mentir sem que ninguém tenha mentido de propósito.
53
+ */
54
+ export interface FiscalValueMetrics {
55
+ /**
56
+ * Documentos que chegaram por automação. Fato direto: linhas de
57
+ * `fiscal_document` cuja origem não é entrega manual.
58
+ */
59
+ documentsAutomaticallyCollected: number;
60
+ /**
61
+ * Downloads de portal evitados.
62
+ *
63
+ * DEFINIÇÃO: um documento coletado automaticamente COM o XML original
64
+ * preservado é um arquivo que ninguém precisou baixar. É medição de arquivo,
65
+ * não de tempo — e a distinção importa: um resumo (`summary`) coletado ainda
66
+ * exigiria alguém buscar o documento completo, então ele não conta.
67
+ */
68
+ manualDownloadsAvoided: number;
69
+ /**
70
+ * Pedidos ao cliente evitados — PARCIAL, e por um motivo que não some.
71
+ *
72
+ * O numerador é medível: competências de `docs_fiscais_mes` cuja coleta
73
+ * automática trouxe documento. O que NÃO é medível é se o escritório de fato
74
+ * teria pedido ao cliente naquela competência — isso depende de uma rotina
75
+ * humana que ninguém registrou. O número abaixo é um limite SUPERIOR honesto,
76
+ * e o campo `basis` diz isso em voz alta.
77
+ */
78
+ clientRequestsAvoided: number;
79
+ clientRequestsAvoidedBasis: 'upper_bound_no_human_baseline';
80
+ /**
81
+ * Intervenções humanas exigidas. Fato direto, e o contrapeso das outras três:
82
+ * automação que gera tarefa não economizou nada.
83
+ */
84
+ humanInterventionsRequired: number;
85
+ humanInterventionsResolved: number;
86
+ /**
87
+ * O que NÃO está aqui, e por quê.
88
+ *
89
+ * `estimatedMinutesSaved` exigiria cronometrar o trabalho manual real. Sem
90
+ * esse baseline, qualquer número seria um multiplicador inventado — e o campo
91
+ * declara a ausência em vez de deixar quem lê supor que esquecemos.
92
+ */
93
+ estimatedMinutesSaved: null;
94
+ minutesSavedBlockedBy: 'human_baseline_not_measured';
95
+ }
96
+ export declare function fiscalValueMetrics(tx: Tx): Promise<FiscalValueMetrics>;
97
+ /**
98
+ * O estado operacional de UM cliente.
99
+ *
100
+ * ## Nenhum destes é um semáforo inventado
101
+ *
102
+ * Cada valor sai de um fato do banco, e a ordem de avaliação vai do mais
103
+ * específico ao mais genérico — dizer "erro" quando na verdade ninguém ligou a
104
+ * automação seria culpar o sistema pela ausência de decisão de uma pessoa.
105
+ *
106
+ * `DISABLED` sem política de cadência. Escolha legítima.
107
+ * `UNSUPPORTED` não há caminho de coleta conhecido para este cliente.
108
+ * `AUTH_REQUIRED` credencial vencida, inválida ou recusada.
109
+ * `SYNCING` há uma vez tomada e viva neste instante.
110
+ * `ERROR` a última execução falhou e ninguém resolveu.
111
+ * `DEGRADED` há execução recente boa E fila humana aberta.
112
+ * `HEALTHY` sincronizou com sucesso na última vez.
113
+ * `READY` tudo em ordem e nenhuma execução ainda.
114
+ */
115
+ export type FiscalClientOperationalStatus = 'DISABLED' | 'READY' | 'SYNCING' | 'HEALTHY' | 'DEGRADED' | 'AUTH_REQUIRED' | 'ERROR' | 'UNSUPPORTED';
116
+ export interface FiscalClientSyncRow {
117
+ clientId: string;
118
+ clientName: string | null;
119
+ documentType: FiscalDocumentType;
120
+ source: string | null;
121
+ environment: string | null;
122
+ status: FiscalClientOperationalStatus;
123
+ frequency: string;
124
+ lastSuccessAt: string | null;
125
+ lastStartedAt: string | null;
126
+ nextRunAt: string | null;
127
+ lastErrorClass: string | null;
128
+ consecutiveFailures: number;
129
+ cursor: string | null;
130
+ documentsCollected: number;
131
+ openInterventions: number;
132
+ coverageStatus: string;
133
+ leaseHolder: string | null;
134
+ detail: string;
135
+ }
136
+ /**
137
+ * O painel por cliente.
138
+ *
139
+ * Uma consulta só, e não N+1: a tela lista a carteira inteira, e um `for` com
140
+ * quatro consultas por cliente transformaria trinta clientes em cento e vinte
141
+ * viagens ao banco. A cobertura entra por junção lateral com a MESMA regra do
142
+ * módulo de cobertura — pergunta municipal só é respondida por linha municipal.
143
+ */
144
+ export declare function listFiscalClientSyncStatus(tx: Tx, input?: {
145
+ documentType?: FiscalDocumentType;
146
+ now?: Date;
147
+ }): Promise<FiscalClientSyncRow[]>;
148
+ //# sourceMappingURL=observability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../../src/fiscal/sync/observability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,239 @@
1
+ export async function fiscalOperationalMetrics(tx, now = new Date()) {
2
+ const [runs] = await tx `
3
+ SELECT count(*)::int AS total,
4
+ count(*) FILTER (WHERE outcome IN ('completed','no_documents'))::int AS success,
5
+ count(*) FILTER (WHERE outcome IN ('failed','provider_error'))::int AS failure,
6
+ count(*) FILTER (WHERE outcome LIKE 'blocked%' OR outcome = 'throttled')::int
7
+ AS blocked,
8
+ coalesce(sum(documents_fetched), 0)::int AS fetched,
9
+ coalesce(sum(documents_new), 0)::int AS novos,
10
+ coalesce(sum(documents_duplicate), 0)::int AS dup,
11
+ coalesce(sum(documents_failed), 0)::int AS falhos,
12
+ coalesce(sum(events_pending), 0)::int AS pend,
13
+ coalesce(sum(events_applied), 0)::int AS apl,
14
+ coalesce(sum(events_reconciled), 0)::int AS rec,
15
+ count(*) FILTER (WHERE outcome = 'provider_error')::int AS prov,
16
+ -- Percentil, e não média: uma execução de dez minutos entre mil de um
17
+ -- segundo move a média e não move a mediana — e é a mediana que
18
+ -- descreve o que acontece na maioria das vezes.
19
+ (percentile_disc(0.5) WITHIN GROUP (ORDER BY duration_ms)
20
+ FILTER (WHERE duration_ms IS NOT NULL))::int AS p50,
21
+ max(duration_ms)::int AS max,
22
+ max(finished_at) FILTER (WHERE outcome IN ('completed','no_documents')) AS ultimo
23
+ FROM fiscal_sync_run
24
+ `;
25
+ const [leases] = await tx `
26
+ SELECT coalesce(sum(recovered_count), 0)::int AS recuperacoes,
27
+ count(*) FILTER (WHERE released_at IS NULL AND expires_at <= ${now})::int AS vencidos
28
+ FROM fiscal_sync_lease
29
+ `;
30
+ const [fila] = await tx `
31
+ SELECT count(*)::int AS abertas FROM fiscal_intervention WHERE state <> 'resolved'
32
+ `;
33
+ const [circuitos] = await tx `
34
+ SELECT count(*)::int AS abertos
35
+ FROM fiscal_provider_circuit
36
+ WHERE state = 'open' AND (open_until IS NULL OR open_until > ${now})
37
+ `;
38
+ return {
39
+ runsTotal: runs?.total ?? 0,
40
+ runsSuccess: runs?.success ?? 0,
41
+ runsFailure: runs?.failure ?? 0,
42
+ runsBlocked: runs?.blocked ?? 0,
43
+ documentsFetched: runs?.fetched ?? 0,
44
+ documentsNew: runs?.novos ?? 0,
45
+ documentsDuplicate: runs?.dup ?? 0,
46
+ documentsFailed: runs?.falhos ?? 0,
47
+ eventsPending: runs?.pend ?? 0,
48
+ eventsApplied: runs?.apl ?? 0,
49
+ eventsReconciled: runs?.rec ?? 0,
50
+ providerErrors: runs?.prov ?? 0,
51
+ syncDurationMsP50: runs?.p50 ?? null,
52
+ syncDurationMsMax: runs?.max ?? null,
53
+ lastSuccessfulSyncAt: runs?.ultimo?.toISOString() ?? null,
54
+ leaseRecoveries: leases?.recuperacoes ?? 0,
55
+ staleLeases: leases?.vencidos ?? 0,
56
+ openInterventions: fila?.abertas ?? 0,
57
+ openCircuits: circuitos?.abertos ?? 0,
58
+ };
59
+ }
60
+ export async function fiscalValueMetrics(tx) {
61
+ const [docs] = await tx `
62
+ SELECT count(*) FILTER (WHERE source <> 'manual')::int AS automaticos,
63
+ count(*) FILTER (WHERE source <> 'manual' AND raw_blob_id IS NOT NULL
64
+ AND content_kind = 'full')::int AS "comRaw"
65
+ FROM fiscal_document
66
+ `;
67
+ const [pedidos] = await tx `
68
+ -- Competências de "Documentos fiscais do mês" em que a automação trouxe ao
69
+ -- menos um documento daquele cliente. A junção é pela COMPETÊNCIA, não pela
70
+ -- data de emissão: são conceitos independentes, e confundi-los erraria o
71
+ -- fechamento (a mesma distinção que a 0056 registra em competence_label).
72
+ SELECT count(DISTINCT (ri.client_id, c.label))::int AS n
73
+ FROM recurring_instance ri
74
+ JOIN recurring_item_type rit ON rit.id = ri.item_type_id
75
+ JOIN competence c ON c.id = ri.competence_id
76
+ WHERE rit.key = 'docs_fiscais_mes'
77
+ AND ri.deleted_at IS NULL
78
+ AND EXISTS (
79
+ SELECT 1 FROM fiscal_document fd
80
+ WHERE fd.client_id = ri.client_id
81
+ AND fd.competence_label = c.label
82
+ AND fd.source <> 'manual'
83
+ )
84
+ `;
85
+ const [fila] = await tx `
86
+ SELECT count(*) FILTER (WHERE state <> 'resolved')::int AS abertas,
87
+ count(*) FILTER (WHERE state = 'resolved')::int AS resolvidas
88
+ FROM fiscal_intervention
89
+ `;
90
+ return {
91
+ documentsAutomaticallyCollected: docs?.automaticos ?? 0,
92
+ manualDownloadsAvoided: docs?.comRaw ?? 0,
93
+ clientRequestsAvoided: pedidos?.n ?? 0,
94
+ clientRequestsAvoidedBasis: 'upper_bound_no_human_baseline',
95
+ humanInterventionsRequired: fila?.abertas ?? 0,
96
+ humanInterventionsResolved: fila?.resolvidas ?? 0,
97
+ estimatedMinutesSaved: null,
98
+ minutesSavedBlockedBy: 'human_baseline_not_measured',
99
+ };
100
+ }
101
+ /**
102
+ * O painel por cliente.
103
+ *
104
+ * Uma consulta só, e não N+1: a tela lista a carteira inteira, e um `for` com
105
+ * quatro consultas por cliente transformaria trinta clientes em cento e vinte
106
+ * viagens ao banco. A cobertura entra por junção lateral com a MESMA regra do
107
+ * módulo de cobertura — pergunta municipal só é respondida por linha municipal.
108
+ */
109
+ export async function listFiscalClientSyncStatus(tx, input = {}) {
110
+ const documentType = input.documentType ?? 'nfse';
111
+ const now = input.now ?? new Date();
112
+ const rows = await tx `
113
+ SELECT c.id AS client_id,
114
+ c.display_name AS client_name,
115
+ c.municipality_ibge_code,
116
+ cur.source,
117
+ cur.environment,
118
+ pol.frequency,
119
+ cur.last_success_at,
120
+ cur.last_started_at,
121
+ cur.next_attempt_after,
122
+ cur.next_eligible_run_at,
123
+ cur.last_error_class,
124
+ cur.consecutive_failures,
125
+ cur.last_nsu,
126
+ (SELECT count(*)::int FROM fiscal_document d
127
+ WHERE d.client_id = c.id AND d.document_type = ${documentType}) AS documentos,
128
+ (SELECT count(*)::int FROM fiscal_intervention i
129
+ WHERE i.client_id = c.id AND i.state <> 'resolved') AS intervencoes,
130
+ (SELECT bool_or(i.kind IN ('certificate_expired','certificate_invalid','auth_required'))
131
+ FROM fiscal_intervention i
132
+ WHERE i.client_id = c.id AND i.state <> 'resolved') AS cred_expirada,
133
+ (SELECT l.holder FROM fiscal_sync_lease l
134
+ WHERE l.client_id = c.id AND l.document_type = ${documentType}
135
+ AND l.released_at IS NULL AND l.expires_at > ${now}
136
+ LIMIT 1) AS lease_holder,
137
+ cov.coverage_status
138
+ FROM client c
139
+ JOIN client_fiscal_enrollment e
140
+ ON e.client_id = c.id AND e.document_type = ${documentType} AND e.revoked_at IS NULL
141
+ LEFT JOIN fiscal_sync_cursor cur
142
+ ON cur.client_id = c.id AND cur.environment = (
143
+ SELECT mode FROM tenant_fiscal_automation LIMIT 1
144
+ )
145
+ LEFT JOIN LATERAL (
146
+ SELECT frequency FROM fiscal_sync_policy p
147
+ WHERE p.document_type = ${documentType}
148
+ AND (p.client_id = c.id OR p.client_id IS NULL)
149
+ ORDER BY p.client_id NULLS LAST
150
+ LIMIT 1
151
+ ) pol ON true
152
+ LEFT JOIN LATERAL (
153
+ -- A MESMA regra do módulo de cobertura, e a razão de ela estar repetida
154
+ -- aqui é performance de listagem: uma pergunta municipal só encontra
155
+ -- linha municipal (a exata do IBGE, senão a padrão). Nunca sobe para a
156
+ -- nacional — é assim que "o ADN cobre o Brasil inteiro" entraria.
157
+ SELECT fc.coverage_status
158
+ FROM fiscal_coverage fc
159
+ WHERE fc.document_type = ${documentType}
160
+ AND fc.jurisdiction_scope = ${documentType === 'nfse' ? 'municipal' : 'national'}
161
+ AND (fc.jurisdiction_code = c.municipality_ibge_code OR fc.jurisdiction_code IS NULL)
162
+ ORDER BY fc.jurisdiction_code NULLS LAST
163
+ LIMIT 1
164
+ ) cov ON true
165
+ WHERE c.deleted_at IS NULL
166
+ ORDER BY c.display_name
167
+ `;
168
+ return rows.map((r) => {
169
+ const cobertura = r.coverage_status ?? 'UNKNOWN';
170
+ const frequency = r.frequency ?? 'disabled';
171
+ const gate = maior(r.next_eligible_run_at, r.next_attempt_after);
172
+ const status = (() => {
173
+ if (r.cred_expirada)
174
+ return 'AUTH_REQUIRED';
175
+ if (cobertura === 'UNSUPPORTED')
176
+ return 'UNSUPPORTED';
177
+ if (frequency === 'disabled')
178
+ return 'DISABLED';
179
+ if (r.lease_holder)
180
+ return 'SYNCING';
181
+ if (r.last_error_class)
182
+ return 'ERROR';
183
+ if (r.last_success_at)
184
+ return (r.intervencoes ?? 0) > 0 ? 'DEGRADED' : 'HEALTHY';
185
+ return 'READY';
186
+ })();
187
+ return {
188
+ clientId: r.client_id,
189
+ clientName: r.client_name,
190
+ documentType,
191
+ source: r.source,
192
+ environment: r.environment,
193
+ status,
194
+ frequency,
195
+ lastSuccessAt: r.last_success_at?.toISOString() ?? null,
196
+ lastStartedAt: r.last_started_at?.toISOString() ?? null,
197
+ nextRunAt: gate?.toISOString() ?? null,
198
+ lastErrorClass: r.last_error_class,
199
+ consecutiveFailures: r.consecutive_failures ?? 0,
200
+ cursor: r.last_nsu,
201
+ documentsCollected: r.documentos,
202
+ openInterventions: r.intervencoes,
203
+ coverageStatus: cobertura,
204
+ leaseHolder: r.lease_holder,
205
+ detail: describe(status, cobertura, frequency),
206
+ };
207
+ });
208
+ }
209
+ function maior(a, b) {
210
+ if (!a)
211
+ return b;
212
+ if (!b)
213
+ return a;
214
+ return a > b ? a : b;
215
+ }
216
+ /** A frase que explica o estado. Fato, nunca conselho genérico. */
217
+ function describe(status, coverage, frequency) {
218
+ switch (status) {
219
+ case 'DISABLED':
220
+ return 'Cadência desligada. Inscrever o cliente não liga a busca automática.';
221
+ case 'UNSUPPORTED':
222
+ return 'Não há caminho de coleta automática conhecido para esta jurisdição.';
223
+ case 'AUTH_REQUIRED':
224
+ return 'Certificado vencido, inválido ou recusado. Só uma pessoa resolve.';
225
+ case 'SYNCING':
226
+ return 'Uma execução está com a vez deste fluxo agora.';
227
+ case 'ERROR':
228
+ return 'A última execução falhou. O cursor não avançou — nada foi perdido.';
229
+ case 'DEGRADED':
230
+ return 'A última execução deu certo, mas há pendência humana aberta.';
231
+ case 'HEALTHY':
232
+ return `Sincronizando em cadência ${frequency}.`;
233
+ case 'READY':
234
+ return coverage === 'UNKNOWN'
235
+ ? 'Habilitado, mas a cobertura desta jurisdição é desconhecida.'
236
+ : 'Habilitado e ainda sem execução concluída.';
237
+ }
238
+ }
239
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../../../src/fiscal/sync/observability.ts"],"names":[],"mappings":"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"}