@baruk/core 0.4.2 → 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 (465) 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 +103 -0
  34. package/dist/cjs/clients/ibge.js.map +1 -0
  35. package/dist/cjs/clients/repository.js +186 -9
  36. package/dist/cjs/clients/repository.js.map +1 -1
  37. package/dist/cjs/collection/branding.js +190 -0
  38. package/dist/cjs/collection/branding.js.map +1 -1
  39. package/dist/cjs/collection/clearance-store.js +74 -0
  40. package/dist/cjs/collection/clearance-store.js.map +1 -0
  41. package/dist/cjs/collection/communication-runtime.js +65 -2
  42. package/dist/cjs/collection/communication-runtime.js.map +1 -1
  43. package/dist/cjs/collection/engine.js +20 -0
  44. package/dist/cjs/collection/engine.js.map +1 -1
  45. package/dist/cjs/collection/policy.js +29 -1
  46. package/dist/cjs/collection/policy.js.map +1 -1
  47. package/dist/cjs/communication/clearance.js +18 -0
  48. package/dist/cjs/communication/clearance.js.map +1 -0
  49. package/dist/cjs/communication/dry-run-scenario.js +5 -0
  50. package/dist/cjs/communication/dry-run-scenario.js.map +1 -1
  51. package/dist/cjs/communication/engine.js +12 -0
  52. package/dist/cjs/communication/engine.js.map +1 -1
  53. package/dist/cjs/communication/policy.js.map +1 -1
  54. package/dist/cjs/competence/business-days.js +155 -0
  55. package/dist/cjs/competence/business-days.js.map +1 -0
  56. package/dist/cjs/competence/catalog-validation.js +174 -0
  57. package/dist/cjs/competence/catalog-validation.js.map +1 -0
  58. package/dist/cjs/competence/obligation-preview.js +190 -0
  59. package/dist/cjs/competence/obligation-preview.js.map +1 -0
  60. package/dist/cjs/competence/repository.js +330 -17
  61. package/dist/cjs/competence/repository.js.map +1 -1
  62. package/dist/cjs/dashboard/pilot-panel.js +90 -0
  63. package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
  64. package/dist/cjs/dashboard/repository.js +11 -1
  65. package/dist/cjs/dashboard/repository.js.map +1 -1
  66. package/dist/cjs/db/client.js +17 -11
  67. package/dist/cjs/db/client.js.map +1 -1
  68. package/dist/cjs/db/provision-e2e-identity.js +111 -0
  69. package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
  70. package/dist/cjs/fiscal/applicability.js +164 -0
  71. package/dist/cjs/fiscal/applicability.js.map +1 -0
  72. package/dist/cjs/fiscal/conditions.js +198 -0
  73. package/dist/cjs/fiscal/conditions.js.map +1 -0
  74. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
  75. package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  76. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
  77. package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  78. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
  79. package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  80. package/dist/cjs/fiscal/coverage/model.js +127 -0
  81. package/dist/cjs/fiscal/coverage/model.js.map +1 -0
  82. package/dist/cjs/fiscal/coverage/requests.js +99 -0
  83. package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
  84. package/dist/cjs/fiscal/credentials/material.js +168 -0
  85. package/dist/cjs/fiscal/credentials/material.js.map +1 -0
  86. package/dist/cjs/fiscal/credentials/readiness.js +163 -0
  87. package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
  88. package/dist/cjs/fiscal/eligibility.js +199 -0
  89. package/dist/cjs/fiscal/eligibility.js.map +1 -0
  90. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
  91. package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  92. package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
  93. package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
  94. package/dist/cjs/fiscal/ingestion/direction.js +36 -0
  95. package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
  96. package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
  97. package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
  98. package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
  99. package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
  100. package/dist/cjs/fiscal/ingestion/provider.js +51 -0
  101. package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
  102. package/dist/cjs/fiscal/ingestion/repository.js +132 -0
  103. package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
  104. package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
  105. package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
  106. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
  107. package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  108. package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
  109. package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
  110. package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
  111. package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
  112. package/dist/cjs/fiscal/repository.js +470 -0
  113. package/dist/cjs/fiscal/repository.js.map +1 -0
  114. package/dist/cjs/fiscal/sync/circuit.js +124 -0
  115. package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
  116. package/dist/cjs/fiscal/sync/intervention.js +140 -0
  117. package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
  118. package/dist/cjs/fiscal/sync/lease.js +146 -0
  119. package/dist/cjs/fiscal/sync/lease.js.map +1 -0
  120. package/dist/cjs/fiscal/sync/observability.js +244 -0
  121. package/dist/cjs/fiscal/sync/observability.js.map +1 -0
  122. package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
  123. package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
  124. package/dist/cjs/fiscal/sync/policy.js +143 -0
  125. package/dist/cjs/fiscal/sync/policy.js.map +1 -0
  126. package/dist/cjs/fiscal/sync/reprocess.js +241 -0
  127. package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
  128. package/dist/cjs/fiscal/sync/retry.js +183 -0
  129. package/dist/cjs/fiscal/sync/retry.js.map +1 -0
  130. package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
  131. package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
  132. package/dist/cjs/fiscal/transport/https.js +309 -0
  133. package/dist/cjs/fiscal/transport/https.js.map +1 -0
  134. package/dist/cjs/fiscal/transport/synthetic-tls.js +328 -0
  135. package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
  136. package/dist/cjs/fiscal/transport/types.js +93 -0
  137. package/dist/cjs/fiscal/transport/types.js.map +1 -0
  138. package/dist/cjs/import/br-documents.js +85 -0
  139. package/dist/cjs/import/br-documents.js.map +1 -0
  140. package/dist/cjs/import/clients-import.js +347 -40
  141. package/dist/cjs/import/clients-import.js.map +1 -1
  142. package/dist/cjs/index.js +316 -11
  143. package/dist/cjs/index.js.map +1 -1
  144. package/dist/cjs/legal/documents.js +100 -15
  145. package/dist/cjs/legal/documents.js.map +1 -1
  146. package/dist/cjs/legal/index.js +3 -1
  147. package/dist/cjs/legal/index.js.map +1 -1
  148. package/dist/cjs/legal/types.js.map +1 -1
  149. package/dist/cjs/onboarding/persistence.js +4 -4
  150. package/dist/cjs/onboarding/persistence.js.map +1 -1
  151. package/dist/cjs/pilot/go-live-checklist.js +212 -0
  152. package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
  153. package/dist/cjs/pilot/milestone.js +79 -0
  154. package/dist/cjs/pilot/milestone.js.map +1 -0
  155. package/dist/cjs/platform/capabilities.js +144 -0
  156. package/dist/cjs/platform/capabilities.js.map +1 -0
  157. package/dist/cjs/platform/job-contract.js +411 -0
  158. package/dist/cjs/platform/job-contract.js.map +1 -0
  159. package/dist/cjs/rbac/catalog.js +34 -0
  160. package/dist/cjs/rbac/catalog.js.map +1 -1
  161. package/dist/cjs/subscription-billing/index.js +2 -1
  162. package/dist/cjs/subscription-billing/index.js.map +1 -1
  163. package/dist/cjs/subscription-billing/service.js +153 -77
  164. package/dist/cjs/subscription-billing/service.js.map +1 -1
  165. package/dist/cjs/tenancy/features.js +131 -0
  166. package/dist/cjs/tenancy/features.js.map +1 -0
  167. package/dist/cjs/tenancy/settings.js +224 -0
  168. package/dist/cjs/tenancy/settings.js.map +1 -0
  169. package/dist/cjs/users/repository.js +24 -1
  170. package/dist/cjs/users/repository.js.map +1 -1
  171. package/dist/clients/ibge.d.ts +17 -0
  172. package/dist/clients/ibge.d.ts.map +1 -0
  173. package/dist/clients/ibge.js +98 -0
  174. package/dist/clients/ibge.js.map +1 -0
  175. package/dist/clients/repository.d.ts +154 -0
  176. package/dist/clients/repository.d.ts.map +1 -1
  177. package/dist/clients/repository.js +182 -9
  178. package/dist/clients/repository.js.map +1 -1
  179. package/dist/collection/branding.d.ts +65 -0
  180. package/dist/collection/branding.d.ts.map +1 -1
  181. package/dist/collection/branding.js +186 -0
  182. package/dist/collection/branding.js.map +1 -1
  183. package/dist/collection/clearance-store.d.ts +39 -0
  184. package/dist/collection/clearance-store.d.ts.map +1 -0
  185. package/dist/collection/clearance-store.js +69 -0
  186. package/dist/collection/clearance-store.js.map +1 -0
  187. package/dist/collection/communication-runtime.d.ts +37 -0
  188. package/dist/collection/communication-runtime.d.ts.map +1 -1
  189. package/dist/collection/communication-runtime.js +63 -1
  190. package/dist/collection/communication-runtime.js.map +1 -1
  191. package/dist/collection/engine.d.ts +23 -0
  192. package/dist/collection/engine.d.ts.map +1 -1
  193. package/dist/collection/engine.js +20 -0
  194. package/dist/collection/engine.js.map +1 -1
  195. package/dist/collection/policy.d.ts +25 -0
  196. package/dist/collection/policy.d.ts.map +1 -1
  197. package/dist/collection/policy.js +27 -0
  198. package/dist/collection/policy.js.map +1 -1
  199. package/dist/communication/clearance.d.ts +53 -0
  200. package/dist/communication/clearance.d.ts.map +1 -0
  201. package/dist/communication/clearance.js +15 -0
  202. package/dist/communication/clearance.js.map +1 -0
  203. package/dist/communication/dry-run-scenario.d.ts.map +1 -1
  204. package/dist/communication/dry-run-scenario.js +5 -0
  205. package/dist/communication/dry-run-scenario.js.map +1 -1
  206. package/dist/communication/engine.d.ts +10 -0
  207. package/dist/communication/engine.d.ts.map +1 -1
  208. package/dist/communication/engine.js +12 -0
  209. package/dist/communication/engine.js.map +1 -1
  210. package/dist/communication/policy.d.ts +16 -0
  211. package/dist/communication/policy.d.ts.map +1 -1
  212. package/dist/communication/policy.js.map +1 -1
  213. package/dist/competence/business-days.d.ts +51 -0
  214. package/dist/competence/business-days.d.ts.map +1 -0
  215. package/dist/competence/business-days.js +145 -0
  216. package/dist/competence/business-days.js.map +1 -0
  217. package/dist/competence/catalog-validation.d.ts +86 -0
  218. package/dist/competence/catalog-validation.d.ts.map +1 -0
  219. package/dist/competence/catalog-validation.js +168 -0
  220. package/dist/competence/catalog-validation.js.map +1 -0
  221. package/dist/competence/obligation-preview.d.ts +103 -0
  222. package/dist/competence/obligation-preview.d.ts.map +1 -0
  223. package/dist/competence/obligation-preview.js +184 -0
  224. package/dist/competence/obligation-preview.js.map +1 -0
  225. package/dist/competence/repository.d.ts +139 -1
  226. package/dist/competence/repository.d.ts.map +1 -1
  227. package/dist/competence/repository.js +325 -17
  228. package/dist/competence/repository.js.map +1 -1
  229. package/dist/dashboard/pilot-panel.d.ts +100 -0
  230. package/dist/dashboard/pilot-panel.d.ts.map +1 -0
  231. package/dist/dashboard/pilot-panel.js +87 -0
  232. package/dist/dashboard/pilot-panel.js.map +1 -0
  233. package/dist/dashboard/repository.d.ts.map +1 -1
  234. package/dist/dashboard/repository.js +11 -1
  235. package/dist/dashboard/repository.js.map +1 -1
  236. package/dist/db/client.d.ts +45 -0
  237. package/dist/db/client.d.ts.map +1 -1
  238. package/dist/db/client.js +16 -11
  239. package/dist/db/client.js.map +1 -1
  240. package/dist/db/migrate.d.ts +36 -1
  241. package/dist/db/migrate.d.ts.map +1 -1
  242. package/dist/db/migrate.js +199 -32
  243. package/dist/db/migrate.js.map +1 -1
  244. package/dist/db/provision-e2e-identity.d.ts +2 -0
  245. package/dist/db/provision-e2e-identity.d.ts.map +1 -0
  246. package/dist/db/provision-e2e-identity.js +109 -0
  247. package/dist/db/provision-e2e-identity.js.map +1 -0
  248. package/dist/fiscal/applicability.d.ts +73 -0
  249. package/dist/fiscal/applicability.d.ts.map +1 -0
  250. package/dist/fiscal/applicability.js +160 -0
  251. package/dist/fiscal/applicability.js.map +1 -0
  252. package/dist/fiscal/conditions.d.ts +99 -0
  253. package/dist/fiscal/conditions.d.ts.map +1 -0
  254. package/dist/fiscal/conditions.js +190 -0
  255. package/dist/fiscal/conditions.js.map +1 -0
  256. package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
  257. package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
  258. package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
  259. package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
  260. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
  261. package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
  262. package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
  263. package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
  264. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
  265. package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
  266. package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
  267. package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
  268. package/dist/fiscal/coverage/model.d.ts +86 -0
  269. package/dist/fiscal/coverage/model.d.ts.map +1 -0
  270. package/dist/fiscal/coverage/model.js +120 -0
  271. package/dist/fiscal/coverage/model.js.map +1 -0
  272. package/dist/fiscal/coverage/requests.d.ts +70 -0
  273. package/dist/fiscal/coverage/requests.d.ts.map +1 -0
  274. package/dist/fiscal/coverage/requests.js +95 -0
  275. package/dist/fiscal/coverage/requests.js.map +1 -0
  276. package/dist/fiscal/credentials/material.d.ts +81 -0
  277. package/dist/fiscal/credentials/material.d.ts.map +1 -0
  278. package/dist/fiscal/credentials/material.js +164 -0
  279. package/dist/fiscal/credentials/material.js.map +1 -0
  280. package/dist/fiscal/credentials/readiness.d.ts +92 -0
  281. package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
  282. package/dist/fiscal/credentials/readiness.js +159 -0
  283. package/dist/fiscal/credentials/readiness.js.map +1 -0
  284. package/dist/fiscal/eligibility.d.ts +106 -0
  285. package/dist/fiscal/eligibility.d.ts.map +1 -0
  286. package/dist/fiscal/eligibility.js +194 -0
  287. package/dist/fiscal/eligibility.js.map +1 -0
  288. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
  289. package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
  290. package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
  291. package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
  292. package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
  293. package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
  294. package/dist/fiscal/ingestion/adn-transport.js +220 -0
  295. package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
  296. package/dist/fiscal/ingestion/direction.d.ts +60 -0
  297. package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
  298. package/dist/fiscal/ingestion/direction.js +32 -0
  299. package/dist/fiscal/ingestion/direction.js.map +1 -0
  300. package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
  301. package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
  302. package/dist/fiscal/ingestion/nfse-adn.js +222 -0
  303. package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
  304. package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
  305. package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
  306. package/dist/fiscal/ingestion/pipeline.js +699 -0
  307. package/dist/fiscal/ingestion/pipeline.js.map +1 -0
  308. package/dist/fiscal/ingestion/provider.d.ts +206 -0
  309. package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
  310. package/dist/fiscal/ingestion/provider.js +47 -0
  311. package/dist/fiscal/ingestion/provider.js.map +1 -0
  312. package/dist/fiscal/ingestion/repository.d.ts +82 -0
  313. package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
  314. package/dist/fiscal/ingestion/repository.js +127 -0
  315. package/dist/fiscal/ingestion/repository.js.map +1 -0
  316. package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
  317. package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
  318. package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
  319. package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
  320. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
  321. package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
  322. package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
  323. package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
  324. package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
  325. package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
  326. package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
  327. package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
  328. package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
  329. package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
  330. package/dist/fiscal/ingestion/xml-reader.js +112 -0
  331. package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
  332. package/dist/fiscal/repository.d.ts +220 -0
  333. package/dist/fiscal/repository.d.ts.map +1 -0
  334. package/dist/fiscal/repository.js +449 -0
  335. package/dist/fiscal/repository.js.map +1 -0
  336. package/dist/fiscal/sync/circuit.d.ts +86 -0
  337. package/dist/fiscal/sync/circuit.d.ts.map +1 -0
  338. package/dist/fiscal/sync/circuit.js +118 -0
  339. package/dist/fiscal/sync/circuit.js.map +1 -0
  340. package/dist/fiscal/sync/intervention.d.ts +81 -0
  341. package/dist/fiscal/sync/intervention.d.ts.map +1 -0
  342. package/dist/fiscal/sync/intervention.js +135 -0
  343. package/dist/fiscal/sync/intervention.js.map +1 -0
  344. package/dist/fiscal/sync/lease.d.ts +118 -0
  345. package/dist/fiscal/sync/lease.d.ts.map +1 -0
  346. package/dist/fiscal/sync/lease.js +139 -0
  347. package/dist/fiscal/sync/lease.js.map +1 -0
  348. package/dist/fiscal/sync/observability.d.ts +148 -0
  349. package/dist/fiscal/sync/observability.d.ts.map +1 -0
  350. package/dist/fiscal/sync/observability.js +239 -0
  351. package/dist/fiscal/sync/observability.js.map +1 -0
  352. package/dist/fiscal/sync/orchestrator.d.ts +132 -0
  353. package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
  354. package/dist/fiscal/sync/orchestrator.js +487 -0
  355. package/dist/fiscal/sync/orchestrator.js.map +1 -0
  356. package/dist/fiscal/sync/policy.d.ts +87 -0
  357. package/dist/fiscal/sync/policy.d.ts.map +1 -0
  358. package/dist/fiscal/sync/policy.js +136 -0
  359. package/dist/fiscal/sync/policy.js.map +1 -0
  360. package/dist/fiscal/sync/reprocess.d.ts +76 -0
  361. package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
  362. package/dist/fiscal/sync/reprocess.js +237 -0
  363. package/dist/fiscal/sync/reprocess.js.map +1 -0
  364. package/dist/fiscal/sync/retry.d.ts +82 -0
  365. package/dist/fiscal/sync/retry.d.ts.map +1 -0
  366. package/dist/fiscal/sync/retry.js +176 -0
  367. package/dist/fiscal/sync/retry.js.map +1 -0
  368. package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
  369. package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
  370. package/dist/fiscal/sync/secret-boundary.js +116 -0
  371. package/dist/fiscal/sync/secret-boundary.js.map +1 -0
  372. package/dist/fiscal/transport/https.d.ts +86 -0
  373. package/dist/fiscal/transport/https.d.ts.map +1 -0
  374. package/dist/fiscal/transport/https.js +303 -0
  375. package/dist/fiscal/transport/https.js.map +1 -0
  376. package/dist/fiscal/transport/synthetic-tls.d.ts +80 -0
  377. package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
  378. package/dist/fiscal/transport/synthetic-tls.js +323 -0
  379. package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
  380. package/dist/fiscal/transport/types.d.ts +134 -0
  381. package/dist/fiscal/transport/types.d.ts.map +1 -0
  382. package/dist/fiscal/transport/types.js +88 -0
  383. package/dist/fiscal/transport/types.js.map +1 -0
  384. package/dist/import/br-documents.d.ts +26 -0
  385. package/dist/import/br-documents.d.ts.map +1 -0
  386. package/dist/import/br-documents.js +78 -0
  387. package/dist/import/br-documents.js.map +1 -0
  388. package/dist/import/clients-import.d.ts +122 -4
  389. package/dist/import/clients-import.d.ts.map +1 -1
  390. package/dist/import/clients-import.js +341 -41
  391. package/dist/import/clients-import.js.map +1 -1
  392. package/dist/index.d.ts +115 -11
  393. package/dist/index.d.ts.map +1 -1
  394. package/dist/index.js +100 -7
  395. package/dist/index.js.map +1 -1
  396. package/dist/legal/documents.d.ts +12 -1
  397. package/dist/legal/documents.d.ts.map +1 -1
  398. package/dist/legal/documents.js +98 -14
  399. package/dist/legal/documents.js.map +1 -1
  400. package/dist/legal/index.d.ts +1 -1
  401. package/dist/legal/index.d.ts.map +1 -1
  402. package/dist/legal/index.js +1 -1
  403. package/dist/legal/index.js.map +1 -1
  404. package/dist/legal/types.d.ts +37 -2
  405. package/dist/legal/types.d.ts.map +1 -1
  406. package/dist/legal/types.js.map +1 -1
  407. package/dist/onboarding/persistence.d.ts +10 -1
  408. package/dist/onboarding/persistence.d.ts.map +1 -1
  409. package/dist/onboarding/persistence.js +4 -4
  410. package/dist/onboarding/persistence.js.map +1 -1
  411. package/dist/pilot/go-live-checklist.d.ts +41 -0
  412. package/dist/pilot/go-live-checklist.d.ts.map +1 -0
  413. package/dist/pilot/go-live-checklist.js +209 -0
  414. package/dist/pilot/go-live-checklist.js.map +1 -0
  415. package/dist/pilot/milestone.d.ts +56 -0
  416. package/dist/pilot/milestone.d.ts.map +1 -0
  417. package/dist/pilot/milestone.js +74 -0
  418. package/dist/pilot/milestone.js.map +1 -0
  419. package/dist/platform/capabilities.d.ts +88 -0
  420. package/dist/platform/capabilities.d.ts.map +1 -0
  421. package/dist/platform/capabilities.js +140 -0
  422. package/dist/platform/capabilities.js.map +1 -0
  423. package/dist/platform/job-contract.d.ts +232 -0
  424. package/dist/platform/job-contract.d.ts.map +1 -0
  425. package/dist/platform/job-contract.js +403 -0
  426. package/dist/platform/job-contract.js.map +1 -0
  427. package/dist/rbac/catalog.d.ts.map +1 -1
  428. package/dist/rbac/catalog.js +34 -0
  429. package/dist/rbac/catalog.js.map +1 -1
  430. package/dist/subscription-billing/index.d.ts +6 -5
  431. package/dist/subscription-billing/index.d.ts.map +1 -1
  432. package/dist/subscription-billing/index.js +3 -3
  433. package/dist/subscription-billing/index.js.map +1 -1
  434. package/dist/subscription-billing/service.d.ts +21 -0
  435. package/dist/subscription-billing/service.d.ts.map +1 -1
  436. package/dist/subscription-billing/service.js +90 -15
  437. package/dist/subscription-billing/service.js.map +1 -1
  438. package/dist/tenancy/features.d.ts +69 -0
  439. package/dist/tenancy/features.d.ts.map +1 -0
  440. package/dist/tenancy/features.js +123 -0
  441. package/dist/tenancy/features.js.map +1 -0
  442. package/dist/tenancy/settings.d.ts +63 -0
  443. package/dist/tenancy/settings.d.ts.map +1 -0
  444. package/dist/tenancy/settings.js +218 -0
  445. package/dist/tenancy/settings.js.map +1 -0
  446. package/dist/users/repository.d.ts +16 -1
  447. package/dist/users/repository.d.ts.map +1 -1
  448. package/dist/users/repository.js +24 -1
  449. package/dist/users/repository.js.map +1 -1
  450. package/package.json +9 -2
  451. package/src/db/migrations/0045_role_write_scope.sql +122 -0
  452. package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
  453. package/src/db/migrations/0047_recipient_clearance.sql +89 -0
  454. package/src/db/migrations/0048_item_type_note.sql +16 -0
  455. package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
  456. package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
  457. package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
  458. package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
  459. package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
  460. package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
  461. package/src/db/migrations/0055_job_capability_contract.sql +300 -0
  462. package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
  463. package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
  464. package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
  465. package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.raiseFiscalIntervention = raiseFiscalIntervention;
4
+ exports.resolveFiscalInterventions = resolveFiscalInterventions;
5
+ exports.listFiscalInterventions = listFiscalInterventions;
6
+ const shared_1 = require("@baruk/shared");
7
+ /**
8
+ * Abre a tarefa, ou soma uma ocorrência à que já existe.
9
+ *
10
+ * `detail` é atualizado a cada ocorrência: o motivo mais recente é o mais útil
11
+ * para quem for resolver. É CLASSE e contexto — nunca a resposta do provedor,
12
+ * que cita sujeito de certificado e caminho de arquivo.
13
+ */
14
+ async function raiseFiscalIntervention(tx, input) {
15
+ const now = input.now ?? new Date();
16
+ // O índice único é parcial (`WHERE state <> 'resolved'`), então `ON CONFLICT`
17
+ // não o alcança por nome de coluna. O caminho é tentar o UPDATE primeiro e
18
+ // inserir só quando ninguém foi atingido — nesta ordem, porque a inversa
19
+ // dispararia violação de unicidade no caso comum (a tarefa já existe).
20
+ const atualizados = await tx `
21
+ UPDATE fiscal_intervention
22
+ SET occurrences = occurrences + 1, last_seen_at = ${now}, detail = ${input.detail}
23
+ WHERE state <> 'resolved'
24
+ AND kind = ${input.kind}
25
+ AND client_id IS NOT DISTINCT FROM ${input.clientId ?? null}
26
+ AND source IS NOT DISTINCT FROM ${input.source ?? null}
27
+ AND environment IS NOT DISTINCT FROM ${input.environment ?? null}
28
+ RETURNING id, occurrences
29
+ `;
30
+ const existente = atualizados[0];
31
+ if (existente) {
32
+ return { id: existente.id, created: false, occurrences: existente.occurrences };
33
+ }
34
+ /*
35
+ * A corrida que o lease NÃO cobre.
36
+ *
37
+ * A vez de sincronizar é tomada DEPOIS do portão de credencial — de propósito,
38
+ * porque não faz sentido travar um cliente para descobrir em seguida que o
39
+ * certificado dele venceu. A consequência é que dois workers podem chegar a
40
+ * este ponto ao mesmo tempo para o mesmo cliente: os dois não encontram
41
+ * pendência aberta, e os dois tentam inserir.
42
+ *
43
+ * O segundo bate no índice único parcial. Sem tratamento, a exceção aborta a
44
+ * transação inteira e o ciclo daquele escritório cai — um erro de
45
+ * infraestrutura produzido por dois processos concordando sobre um fato.
46
+ *
47
+ * O `SAVEPOINT` é o que torna a recuperação possível: no PostgreSQL um comando
48
+ * que falha aborta a transação, e daí em diante todo comando devolve `25P02`
49
+ * — inclusive o UPDATE de recuperação. Com savepoint, só a tentativa de
50
+ * inserção é desfeita.
51
+ */
52
+ const id = (0, shared_1.uuidv7)();
53
+ try {
54
+ await tx.savepoint((sp) => sp `
55
+ INSERT INTO fiscal_intervention (
56
+ id, tenant_id, client_id, kind, source, environment, document_type,
57
+ state, detail, occurrences, first_seen_at, last_seen_at
58
+ ) VALUES (
59
+ ${id}, ${input.tenantId}, ${input.clientId ?? null}, ${input.kind},
60
+ ${input.source ?? null}, ${input.environment ?? null}, ${input.documentType ?? null},
61
+ 'open', ${input.detail}, 1, ${now}, ${now}
62
+ )
63
+ `);
64
+ return { id, created: true, occurrences: 1 };
65
+ }
66
+ catch (err) {
67
+ // `23505` é violação de unicidade: alguém abriu a MESMA pendência entre o
68
+ // nosso UPDATE e o nosso INSERT. O desfecho correto é o mesmo do caminho
69
+ // comum — somar uma ocorrência à linha que agora existe.
70
+ const code = err?.code;
71
+ if (code !== '23505')
72
+ throw err;
73
+ const concorrente = await tx `
74
+ UPDATE fiscal_intervention
75
+ SET occurrences = occurrences + 1, last_seen_at = ${now}, detail = ${input.detail}
76
+ WHERE state <> 'resolved'
77
+ AND kind = ${input.kind}
78
+ AND client_id IS NOT DISTINCT FROM ${input.clientId ?? null}
79
+ AND source IS NOT DISTINCT FROM ${input.source ?? null}
80
+ AND environment IS NOT DISTINCT FROM ${input.environment ?? null}
81
+ RETURNING id, occurrences
82
+ `;
83
+ const linha = concorrente[0];
84
+ if (linha)
85
+ return { id: linha.id, created: false, occurrences: linha.occurrences };
86
+ // Nem inseriu nem encontrou: alguém resolveu a pendência no intervalo. Não é
87
+ // erro, e não vale reabrir — o problema deixou de existir para quem olhou.
88
+ return { id, created: false, occurrences: 0 };
89
+ }
90
+ }
91
+ /**
92
+ * Fecha a tarefa quando o problema deixou de existir.
93
+ *
94
+ * Fechamento AUTOMÁTICO só para o que foi observado voltar a funcionar — nunca
95
+ * por decurso de prazo. Uma tarefa que some sozinha depois de uma semana é uma
96
+ * tarefa que ninguém resolveu, apresentada como resolvida.
97
+ */
98
+ async function resolveFiscalInterventions(tx, input) {
99
+ if (input.kinds.length === 0)
100
+ return 0;
101
+ const now = input.now ?? new Date();
102
+ const rows = await tx `
103
+ UPDATE fiscal_intervention
104
+ SET state = 'resolved', resolved_at = ${now}, resolved_by = ${input.resolvedBy ?? null}
105
+ WHERE state <> 'resolved'
106
+ AND kind = ANY (${input.kinds})
107
+ AND client_id IS NOT DISTINCT FROM ${input.clientId ?? null}
108
+ AND source IS NOT DISTINCT FROM ${input.source ?? null}
109
+ AND environment IS NOT DISTINCT FROM ${input.environment ?? null}
110
+ RETURNING id
111
+ `;
112
+ return rows.length;
113
+ }
114
+ /** A fila aberta do escritório, a mais recente primeiro. */
115
+ async function listFiscalInterventions(tx, input = {}) {
116
+ const limit = Math.min(Math.max(input.limit ?? 100, 1), 500);
117
+ const state = input.state ?? 'open';
118
+ const rows = await tx `
119
+ SELECT id, client_id, kind, source, environment, document_type, state, detail,
120
+ occurrences, first_seen_at, last_seen_at
121
+ FROM fiscal_intervention
122
+ WHERE ${state === 'any' ? tx `true` : tx `state = ${state}`}
123
+ ORDER BY last_seen_at DESC
124
+ LIMIT ${limit}
125
+ `;
126
+ return rows.map((r) => ({
127
+ id: r.id,
128
+ clientId: r.client_id,
129
+ kind: r.kind,
130
+ source: r.source,
131
+ environment: r.environment,
132
+ documentType: r.document_type,
133
+ state: r.state,
134
+ detail: r.detail,
135
+ occurrences: r.occurrences,
136
+ firstSeenAt: r.first_seen_at.toISOString(),
137
+ lastSeenAt: r.last_seen_at.toISOString(),
138
+ }));
139
+ }
140
+ //# sourceMappingURL=intervention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intervention.js","sourceRoot":"","sources":["../../../../src/fiscal/sync/intervention.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_LEASE_TTL_MS = void 0;
4
+ exports.acquireFiscalSyncLease = acquireFiscalSyncLease;
5
+ exports.heartbeatFiscalSyncLease = heartbeatFiscalSyncLease;
6
+ exports.releaseFiscalSyncLease = releaseFiscalSyncLease;
7
+ exports.listStaleFiscalSyncLeases = listStaleFiscalSyncLeases;
8
+ const shared_1 = require("@baruk/shared");
9
+ /**
10
+ * Prazo padrão da vez.
11
+ *
12
+ * Dez minutos: mais do que qualquer lote de 50 documentos precisa, e menos do
13
+ * que o intervalo entre ciclos diários — de modo que um worker morto nunca
14
+ * atrase o cliente para o dia seguinte. Lotes longos renovam com `heartbeat`.
15
+ */
16
+ exports.DEFAULT_LEASE_TTL_MS = 10 * 60_000;
17
+ /**
18
+ * Toma a vez. Devolve `null` quando outro processo VIVO a tem.
19
+ *
20
+ * `null` não é erro e não merece log de erro: é a resposta correta e frequente
21
+ * quando dois workers percorrem a mesma carteira.
22
+ */
23
+ async function acquireFiscalSyncLease(tx, input) {
24
+ const now = input.now ?? new Date();
25
+ const expiresAt = new Date(now.getTime() + (input.ttlMs ?? exports.DEFAULT_LEASE_TTL_MS));
26
+ const { stream } = input;
27
+ // A CTE fotografa o titular ANTERIOR. Ela não participa da exclusão — quem
28
+ // exclui é o `ON CONFLICT` —, serve só para dizer se esta tomada veio de uma
29
+ // vez devolvida (caminho normal) ou arrancada de um titular vencido (worker
30
+ // morto). Sob disputa real a segunda transação nem chega aqui: ela bloqueia
31
+ // na linha e depois reprova no `WHERE`.
32
+ const rows = await tx `
33
+ WITH anterior AS (
34
+ SELECT released_at
35
+ FROM fiscal_sync_lease
36
+ WHERE tenant_id = ${input.tenantId} AND client_id = ${stream.clientId}
37
+ AND source = ${stream.source} AND environment = ${stream.environment}
38
+ AND document_type = ${stream.documentType}
39
+ )
40
+ INSERT INTO fiscal_sync_lease (
41
+ id, tenant_id, client_id, source, environment, document_type,
42
+ holder, run_id, acquired_at, heartbeat_at, expires_at, released_at, updated_at
43
+ ) VALUES (
44
+ ${(0, shared_1.uuidv7)()}, ${input.tenantId}, ${stream.clientId}, ${stream.source},
45
+ ${stream.environment}, ${stream.documentType},
46
+ ${input.holder}, ${input.runId ?? null}, ${now}, ${now}, ${expiresAt}, NULL, now()
47
+ )
48
+ ON CONFLICT (tenant_id, client_id, source, environment, document_type)
49
+ DO UPDATE SET
50
+ holder = EXCLUDED.holder,
51
+ run_id = EXCLUDED.run_id,
52
+ acquired_at = EXCLUDED.acquired_at,
53
+ heartbeat_at = EXCLUDED.heartbeat_at,
54
+ expires_at = EXCLUDED.expires_at,
55
+ released_at = NULL,
56
+ -- Só conta como RETOMADA quando o titular anterior não devolveu. Uma vez
57
+ -- livre e devolvida é o caminho normal, e inflá-lo apagaria o sinal de
58
+ -- que existe um worker morrendo no meio do lote.
59
+ recovered_count = fiscal_sync_lease.recovered_count
60
+ + CASE WHEN fiscal_sync_lease.released_at IS NULL THEN 1 ELSE 0 END,
61
+ updated_at = now()
62
+ WHERE fiscal_sync_lease.released_at IS NOT NULL
63
+ OR fiscal_sync_lease.expires_at <= ${now}
64
+ RETURNING id, holder, acquired_at, expires_at, recovered_count,
65
+ (SELECT released_at IS NULL FROM anterior) AS recovered
66
+ `;
67
+ const r = rows[0];
68
+ if (!r)
69
+ return null;
70
+ return {
71
+ id: r.id,
72
+ holder: r.holder,
73
+ acquiredAt: r.acquired_at,
74
+ expiresAt: r.expires_at,
75
+ recoveredCount: r.recovered_count,
76
+ // Sem linha anterior a CTE devolve NULL: é uma vez nova, não uma retomada.
77
+ recovered: r.recovered === true,
78
+ };
79
+ }
80
+ /**
81
+ * Renova o prazo — e confirma que a vez ainda é nossa.
82
+ *
83
+ * O `WHERE holder = ...` não é zelo: um lote que demorou mais do que o prazo já
84
+ * PERDEU a vez para outro worker, e continuar escrevendo depois disso é
85
+ * exatamente a corrida que o lease existe para impedir. `false` significa
86
+ * "pare agora", e quem chama tem de obedecer.
87
+ */
88
+ async function heartbeatFiscalSyncLease(tx, input) {
89
+ const now = input.now ?? new Date();
90
+ const expiresAt = new Date(now.getTime() + (input.ttlMs ?? exports.DEFAULT_LEASE_TTL_MS));
91
+ const rows = await tx `
92
+ UPDATE fiscal_sync_lease
93
+ SET heartbeat_at = ${now}, expires_at = ${expiresAt}, updated_at = now()
94
+ WHERE id = ${input.leaseId}
95
+ AND holder = ${input.holder}
96
+ AND released_at IS NULL
97
+ AND expires_at > ${now}
98
+ RETURNING id
99
+ `;
100
+ return rows.length > 0;
101
+ }
102
+ /**
103
+ * Devolve a vez.
104
+ *
105
+ * Idempotente e tolerante: devolver uma vez que já foi tomada por outro não é
106
+ * erro, é o desfecho normal de um worker que demorou demais. Devolve `false`
107
+ * para que a trilha saiba, sem lançar.
108
+ */
109
+ async function releaseFiscalSyncLease(tx, input) {
110
+ const now = input.now ?? new Date();
111
+ const rows = await tx `
112
+ UPDATE fiscal_sync_lease
113
+ SET released_at = ${now}, updated_at = now()
114
+ WHERE id = ${input.leaseId} AND holder = ${input.holder} AND released_at IS NULL
115
+ RETURNING id
116
+ `;
117
+ return rows.length > 0;
118
+ }
119
+ /**
120
+ * As vezes vencidas que ninguém devolveu.
121
+ *
122
+ * A retomada não depende desta função — `acquire` já toma o que venceu. Ela
123
+ * existe para OBSERVAÇÃO: uma lista que nunca esvazia é um worker que morre
124
+ * sempre no mesmo cliente, e isso é uma pergunta que nenhum contador agregado
125
+ * responde.
126
+ */
127
+ async function listStaleFiscalSyncLeases(tx, now = new Date()) {
128
+ const rows = await tx `
129
+ SELECT id, client_id, source, environment, document_type, holder,
130
+ expires_at, recovered_count
131
+ FROM fiscal_sync_lease
132
+ WHERE released_at IS NULL AND expires_at <= ${now}
133
+ ORDER BY expires_at
134
+ `;
135
+ return rows.map((r) => ({
136
+ id: r.id,
137
+ clientId: r.client_id,
138
+ source: r.source,
139
+ environment: r.environment,
140
+ documentType: r.document_type,
141
+ holder: r.holder,
142
+ expiresAt: r.expires_at,
143
+ recoveredCount: r.recovered_count,
144
+ }));
145
+ }
146
+ //# 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,244 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fiscalOperationalMetrics = fiscalOperationalMetrics;
4
+ exports.fiscalValueMetrics = fiscalValueMetrics;
5
+ exports.listFiscalClientSyncStatus = listFiscalClientSyncStatus;
6
+ async function fiscalOperationalMetrics(tx, now = new Date()) {
7
+ const [runs] = await tx `
8
+ SELECT count(*)::int AS total,
9
+ count(*) FILTER (WHERE outcome IN ('completed','no_documents'))::int AS success,
10
+ count(*) FILTER (WHERE outcome IN ('failed','provider_error'))::int AS failure,
11
+ count(*) FILTER (WHERE outcome LIKE 'blocked%' OR outcome = 'throttled')::int
12
+ AS blocked,
13
+ coalesce(sum(documents_fetched), 0)::int AS fetched,
14
+ coalesce(sum(documents_new), 0)::int AS novos,
15
+ coalesce(sum(documents_duplicate), 0)::int AS dup,
16
+ coalesce(sum(documents_failed), 0)::int AS falhos,
17
+ coalesce(sum(events_pending), 0)::int AS pend,
18
+ coalesce(sum(events_applied), 0)::int AS apl,
19
+ coalesce(sum(events_reconciled), 0)::int AS rec,
20
+ count(*) FILTER (WHERE outcome = 'provider_error')::int AS prov,
21
+ -- Percentil, e não média: uma execução de dez minutos entre mil de um
22
+ -- segundo move a média e não move a mediana — e é a mediana que
23
+ -- descreve o que acontece na maioria das vezes.
24
+ (percentile_disc(0.5) WITHIN GROUP (ORDER BY duration_ms)
25
+ FILTER (WHERE duration_ms IS NOT NULL))::int AS p50,
26
+ max(duration_ms)::int AS max,
27
+ max(finished_at) FILTER (WHERE outcome IN ('completed','no_documents')) AS ultimo
28
+ FROM fiscal_sync_run
29
+ `;
30
+ const [leases] = await tx `
31
+ SELECT coalesce(sum(recovered_count), 0)::int AS recuperacoes,
32
+ count(*) FILTER (WHERE released_at IS NULL AND expires_at <= ${now})::int AS vencidos
33
+ FROM fiscal_sync_lease
34
+ `;
35
+ const [fila] = await tx `
36
+ SELECT count(*)::int AS abertas FROM fiscal_intervention WHERE state <> 'resolved'
37
+ `;
38
+ const [circuitos] = await tx `
39
+ SELECT count(*)::int AS abertos
40
+ FROM fiscal_provider_circuit
41
+ WHERE state = 'open' AND (open_until IS NULL OR open_until > ${now})
42
+ `;
43
+ return {
44
+ runsTotal: runs?.total ?? 0,
45
+ runsSuccess: runs?.success ?? 0,
46
+ runsFailure: runs?.failure ?? 0,
47
+ runsBlocked: runs?.blocked ?? 0,
48
+ documentsFetched: runs?.fetched ?? 0,
49
+ documentsNew: runs?.novos ?? 0,
50
+ documentsDuplicate: runs?.dup ?? 0,
51
+ documentsFailed: runs?.falhos ?? 0,
52
+ eventsPending: runs?.pend ?? 0,
53
+ eventsApplied: runs?.apl ?? 0,
54
+ eventsReconciled: runs?.rec ?? 0,
55
+ providerErrors: runs?.prov ?? 0,
56
+ syncDurationMsP50: runs?.p50 ?? null,
57
+ syncDurationMsMax: runs?.max ?? null,
58
+ lastSuccessfulSyncAt: runs?.ultimo?.toISOString() ?? null,
59
+ leaseRecoveries: leases?.recuperacoes ?? 0,
60
+ staleLeases: leases?.vencidos ?? 0,
61
+ openInterventions: fila?.abertas ?? 0,
62
+ openCircuits: circuitos?.abertos ?? 0,
63
+ };
64
+ }
65
+ async function fiscalValueMetrics(tx) {
66
+ const [docs] = await tx `
67
+ SELECT count(*) FILTER (WHERE source <> 'manual')::int AS automaticos,
68
+ count(*) FILTER (WHERE source <> 'manual' AND raw_blob_id IS NOT NULL
69
+ AND content_kind = 'full')::int AS "comRaw"
70
+ FROM fiscal_document
71
+ `;
72
+ const [pedidos] = await tx `
73
+ -- Competências de "Documentos fiscais do mês" em que a automação trouxe ao
74
+ -- menos um documento daquele cliente. A junção é pela COMPETÊNCIA, não pela
75
+ -- data de emissão: são conceitos independentes, e confundi-los erraria o
76
+ -- fechamento (a mesma distinção que a 0056 registra em competence_label).
77
+ SELECT count(DISTINCT (ri.client_id, c.label))::int AS n
78
+ FROM recurring_instance ri
79
+ JOIN recurring_item_type rit ON rit.id = ri.item_type_id
80
+ JOIN competence c ON c.id = ri.competence_id
81
+ WHERE rit.key = 'docs_fiscais_mes'
82
+ AND ri.deleted_at IS NULL
83
+ AND EXISTS (
84
+ SELECT 1 FROM fiscal_document fd
85
+ WHERE fd.client_id = ri.client_id
86
+ AND fd.competence_label = c.label
87
+ AND fd.source <> 'manual'
88
+ )
89
+ `;
90
+ const [fila] = await tx `
91
+ SELECT count(*) FILTER (WHERE state <> 'resolved')::int AS abertas,
92
+ count(*) FILTER (WHERE state = 'resolved')::int AS resolvidas
93
+ FROM fiscal_intervention
94
+ `;
95
+ return {
96
+ documentsAutomaticallyCollected: docs?.automaticos ?? 0,
97
+ manualDownloadsAvoided: docs?.comRaw ?? 0,
98
+ clientRequestsAvoided: pedidos?.n ?? 0,
99
+ clientRequestsAvoidedBasis: 'upper_bound_no_human_baseline',
100
+ humanInterventionsRequired: fila?.abertas ?? 0,
101
+ humanInterventionsResolved: fila?.resolvidas ?? 0,
102
+ estimatedMinutesSaved: null,
103
+ minutesSavedBlockedBy: 'human_baseline_not_measured',
104
+ };
105
+ }
106
+ /**
107
+ * O painel por cliente.
108
+ *
109
+ * Uma consulta só, e não N+1: a tela lista a carteira inteira, e um `for` com
110
+ * quatro consultas por cliente transformaria trinta clientes em cento e vinte
111
+ * viagens ao banco. A cobertura entra por junção lateral com a MESMA regra do
112
+ * módulo de cobertura — pergunta municipal só é respondida por linha municipal.
113
+ */
114
+ async function listFiscalClientSyncStatus(tx, input = {}) {
115
+ const documentType = input.documentType ?? 'nfse';
116
+ const now = input.now ?? new Date();
117
+ const rows = await tx `
118
+ SELECT c.id AS client_id,
119
+ c.display_name AS client_name,
120
+ c.municipality_ibge_code,
121
+ cur.source,
122
+ cur.environment,
123
+ pol.frequency,
124
+ cur.last_success_at,
125
+ cur.last_started_at,
126
+ cur.next_attempt_after,
127
+ cur.next_eligible_run_at,
128
+ cur.last_error_class,
129
+ cur.consecutive_failures,
130
+ cur.last_nsu,
131
+ (SELECT count(*)::int FROM fiscal_document d
132
+ WHERE d.client_id = c.id AND d.document_type = ${documentType}) AS documentos,
133
+ (SELECT count(*)::int FROM fiscal_intervention i
134
+ WHERE i.client_id = c.id AND i.state <> 'resolved') AS intervencoes,
135
+ (SELECT bool_or(i.kind IN ('certificate_expired','certificate_invalid','auth_required'))
136
+ FROM fiscal_intervention i
137
+ WHERE i.client_id = c.id AND i.state <> 'resolved') AS cred_expirada,
138
+ (SELECT l.holder FROM fiscal_sync_lease l
139
+ WHERE l.client_id = c.id AND l.document_type = ${documentType}
140
+ AND l.released_at IS NULL AND l.expires_at > ${now}
141
+ LIMIT 1) AS lease_holder,
142
+ cov.coverage_status
143
+ FROM client c
144
+ JOIN client_fiscal_enrollment e
145
+ ON e.client_id = c.id AND e.document_type = ${documentType} AND e.revoked_at IS NULL
146
+ LEFT JOIN fiscal_sync_cursor cur
147
+ ON cur.client_id = c.id AND cur.environment = (
148
+ SELECT mode FROM tenant_fiscal_automation LIMIT 1
149
+ )
150
+ LEFT JOIN LATERAL (
151
+ SELECT frequency FROM fiscal_sync_policy p
152
+ WHERE p.document_type = ${documentType}
153
+ AND (p.client_id = c.id OR p.client_id IS NULL)
154
+ ORDER BY p.client_id NULLS LAST
155
+ LIMIT 1
156
+ ) pol ON true
157
+ LEFT JOIN LATERAL (
158
+ -- A MESMA regra do módulo de cobertura, e a razão de ela estar repetida
159
+ -- aqui é performance de listagem: uma pergunta municipal só encontra
160
+ -- linha municipal (a exata do IBGE, senão a padrão). Nunca sobe para a
161
+ -- nacional — é assim que "o ADN cobre o Brasil inteiro" entraria.
162
+ SELECT fc.coverage_status
163
+ FROM fiscal_coverage fc
164
+ WHERE fc.document_type = ${documentType}
165
+ AND fc.jurisdiction_scope = ${documentType === 'nfse' ? 'municipal' : 'national'}
166
+ AND (fc.jurisdiction_code = c.municipality_ibge_code OR fc.jurisdiction_code IS NULL)
167
+ ORDER BY fc.jurisdiction_code NULLS LAST
168
+ LIMIT 1
169
+ ) cov ON true
170
+ WHERE c.deleted_at IS NULL
171
+ ORDER BY c.display_name
172
+ `;
173
+ return rows.map((r) => {
174
+ const cobertura = r.coverage_status ?? 'UNKNOWN';
175
+ const frequency = r.frequency ?? 'disabled';
176
+ const gate = maior(r.next_eligible_run_at, r.next_attempt_after);
177
+ const status = (() => {
178
+ if (r.cred_expirada)
179
+ return 'AUTH_REQUIRED';
180
+ if (cobertura === 'UNSUPPORTED')
181
+ return 'UNSUPPORTED';
182
+ if (frequency === 'disabled')
183
+ return 'DISABLED';
184
+ if (r.lease_holder)
185
+ return 'SYNCING';
186
+ if (r.last_error_class)
187
+ return 'ERROR';
188
+ if (r.last_success_at)
189
+ return (r.intervencoes ?? 0) > 0 ? 'DEGRADED' : 'HEALTHY';
190
+ return 'READY';
191
+ })();
192
+ return {
193
+ clientId: r.client_id,
194
+ clientName: r.client_name,
195
+ documentType,
196
+ source: r.source,
197
+ environment: r.environment,
198
+ status,
199
+ frequency,
200
+ lastSuccessAt: r.last_success_at?.toISOString() ?? null,
201
+ lastStartedAt: r.last_started_at?.toISOString() ?? null,
202
+ nextRunAt: gate?.toISOString() ?? null,
203
+ lastErrorClass: r.last_error_class,
204
+ consecutiveFailures: r.consecutive_failures ?? 0,
205
+ cursor: r.last_nsu,
206
+ documentsCollected: r.documentos,
207
+ openInterventions: r.intervencoes,
208
+ coverageStatus: cobertura,
209
+ leaseHolder: r.lease_holder,
210
+ detail: describe(status, cobertura, frequency),
211
+ };
212
+ });
213
+ }
214
+ function maior(a, b) {
215
+ if (!a)
216
+ return b;
217
+ if (!b)
218
+ return a;
219
+ return a > b ? a : b;
220
+ }
221
+ /** A frase que explica o estado. Fato, nunca conselho genérico. */
222
+ function describe(status, coverage, frequency) {
223
+ switch (status) {
224
+ case 'DISABLED':
225
+ return 'Cadência desligada. Inscrever o cliente não liga a busca automática.';
226
+ case 'UNSUPPORTED':
227
+ return 'Não há caminho de coleta automática conhecido para esta jurisdição.';
228
+ case 'AUTH_REQUIRED':
229
+ return 'Certificado vencido, inválido ou recusado. Só uma pessoa resolve.';
230
+ case 'SYNCING':
231
+ return 'Uma execução está com a vez deste fluxo agora.';
232
+ case 'ERROR':
233
+ return 'A última execução falhou. O cursor não avançou — nada foi perdido.';
234
+ case 'DEGRADED':
235
+ return 'A última execução deu certo, mas há pendência humana aberta.';
236
+ case 'HEALTHY':
237
+ return `Sincronizando em cadência ${frequency}.`;
238
+ case 'READY':
239
+ return coverage === 'UNKNOWN'
240
+ ? 'Habilitado, mas a cobertura desta jurisdição é desconhecida.'
241
+ : 'Habilitado e ainda sem execução concluída.';
242
+ }
243
+ }
244
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../../../../src/fiscal/sync/observability.ts"],"names":[],"mappings":";;AAgDA,4DAiFC;AAoDD,gDAyCC;AA2DD,gEAyHC;AAlWM,KAAK,UAAU,wBAAwB,CAC5C,EAAM,EACN,MAAY,IAAI,IAAI,EAAE;IAEtB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAkBtB;;;;;;;;;;;;;;;;;;;;;;GAsBA,CAAC;IAEF,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAA8C;;0EAEC,GAAG;;GAE1E,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAuB;;GAE7C,CAAC;IACF,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,CAAuB;;;oEAGe,GAAG;GACpE,CAAC;IAEF,OAAO;QACL,SAAS,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;QAC3B,WAAW,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC;QAC/B,WAAW,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC;QAC/B,WAAW,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC;QAC/B,gBAAgB,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC;QACpC,YAAY,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;QAC9B,kBAAkB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAClC,eAAe,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;QAClC,aAAa,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;QAC9B,aAAa,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAC7B,gBAAgB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAChC,cAAc,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;QAC/B,iBAAiB,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI;QACpC,iBAAiB,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI;QACpC,oBAAoB,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,IAAI;QACzD,eAAe,EAAE,MAAM,EAAE,YAAY,IAAI,CAAC;QAC1C,WAAW,EAAE,MAAM,EAAE,QAAQ,IAAI,CAAC;QAClC,iBAAiB,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC;QACrC,YAAY,EAAE,SAAS,EAAE,OAAO,IAAI,CAAC;KACtC,CAAC;AACJ,CAAC;AAoDM,KAAK,UAAU,kBAAkB,CAAC,EAAM;IAC7C,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAA2C;;;;;GAKjE,CAAC;IACF,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,CAAiB;;;;;;;;;;;;;;;;;GAiB1C,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAA2C;;;;GAIjE,CAAC;IAEF,OAAO;QACL,+BAA+B,EAAE,IAAI,EAAE,WAAW,IAAI,CAAC;QACvD,sBAAsB,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;QACzC,qBAAqB,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC;QACtC,0BAA0B,EAAE,+BAA+B;QAC3D,0BAA0B,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC;QAC9C,0BAA0B,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC;QACjD,qBAAqB,EAAE,IAAI;QAC3B,qBAAqB,EAAE,6BAA6B;KACrD,CAAC;AACJ,CAAC;AAmDD;;;;;;;GAOG;AACI,KAAK,UAAU,0BAA0B,CAC9C,EAAM,EACN,QAA2D,EAAE;IAE7D,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC;IAClD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAEpC,MAAM,IAAI,GAAG,MAAM,EAAE,CAqBpB;;;;;;;;;;;;;;;8DAe2D,YAAY;;;;;;;8DAOZ,YAAY;8DACZ,GAAG;;;;;sDAKX,YAAY;;;;;;;mCAO/B,YAAY;;;;;;;;;;;;oCAYX,YAAY;yCACP,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU;;;;;;;GAOxF,CAAC;IAEF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACpB,MAAM,SAAS,GAAG,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC;QACjD,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,UAAU,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAEjE,MAAM,MAAM,GAAkC,CAAC,GAAG,EAAE;YAClD,IAAI,CAAC,CAAC,aAAa;gBAAE,OAAO,eAAe,CAAC;YAC5C,IAAI,SAAS,KAAK,aAAa;gBAAE,OAAO,aAAa,CAAC;YACtD,IAAI,SAAS,KAAK,UAAU;gBAAE,OAAO,UAAU,CAAC;YAChD,IAAI,CAAC,CAAC,YAAY;gBAAE,OAAO,SAAS,CAAC;YACrC,IAAI,CAAC,CAAC,gBAAgB;gBAAE,OAAO,OAAO,CAAC;YACvC,IAAI,CAAC,CAAC,eAAe;gBAAE,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;YACjF,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,EAAE,CAAC;QAEL,OAAO;YACL,QAAQ,EAAE,CAAC,CAAC,SAAS;YACrB,UAAU,EAAE,CAAC,CAAC,WAAW;YACzB,YAAY;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,MAAM;YACN,SAAS;YACT,aAAa,EAAE,CAAC,CAAC,eAAe,EAAE,WAAW,EAAE,IAAI,IAAI;YACvD,aAAa,EAAE,CAAC,CAAC,eAAe,EAAE,WAAW,EAAE,IAAI,IAAI;YACvD,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI;YACtC,cAAc,EAAE,CAAC,CAAC,gBAAgB;YAClC,mBAAmB,EAAE,CAAC,CAAC,oBAAoB,IAAI,CAAC;YAChD,MAAM,EAAE,CAAC,CAAC,QAAQ;YAClB,kBAAkB,EAAE,CAAC,CAAC,UAAU;YAChC,iBAAiB,EAAE,CAAC,CAAC,YAAY;YACjC,cAAc,EAAE,SAAS;YACzB,WAAW,EAAE,CAAC,CAAC,YAAY;YAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;SAC/C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,CAAc,EAAE,CAAc;IAC3C,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,mEAAmE;AACnE,SAAS,QAAQ,CACf,MAAqC,EACrC,QAAgB,EAChB,SAAiB;IAEjB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU;YACb,OAAO,sEAAsE,CAAC;QAChF,KAAK,aAAa;YAChB,OAAO,qEAAqE,CAAC;QAC/E,KAAK,eAAe;YAClB,OAAO,mEAAmE,CAAC;QAC7E,KAAK,SAAS;YACZ,OAAO,gDAAgD,CAAC;QAC1D,KAAK,OAAO;YACV,OAAO,oEAAoE,CAAC;QAC9E,KAAK,UAAU;YACb,OAAO,8DAA8D,CAAC;QACxE,KAAK,SAAS;YACZ,OAAO,6BAA6B,SAAS,GAAG,CAAC;QACnD,KAAK,OAAO;YACV,OAAO,QAAQ,KAAK,SAAS;gBAC3B,CAAC,CAAC,8DAA8D;gBAChE,CAAC,CAAC,4CAA4C,CAAC;IACrD,CAAC;AACH,CAAC"}