@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 @@
1
+ {"version":3,"file":"competence.d.ts","sourceRoot":"","sources":["../../../src/fiscal/collection/competence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAIpC;AAED,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAG,yBAAkC,CAAC;AAE5E;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAgB1E;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,IAAI,GAAG,gBAAgB,CAItE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,gBAAgB,EAC5B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,IAAI,CAYN"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * A janela da coleta — dita por extenso, nunca deduzida.
3
+ *
4
+ * ## O relato que originou este módulo
5
+ *
6
+ * A equipe do escritório chama de "dar baixa nas notas" o trabalho de, na virada
7
+ * do mês, entrar nos portais e recolher os documentos do período. Ao descrever
8
+ * esse trabalho, o relato humano trouxe exemplos de datas que não fechavam entre
9
+ * si — o que é absolutamente normal em conversa, e absolutamente perigoso como
10
+ * fonte de regra.
11
+ *
12
+ * A tentação é transformar "mês anterior" em constante. O erro que isso produz é
13
+ * silencioso: uma coleta rodada em 01/11 sobre uma janela que ninguém confirmou
14
+ * traz documentos de um período que não é o que a pessoa tinha em mente, e a
15
+ * ausência do que faltava só aparece no fechamento.
16
+ *
17
+ * Aqui a competência é um par ano/mês, e o período é um par de DATAS derivado
18
+ * dele. A sugestão padrão existe — mês calendário anterior —, mas ela é uma
19
+ * SUGESTÃO exibida, não um valor implícito: a tela mostra "serão consultados
20
+ * documentos de DD/MM/AAAA a DD/MM/AAAA" antes de qualquer execução, e as duas
21
+ * datas são gravadas na autorização.
22
+ */
23
+ export class InvalidCompetenceError extends Error {
24
+ detail;
25
+ constructor(detail) {
26
+ super(`competência inválida: ${detail}`);
27
+ this.detail = detail;
28
+ this.name = 'InvalidCompetenceError';
29
+ }
30
+ }
31
+ /** A política padrão desta fase, nomeada para poder ser citada e mudada. */
32
+ export const DEFAULT_COMPETENCE_POLICY = 'PREVIOUS_CALENDAR_MONTH';
33
+ /**
34
+ * A competência de um par ano/mês.
35
+ *
36
+ * O último dia sai do calendário: `Date.UTC(ano, mês, 0)` — com o mês em base 1
37
+ * — devolve o último dia daquele mês. Fevereiro bissexto sai de graça, que é o
38
+ * ponto de não escrever `30`.
39
+ */
40
+ export function competenceOf(year, month) {
41
+ if (!Number.isInteger(year) || year < 2000 || year > 2100) {
42
+ throw new InvalidCompetenceError('ano fora de 2000–2100');
43
+ }
44
+ if (!Number.isInteger(month) || month < 1 || month > 12) {
45
+ throw new InvalidCompetenceError('mês fora de 1–12');
46
+ }
47
+ const mm = String(month).padStart(2, '0');
48
+ const lastDay = new Date(Date.UTC(year, month, 0)).getUTCDate();
49
+ return {
50
+ year,
51
+ month,
52
+ label: `${year}-${mm}`,
53
+ periodStart: `${year}-${mm}-01`,
54
+ periodEnd: `${year}-${mm}-${String(lastDay).padStart(2, '0')}`,
55
+ };
56
+ }
57
+ /**
58
+ * A SUGESTÃO padrão para uma execução feita em `reference`: o mês calendário
59
+ * anterior.
60
+ *
61
+ * Chama-se `suggest` e não `default` de propósito. Uma função chamada
62
+ * `defaultCompetence()` acaba sendo usada como valor efetivo por quem não leu;
63
+ * `suggestCompetenceFor()` obriga quem chama a decidir o que fazer com a
64
+ * sugestão — que é exibi-la ao lado das duas datas.
65
+ */
66
+ export function suggestCompetenceFor(reference) {
67
+ const year = reference.getUTCFullYear();
68
+ const month = reference.getUTCMonth() + 1; // base 1
69
+ return month === 1 ? competenceOf(year - 1, 12) : competenceOf(year, month - 1);
70
+ }
71
+ /**
72
+ * Confere uma janela informada à mão contra a competência declarada.
73
+ *
74
+ * Permitir janela manual e conferi-la não são opostos: o operador pode querer um
75
+ * recorte menor dentro do mês — o que é legítimo —, mas uma janela que atravessa
76
+ * a competência declarada significa que um dos dois campos está errado, e gravar
77
+ * os dois deixaria a autorização dizendo duas coisas.
78
+ */
79
+ export function validateWindow(competence, periodStart, periodEnd) {
80
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(periodStart) || !/^\d{4}-\d{2}-\d{2}$/.test(periodEnd)) {
81
+ throw new InvalidCompetenceError('datas devem estar em YYYY-MM-DD');
82
+ }
83
+ if (periodEnd < periodStart) {
84
+ throw new InvalidCompetenceError('data final anterior à inicial');
85
+ }
86
+ if (periodStart < competence.periodStart || periodEnd > competence.periodEnd) {
87
+ throw new InvalidCompetenceError(`janela ${periodStart}..${periodEnd} sai da competência ${competence.label}`);
88
+ }
89
+ }
90
+ //# sourceMappingURL=competence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"competence.js","sourceRoot":"","sources":["../../../src/fiscal/collection/competence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAaH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC1B;IAArB,YAAqB,MAAc;QACjC,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;QADtB,WAAM,GAAN,MAAM,CAAQ;QAEjC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,yBAAyB,GAAG,yBAAkC,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAa;IACtD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;QAC1D,MAAM,IAAI,sBAAsB,CAAC,uBAAuB,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,sBAAsB,CAAC,kBAAkB,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAChE,OAAO;QACL,IAAI;QACJ,KAAK;QACL,KAAK,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE;QACtB,WAAW,EAAE,GAAG,IAAI,IAAI,EAAE,KAAK;QAC/B,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;KAC/D,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAe;IAClD,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS;IACpD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,UAA4B,EAC5B,WAAmB,EACnB,SAAiB;IAEjB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,sBAAsB,CAAC,iCAAiC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,SAAS,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,IAAI,sBAAsB,CAAC,+BAA+B,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;QAC7E,MAAM,IAAI,sBAAsB,CAC9B,UAAU,WAAW,KAAK,SAAS,uBAAuB,UAAU,CAAC,KAAK,EAAE,CAC7E,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,103 @@
1
+ import type { Tx } from '../../db/client.js';
2
+ import { type FiscalEnvironment } from '../eligibility.js';
3
+ import { type FiscalRunAuthorization } from './authorization.js';
4
+ /**
5
+ * O PRIMEIRO CONTATO — a execução única que existe para obter o aceite remoto.
6
+ *
7
+ * ## O impasse que ele desfaz
8
+ *
9
+ * Toda execução exigia `verified_at`. `verified_at` significa "o ambiente
10
+ * oficial já aceitou este material". E só uma execução produz esse aceite. O
11
+ * ciclo se fechava sobre si mesmo, e a primeira consulta real de qualquer
12
+ * cliente era inalcançável por construção — não por configuração, não por falta
13
+ * de certificado.
14
+ *
15
+ * A saída não é afrouxar o portão do worker: é reconhecer que existem DUAS
16
+ * perguntas, e que só uma delas o cron pode responder sozinho.
17
+ *
18
+ * validação LOCAL o arquivo abre, a chave casa, o titular confere, as
19
+ * datas valem. Custa milissegundos, não toca a rede, e
20
+ * acontece no segundo do upload.
21
+ * verificação REMOTA aquele ambiente aceitou aquele material. Custa uma
22
+ * requisição autenticada em nome de um terceiro — e, se
23
+ * feita fora de hora, custa ao CLIENTE um CNPJ bloqueado
24
+ * por consumo indevido.
25
+ *
26
+ * O primeiro contato é o ato que atravessa a segunda pela primeira vez. Por
27
+ * isso ele é manual, único, somente leitura, e assinado por uma pessoa que
28
+ * declarou o responsável contábil.
29
+ *
30
+ * ## Por que o cron jamais chega aqui
31
+ *
32
+ * Não por um `if` neste arquivo — por CHECK no banco (0062): uma autorização
33
+ * com `first_contact = true` e `trigger_kind = 'scheduled'` viola a constraint
34
+ * e a transação morre. Um refactor deste módulo não consegue reabrir a porta.
35
+ *
36
+ * ## O que este módulo NÃO faz
37
+ *
38
+ * Não fala com serviço fiscal nenhum. Ele decide, reivindica e registra; quem
39
+ * fala é o adaptador que lhe é passado. Nesta frente, todo adaptador em uso é
40
+ * sintético — e os portões `connectorImplemented`, `protocolVerified` e o
41
+ * transporte real continuam fechados por conta própria.
42
+ */
43
+ /** Por que o primeiro contato foi recusado. Vocabulário fechado. */
44
+ export type FirstContactRefusal = 'authorization_not_found' | 'authorization_not_first_contact' | 'authorization_expired' | 'authorization_revoked' | 'authorization_already_consumed' | 'authorization_scheduled_trigger' | 'tenant_mismatch' | 'client_mismatch' | 'connector_mismatch' | 'competence_mismatch' | 'credential_fingerprint_mismatch' | 'credential_not_local_valid' | 'credential_already_verified' | 'client_not_enrolled' | 'tenant_automation_disabled' | 'connector_not_implemented' | 'protocol_not_verified' | 'real_transport_disabled' | 'claim_lost';
45
+ export type FirstContactOutcome = {
46
+ status: 'refused';
47
+ reason: FirstContactRefusal;
48
+ detail: string;
49
+ } | {
50
+ status: 'executed';
51
+ runId: string;
52
+ authorization: FiscalRunAuthorization;
53
+ /** O ambiente aceitou o material? Só `true` grava a verificação remota. */
54
+ remoteVerified: boolean;
55
+ documentCount: number;
56
+ };
57
+ /**
58
+ * O que o adaptador precisa devolver para que o aceite remoto seja gravado.
59
+ *
60
+ * `accepted` não é "respondeu 200". É "a resposta foi reconhecida como do
61
+ * contrato deste provedor" — um 200 com corpo de página de erro, um redirect
62
+ * para portal de login, um HTML de manutenção: todos são 200, e nenhum deles
63
+ * prova que o certificado foi aceito.
64
+ */
65
+ export interface FirstContactProbe {
66
+ accepted: boolean;
67
+ /** Classe da recusa, quando houve. NUNCA a mensagem do provedor. */
68
+ failureCode?: string | null;
69
+ documentCount?: number;
70
+ /** Metadados de cursor seguros para trilha (NSU, etc). Sem conteúdo fiscal. */
71
+ cursor?: Record<string, string | number | null>;
72
+ }
73
+ export interface FirstContactInput {
74
+ authorizationId: string;
75
+ tenantId: string;
76
+ clientId: string;
77
+ connector: string;
78
+ environment: FiscalEnvironment;
79
+ competenceYear: number;
80
+ competenceMonth: number;
81
+ actorId: string;
82
+ /**
83
+ * Fala com o provedor. Só é chamado depois de TODOS os portões e depois de a
84
+ * autorização ter sido reivindicada — nunca antes.
85
+ */
86
+ probe: () => Promise<FirstContactProbe>;
87
+ /**
88
+ * O transporte real está habilitado para este conector? Vem de fora porque a
89
+ * flag mora no adaptador, e este módulo não deve conhecer nenhum.
90
+ */
91
+ realTransportEnabled: boolean;
92
+ now?: Date;
93
+ }
94
+ /**
95
+ * Executa o primeiro contato — ou recusa, dizendo exatamente por quê.
96
+ *
97
+ * A ordem dos portões é deliberada e vai do mais barato ao mais caro, com uma
98
+ * regra acima de tudo: **nada que toque credencial ou rede acontece antes de
99
+ * todos os portões de papel terem passado**. Um portão que fechasse depois de o
100
+ * cofre ter sido aberto já teria custado o que se queria evitar.
101
+ */
102
+ export declare function runFirstContact(tx: Tx, input: FirstContactInput): Promise<FirstContactOutcome>;
103
+ //# sourceMappingURL=first-contact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"first-contact.d.ts","sourceRoot":"","sources":["../../../src/fiscal/collection/first-contact.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAI7C,OAAO,EAA6B,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAA2B,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE1F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,oEAAoE;AACpE,MAAM,MAAM,mBAAmB,GAC3B,yBAAyB,GACzB,iCAAiC,GACjC,uBAAuB,GACvB,uBAAuB,GACvB,gCAAgC,GAChC,iCAAiC,GACjC,iBAAiB,GACjB,iBAAiB,GACjB,oBAAoB,GACpB,qBAAqB,GACrB,iCAAiC,GACjC,4BAA4B,GAC5B,6BAA6B,GAC7B,qBAAqB,GACrB,4BAA4B,GAC5B,2BAA2B,GAC3B,uBAAuB,GACvB,yBAAyB,GACzB,YAAY,CAAC;AAEjB,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClE;IACE,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,sBAAsB,CAAC;IACtC,2EAA2E;IAC3E,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEN;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxC;;;OAGG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAC9B,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAQD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,mBAAmB,CAAC,CAgN9B"}
@@ -0,0 +1,201 @@
1
+ import { uuidv7 } from '@baruk/shared';
2
+ import { appendAudit } from '../../audit/audit.js';
3
+ import { coverageForClient } from '../coverage/model.js';
4
+ import { readFiscalCredentialReadiness } from '../credentials/readiness.js';
5
+ import { evaluateFiscalEligibility } from '../eligibility.js';
6
+ import { consumeRunAuthorization } from './authorization.js';
7
+ const recusa = (reason, detail) => ({
8
+ status: 'refused',
9
+ reason,
10
+ detail,
11
+ });
12
+ /**
13
+ * Executa o primeiro contato — ou recusa, dizendo exatamente por quê.
14
+ *
15
+ * A ordem dos portões é deliberada e vai do mais barato ao mais caro, com uma
16
+ * regra acima de tudo: **nada que toque credencial ou rede acontece antes de
17
+ * todos os portões de papel terem passado**. Um portão que fechasse depois de o
18
+ * cofre ter sido aberto já teria custado o que se queria evitar.
19
+ */
20
+ export async function runFirstContact(tx, input) {
21
+ const now = input.now ?? new Date();
22
+ // ═══ 1 · A autorização existe, e é DESTE escopo ═════════════════════════
23
+ const [auth] = await tx `
24
+ SELECT id, tenant_id, client_id, source, environment, competence_year, competence_month,
25
+ operation, first_contact, trigger_kind, credential_fingerprint,
26
+ expires_at, consumed_at, revoked_at
27
+ FROM fiscal_run_authorization
28
+ WHERE id = ${input.authorizationId}
29
+ `;
30
+ if (!auth)
31
+ return recusa('authorization_not_found', 'autorização inexistente');
32
+ // Cada binding é conferido em separado, e a recusa NOMEIA qual falhou. Um
33
+ // "não autorizado" genérico faria toda investigação começar do zero.
34
+ if (auth.tenant_id !== input.tenantId) {
35
+ return recusa('tenant_mismatch', 'autorização é de outra organização');
36
+ }
37
+ if (auth.client_id !== input.clientId) {
38
+ return recusa('client_mismatch', 'autorização é de outro cliente');
39
+ }
40
+ if (auth.source !== input.connector) {
41
+ return recusa('connector_mismatch', `autorização é do conector ${auth.source}`);
42
+ }
43
+ if (auth.competence_year !== input.competenceYear ||
44
+ auth.competence_month !== input.competenceMonth) {
45
+ return recusa('competence_mismatch', 'autorização é de outra competência');
46
+ }
47
+ if (!auth.first_contact) {
48
+ return recusa('authorization_not_first_contact', 'esta autorização não declara primeiro contato');
49
+ }
50
+ if (auth.trigger_kind !== 'manual') {
51
+ return recusa('authorization_scheduled_trigger', 'primeiro contato não aceita agendamento');
52
+ }
53
+ if (auth.revoked_at)
54
+ return recusa('authorization_revoked', 'autorização revogada');
55
+ if (auth.consumed_at)
56
+ return recusa('authorization_already_consumed', 'autorização já consumida');
57
+ if (auth.expires_at <= now)
58
+ return recusa('authorization_expired', 'autorização expirada');
59
+ // ═══ 2 · O escritório e o cliente disseram sim ══════════════════════════
60
+ //
61
+ // A elegibilidade é default-deny e cobre habilitação do tenant e matrícula do
62
+ // cliente. Ela é consultada AQUI, e não confiada à tela: a tela é uma
63
+ // conveniência, o portão é isto.
64
+ const eligibility = await evaluateFiscalEligibility(tx, {
65
+ clientId: input.clientId,
66
+ documentType: documentTypeOf(input.connector),
67
+ environment: input.environment,
68
+ });
69
+ if (!eligibility.eligible) {
70
+ const razoes = new Set(eligibility.reasons);
71
+ if (razoes.has('client_not_enrolled')) {
72
+ return recusa('client_not_enrolled', 'cliente sem matrícula fiscal para este documento');
73
+ }
74
+ if (razoes.has('tenant_automation_disabled') || razoes.has('environment_mismatch')) {
75
+ return recusa('tenant_automation_disabled', 'organização sem automação fiscal habilitada');
76
+ }
77
+ // `credential_not_ready` é ESPERADO aqui — o primeiro contato existe
78
+ // justamente para o caso em que a credencial ainda não foi aceita. Só ele
79
+ // é tolerado; qualquer outro motivo continua fechando.
80
+ const outros = [...razoes].filter((r) => r !== 'credential_not_ready' && r !== 'real_operation_not_declared');
81
+ if (outros.length > 0) {
82
+ return recusa('client_not_enrolled', `inelegível: ${outros.join(', ')}`);
83
+ }
84
+ }
85
+ // ═══ 3 · O conector existe DE VERDADE ══════════════════════════════════
86
+ //
87
+ // Aqui mora a correção da leitura que a C2 encontrou: cobertura oficial é
88
+ // fato do mundo; adaptador implementado é fato do repositório. Autorizar
89
+ // contra um conector inexistente falharia adiante com um erro de sistema, e a
90
+ // tela culparia o certificado.
91
+ const coverage = await coverageForClient(tx, {
92
+ clientId: input.clientId,
93
+ documentType: documentTypeOf(input.connector),
94
+ });
95
+ if (!coverage.connectorImplemented) {
96
+ return recusa('connector_not_implemented', 'este conector ainda não existe no produto');
97
+ }
98
+ if (!coverage.protocolVerified) {
99
+ return recusa('protocol_not_verified', 'o contrato do provedor não foi conferido');
100
+ }
101
+ if (!input.realTransportEnabled) {
102
+ return recusa('real_transport_disabled', 'transporte real desabilitado para este conector');
103
+ }
104
+ // ═══ 4 · A credencial: local válida, e ainda não aceita ═════════════════
105
+ const credential = await readFiscalCredentialReadiness(tx, {
106
+ clientId: input.clientId,
107
+ environment: input.environment,
108
+ source: input.connector,
109
+ });
110
+ if (credential.state === 'READY') {
111
+ // Já aceita: não há primeiro contato a fazer, e insistir gastaria uma
112
+ // requisição autenticada para descobrir o que já se sabe.
113
+ return recusa('credential_already_verified', 'esta credencial já foi aceita pelo ambiente');
114
+ }
115
+ if (!credential.eligibleForFirstContact) {
116
+ return recusa('credential_not_local_valid', `credencial em estado ${credential.state}`);
117
+ }
118
+ // O material aprovado é o material que vai. Trocar o certificado depois de
119
+ // autorizar invalida a autorização — quem assinou aprovou UM arquivo.
120
+ if (auth.credential_fingerprint && auth.credential_fingerprint !== credential.fingerprint) {
121
+ return recusa('credential_fingerprint_mismatch', 'o certificado mudou depois desta autorização');
122
+ }
123
+ // ═══ 5 · A reivindicação — e o banco decide quem ganha ══════════════════
124
+ //
125
+ // O `UPDATE ... WHERE consumed_at IS NULL` de `consumeRunAuthorization` é o
126
+ // que torna a execução única sob concorrência. Dois processos chegando juntos
127
+ // aqui: um recebe a linha, o outro recebe `null`. Nenhum `if` em TypeScript
128
+ // consegue essa garantia.
129
+ const runId = uuidv7();
130
+ const claimed = await consumeRunAuthorization(tx, {
131
+ authorizationId: input.authorizationId,
132
+ runId,
133
+ });
134
+ if (!claimed) {
135
+ return recusa('claim_lost', 'outra execução reivindicou esta autorização primeiro');
136
+ }
137
+ // ═══ 6 · Só agora se fala com o provedor ═══════════════════════════════
138
+ let probe;
139
+ try {
140
+ probe = await input.probe();
141
+ }
142
+ catch {
143
+ // Exceção do transporte não atravessa: a mensagem de um cliente HTTP cita a
144
+ // URL, e URL de provedor carrega credencial.
145
+ probe = { accepted: false, failureCode: 'transport' };
146
+ }
147
+ // O registro do desfecho.
148
+ //
149
+ // `CASE` em vez de montar SQL condicional: um fragmento interpolado no meio
150
+ // de um `SET` é o tipo de construção que funciona no teste e produz sintaxe
151
+ // inválida no primeiro campo a mais.
152
+ //
153
+ // E a tentativa é registrada nos DOIS desfechos — "tentou e o ambiente
154
+ // recusou" e "nunca tentou" pedem coisas opostas de quem opera, e sem esta
155
+ // coluna eram indistinguíveis.
156
+ const falha = probe.accepted ? null : (probe.failureCode ?? 'unknown');
157
+ await tx `
158
+ UPDATE digital_certificate
159
+ SET remote_verification_last_attempt_at = ${now},
160
+ last_verification_error = ${falha},
161
+ verified_at = CASE WHEN ${probe.accepted} THEN ${now} ELSE verified_at END,
162
+ verified_by = CASE WHEN ${probe.accepted} THEN ${input.actorId}::uuid ELSE verified_by END,
163
+ remote_verification_provider =
164
+ CASE WHEN ${probe.accepted} THEN ${input.connector} ELSE remote_verification_provider END,
165
+ updated_at = now()
166
+ WHERE client_id = ${input.clientId}
167
+ AND deleted_at IS NULL
168
+ AND local_validated_at IS NOT NULL
169
+ -- O certificado EXATO que foi aprovado. Sem isto, um cliente com dois
170
+ -- certificados teria os dois marcados por uma execução que usou um só.
171
+ AND (${credential.fingerprint}::text IS NULL OR fingerprint_sha256 = ${credential.fingerprint})
172
+ `;
173
+ await appendAudit(tx, {
174
+ actorId: input.actorId,
175
+ action: probe.accepted ? 'fiscal_first_contact_accepted' : 'fiscal_first_contact_refused',
176
+ resourceType: 'fiscal_run_authorization',
177
+ resourceId: input.authorizationId,
178
+ metadata: {
179
+ runId,
180
+ connector: input.connector,
181
+ environment: input.environment,
182
+ competence: `${input.competenceYear}-${String(input.competenceMonth).padStart(2, '0')}`,
183
+ documentCount: probe.documentCount ?? 0,
184
+ // Classe, nunca mensagem. E nenhum conteúdo fiscal.
185
+ failureCode: probe.accepted ? null : (probe.failureCode ?? 'unknown'),
186
+ cursor: probe.cursor ?? null,
187
+ },
188
+ });
189
+ return {
190
+ status: 'executed',
191
+ runId,
192
+ authorization: claimed,
193
+ remoteVerified: probe.accepted,
194
+ documentCount: probe.documentCount ?? 0,
195
+ };
196
+ }
197
+ /** O tipo de documento que um conector atende. */
198
+ function documentTypeOf(connector) {
199
+ return connector === 'nfse_adn' ? 'nfse' : 'nfe';
200
+ }
201
+ //# 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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAA0B,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,uBAAuB,EAA+B,MAAM,oBAAoB,CAAC;AAkH1F,MAAM,MAAM,GAAG,CAAC,MAA2B,EAAE,MAAc,EAAuB,EAAE,CAAC,CAAC;IACpF,MAAM,EAAE,SAAS;IACjB,MAAM;IACN,MAAM;CACP,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAM,EACN,KAAwB;IAExB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAEpC,2EAA2E;IAC3E,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAiBtB;;;;;kBAKe,KAAK,CAAC,eAAe;GACpC,CAAC;IACF,IAAI,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,CAAC;IAE/E,0EAA0E;IAC1E,qEAAqE;IACrE,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC,oBAAoB,EAAE,6BAA6B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,IACE,IAAI,CAAC,eAAe,KAAK,KAAK,CAAC,cAAc;QAC7C,IAAI,CAAC,gBAAgB,KAAK,KAAK,CAAC,eAAe,EAC/C,CAAC;QACD,OAAO,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACxB,OAAO,MAAM,CACX,iCAAiC,EACjC,+CAA+C,CAChD,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,iCAAiC,EAAE,yCAAyC,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC,uBAAuB,EAAE,sBAAsB,CAAC,CAAC;IACpF,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,MAAM,CAAC,gCAAgC,EAAE,0BAA0B,CAAC,CAAC;IAClG,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG;QAAE,OAAO,MAAM,CAAC,uBAAuB,EAAE,sBAAsB,CAAC,CAAC;IAE3F,2EAA2E;IAC3E,EAAE;IACF,8EAA8E;IAC9E,sEAAsE;IACtE,iCAAiC;IACjC,MAAM,WAAW,GAAG,MAAM,yBAAyB,CAAC,EAAE,EAAE;QACtD,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC;QAC7C,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAC,CAAC;IACH,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,qBAAqB,EAAE,kDAAkD,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACnF,OAAO,MAAM,CAAC,4BAA4B,EAAE,6CAA6C,CAAC,CAAC;QAC7F,CAAC;QACD,qEAAqE;QACrE,0EAA0E;QAC1E,uDAAuD;QACvD,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,sBAAsB,IAAI,CAAC,KAAK,6BAA6B,CAC3E,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC,qBAAqB,EAAE,eAAe,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,EAAE;IACF,0EAA0E;IAC1E,yEAAyE;IACzE,8EAA8E;IAC9E,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE;QAC3C,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC;KAC9C,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,2BAA2B,EAAE,2CAA2C,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,uBAAuB,EAAE,0CAA0C,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,yBAAyB,EAAE,iDAAiD,CAAC,CAAC;IAC9F,CAAC;IAED,2EAA2E;IAC3E,MAAM,UAAU,GAAG,MAAM,6BAA6B,CAAC,EAAE,EAAE;QACzD,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,SAAS;KACxB,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QACjC,sEAAsE;QACtE,0DAA0D;QAC1D,OAAO,MAAM,CAAC,6BAA6B,EAAE,6CAA6C,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC,4BAA4B,EAAE,wBAAwB,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,2EAA2E;IAC3E,sEAAsE;IACtE,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,sBAAsB,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC;QAC1F,OAAO,MAAM,CACX,iCAAiC,EACjC,8CAA8C,CAC/C,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,EAAE;IACF,4EAA4E;IAC5E,8EAA8E;IAC9E,4EAA4E;IAC5E,0BAA0B;IAC1B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,EAAE,EAAE;QAChD,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,KAAK;KACN,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,MAAM,CAAC,YAAY,EAAE,sDAAsD,CAAC,CAAC;IACtF,CAAC;IAED,0EAA0E;IAC1E,IAAI,KAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;QAC5E,6CAA6C;QAC7C,KAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IACxD,CAAC;IAED,0BAA0B;IAC1B,EAAE;IACF,4EAA4E;IAC5E,4EAA4E;IAC5E,qCAAqC;IACrC,EAAE;IACF,uEAAuE;IACvE,2EAA2E;IAC3E,+BAA+B;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;IACvE,MAAM,EAAE,CAAA;;mDAEyC,GAAG;uCACf,KAAK;qCACP,KAAK,CAAC,QAAQ,SAAS,GAAG;qCAC1B,KAAK,CAAC,QAAQ,SAAS,KAAK,CAAC,OAAO;;yBAEhD,KAAK,CAAC,QAAQ,SAAS,KAAK,CAAC,SAAS;;yBAEtC,KAAK,CAAC,QAAQ;;;;;cAKzB,UAAU,CAAC,WAAW,0CAA0C,UAAU,CAAC,WAAW;GACjG,CAAC;IAEF,MAAM,WAAW,CAAC,EAAE,EAAE;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,8BAA8B;QACzF,YAAY,EAAE,0BAA0B;QACxC,UAAU,EAAE,KAAK,CAAC,eAAe;QACjC,QAAQ,EAAE;YACR,KAAK;YACL,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,UAAU,EAAE,GAAG,KAAK,CAAC,cAAc,IAAI,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YACvF,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;YACvC,oDAAoD;YACpD,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,SAAS,CAAC;YACrE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;SAC7B;KACF,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,KAAK;QACL,aAAa,EAAE,OAAO;QACtB,cAAc,EAAE,KAAK,CAAC,QAAQ;QAC9B,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,kDAAkD;AAClD,SAAS,cAAc,CAAC,SAAiB;IACvC,OAAO,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AACnD,CAAC"}
@@ -0,0 +1,74 @@
1
+ import type { Tx } from '../../db/client.js';
2
+ import { type FiscalCoverage } from '../coverage/model.js';
3
+ import type { FiscalDocumentType, FiscalEnvironment } from '../eligibility.js';
4
+ import { type FiscalCompetence } from './competence.js';
5
+ import { type FiscalRunAuthorization } from './authorization.js';
6
+ /**
7
+ * O plano de coleta de uma competência — CALCULADO, não guardado.
8
+ *
9
+ * ## Por que não existe tabela `fiscal_collection_plan`
10
+ *
11
+ * O plano responde a: para este cliente e esta competência, qual conector, qual
12
+ * documento, qual jurisdição, qual credencial, e o que falta. Cada uma dessas
13
+ * respostas já tem dono no banco — cobertura, prontidão da credencial,
14
+ * elegibilidade, autorização. Uma tabela de plano seria uma SEXTA cópia, que
15
+ * envelhece na primeira vez que uma das cinco mudar sem que alguém lembre de
16
+ * recalcular a sexta.
17
+ *
18
+ * Esta casa já pagou por isso: a 0055 criou `client_fiscal_credential` para um
19
+ * fato que `digital_certificate` já guardava, e a 0056 teve de removê-la. Um
20
+ * schema sem consumidor é invenção; um schema com o MESMO fato em dois lugares é
21
+ * pior, porque os dois respondem e discordam.
22
+ *
23
+ * Aqui o plano é uma projeção. Ele nasce da leitura, morre na resposta HTTP, e
24
+ * nunca diverge — porque não há de quê divergir.
25
+ *
26
+ * ## O que o plano NÃO faz
27
+ *
28
+ * Não executa, não autoriza e não liga nada. `readyForControlledTest` é um
29
+ * diagnóstico: significa que os insumos estão no lugar, não que alguém aprovou.
30
+ * A aprovação é `fiscal_run_authorization`, é humana, e é de uma execução só.
31
+ */
32
+ export type CollectionBlocker = 'jurisdiction_unknown' | 'coverage_unknown' | 'coverage_unsupported' | 'credential_not_ready' | 'not_eligible' | 'connector_not_verified' | 'connector_not_implemented' | 'protocol_not_verified' | 'client_not_enrolled' | 'tenant_automation_disabled';
33
+ export interface CollectionPlanEntry {
34
+ documentType: FiscalDocumentType;
35
+ /** Slug da fonte — o mesmo vocabulário de `fiscal_sync_cursor.source`. */
36
+ connector: string;
37
+ jurisdictionScope: string;
38
+ jurisdictionCode: string | null;
39
+ coverage: FiscalCoverage;
40
+ credentialState: string;
41
+ credentialKind: string | null;
42
+ /** Sempre `READ_ONLY` nesta fase, e a 0060 impede gravar outra coisa. */
43
+ operation: 'READ_ONLY';
44
+ /** Ninguém executa por conta própria nesta fase. */
45
+ executionMode: 'manual';
46
+ credentialLocalValid: boolean;
47
+ /** Uma autorização aqui seria de PRIMEIRO CONTATO, e a tela precisa dizer. */
48
+ firstContact: boolean;
49
+ connectorImplemented: boolean;
50
+ protocolVerified: boolean;
51
+ blockers: readonly CollectionBlocker[];
52
+ readyForControlledTest: boolean;
53
+ /** A autorização viva, se houver. `null` significa que falta o portão humano. */
54
+ authorization: FiscalRunAuthorization | null;
55
+ }
56
+ export interface CollectionPlan {
57
+ clientId: string;
58
+ competence: FiscalCompetence;
59
+ /** A sugestão que a tela exibe quando ninguém escolheu — nunca aplicada em silêncio. */
60
+ suggestedCompetence: FiscalCompetence;
61
+ environment: FiscalEnvironment;
62
+ entries: readonly CollectionPlanEntry[];
63
+ /** Verdadeiro só quando TODA entrada está pronta. Um bloqueio basta para negar. */
64
+ readyForControlledTest: boolean;
65
+ }
66
+ export declare function buildCollectionPlan(tx: Tx, input: {
67
+ clientId: string;
68
+ environment: FiscalEnvironment;
69
+ competenceYear?: number;
70
+ competenceMonth?: number;
71
+ documentTypes?: readonly FiscalDocumentType[];
72
+ now?: Date;
73
+ }): Promise<CollectionPlan>;
74
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/fiscal/collection/plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAsC,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAyB,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAExF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,MAAM,iBAAiB,GACzB,sBAAsB,GACtB,kBAAkB,GAClB,sBAAsB,GACtB,sBAAsB,GACtB,cAAc,GACd,wBAAwB,GAMxB,2BAA2B,GAC3B,uBAAuB,GACvB,qBAAqB,GACrB,4BAA4B,CAAC;AAEjC,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,kBAAkB,CAAC;IACjC,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,cAAc,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,yEAAyE;IACzE,SAAS,EAAE,WAAW,CAAC;IACvB,oDAAoD;IACpD,aAAa,EAAE,QAAQ,CAAC;IACxB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,8EAA8E;IAC9E,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACvC,sBAAsB,EAAE,OAAO,CAAC;IAChC,iFAAiF;IACjF,aAAa,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,wFAAwF;IACxF,mBAAmB,EAAE,gBAAgB,CAAC;IACtC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACxC,mFAAmF;IACnF,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAkBD,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GACA,OAAO,CAAC,cAAc,CAAC,CAwGzB"}
@@ -0,0 +1,119 @@
1
+ import { coverageForClient } from '../coverage/model.js';
2
+ import { readFiscalCredentialReadiness } from '../credentials/readiness.js';
3
+ import { evaluateFiscalEligibility } from '../eligibility.js';
4
+ import { competenceOf, suggestCompetenceFor } from './competence.js';
5
+ import { listRunAuthorizations } from './authorization.js';
6
+ /**
7
+ * O conector de cada tipo de documento.
8
+ *
9
+ * Municipal e estadual são conectores SEPARADOS — foi o que o discovery desta
10
+ * fase confirmou, e é o que impede o erro de tratar "dar baixa nas notas" como
11
+ * uma coisa só. A NFS-e do município vem pelo ADN nacional (que é quem recebe o
12
+ * compartilhamento das prefeituras); a NF-e de entrada vem pela distribuição da
13
+ * SEFAZ. Mesmo certificado, protocolos distintos, cursores distintos.
14
+ */
15
+ const CONNECTOR_BY_TYPE = {
16
+ nfse: 'nfse_adn',
17
+ nfe: 'sefaz_dfe',
18
+ cte: 'sefaz_dfe',
19
+ nfce: 'sefaz_dfe',
20
+ };
21
+ export async function buildCollectionPlan(tx, input) {
22
+ const now = input.now ?? new Date();
23
+ const suggested = suggestCompetenceFor(now);
24
+ const competence = input.competenceYear !== undefined && input.competenceMonth !== undefined
25
+ ? competenceOf(input.competenceYear, input.competenceMonth)
26
+ : suggested;
27
+ const types = input.documentTypes ?? ['nfse', 'nfe'];
28
+ const authorizations = await listRunAuthorizations(tx, input.clientId);
29
+ const entries = [];
30
+ for (const documentType of types) {
31
+ const connector = CONNECTOR_BY_TYPE[documentType];
32
+ const coverage = await coverageForClient(tx, { clientId: input.clientId, documentType });
33
+ const credential = await readFiscalCredentialReadiness(tx, {
34
+ clientId: input.clientId,
35
+ environment: input.environment,
36
+ source: connector,
37
+ });
38
+ const eligibility = await evaluateFiscalEligibility(tx, {
39
+ clientId: input.clientId,
40
+ documentType,
41
+ environment: input.environment,
42
+ });
43
+ const blockers = [];
44
+ if (!coverage.jurisdictionKnown)
45
+ blockers.push('jurisdiction_unknown');
46
+ if (coverage.coverageStatus === 'UNKNOWN')
47
+ blockers.push('coverage_unknown');
48
+ if (coverage.coverageStatus === 'UNSUPPORTED')
49
+ blockers.push('coverage_unsupported');
50
+ // A cobertura diz que o CAMINHO existe. Que ele já tenha respondido a este
51
+ // produto é outra afirmação, e ela mora em `verified_at` — vazio aqui
52
+ // significa que o conector nunca foi exercido, e o plano tem de dizer isso
53
+ // em vez de mostrar "conectado" por causa de um certificado salvo.
54
+ if (coverage.officialApiAvailable !== 'yes')
55
+ blockers.push('connector_not_verified');
56
+ // Cada camada com o seu nome. Fundir as três num "não está pronto" foi o que
57
+ // mandou o operador procurar no certificado um defeito de implementação.
58
+ if (!coverage.connectorImplemented)
59
+ blockers.push('connector_not_implemented');
60
+ else if (!coverage.protocolVerified)
61
+ blockers.push('protocol_not_verified');
62
+ // A credencial válida SÓ localmente não é mais um bloqueio absoluto: ela é
63
+ // exatamente o estado que o primeiro contato existe para atravessar. O que
64
+ // continua bloqueando é o cron — e este plano descreve a prova controlada,
65
+ // que é manual por definição.
66
+ if (!credential.usableByWorker && !credential.eligibleForFirstContact) {
67
+ blockers.push('credential_not_ready');
68
+ }
69
+ const motivos = new Set(eligibility.reasons);
70
+ if (motivos.has('client_not_enrolled'))
71
+ blockers.push('client_not_enrolled');
72
+ if (motivos.has('tenant_automation_disabled') || motivos.has('environment_mismatch')) {
73
+ blockers.push('tenant_automation_disabled');
74
+ }
75
+ // `credential_not_ready` da elegibilidade é esperado enquanto o aceite
76
+ // remoto não existir, e já está representado acima com a distinção certa.
77
+ const outros = [...motivos].filter((r) => r !== 'client_not_enrolled' &&
78
+ r !== 'tenant_automation_disabled' &&
79
+ r !== 'environment_mismatch' &&
80
+ r !== 'credential_not_ready' &&
81
+ r !== 'real_operation_not_declared');
82
+ if (outros.length > 0)
83
+ blockers.push('not_eligible');
84
+ const live = authorizations.find((a) => a.state === 'live' &&
85
+ a.source === connector &&
86
+ a.environment === input.environment &&
87
+ a.competence.year === competence.year &&
88
+ a.competence.month === competence.month);
89
+ entries.push({
90
+ documentType,
91
+ connector,
92
+ jurisdictionScope: coverage.jurisdictionScope,
93
+ jurisdictionCode: coverage.jurisdictionCode,
94
+ coverage,
95
+ credentialState: credential.state,
96
+ credentialKind: credential.kind,
97
+ /** O material abre aqui? Independente de algum ambiente já tê-lo aceito. */
98
+ credentialLocalValid: credential.localValid,
99
+ /** Esta prova, se autorizada, seria o primeiro contato com o ambiente. */
100
+ firstContact: credential.eligibleForFirstContact,
101
+ connectorImplemented: coverage.connectorImplemented,
102
+ protocolVerified: coverage.protocolVerified,
103
+ operation: 'READ_ONLY',
104
+ executionMode: 'manual',
105
+ blockers,
106
+ readyForControlledTest: blockers.length === 0,
107
+ authorization: live ?? null,
108
+ });
109
+ }
110
+ return {
111
+ clientId: input.clientId,
112
+ competence,
113
+ suggestedCompetence: suggested,
114
+ environment: input.environment,
115
+ entries,
116
+ readyForControlledTest: entries.length > 0 && entries.every((e) => e.readyForControlledTest),
117
+ };
118
+ }
119
+ //# 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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"}