@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,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runFirstContact = runFirstContact;
4
+ const shared_1 = require("@baruk/shared");
5
+ const audit_js_1 = require("../../audit/audit.js");
6
+ const model_js_1 = require("../coverage/model.js");
7
+ const readiness_js_1 = require("../credentials/readiness.js");
8
+ const eligibility_js_1 = require("../eligibility.js");
9
+ const authorization_js_1 = require("./authorization.js");
10
+ const recusa = (reason, detail) => ({
11
+ status: 'refused',
12
+ reason,
13
+ detail,
14
+ });
15
+ /**
16
+ * Executa o primeiro contato — ou recusa, dizendo exatamente por quê.
17
+ *
18
+ * A ordem dos portões é deliberada e vai do mais barato ao mais caro, com uma
19
+ * regra acima de tudo: **nada que toque credencial ou rede acontece antes de
20
+ * todos os portões de papel terem passado**. Um portão que fechasse depois de o
21
+ * cofre ter sido aberto já teria custado o que se queria evitar.
22
+ */
23
+ async function runFirstContact(tx, input) {
24
+ const now = input.now ?? new Date();
25
+ // ═══ 1 · A autorização existe, e é DESTE escopo ═════════════════════════
26
+ const [auth] = await tx `
27
+ SELECT id, tenant_id, client_id, source, environment, competence_year, competence_month,
28
+ operation, first_contact, trigger_kind, credential_fingerprint,
29
+ expires_at, consumed_at, revoked_at
30
+ FROM fiscal_run_authorization
31
+ WHERE id = ${input.authorizationId}
32
+ `;
33
+ if (!auth)
34
+ return recusa('authorization_not_found', 'autorização inexistente');
35
+ // Cada binding é conferido em separado, e a recusa NOMEIA qual falhou. Um
36
+ // "não autorizado" genérico faria toda investigação começar do zero.
37
+ if (auth.tenant_id !== input.tenantId) {
38
+ return recusa('tenant_mismatch', 'autorização é de outra organização');
39
+ }
40
+ if (auth.client_id !== input.clientId) {
41
+ return recusa('client_mismatch', 'autorização é de outro cliente');
42
+ }
43
+ if (auth.source !== input.connector) {
44
+ return recusa('connector_mismatch', `autorização é do conector ${auth.source}`);
45
+ }
46
+ if (auth.competence_year !== input.competenceYear ||
47
+ auth.competence_month !== input.competenceMonth) {
48
+ return recusa('competence_mismatch', 'autorização é de outra competência');
49
+ }
50
+ if (!auth.first_contact) {
51
+ return recusa('authorization_not_first_contact', 'esta autorização não declara primeiro contato');
52
+ }
53
+ if (auth.trigger_kind !== 'manual') {
54
+ return recusa('authorization_scheduled_trigger', 'primeiro contato não aceita agendamento');
55
+ }
56
+ if (auth.revoked_at)
57
+ return recusa('authorization_revoked', 'autorização revogada');
58
+ if (auth.consumed_at)
59
+ return recusa('authorization_already_consumed', 'autorização já consumida');
60
+ if (auth.expires_at <= now)
61
+ return recusa('authorization_expired', 'autorização expirada');
62
+ // ═══ 2 · O escritório e o cliente disseram sim ══════════════════════════
63
+ //
64
+ // A elegibilidade é default-deny e cobre habilitação do tenant e matrícula do
65
+ // cliente. Ela é consultada AQUI, e não confiada à tela: a tela é uma
66
+ // conveniência, o portão é isto.
67
+ const eligibility = await (0, eligibility_js_1.evaluateFiscalEligibility)(tx, {
68
+ clientId: input.clientId,
69
+ documentType: documentTypeOf(input.connector),
70
+ environment: input.environment,
71
+ });
72
+ if (!eligibility.eligible) {
73
+ const razoes = new Set(eligibility.reasons);
74
+ if (razoes.has('client_not_enrolled')) {
75
+ return recusa('client_not_enrolled', 'cliente sem matrícula fiscal para este documento');
76
+ }
77
+ if (razoes.has('tenant_automation_disabled') || razoes.has('environment_mismatch')) {
78
+ return recusa('tenant_automation_disabled', 'organização sem automação fiscal habilitada');
79
+ }
80
+ // `credential_not_ready` é ESPERADO aqui — o primeiro contato existe
81
+ // justamente para o caso em que a credencial ainda não foi aceita. Só ele
82
+ // é tolerado; qualquer outro motivo continua fechando.
83
+ const outros = [...razoes].filter((r) => r !== 'credential_not_ready' && r !== 'real_operation_not_declared');
84
+ if (outros.length > 0) {
85
+ return recusa('client_not_enrolled', `inelegível: ${outros.join(', ')}`);
86
+ }
87
+ }
88
+ // ═══ 3 · O conector existe DE VERDADE ══════════════════════════════════
89
+ //
90
+ // Aqui mora a correção da leitura que a C2 encontrou: cobertura oficial é
91
+ // fato do mundo; adaptador implementado é fato do repositório. Autorizar
92
+ // contra um conector inexistente falharia adiante com um erro de sistema, e a
93
+ // tela culparia o certificado.
94
+ const coverage = await (0, model_js_1.coverageForClient)(tx, {
95
+ clientId: input.clientId,
96
+ documentType: documentTypeOf(input.connector),
97
+ });
98
+ if (!coverage.connectorImplemented) {
99
+ return recusa('connector_not_implemented', 'este conector ainda não existe no produto');
100
+ }
101
+ if (!coverage.protocolVerified) {
102
+ return recusa('protocol_not_verified', 'o contrato do provedor não foi conferido');
103
+ }
104
+ if (!input.realTransportEnabled) {
105
+ return recusa('real_transport_disabled', 'transporte real desabilitado para este conector');
106
+ }
107
+ // ═══ 4 · A credencial: local válida, e ainda não aceita ═════════════════
108
+ const credential = await (0, readiness_js_1.readFiscalCredentialReadiness)(tx, {
109
+ clientId: input.clientId,
110
+ environment: input.environment,
111
+ source: input.connector,
112
+ });
113
+ if (credential.state === 'READY') {
114
+ // Já aceita: não há primeiro contato a fazer, e insistir gastaria uma
115
+ // requisição autenticada para descobrir o que já se sabe.
116
+ return recusa('credential_already_verified', 'esta credencial já foi aceita pelo ambiente');
117
+ }
118
+ if (!credential.eligibleForFirstContact) {
119
+ return recusa('credential_not_local_valid', `credencial em estado ${credential.state}`);
120
+ }
121
+ // O material aprovado é o material que vai. Trocar o certificado depois de
122
+ // autorizar invalida a autorização — quem assinou aprovou UM arquivo.
123
+ if (auth.credential_fingerprint && auth.credential_fingerprint !== credential.fingerprint) {
124
+ return recusa('credential_fingerprint_mismatch', 'o certificado mudou depois desta autorização');
125
+ }
126
+ // ═══ 5 · A reivindicação — e o banco decide quem ganha ══════════════════
127
+ //
128
+ // O `UPDATE ... WHERE consumed_at IS NULL` de `consumeRunAuthorization` é o
129
+ // que torna a execução única sob concorrência. Dois processos chegando juntos
130
+ // aqui: um recebe a linha, o outro recebe `null`. Nenhum `if` em TypeScript
131
+ // consegue essa garantia.
132
+ const runId = (0, shared_1.uuidv7)();
133
+ const claimed = await (0, authorization_js_1.consumeRunAuthorization)(tx, {
134
+ authorizationId: input.authorizationId,
135
+ runId,
136
+ });
137
+ if (!claimed) {
138
+ return recusa('claim_lost', 'outra execução reivindicou esta autorização primeiro');
139
+ }
140
+ // ═══ 6 · Só agora se fala com o provedor ═══════════════════════════════
141
+ let probe;
142
+ try {
143
+ probe = await input.probe();
144
+ }
145
+ catch {
146
+ // Exceção do transporte não atravessa: a mensagem de um cliente HTTP cita a
147
+ // URL, e URL de provedor carrega credencial.
148
+ probe = { accepted: false, failureCode: 'transport' };
149
+ }
150
+ // O registro do desfecho.
151
+ //
152
+ // `CASE` em vez de montar SQL condicional: um fragmento interpolado no meio
153
+ // de um `SET` é o tipo de construção que funciona no teste e produz sintaxe
154
+ // inválida no primeiro campo a mais.
155
+ //
156
+ // E a tentativa é registrada nos DOIS desfechos — "tentou e o ambiente
157
+ // recusou" e "nunca tentou" pedem coisas opostas de quem opera, e sem esta
158
+ // coluna eram indistinguíveis.
159
+ const falha = probe.accepted ? null : (probe.failureCode ?? 'unknown');
160
+ await tx `
161
+ UPDATE digital_certificate
162
+ SET remote_verification_last_attempt_at = ${now},
163
+ last_verification_error = ${falha},
164
+ verified_at = CASE WHEN ${probe.accepted} THEN ${now} ELSE verified_at END,
165
+ verified_by = CASE WHEN ${probe.accepted} THEN ${input.actorId}::uuid ELSE verified_by END,
166
+ remote_verification_provider =
167
+ CASE WHEN ${probe.accepted} THEN ${input.connector} ELSE remote_verification_provider END,
168
+ updated_at = now()
169
+ WHERE client_id = ${input.clientId}
170
+ AND deleted_at IS NULL
171
+ AND local_validated_at IS NOT NULL
172
+ -- O certificado EXATO que foi aprovado. Sem isto, um cliente com dois
173
+ -- certificados teria os dois marcados por uma execução que usou um só.
174
+ AND (${credential.fingerprint}::text IS NULL OR fingerprint_sha256 = ${credential.fingerprint})
175
+ `;
176
+ await (0, audit_js_1.appendAudit)(tx, {
177
+ actorId: input.actorId,
178
+ action: probe.accepted ? 'fiscal_first_contact_accepted' : 'fiscal_first_contact_refused',
179
+ resourceType: 'fiscal_run_authorization',
180
+ resourceId: input.authorizationId,
181
+ metadata: {
182
+ runId,
183
+ connector: input.connector,
184
+ environment: input.environment,
185
+ competence: `${input.competenceYear}-${String(input.competenceMonth).padStart(2, '0')}`,
186
+ documentCount: probe.documentCount ?? 0,
187
+ // Classe, nunca mensagem. E nenhum conteúdo fiscal.
188
+ failureCode: probe.accepted ? null : (probe.failureCode ?? 'unknown'),
189
+ cursor: probe.cursor ?? null,
190
+ },
191
+ });
192
+ return {
193
+ status: 'executed',
194
+ runId,
195
+ authorization: claimed,
196
+ remoteVerified: probe.accepted,
197
+ documentCount: probe.documentCount ?? 0,
198
+ };
199
+ }
200
+ /** O tipo de documento que um conector atende. */
201
+ function documentTypeOf(connector) {
202
+ return connector === 'nfse_adn' ? 'nfse' : 'nfe';
203
+ }
204
+ //# sourceMappingURL=first-contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"first-contact.js","sourceRoot":"","sources":["../../../../src/fiscal/collection/first-contact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildCollectionPlan = buildCollectionPlan;
4
+ const model_js_1 = require("../coverage/model.js");
5
+ const readiness_js_1 = require("../credentials/readiness.js");
6
+ const eligibility_js_1 = require("../eligibility.js");
7
+ const competence_js_1 = require("./competence.js");
8
+ const authorization_js_1 = require("./authorization.js");
9
+ /**
10
+ * O conector de cada tipo de documento.
11
+ *
12
+ * Municipal e estadual são conectores SEPARADOS — foi o que o discovery desta
13
+ * fase confirmou, e é o que impede o erro de tratar "dar baixa nas notas" como
14
+ * uma coisa só. A NFS-e do município vem pelo ADN nacional (que é quem recebe o
15
+ * compartilhamento das prefeituras); a NF-e de entrada vem pela distribuição da
16
+ * SEFAZ. Mesmo certificado, protocolos distintos, cursores distintos.
17
+ */
18
+ const CONNECTOR_BY_TYPE = {
19
+ nfse: 'nfse_adn',
20
+ nfe: 'sefaz_dfe',
21
+ cte: 'sefaz_dfe',
22
+ nfce: 'sefaz_dfe',
23
+ };
24
+ async function buildCollectionPlan(tx, input) {
25
+ const now = input.now ?? new Date();
26
+ const suggested = (0, competence_js_1.suggestCompetenceFor)(now);
27
+ const competence = input.competenceYear !== undefined && input.competenceMonth !== undefined
28
+ ? (0, competence_js_1.competenceOf)(input.competenceYear, input.competenceMonth)
29
+ : suggested;
30
+ const types = input.documentTypes ?? ['nfse', 'nfe'];
31
+ const authorizations = await (0, authorization_js_1.listRunAuthorizations)(tx, input.clientId);
32
+ const entries = [];
33
+ for (const documentType of types) {
34
+ const connector = CONNECTOR_BY_TYPE[documentType];
35
+ const coverage = await (0, model_js_1.coverageForClient)(tx, { clientId: input.clientId, documentType });
36
+ const credential = await (0, readiness_js_1.readFiscalCredentialReadiness)(tx, {
37
+ clientId: input.clientId,
38
+ environment: input.environment,
39
+ source: connector,
40
+ });
41
+ const eligibility = await (0, eligibility_js_1.evaluateFiscalEligibility)(tx, {
42
+ clientId: input.clientId,
43
+ documentType,
44
+ environment: input.environment,
45
+ });
46
+ const blockers = [];
47
+ if (!coverage.jurisdictionKnown)
48
+ blockers.push('jurisdiction_unknown');
49
+ if (coverage.coverageStatus === 'UNKNOWN')
50
+ blockers.push('coverage_unknown');
51
+ if (coverage.coverageStatus === 'UNSUPPORTED')
52
+ blockers.push('coverage_unsupported');
53
+ // A cobertura diz que o CAMINHO existe. Que ele já tenha respondido a este
54
+ // produto é outra afirmação, e ela mora em `verified_at` — vazio aqui
55
+ // significa que o conector nunca foi exercido, e o plano tem de dizer isso
56
+ // em vez de mostrar "conectado" por causa de um certificado salvo.
57
+ if (coverage.officialApiAvailable !== 'yes')
58
+ blockers.push('connector_not_verified');
59
+ // Cada camada com o seu nome. Fundir as três num "não está pronto" foi o que
60
+ // mandou o operador procurar no certificado um defeito de implementação.
61
+ if (!coverage.connectorImplemented)
62
+ blockers.push('connector_not_implemented');
63
+ else if (!coverage.protocolVerified)
64
+ blockers.push('protocol_not_verified');
65
+ // A credencial válida SÓ localmente não é mais um bloqueio absoluto: ela é
66
+ // exatamente o estado que o primeiro contato existe para atravessar. O que
67
+ // continua bloqueando é o cron — e este plano descreve a prova controlada,
68
+ // que é manual por definição.
69
+ if (!credential.usableByWorker && !credential.eligibleForFirstContact) {
70
+ blockers.push('credential_not_ready');
71
+ }
72
+ const motivos = new Set(eligibility.reasons);
73
+ if (motivos.has('client_not_enrolled'))
74
+ blockers.push('client_not_enrolled');
75
+ if (motivos.has('tenant_automation_disabled') || motivos.has('environment_mismatch')) {
76
+ blockers.push('tenant_automation_disabled');
77
+ }
78
+ // `credential_not_ready` da elegibilidade é esperado enquanto o aceite
79
+ // remoto não existir, e já está representado acima com a distinção certa.
80
+ const outros = [...motivos].filter((r) => r !== 'client_not_enrolled' &&
81
+ r !== 'tenant_automation_disabled' &&
82
+ r !== 'environment_mismatch' &&
83
+ r !== 'credential_not_ready' &&
84
+ r !== 'real_operation_not_declared');
85
+ if (outros.length > 0)
86
+ blockers.push('not_eligible');
87
+ const live = authorizations.find((a) => a.state === 'live' &&
88
+ a.source === connector &&
89
+ a.environment === input.environment &&
90
+ a.competence.year === competence.year &&
91
+ a.competence.month === competence.month);
92
+ entries.push({
93
+ documentType,
94
+ connector,
95
+ jurisdictionScope: coverage.jurisdictionScope,
96
+ jurisdictionCode: coverage.jurisdictionCode,
97
+ coverage,
98
+ credentialState: credential.state,
99
+ credentialKind: credential.kind,
100
+ /** O material abre aqui? Independente de algum ambiente já tê-lo aceito. */
101
+ credentialLocalValid: credential.localValid,
102
+ /** Esta prova, se autorizada, seria o primeiro contato com o ambiente. */
103
+ firstContact: credential.eligibleForFirstContact,
104
+ connectorImplemented: coverage.connectorImplemented,
105
+ protocolVerified: coverage.protocolVerified,
106
+ operation: 'READ_ONLY',
107
+ executionMode: 'manual',
108
+ blockers,
109
+ readyForControlledTest: blockers.length === 0,
110
+ authorization: live ?? null,
111
+ });
112
+ }
113
+ return {
114
+ clientId: input.clientId,
115
+ competence,
116
+ suggestedCompetence: suggested,
117
+ environment: input.environment,
118
+ entries,
119
+ readyForControlledTest: entries.length > 0 && entries.every((e) => e.readyForControlledTest),
120
+ };
121
+ }
122
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../src/fiscal/collection/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ /**
3
+ * Condições de aplicabilidade — uma AST declarativa, tipada e interpretada.
4
+ *
5
+ * ## Por que não uma linguagem
6
+ *
7
+ * A tentação é guardar uma expressão e avaliá-la. Nada aqui é avaliado: não há
8
+ * `eval`, nem `Function`, nem SQL montado, nem código do usuário. A condição é
9
+ * um objeto JSON com formato fechado, validado na escrita e percorrido por um
10
+ * `switch` na leitura. O pior que uma condição malformada consegue fazer é ser
11
+ * recusada.
12
+ *
13
+ * ## Por que não uma floresta de `if`
14
+ *
15
+ * A alternativa seria `requires_employees`, `requires_icms`, `requires_iss`…
16
+ * uma coluna e um `if` por pergunta fiscal. Não escala: cada UF e cada segmento
17
+ * acrescenta perguntas, e o motor vira uma cascata que ninguém consegue ler nem
18
+ * testar. Aqui o motor sabe avaliar **operadores**; o catálogo declara **fatos**.
19
+ *
20
+ * ## O terceiro valor
21
+ *
22
+ * A avaliação não devolve booleano. Devolve `true`, `false` ou **`unknown`** —
23
+ * e `unknown` é o ponto inteiro desta fase. Um cliente sobre o qual ninguém
24
+ * disse se tem empregados não é "sem empregados": é desconhecido, e a decisão
25
+ * segura é não gerar nem declarar isento. Colapsar `unknown` em `false` é
26
+ * exatamente o defeito que a auditoria nacional encontrou.
27
+ */
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.InvalidCondition = void 0;
30
+ exports.parseCondition = parseCondition;
31
+ exports.referencedAttributes = referencedAttributes;
32
+ exports.evaluate = evaluate;
33
+ exports.missingAttributes = missingAttributes;
34
+ const OPS = new Set(['always', 'eq', 'neq', 'in', 'not_in', 'exists', 'not_exists', 'and', 'or']);
35
+ class InvalidCondition extends Error {
36
+ constructor(message) {
37
+ super(message);
38
+ this.name = 'InvalidCondition';
39
+ }
40
+ }
41
+ exports.InvalidCondition = InvalidCondition;
42
+ /**
43
+ * Valida a forma ANTES de gravar.
44
+ *
45
+ * Uma condição malformada gravada é uma regra que ninguém consegue avaliar, e
46
+ * o motor descobriria isso na madrugada do vencimento. Recusar na escrita é
47
+ * mais barato que descobrir na geração.
48
+ *
49
+ * `maxDepth` existe porque uma AST profunda o bastante estoura a pilha na
50
+ * avaliação, e a escrita é onde isso pode ser recusado com uma mensagem.
51
+ */
52
+ function parseCondition(raw, depth = 0) {
53
+ if (depth > 12)
54
+ throw new InvalidCondition('condição aninhada demais (limite 12)');
55
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
56
+ throw new InvalidCondition('condição precisa ser um objeto');
57
+ }
58
+ const o = raw;
59
+ const op = o['op'];
60
+ if (typeof op !== 'string' || !OPS.has(op)) {
61
+ throw new InvalidCondition(`operador desconhecido: ${String(op)}`);
62
+ }
63
+ const attr = () => {
64
+ const a = o['attribute'];
65
+ if (typeof a !== 'string' || a.length === 0) {
66
+ throw new InvalidCondition(`${op} exige "attribute"`);
67
+ }
68
+ return a;
69
+ };
70
+ const scalar = () => {
71
+ const v = o['value'];
72
+ if (typeof v !== 'string' && typeof v !== 'boolean') {
73
+ throw new InvalidCondition(`${op} exige "value" texto ou booleano`);
74
+ }
75
+ return v;
76
+ };
77
+ const list = () => {
78
+ const v = o['values'];
79
+ if (!Array.isArray(v) || v.length === 0) {
80
+ throw new InvalidCondition(`${op} exige "values" não vazio`);
81
+ }
82
+ return v.map((x) => {
83
+ if (typeof x !== 'string' && typeof x !== 'boolean') {
84
+ throw new InvalidCondition(`${op} aceita apenas texto ou booleano em "values"`);
85
+ }
86
+ return x;
87
+ });
88
+ };
89
+ const children = () => {
90
+ const v = o['of'];
91
+ if (!Array.isArray(v) || v.length === 0) {
92
+ throw new InvalidCondition(`${op} exige "of" não vazio`);
93
+ }
94
+ return v.map((c) => parseCondition(c, depth + 1));
95
+ };
96
+ switch (op) {
97
+ case 'always':
98
+ return { op: 'always' };
99
+ case 'eq':
100
+ return { op: 'eq', attribute: attr(), value: scalar() };
101
+ case 'neq':
102
+ return { op: 'neq', attribute: attr(), value: scalar() };
103
+ case 'in':
104
+ return { op: 'in', attribute: attr(), values: list() };
105
+ case 'not_in':
106
+ return { op: 'not_in', attribute: attr(), values: list() };
107
+ case 'exists':
108
+ return { op: 'exists', attribute: attr() };
109
+ case 'not_exists':
110
+ return { op: 'not_exists', attribute: attr() };
111
+ case 'and':
112
+ return { op: 'and', of: children() };
113
+ default:
114
+ return { op: 'or', of: children() };
115
+ }
116
+ }
117
+ /** Atributos citados pela condição — o motor usa para explicar o que faltou. */
118
+ function referencedAttributes(c, into = new Set()) {
119
+ switch (c.op) {
120
+ case 'always':
121
+ break;
122
+ case 'and':
123
+ case 'or':
124
+ for (const child of c.of)
125
+ referencedAttributes(child, into);
126
+ break;
127
+ default:
128
+ into.add(c.attribute);
129
+ }
130
+ return into;
131
+ }
132
+ /**
133
+ * Avalia em lógica ternária.
134
+ *
135
+ * As regras de `and` e `or` são as de Kleene, e a escolha importa:
136
+ *
137
+ * - `and` com um `false` é `false` mesmo havendo desconhecidos — não adianta
138
+ * saber o resto, a regra já não se aplica;
139
+ * - `or` com um `true` é `true` pelo mesmo motivo;
140
+ * - fora esses casos, qualquer desconhecido torna o todo desconhecido.
141
+ *
142
+ * Sem isso, uma regra "Simples E tem empregados" avaliada para um cliente do
143
+ * Lucro Real sem informação de folha devolveria `unknown` e viraria pendência
144
+ * na mesa de alguém — quando a resposta já era `false` pelo regime.
145
+ */
146
+ function evaluate(condition, profile) {
147
+ switch (condition.op) {
148
+ case 'always':
149
+ return true;
150
+ case 'exists':
151
+ return profile[condition.attribute] !== undefined;
152
+ case 'not_exists':
153
+ return profile[condition.attribute] === undefined;
154
+ case 'eq':
155
+ case 'neq': {
156
+ const v = profile[condition.attribute];
157
+ if (v === undefined)
158
+ return 'unknown';
159
+ const igual = v === condition.value;
160
+ return condition.op === 'eq' ? igual : !igual;
161
+ }
162
+ case 'in':
163
+ case 'not_in': {
164
+ const v = profile[condition.attribute];
165
+ if (v === undefined)
166
+ return 'unknown';
167
+ const dentro = condition.values.includes(v);
168
+ return condition.op === 'in' ? dentro : !dentro;
169
+ }
170
+ case 'and': {
171
+ let desconhecido = false;
172
+ for (const c of condition.of) {
173
+ const r = evaluate(c, profile);
174
+ if (r === false)
175
+ return false;
176
+ if (r === 'unknown')
177
+ desconhecido = true;
178
+ }
179
+ return desconhecido ? 'unknown' : true;
180
+ }
181
+ default: {
182
+ let desconhecido = false;
183
+ for (const c of condition.of) {
184
+ const r = evaluate(c, profile);
185
+ if (r === true)
186
+ return true;
187
+ if (r === 'unknown')
188
+ desconhecido = true;
189
+ }
190
+ return desconhecido ? 'unknown' : false;
191
+ }
192
+ }
193
+ }
194
+ /** Atributos citados que o perfil não conhece — a explicação do `unknown`. */
195
+ function missingAttributes(condition, profile) {
196
+ return [...referencedAttributes(condition)].filter((a) => profile[a] === undefined).sort();
197
+ }
198
+ //# sourceMappingURL=conditions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditions.js","sourceRoot":"","sources":["../../../src/fiscal/conditions.ts"],"names":[],"mappings":"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"}