@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.
- package/.baruk-provenance.json +4 -4
- package/CHANGELOG.md +42 -0
- package/dist/audit/repository.d.ts +33 -1
- package/dist/audit/repository.d.ts.map +1 -1
- package/dist/audit/repository.js +41 -7
- package/dist/audit/repository.js.map +1 -1
- package/dist/auth/service.d.ts +21 -0
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +46 -1
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +41 -1
- package/dist/billing/ar-repository.d.ts.map +1 -1
- package/dist/billing/ar-repository.js +82 -6
- package/dist/billing/ar-repository.js.map +1 -1
- package/dist/billing/provider-account.d.ts +38 -0
- package/dist/billing/provider-account.d.ts.map +1 -1
- package/dist/billing/provider-account.js +58 -2
- package/dist/billing/provider-account.js.map +1 -1
- package/dist/billing/repository.d.ts +44 -0
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +49 -5
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/audit/repository.js +41 -7
- package/dist/cjs/audit/repository.js.map +1 -1
- package/dist/cjs/auth/service.js +46 -1
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +82 -6
- package/dist/cjs/billing/ar-repository.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +60 -1
- package/dist/cjs/billing/provider-account.js.map +1 -1
- package/dist/cjs/billing/repository.js +51 -5
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/ibge.js +117 -0
- package/dist/cjs/clients/ibge.js.map +1 -0
- package/dist/cjs/clients/registry/http.js +157 -0
- package/dist/cjs/clients/registry/http.js.map +1 -0
- package/dist/cjs/clients/registry/ibge-municipios.js +28 -0
- package/dist/cjs/clients/registry/ibge-municipios.js.map +1 -0
- package/dist/cjs/clients/registry/ibge.js +63 -0
- package/dist/cjs/clients/registry/ibge.js.map +1 -0
- package/dist/cjs/clients/registry/lookup.js +191 -0
- package/dist/cjs/clients/registry/lookup.js.map +1 -0
- package/dist/cjs/clients/registry/provider.js +34 -0
- package/dist/cjs/clients/registry/provider.js.map +1 -0
- package/dist/cjs/clients/registry/resolve.js +47 -0
- package/dist/cjs/clients/registry/resolve.js.map +1 -0
- package/dist/cjs/clients/registry/serpro.js +149 -0
- package/dist/cjs/clients/registry/serpro.js.map +1 -0
- package/dist/cjs/clients/registry/service.js +230 -0
- package/dist/cjs/clients/registry/service.js.map +1 -0
- package/dist/cjs/clients/registry/synthetic.js +165 -0
- package/dist/cjs/clients/registry/synthetic.js.map +1 -0
- package/dist/cjs/clients/repository.js +190 -9
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +190 -0
- package/dist/cjs/collection/branding.js.map +1 -1
- package/dist/cjs/collection/clearance-store.js +74 -0
- package/dist/cjs/collection/clearance-store.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +65 -2
- package/dist/cjs/collection/communication-runtime.js.map +1 -1
- package/dist/cjs/collection/engine.js +20 -0
- package/dist/cjs/collection/engine.js.map +1 -1
- package/dist/cjs/collection/policy.js +29 -1
- package/dist/cjs/collection/policy.js.map +1 -1
- package/dist/cjs/communication/clearance.js +18 -0
- package/dist/cjs/communication/clearance.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +5 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -1
- package/dist/cjs/communication/engine.js +12 -0
- package/dist/cjs/communication/engine.js.map +1 -1
- package/dist/cjs/communication/policy.js.map +1 -1
- package/dist/cjs/competence/business-days.js +155 -0
- package/dist/cjs/competence/business-days.js.map +1 -0
- package/dist/cjs/competence/catalog-validation.js +174 -0
- package/dist/cjs/competence/catalog-validation.js.map +1 -0
- package/dist/cjs/competence/obligation-preview.js +190 -0
- package/dist/cjs/competence/obligation-preview.js.map +1 -0
- package/dist/cjs/competence/repository.js +330 -17
- package/dist/cjs/competence/repository.js.map +1 -1
- package/dist/cjs/dashboard/pilot-panel.js +90 -0
- package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
- package/dist/cjs/dashboard/repository.js +11 -1
- package/dist/cjs/dashboard/repository.js.map +1 -1
- package/dist/cjs/db/client.js +17 -11
- package/dist/cjs/db/client.js.map +1 -1
- package/dist/cjs/db/provision-e2e-identity.js +116 -0
- package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
- package/dist/cjs/fiscal/applicability.js +164 -0
- package/dist/cjs/fiscal/applicability.js.map +1 -0
- package/dist/cjs/fiscal/collection/authorization.js +186 -0
- package/dist/cjs/fiscal/collection/authorization.js.map +1 -0
- package/dist/cjs/fiscal/collection/competence.js +97 -0
- package/dist/cjs/fiscal/collection/competence.js.map +1 -0
- package/dist/cjs/fiscal/collection/first-contact.js +204 -0
- package/dist/cjs/fiscal/collection/first-contact.js.map +1 -0
- package/dist/cjs/fiscal/collection/plan.js +122 -0
- package/dist/cjs/fiscal/collection/plan.js.map +1 -0
- package/dist/cjs/fiscal/conditions.js +198 -0
- package/dist/cjs/fiscal/conditions.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/cjs/fiscal/coverage/model.js +137 -0
- package/dist/cjs/fiscal/coverage/model.js.map +1 -0
- package/dist/cjs/fiscal/coverage/requests.js +99 -0
- package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
- package/dist/cjs/fiscal/credentials/inspect.js +182 -0
- package/dist/cjs/fiscal/credentials/inspect.js.map +1 -0
- package/dist/cjs/fiscal/credentials/material.js +168 -0
- package/dist/cjs/fiscal/credentials/material.js.map +1 -0
- package/dist/cjs/fiscal/credentials/onboarding.js +266 -0
- package/dist/cjs/fiscal/credentials/onboarding.js.map +1 -0
- package/dist/cjs/fiscal/credentials/readiness.js +190 -0
- package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
- package/dist/cjs/fiscal/eligibility.js +199 -0
- package/dist/cjs/fiscal/eligibility.js.map +1 -0
- package/dist/cjs/fiscal/enrollment.js +134 -0
- package/dist/cjs/fiscal/enrollment.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/direction.js +36 -0
- package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/provider.js +51 -0
- package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/repository.js +132 -0
- package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/cjs/fiscal/repository.js +470 -0
- package/dist/cjs/fiscal/repository.js.map +1 -0
- package/dist/cjs/fiscal/sync/circuit.js +124 -0
- package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
- package/dist/cjs/fiscal/sync/intervention.js +140 -0
- package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
- package/dist/cjs/fiscal/sync/lease.js +146 -0
- package/dist/cjs/fiscal/sync/lease.js.map +1 -0
- package/dist/cjs/fiscal/sync/observability.js +244 -0
- package/dist/cjs/fiscal/sync/observability.js.map +1 -0
- package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
- package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/cjs/fiscal/sync/policy.js +143 -0
- package/dist/cjs/fiscal/sync/policy.js.map +1 -0
- package/dist/cjs/fiscal/sync/reprocess.js +241 -0
- package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
- package/dist/cjs/fiscal/sync/retry.js +183 -0
- package/dist/cjs/fiscal/sync/retry.js.map +1 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/cjs/fiscal/transport/https.js +309 -0
- package/dist/cjs/fiscal/transport/https.js.map +1 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js +380 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/cjs/fiscal/transport/types.js +93 -0
- package/dist/cjs/fiscal/transport/types.js.map +1 -0
- package/dist/cjs/import/br-documents.js +85 -0
- package/dist/cjs/import/br-documents.js.map +1 -0
- package/dist/cjs/import/clients-import.js +347 -40
- package/dist/cjs/import/clients-import.js.map +1 -1
- package/dist/cjs/index.js +461 -73
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +164 -19
- package/dist/cjs/legal/documents.js.map +1 -1
- package/dist/cjs/legal/index.js +3 -1
- package/dist/cjs/legal/index.js.map +1 -1
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/onboarding/persistence.js +4 -4
- package/dist/cjs/onboarding/persistence.js.map +1 -1
- package/dist/cjs/pilot/go-live-checklist.js +212 -0
- package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
- package/dist/cjs/pilot/milestone.js +79 -0
- package/dist/cjs/pilot/milestone.js.map +1 -0
- package/dist/cjs/platform/capabilities.js +173 -0
- package/dist/cjs/platform/capabilities.js.map +1 -0
- package/dist/cjs/platform/job-contract.js +411 -0
- package/dist/cjs/platform/job-contract.js.map +1 -0
- package/dist/cjs/rbac/catalog.js +110 -0
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/subscription-billing/index.js +9 -1
- package/dist/cjs/subscription-billing/index.js.map +1 -1
- package/dist/cjs/subscription-billing/platform-exemption.js +121 -0
- package/dist/cjs/subscription-billing/platform-exemption.js.map +1 -0
- package/dist/cjs/subscription-billing/service.js +246 -78
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/tenancy/features.js +131 -0
- package/dist/cjs/tenancy/features.js.map +1 -0
- package/dist/cjs/tenancy/settings.js +224 -0
- package/dist/cjs/tenancy/settings.js.map +1 -0
- package/dist/cjs/users/repository.js +24 -1
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +92 -5
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/ibge.d.ts +17 -0
- package/dist/clients/ibge.d.ts.map +1 -0
- package/dist/clients/ibge.js +112 -0
- package/dist/clients/ibge.js.map +1 -0
- package/dist/clients/registry/http.d.ts +61 -0
- package/dist/clients/registry/http.d.ts.map +1 -0
- package/dist/clients/registry/http.js +151 -0
- package/dist/clients/registry/http.js.map +1 -0
- package/dist/clients/registry/ibge-municipios.d.ts +25 -0
- package/dist/clients/registry/ibge-municipios.d.ts.map +1 -0
- package/dist/clients/registry/ibge-municipios.js +25 -0
- package/dist/clients/registry/ibge-municipios.js.map +1 -0
- package/dist/clients/registry/ibge.d.ts +62 -0
- package/dist/clients/registry/ibge.d.ts.map +1 -0
- package/dist/clients/registry/ibge.js +57 -0
- package/dist/clients/registry/ibge.js.map +1 -0
- package/dist/clients/registry/lookup.d.ts +94 -0
- package/dist/clients/registry/lookup.d.ts.map +1 -0
- package/dist/clients/registry/lookup.js +184 -0
- package/dist/clients/registry/lookup.js.map +1 -0
- package/dist/clients/registry/provider.d.ts +124 -0
- package/dist/clients/registry/provider.d.ts.map +1 -0
- package/dist/clients/registry/provider.js +39 -0
- package/dist/clients/registry/provider.js.map +1 -0
- package/dist/clients/registry/resolve.d.ts +36 -0
- package/dist/clients/registry/resolve.d.ts.map +1 -0
- package/dist/clients/registry/resolve.js +44 -0
- package/dist/clients/registry/resolve.js.map +1 -0
- package/dist/clients/registry/serpro.d.ts +57 -0
- package/dist/clients/registry/serpro.d.ts.map +1 -0
- package/dist/clients/registry/serpro.js +143 -0
- package/dist/clients/registry/serpro.js.map +1 -0
- package/dist/clients/registry/service.d.ts +59 -0
- package/dist/clients/registry/service.d.ts.map +1 -0
- package/dist/clients/registry/service.js +225 -0
- package/dist/clients/registry/service.js.map +1 -0
- package/dist/clients/registry/synthetic.d.ts +30 -0
- package/dist/clients/registry/synthetic.d.ts.map +1 -0
- package/dist/clients/registry/synthetic.js +161 -0
- package/dist/clients/registry/synthetic.js.map +1 -0
- package/dist/clients/repository.d.ts +158 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +186 -9
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +65 -0
- package/dist/collection/branding.d.ts.map +1 -1
- package/dist/collection/branding.js +186 -0
- package/dist/collection/branding.js.map +1 -1
- package/dist/collection/clearance-store.d.ts +39 -0
- package/dist/collection/clearance-store.d.ts.map +1 -0
- package/dist/collection/clearance-store.js +69 -0
- package/dist/collection/clearance-store.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +37 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -1
- package/dist/collection/communication-runtime.js +63 -1
- package/dist/collection/communication-runtime.js.map +1 -1
- package/dist/collection/engine.d.ts +23 -0
- package/dist/collection/engine.d.ts.map +1 -1
- package/dist/collection/engine.js +20 -0
- package/dist/collection/engine.js.map +1 -1
- package/dist/collection/policy.d.ts +25 -0
- package/dist/collection/policy.d.ts.map +1 -1
- package/dist/collection/policy.js +27 -0
- package/dist/collection/policy.js.map +1 -1
- package/dist/communication/clearance.d.ts +53 -0
- package/dist/communication/clearance.d.ts.map +1 -0
- package/dist/communication/clearance.js +15 -0
- package/dist/communication/clearance.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -1
- package/dist/communication/dry-run-scenario.js +5 -0
- package/dist/communication/dry-run-scenario.js.map +1 -1
- package/dist/communication/engine.d.ts +10 -0
- package/dist/communication/engine.d.ts.map +1 -1
- package/dist/communication/engine.js +12 -0
- package/dist/communication/engine.js.map +1 -1
- package/dist/communication/policy.d.ts +16 -0
- package/dist/communication/policy.d.ts.map +1 -1
- package/dist/communication/policy.js.map +1 -1
- package/dist/competence/business-days.d.ts +51 -0
- package/dist/competence/business-days.d.ts.map +1 -0
- package/dist/competence/business-days.js +145 -0
- package/dist/competence/business-days.js.map +1 -0
- package/dist/competence/catalog-validation.d.ts +86 -0
- package/dist/competence/catalog-validation.d.ts.map +1 -0
- package/dist/competence/catalog-validation.js +168 -0
- package/dist/competence/catalog-validation.js.map +1 -0
- package/dist/competence/obligation-preview.d.ts +103 -0
- package/dist/competence/obligation-preview.d.ts.map +1 -0
- package/dist/competence/obligation-preview.js +184 -0
- package/dist/competence/obligation-preview.js.map +1 -0
- package/dist/competence/repository.d.ts +139 -1
- package/dist/competence/repository.d.ts.map +1 -1
- package/dist/competence/repository.js +325 -17
- package/dist/competence/repository.js.map +1 -1
- package/dist/dashboard/pilot-panel.d.ts +100 -0
- package/dist/dashboard/pilot-panel.d.ts.map +1 -0
- package/dist/dashboard/pilot-panel.js +87 -0
- package/dist/dashboard/pilot-panel.js.map +1 -0
- package/dist/dashboard/repository.d.ts.map +1 -1
- package/dist/dashboard/repository.js +11 -1
- package/dist/dashboard/repository.js.map +1 -1
- package/dist/db/client.d.ts +45 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +16 -11
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrate.d.ts +36 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +199 -32
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/provision-e2e-identity.d.ts +2 -0
- package/dist/db/provision-e2e-identity.d.ts.map +1 -0
- package/dist/db/provision-e2e-identity.js +114 -0
- package/dist/db/provision-e2e-identity.js.map +1 -0
- package/dist/fiscal/applicability.d.ts +73 -0
- package/dist/fiscal/applicability.d.ts.map +1 -0
- package/dist/fiscal/applicability.js +160 -0
- package/dist/fiscal/applicability.js.map +1 -0
- package/dist/fiscal/collection/authorization.d.ts +152 -0
- package/dist/fiscal/collection/authorization.d.ts.map +1 -0
- package/dist/fiscal/collection/authorization.js +178 -0
- package/dist/fiscal/collection/authorization.js.map +1 -0
- package/dist/fiscal/collection/competence.d.ts +66 -0
- package/dist/fiscal/collection/competence.d.ts.map +1 -0
- package/dist/fiscal/collection/competence.js +90 -0
- package/dist/fiscal/collection/competence.js.map +1 -0
- package/dist/fiscal/collection/first-contact.d.ts +103 -0
- package/dist/fiscal/collection/first-contact.d.ts.map +1 -0
- package/dist/fiscal/collection/first-contact.js +201 -0
- package/dist/fiscal/collection/first-contact.js.map +1 -0
- package/dist/fiscal/collection/plan.d.ts +74 -0
- package/dist/fiscal/collection/plan.d.ts.map +1 -0
- package/dist/fiscal/collection/plan.js +119 -0
- package/dist/fiscal/collection/plan.js.map +1 -0
- package/dist/fiscal/conditions.d.ts +99 -0
- package/dist/fiscal/conditions.d.ts.map +1 -0
- package/dist/fiscal/conditions.js +190 -0
- package/dist/fiscal/conditions.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/fiscal/coverage/model.d.ts +114 -0
- package/dist/fiscal/coverage/model.d.ts.map +1 -0
- package/dist/fiscal/coverage/model.js +130 -0
- package/dist/fiscal/coverage/model.js.map +1 -0
- package/dist/fiscal/coverage/requests.d.ts +70 -0
- package/dist/fiscal/coverage/requests.d.ts.map +1 -0
- package/dist/fiscal/coverage/requests.js +95 -0
- package/dist/fiscal/coverage/requests.js.map +1 -0
- package/dist/fiscal/credentials/inspect.d.ts +114 -0
- package/dist/fiscal/credentials/inspect.d.ts.map +1 -0
- package/dist/fiscal/credentials/inspect.js +178 -0
- package/dist/fiscal/credentials/inspect.js.map +1 -0
- package/dist/fiscal/credentials/material.d.ts +81 -0
- package/dist/fiscal/credentials/material.d.ts.map +1 -0
- package/dist/fiscal/credentials/material.js +164 -0
- package/dist/fiscal/credentials/material.js.map +1 -0
- package/dist/fiscal/credentials/onboarding.d.ts +119 -0
- package/dist/fiscal/credentials/onboarding.d.ts.map +1 -0
- package/dist/fiscal/credentials/onboarding.js +259 -0
- package/dist/fiscal/credentials/onboarding.js.map +1 -0
- package/dist/fiscal/credentials/readiness.d.ts +119 -0
- package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
- package/dist/fiscal/credentials/readiness.js +186 -0
- package/dist/fiscal/credentials/readiness.js.map +1 -0
- package/dist/fiscal/eligibility.d.ts +106 -0
- package/dist/fiscal/eligibility.d.ts.map +1 -0
- package/dist/fiscal/eligibility.js +194 -0
- package/dist/fiscal/eligibility.js.map +1 -0
- package/dist/fiscal/enrollment.d.ts +91 -0
- package/dist/fiscal/enrollment.d.ts.map +1 -0
- package/dist/fiscal/enrollment.js +126 -0
- package/dist/fiscal/enrollment.js.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.js +220 -0
- package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/fiscal/ingestion/direction.d.ts +60 -0
- package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
- package/dist/fiscal/ingestion/direction.js +32 -0
- package/dist/fiscal/ingestion/direction.js.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.js +222 -0
- package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
- package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
- package/dist/fiscal/ingestion/pipeline.js +699 -0
- package/dist/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/fiscal/ingestion/provider.d.ts +206 -0
- package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/provider.js +47 -0
- package/dist/fiscal/ingestion/provider.js.map +1 -0
- package/dist/fiscal/ingestion/repository.d.ts +82 -0
- package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
- package/dist/fiscal/ingestion/repository.js +127 -0
- package/dist/fiscal/ingestion/repository.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
- package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
- package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.js +112 -0
- package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/fiscal/repository.d.ts +220 -0
- package/dist/fiscal/repository.d.ts.map +1 -0
- package/dist/fiscal/repository.js +449 -0
- package/dist/fiscal/repository.js.map +1 -0
- package/dist/fiscal/sync/circuit.d.ts +86 -0
- package/dist/fiscal/sync/circuit.d.ts.map +1 -0
- package/dist/fiscal/sync/circuit.js +118 -0
- package/dist/fiscal/sync/circuit.js.map +1 -0
- package/dist/fiscal/sync/intervention.d.ts +81 -0
- package/dist/fiscal/sync/intervention.d.ts.map +1 -0
- package/dist/fiscal/sync/intervention.js +135 -0
- package/dist/fiscal/sync/intervention.js.map +1 -0
- package/dist/fiscal/sync/lease.d.ts +118 -0
- package/dist/fiscal/sync/lease.d.ts.map +1 -0
- package/dist/fiscal/sync/lease.js +139 -0
- package/dist/fiscal/sync/lease.js.map +1 -0
- package/dist/fiscal/sync/observability.d.ts +148 -0
- package/dist/fiscal/sync/observability.d.ts.map +1 -0
- package/dist/fiscal/sync/observability.js +239 -0
- package/dist/fiscal/sync/observability.js.map +1 -0
- package/dist/fiscal/sync/orchestrator.d.ts +132 -0
- package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
- package/dist/fiscal/sync/orchestrator.js +487 -0
- package/dist/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/fiscal/sync/policy.d.ts +87 -0
- package/dist/fiscal/sync/policy.d.ts.map +1 -0
- package/dist/fiscal/sync/policy.js +136 -0
- package/dist/fiscal/sync/policy.js.map +1 -0
- package/dist/fiscal/sync/reprocess.d.ts +76 -0
- package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
- package/dist/fiscal/sync/reprocess.js +237 -0
- package/dist/fiscal/sync/reprocess.js.map +1 -0
- package/dist/fiscal/sync/retry.d.ts +82 -0
- package/dist/fiscal/sync/retry.d.ts.map +1 -0
- package/dist/fiscal/sync/retry.js +176 -0
- package/dist/fiscal/sync/retry.js.map +1 -0
- package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
- package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
- package/dist/fiscal/sync/secret-boundary.js +116 -0
- package/dist/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/fiscal/transport/https.d.ts +86 -0
- package/dist/fiscal/transport/https.d.ts.map +1 -0
- package/dist/fiscal/transport/https.js +303 -0
- package/dist/fiscal/transport/https.js.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts +99 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.js +374 -0
- package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/fiscal/transport/types.d.ts +134 -0
- package/dist/fiscal/transport/types.d.ts.map +1 -0
- package/dist/fiscal/transport/types.js +88 -0
- package/dist/fiscal/transport/types.js.map +1 -0
- package/dist/import/br-documents.d.ts +26 -0
- package/dist/import/br-documents.d.ts.map +1 -0
- package/dist/import/br-documents.js +78 -0
- package/dist/import/br-documents.js.map +1 -0
- package/dist/import/clients-import.d.ts +122 -4
- package/dist/import/clients-import.d.ts.map +1 -1
- package/dist/import/clients-import.js +341 -41
- package/dist/import/clients-import.js.map +1 -1
- package/dist/index.d.ts +145 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +120 -7
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts +12 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +162 -18
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +2 -2
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/index.js +1 -1
- package/dist/legal/index.js.map +1 -1
- package/dist/legal/types.d.ts +114 -2
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js.map +1 -1
- package/dist/onboarding/persistence.d.ts +10 -1
- package/dist/onboarding/persistence.d.ts.map +1 -1
- package/dist/onboarding/persistence.js +4 -4
- package/dist/onboarding/persistence.js.map +1 -1
- package/dist/pilot/go-live-checklist.d.ts +41 -0
- package/dist/pilot/go-live-checklist.d.ts.map +1 -0
- package/dist/pilot/go-live-checklist.js +209 -0
- package/dist/pilot/go-live-checklist.js.map +1 -0
- package/dist/pilot/milestone.d.ts +56 -0
- package/dist/pilot/milestone.d.ts.map +1 -0
- package/dist/pilot/milestone.js +74 -0
- package/dist/pilot/milestone.js.map +1 -0
- package/dist/platform/capabilities.d.ts +88 -0
- package/dist/platform/capabilities.d.ts.map +1 -0
- package/dist/platform/capabilities.js +169 -0
- package/dist/platform/capabilities.js.map +1 -0
- package/dist/platform/job-contract.d.ts +232 -0
- package/dist/platform/job-contract.d.ts.map +1 -0
- package/dist/platform/job-contract.js +403 -0
- package/dist/platform/job-contract.js.map +1 -0
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +110 -0
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/subscription-billing/index.d.ts +8 -5
- package/dist/subscription-billing/index.d.ts.map +1 -1
- package/dist/subscription-billing/index.js +4 -3
- package/dist/subscription-billing/index.js.map +1 -1
- package/dist/subscription-billing/platform-exemption.d.ts +89 -0
- package/dist/subscription-billing/platform-exemption.d.ts.map +1 -0
- package/dist/subscription-billing/platform-exemption.js +113 -0
- package/dist/subscription-billing/platform-exemption.js.map +1 -0
- package/dist/subscription-billing/service.d.ts +74 -0
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +182 -16
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/tenancy/features.d.ts +69 -0
- package/dist/tenancy/features.d.ts.map +1 -0
- package/dist/tenancy/features.js +123 -0
- package/dist/tenancy/features.js.map +1 -0
- package/dist/tenancy/settings.d.ts +63 -0
- package/dist/tenancy/settings.d.ts.map +1 -0
- package/dist/tenancy/settings.js +218 -0
- package/dist/tenancy/settings.js.map +1 -0
- package/dist/users/repository.d.ts +16 -1
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +24 -1
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +69 -1
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +88 -5
- package/dist/vault/repository.js.map +1 -1
- package/package.json +10 -2
- package/src/db/migrations/0045_role_write_scope.sql +122 -0
- package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
- package/src/db/migrations/0047_recipient_clearance.sql +89 -0
- package/src/db/migrations/0048_item_type_note.sql +16 -0
- package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
- package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
- package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
- package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
- package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
- package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
- package/src/db/migrations/0055_job_capability_contract.sql +300 -0
- package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
- package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
- package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
- package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
- package/src/db/migrations/0060_fiscal_credential_vault_and_run_authorization.sql +321 -0
- package/src/db/migrations/0061_client_official_registry_provenance.sql +193 -0
- package/src/db/migrations/0062_first_contact_and_capability_truth.sql +119 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { Db } from '../../db/client.js';
|
|
2
|
+
import type { StorageProvider } from '../../storage/types.js';
|
|
3
|
+
import { type FiscalEnvironment } from '../eligibility.js';
|
|
4
|
+
import { type FiscalDocumentType } from '../ingestion/provider.js';
|
|
5
|
+
import { type FiscalSourceResolver } from './secret-boundary.js';
|
|
6
|
+
/**
|
|
7
|
+
* O ciclo operacional: de "quem é elegível" a "o cursor andou, e está anotado".
|
|
8
|
+
*
|
|
9
|
+
* ## A ordem é o mecanismo, de novo
|
|
10
|
+
*
|
|
11
|
+
* elegibilidade → política de cadência → DESCRITOR da fonte → janela do
|
|
12
|
+
* cursor → disjuntor → prontidão da credencial → ator → LEASE →
|
|
13
|
+
* ‖ FRONTEIRA DO SEGREDO ‖ → material do cofre → adapter → busca → ingestão
|
|
14
|
+
* (pipeline da Fase 1) → reconciliação → cursor → métricas → trilha →
|
|
15
|
+
* devolução do lease → descarte do material
|
|
16
|
+
*
|
|
17
|
+
* Cada portão fecha por um motivo diferente e produz um desfecho NOMEADO. Não
|
|
18
|
+
* existe `continue` silencioso: um cliente que não sincronizou hoje sempre tem
|
|
19
|
+
* uma linha dizendo por quê, e é isso que separa "não havia nada" de "algo
|
|
20
|
+
* quebrou e ninguém viu".
|
|
21
|
+
*
|
|
22
|
+
* ## Os portões baratos vêm ANTES dos caros — e a régua é o SEGREDO
|
|
23
|
+
*
|
|
24
|
+
* Não é otimização: é o que impede o dano. Ler a política custa uma linha de
|
|
25
|
+
* banco; abrir o certificado custa decifrar material do cofre; consultar o
|
|
26
|
+
* provedor custa cota do CLIENTE contra a Receita. Perguntar "este cliente
|
|
27
|
+
* deveria rodar hoje?" depois de já ter consultado o ambiente nacional seria
|
|
28
|
+
* gastar o recurso escasso para depois descobrir que não devia.
|
|
29
|
+
*
|
|
30
|
+
* A primeira escrita desta fase ordenava por custo COMPUTACIONAL e errava o
|
|
31
|
+
* critério. A fábrica de adapter vinha logo depois da cadência, e como o
|
|
32
|
+
* contrato dela era "devolva o adapter com transporte e credencial", cinco
|
|
33
|
+
* portões que fecham sem tocar em segredo — janela, disjuntor, prontidão, ator,
|
|
34
|
+
* lease — ficavam DEPOIS da abertura do cofre. Nada disso aparecia em produção
|
|
35
|
+
* hoje, porque a única fábrica existente é sintética; apareceria no dia em que
|
|
36
|
+
* a primeira homologação real fosse ligada, com o certificado de um terceiro.
|
|
37
|
+
*
|
|
38
|
+
* A régua correta é: **tudo que sabe dizer "não" sem segredo vem antes do
|
|
39
|
+
* segredo.** É por isso que a fonte é resolvida em duas etapas (descritor e
|
|
40
|
+
* materialização, `secret-boundary.ts`), e por que `loadFiscalTlsMaterial`
|
|
41
|
+
* exige um passe que só é emitido aqui, depois do último portão.
|
|
42
|
+
*
|
|
43
|
+
* ## Onde o lease entra, e por quê
|
|
44
|
+
*
|
|
45
|
+
* DEPOIS dos portões e ANTES da materialização. As duas metades da decisão:
|
|
46
|
+
*
|
|
47
|
+
* antes do material segurar chave privada aberta na memória enquanto se
|
|
48
|
+
* espera um lock é manter o ativo mais sensível vivo
|
|
49
|
+
* exatamente no intervalo em que ele não serve para nada.
|
|
50
|
+
* `lease_unavailable` é desfecho comum com mais de um
|
|
51
|
+
* worker, e pagá-lo com um certificado decifrado seria o
|
|
52
|
+
* mesmo erro da fábrica prematura, uma etapa adiante.
|
|
53
|
+
*
|
|
54
|
+
* depois dos gates tomar a vez custa uma escrita e um índice; fazê-lo antes
|
|
55
|
+
* da cadência ou do disjuntor criaria contenção por
|
|
56
|
+
* clientes que nem iam rodar.
|
|
57
|
+
*
|
|
58
|
+
* ## Uma transação por etapa, e o lease fora do lote
|
|
59
|
+
*
|
|
60
|
+
* A tomada da vez precisa estar CONFIRMADA antes de a busca começar — dentro da
|
|
61
|
+
* transação do lote, nenhum outro processo a enxergaria enquanto ela importa.
|
|
62
|
+
* Por isso cada operação de lease abre seu próprio `withContext`.
|
|
63
|
+
*
|
|
64
|
+
* ## O que este arquivo NÃO faz
|
|
65
|
+
*
|
|
66
|
+
* Não decide se o worker pode rodar: isso é o Gate B0, e é feito uma vez pelo
|
|
67
|
+
* processo, antes de chegar aqui. Não constrói adapter nem abre cofre: recebe um
|
|
68
|
+
* resolvedor de fonte, e é a materialização DELE que amarra transporte,
|
|
69
|
+
* credencial e provedor — sob o passe emitido aqui. Não escreve documento: quem
|
|
70
|
+
* escreve é o pipeline da Fase 1, intocado.
|
|
71
|
+
*/
|
|
72
|
+
/** Por que um cliente não sincronizou. Todo desfecho tem nome. */
|
|
73
|
+
export type ClientCycleOutcome = 'synced' | 'no_documents' | 'policy_disabled' | 'waiting_window' | 'circuit_open' | 'credential_not_ready' | 'lease_unavailable' | 'no_adapter' | 'material_unavailable' | 'blocked' | 'failed';
|
|
74
|
+
export interface ClientCycleResult {
|
|
75
|
+
clientId: string;
|
|
76
|
+
documentType: FiscalDocumentType;
|
|
77
|
+
source: string;
|
|
78
|
+
environment: FiscalEnvironment;
|
|
79
|
+
outcome: ClientCycleOutcome;
|
|
80
|
+
detail: string;
|
|
81
|
+
documentsNew: number;
|
|
82
|
+
documentsDuplicate: number;
|
|
83
|
+
eventsPending: number;
|
|
84
|
+
eventsReconciled: number;
|
|
85
|
+
cursorBefore: string | null;
|
|
86
|
+
cursorAfter: string | null;
|
|
87
|
+
/** Quando volta a ser elegível. `null` = na próxima passada. */
|
|
88
|
+
nextRunAt: string | null;
|
|
89
|
+
leaseId: string | null;
|
|
90
|
+
/** `true` quando a vez veio de um titular que não a devolveu. */
|
|
91
|
+
leaseRecovered: boolean;
|
|
92
|
+
}
|
|
93
|
+
export interface TenantCycleReport {
|
|
94
|
+
tenantId: string;
|
|
95
|
+
environment: FiscalEnvironment | null;
|
|
96
|
+
eligibleClients: number;
|
|
97
|
+
results: readonly ClientCycleResult[];
|
|
98
|
+
documentsNew: number;
|
|
99
|
+
documentsDuplicate: number;
|
|
100
|
+
eventsPending: number;
|
|
101
|
+
eventsReconciled: number;
|
|
102
|
+
failures: number;
|
|
103
|
+
/** Zero é o desfecho ESPERADO enquanto nenhum cliente estiver habilitado. */
|
|
104
|
+
synced: number;
|
|
105
|
+
}
|
|
106
|
+
export interface FiscalSyncCycleDeps {
|
|
107
|
+
db: Db;
|
|
108
|
+
/**
|
|
109
|
+
* Resolve a fonte em duas etapas: descritor (metadata) e materialização
|
|
110
|
+
* (cofre). O orquestrador só convida a segunda depois do último portão.
|
|
111
|
+
*/
|
|
112
|
+
sourceResolver: FiscalSourceResolver;
|
|
113
|
+
storage?: StorageProvider | null;
|
|
114
|
+
/** Identidade DESTE processo. Vai para o lease e para a trilha; nunca segredo. */
|
|
115
|
+
holder: string;
|
|
116
|
+
job: {
|
|
117
|
+
name: string;
|
|
118
|
+
version: number;
|
|
119
|
+
};
|
|
120
|
+
leaseTtlMs?: number;
|
|
121
|
+
now?: () => Date;
|
|
122
|
+
/** Tipos que este ciclo percorre. */
|
|
123
|
+
documentTypes?: readonly FiscalDocumentType[];
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Um ciclo completo para um tenant.
|
|
127
|
+
*
|
|
128
|
+
* O chamador já provou a compatibilidade do worker (Gate B0). Aqui só se decide
|
|
129
|
+
* QUEM roda, e todo "não roda" tem motivo registrado.
|
|
130
|
+
*/
|
|
131
|
+
export declare function runTenantFiscalSyncCycle(deps: FiscalSyncCycleDeps, tenantId: string): Promise<TenantCycleReport>;
|
|
132
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/fiscal/sync/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAM,MAAM,oBAAoB,CAAC;AAGjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAExF,OAAO,EAEL,KAAK,oBAAoB,EAE1B,MAAM,sBAAsB,CAAC;AAO9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AAEH,kEAAkE;AAClE,MAAM,MAAM,kBAAkB,GAC1B,QAAQ,GACR,cAAc,GACd,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,GACd,sBAAsB,GACtB,mBAAmB,GACnB,YAAY,GACZ,sBAAsB,GACtB,SAAS,GACT,QAAQ,CAAC;AAEb,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,kBAAkB,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,iBAAiB,CAAC;IAC/B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gEAAgE;IAChE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iEAAiE;IACjE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,EAAE,CAAC;IACP;;;OAGG;IACH,cAAc,EAAE,oBAAoB,CAAC;IACrC,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,qCAAqC;IACrC,aAAa,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC/C;AAwED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,mBAAmB,EACzB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,CAAC,CA4D5B"}
|
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
import { withContext } from '../../db/context.js';
|
|
2
|
+
import { appendAudit } from '../../audit/audit.js';
|
|
3
|
+
import { getTenantFiscalAutomation, listFiscalEligibleClients, } from '../eligibility.js';
|
|
4
|
+
import { ingestFiscalDocuments } from '../ingestion/pipeline.js';
|
|
5
|
+
import { FiscalProviderError } from '../ingestion/provider.js';
|
|
6
|
+
import { readFiscalCredentialReadiness, interventionKindFor } from '../credentials/readiness.js';
|
|
7
|
+
import { grantFiscalSecretAccess, } from './secret-boundary.js';
|
|
8
|
+
import { acquireFiscalSyncLease, releaseFiscalSyncLease, DEFAULT_LEASE_TTL_MS } from './lease.js';
|
|
9
|
+
import { readProviderCircuit, recordProviderFailure, recordProviderSuccess } from './circuit.js';
|
|
10
|
+
import { nextEffectiveRun, nextRunAfter, resolveFiscalSyncPolicy } from './policy.js';
|
|
11
|
+
import { raiseFiscalIntervention, resolveFiscalInterventions } from './intervention.js';
|
|
12
|
+
import { decideFromError } from './retry.js';
|
|
13
|
+
/** O documento do ator consultado. Sem ele não há a quem perguntar. */
|
|
14
|
+
async function actorDocumentOf(tx, clientId) {
|
|
15
|
+
const [c] = await tx `
|
|
16
|
+
SELECT document_number FROM client WHERE id = ${clientId} AND deleted_at IS NULL
|
|
17
|
+
`;
|
|
18
|
+
const raw = c?.document_number ?? null;
|
|
19
|
+
return raw ? raw.replace(/\D/g, '') : null;
|
|
20
|
+
}
|
|
21
|
+
async function readCursorSnapshot(tx, input) {
|
|
22
|
+
const [r] = await tx `
|
|
23
|
+
SELECT next_attempt_after, next_eligible_run_at, last_completed_at, consecutive_failures
|
|
24
|
+
FROM fiscal_sync_cursor
|
|
25
|
+
WHERE client_id = ${input.clientId} AND source = ${input.source}
|
|
26
|
+
AND environment = ${input.environment}
|
|
27
|
+
`;
|
|
28
|
+
return {
|
|
29
|
+
nextAttemptAfter: r?.next_attempt_after ?? null,
|
|
30
|
+
nextEligibleRunAt: r?.next_eligible_run_at ?? null,
|
|
31
|
+
lastCompletedAt: r?.last_completed_at ?? null,
|
|
32
|
+
consecutiveFailures: r?.consecutive_failures ?? 0,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Grava a cadência e os marcos de execução no cursor.
|
|
37
|
+
*
|
|
38
|
+
* `next_eligible_run_at` é NOSSO; `next_attempt_after` é do provedor e continua
|
|
39
|
+
* sendo escrito pelo pipeline. Este UPDATE não toca naquele — misturá-los faria
|
|
40
|
+
* uma política diária apagar a espera obrigatória de uma hora.
|
|
41
|
+
*/
|
|
42
|
+
async function stampCursorSchedule(tx, input) {
|
|
43
|
+
await tx `
|
|
44
|
+
UPDATE fiscal_sync_cursor
|
|
45
|
+
SET last_started_at = ${input.startedAt},
|
|
46
|
+
last_completed_at = ${input.completedAt},
|
|
47
|
+
next_eligible_run_at = ${input.nextEligibleRunAt},
|
|
48
|
+
updated_at = now()
|
|
49
|
+
WHERE client_id = ${input.clientId} AND source = ${input.source}
|
|
50
|
+
AND environment = ${input.environment}
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Um ciclo completo para um tenant.
|
|
55
|
+
*
|
|
56
|
+
* O chamador já provou a compatibilidade do worker (Gate B0). Aqui só se decide
|
|
57
|
+
* QUEM roda, e todo "não roda" tem motivo registrado.
|
|
58
|
+
*/
|
|
59
|
+
export async function runTenantFiscalSyncCycle(deps, tenantId) {
|
|
60
|
+
const now = deps.now ?? (() => new Date());
|
|
61
|
+
const tipos = deps.documentTypes ?? ['nfse'];
|
|
62
|
+
const results = [];
|
|
63
|
+
const automation = await withContext(deps.db, { tenantId }, (tx) => getTenantFiscalAutomation(tx));
|
|
64
|
+
if (automation.mode === 'disabled') {
|
|
65
|
+
// Escritório que não ligou automação. Não é falha, não abre tarefa, e não
|
|
66
|
+
// consome nada — mas o relatório o diz, porque "zero clientes" e "automação
|
|
67
|
+
// desligada" são estados diferentes com ações diferentes.
|
|
68
|
+
return {
|
|
69
|
+
tenantId,
|
|
70
|
+
environment: null,
|
|
71
|
+
eligibleClients: 0,
|
|
72
|
+
results: [],
|
|
73
|
+
documentsNew: 0,
|
|
74
|
+
documentsDuplicate: 0,
|
|
75
|
+
eventsPending: 0,
|
|
76
|
+
eventsReconciled: 0,
|
|
77
|
+
failures: 0,
|
|
78
|
+
synced: 0,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const environment = automation.mode;
|
|
82
|
+
for (const documentType of tipos) {
|
|
83
|
+
const eligible = await withContext(deps.db, { tenantId }, (tx) => listFiscalEligibleClients(tx, { documentType, environment }));
|
|
84
|
+
for (const clientId of eligible) {
|
|
85
|
+
results.push(await runClientCycle(deps, {
|
|
86
|
+
tenantId,
|
|
87
|
+
clientId,
|
|
88
|
+
documentType,
|
|
89
|
+
environment,
|
|
90
|
+
now: now(),
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const somar = (f) => results.reduce((acc, r) => acc + f(r), 0);
|
|
95
|
+
return {
|
|
96
|
+
tenantId,
|
|
97
|
+
environment,
|
|
98
|
+
eligibleClients: results.length,
|
|
99
|
+
results,
|
|
100
|
+
documentsNew: somar((r) => r.documentsNew),
|
|
101
|
+
documentsDuplicate: somar((r) => r.documentsDuplicate),
|
|
102
|
+
eventsPending: somar((r) => r.eventsPending),
|
|
103
|
+
eventsReconciled: somar((r) => r.eventsReconciled),
|
|
104
|
+
failures: results.filter((r) => r.outcome === 'failed').length,
|
|
105
|
+
synced: results.filter((r) => r.outcome === 'synced' || r.outcome === 'no_documents').length,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const vazio = (base, outcome, detail, extra = {}) => ({
|
|
109
|
+
...base,
|
|
110
|
+
outcome,
|
|
111
|
+
detail,
|
|
112
|
+
documentsNew: 0,
|
|
113
|
+
documentsDuplicate: 0,
|
|
114
|
+
eventsPending: 0,
|
|
115
|
+
eventsReconciled: 0,
|
|
116
|
+
cursorBefore: null,
|
|
117
|
+
cursorAfter: null,
|
|
118
|
+
nextRunAt: null,
|
|
119
|
+
leaseId: null,
|
|
120
|
+
leaseRecovered: false,
|
|
121
|
+
...extra,
|
|
122
|
+
});
|
|
123
|
+
/**
|
|
124
|
+
* Um cliente, do primeiro portão à devolução da vez.
|
|
125
|
+
*
|
|
126
|
+
* A fonte (`source`) sai do DESCRITOR, e não de configuração: é a fonte que sabe
|
|
127
|
+
* com quem fala. Isso amarra a ordem em dois pontos: o descritor vem DEPOIS da
|
|
128
|
+
* cadência, que não depende de fonte nenhuma, e ANTES do cursor, do disjuntor e
|
|
129
|
+
* da prontidão, que dependem.
|
|
130
|
+
*
|
|
131
|
+
* O que mudou na R1: resolver o descritor não é mais montar o adapter. Nenhuma
|
|
132
|
+
* das linhas abaixo da cadência até o lease toca em material criptográfico —
|
|
133
|
+
* verificável por leitura, porque a única função que abre o cofre exige um
|
|
134
|
+
* passe, e o passe é emitido uma vez, depois do lease.
|
|
135
|
+
*/
|
|
136
|
+
async function runClientCycle(deps, input) {
|
|
137
|
+
const { tenantId, clientId, documentType, environment, now } = input;
|
|
138
|
+
/*
|
|
139
|
+
* A cadência vem antes de tudo, e a ordem não é estética.
|
|
140
|
+
*
|
|
141
|
+
* Um escritório com duzentos clientes inscritos e nenhum com cadência ligada
|
|
142
|
+
* — que é exatamente o estado de hoje — não deve pagar duzentas resoluções de
|
|
143
|
+
* fonte para descobrir, logo depois, que nenhuma delas devia acontecer.
|
|
144
|
+
*/
|
|
145
|
+
const policy = await withContext(deps.db, { tenantId }, (tx) => resolveFiscalSyncPolicy(tx, { clientId, documentType }));
|
|
146
|
+
if (!policy.enabled) {
|
|
147
|
+
return vazio({ clientId, documentType, source: 'nao-resolvido', environment }, 'policy_disabled', `cadência ${policy.frequency}`);
|
|
148
|
+
}
|
|
149
|
+
/*
|
|
150
|
+
* O DESCRITOR — metadata da fonte, e nada além disso.
|
|
151
|
+
*
|
|
152
|
+
* Custa leitura de tabela: quem é o provedor, qual slug, que credencial ele
|
|
153
|
+
* exige. Não abre cofre, não decifra, não fala com a rede. É o que os portões
|
|
154
|
+
* seguintes precisam, porque cursor, disjuntor e prontidão são todos POR
|
|
155
|
+
* FONTE — e é só isso que eles precisam.
|
|
156
|
+
*/
|
|
157
|
+
const resolution = await withContext(deps.db, { tenantId }, (tx) => deps.sourceResolver({ tx, tenantId, clientId, documentType, environment }));
|
|
158
|
+
if (!resolution) {
|
|
159
|
+
// Sem caminho de coleta para este cliente. É uma pergunta de PRODUTO — a
|
|
160
|
+
// prefeitura não aderiu, o tipo não tem adapter —, e vira tarefa humana
|
|
161
|
+
// porque nenhuma retentativa a resolve.
|
|
162
|
+
await withContext(deps.db, { tenantId }, (tx) => raiseFiscalIntervention(tx, {
|
|
163
|
+
tenantId,
|
|
164
|
+
clientId,
|
|
165
|
+
kind: 'unsupported_source',
|
|
166
|
+
environment,
|
|
167
|
+
documentType,
|
|
168
|
+
detail: `nenhum adapter para ${documentType} em ${environment}`,
|
|
169
|
+
now,
|
|
170
|
+
}));
|
|
171
|
+
return vazio({ clientId, documentType, source: 'nenhum', environment }, 'no_adapter', `nenhum adapter para ${documentType} em ${environment}`);
|
|
172
|
+
}
|
|
173
|
+
const { descriptor, materialize } = resolution;
|
|
174
|
+
const source = descriptor.source;
|
|
175
|
+
const base = { clientId, documentType, source, environment };
|
|
176
|
+
{
|
|
177
|
+
// ── Portões que fecham SEM segredo, em ordem de custo ──────────────────
|
|
178
|
+
const gates = await withContext(deps.db, { tenantId }, async (tx) => {
|
|
179
|
+
const cursor = await readCursorSnapshot(tx, { clientId, source, environment });
|
|
180
|
+
const circuit = await readProviderCircuit(tx, { tenantId, source, environment }, now);
|
|
181
|
+
const credential = await readFiscalCredentialReadiness(tx, {
|
|
182
|
+
clientId,
|
|
183
|
+
environment,
|
|
184
|
+
source,
|
|
185
|
+
// A fonte declara a credencial que exige. Metadata pergunta a metadata:
|
|
186
|
+
// saber que o ADN pede A1 não exige ter um A1 aberto.
|
|
187
|
+
kind: descriptor.credentialKind,
|
|
188
|
+
});
|
|
189
|
+
const actorDocument = await actorDocumentOf(tx, clientId);
|
|
190
|
+
return { cursor, circuit, credential, actorDocument };
|
|
191
|
+
});
|
|
192
|
+
const gate = nextEffectiveRun(gates.cursor.nextEligibleRunAt, gates.cursor.nextAttemptAfter);
|
|
193
|
+
if (gate && gate > now) {
|
|
194
|
+
return vazio(base, 'waiting_window', `próxima janela em ${gate.toISOString()}`, {
|
|
195
|
+
nextRunAt: gate.toISOString(),
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (!gates.circuit.allows) {
|
|
199
|
+
// O disjuntor do provedor está aberto: nem chega a olhar credencial. É a
|
|
200
|
+
// diferença entre cem requisições contra um serviço fora e nenhuma.
|
|
201
|
+
return vazio(base, 'circuit_open', `provedor em recuo até ${gates.circuit.openUntil?.toISOString() ?? 'indefinido'}`, { nextRunAt: gates.circuit.openUntil?.toISOString() ?? null });
|
|
202
|
+
}
|
|
203
|
+
if (!gates.credential.usableByWorker) {
|
|
204
|
+
const kind = interventionKindFor(gates.credential.state);
|
|
205
|
+
if (kind) {
|
|
206
|
+
await withContext(deps.db, { tenantId }, (tx) => raiseFiscalIntervention(tx, {
|
|
207
|
+
tenantId,
|
|
208
|
+
clientId,
|
|
209
|
+
kind,
|
|
210
|
+
source,
|
|
211
|
+
environment,
|
|
212
|
+
documentType,
|
|
213
|
+
detail: gates.credential.detail,
|
|
214
|
+
now,
|
|
215
|
+
}));
|
|
216
|
+
}
|
|
217
|
+
return vazio(base, 'credential_not_ready', `${gates.credential.state}`);
|
|
218
|
+
}
|
|
219
|
+
if (!gates.actorDocument) {
|
|
220
|
+
return vazio(base, 'blocked', 'cliente sem CNPJ/CPF: não há ator a consultar');
|
|
221
|
+
}
|
|
222
|
+
// ── A vez ─────────────────────────────────────────────────────────────
|
|
223
|
+
const lease = await withContext(deps.db, { tenantId }, (tx) => acquireFiscalSyncLease(tx, {
|
|
224
|
+
tenantId,
|
|
225
|
+
stream: { clientId, source, environment, documentType },
|
|
226
|
+
holder: deps.holder,
|
|
227
|
+
ttlMs: deps.leaseTtlMs ?? DEFAULT_LEASE_TTL_MS,
|
|
228
|
+
now,
|
|
229
|
+
}));
|
|
230
|
+
if (!lease) {
|
|
231
|
+
// Outro processo está com o cliente. Desfecho normal e frequente — não é
|
|
232
|
+
// erro, não conta para o disjuntor e não abre tarefa.
|
|
233
|
+
return vazio(base, 'lease_unavailable', 'outro processo está sincronizando este fluxo');
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
/*
|
|
237
|
+
* ══════════════ A FRONTEIRA DO SEGREDO ══════════════
|
|
238
|
+
*
|
|
239
|
+
* Tudo acima desta linha decidiu SEM segredo. Daqui para baixo, e só
|
|
240
|
+
* daqui para baixo, o cofre pode ser aberto — e o passe que autoriza a
|
|
241
|
+
* abertura é emitido aqui, uma única vez, em posse da vez.
|
|
242
|
+
*
|
|
243
|
+
* `grantFiscalSecretAccess` é a única emissora, e não é reexportada pelo
|
|
244
|
+
* `index` do pacote: fora de `@baruk/core` não existe caminho para
|
|
245
|
+
* fabricar um passe. Um `materialize` que tente abrir o cofre antes de
|
|
246
|
+
* receber o seu recebe `FiscalSecretBoundaryError`, e não uma chave.
|
|
247
|
+
*/
|
|
248
|
+
const authorization = grantFiscalSecretAccess({
|
|
249
|
+
tenantId,
|
|
250
|
+
clientId,
|
|
251
|
+
source,
|
|
252
|
+
environment,
|
|
253
|
+
documentType,
|
|
254
|
+
credentialKind: descriptor.credentialKind,
|
|
255
|
+
leaseId: lease.id,
|
|
256
|
+
credentialFingerprint: gates.credential.fingerprint,
|
|
257
|
+
});
|
|
258
|
+
const materialized = await withContext(deps.db, { tenantId }, (tx) => materialize({ tx, authorization }));
|
|
259
|
+
if (!materialized) {
|
|
260
|
+
// A prontidão disse READY a partir do CADASTRO; o material não abriu.
|
|
261
|
+
// Ponteiro pendurado, envelope ilegível, cofre fora. Os dois fatos são
|
|
262
|
+
// independentes — e este é o estado em que só uma pessoa resolve.
|
|
263
|
+
await withContext(deps.db, { tenantId }, (tx) => raiseFiscalIntervention(tx, {
|
|
264
|
+
tenantId,
|
|
265
|
+
clientId,
|
|
266
|
+
kind: 'certificate_invalid',
|
|
267
|
+
source,
|
|
268
|
+
environment,
|
|
269
|
+
documentType,
|
|
270
|
+
detail: 'credencial pronta no cadastro, material indisponível no cofre',
|
|
271
|
+
now,
|
|
272
|
+
}));
|
|
273
|
+
return vazio(base, 'material_unavailable', 'credencial pronta no cadastro, material indisponível no cofre', { leaseId: lease.id, leaseRecovered: lease.recovered });
|
|
274
|
+
}
|
|
275
|
+
const { adapter, dispose } = materialized;
|
|
276
|
+
try {
|
|
277
|
+
await withContext(deps.db, { tenantId }, (tx) => appendAudit(tx, {
|
|
278
|
+
actorType: 'system',
|
|
279
|
+
action: 'fiscal.sync.started',
|
|
280
|
+
resourceType: 'client',
|
|
281
|
+
resourceId: clientId,
|
|
282
|
+
metadata: {
|
|
283
|
+
source,
|
|
284
|
+
environment,
|
|
285
|
+
documentType,
|
|
286
|
+
job: deps.job.name,
|
|
287
|
+
jobVersion: deps.job.version,
|
|
288
|
+
leaseId: lease.id,
|
|
289
|
+
leaseRecovered: lease.recovered,
|
|
290
|
+
credentialFingerprint: gates.credential.fingerprint,
|
|
291
|
+
},
|
|
292
|
+
}));
|
|
293
|
+
let report;
|
|
294
|
+
try {
|
|
295
|
+
report = await withContext(deps.db, { tenantId }, (tx) => ingestFiscalDocuments(tx, { adapter, storage: deps.storage ?? null }, {
|
|
296
|
+
tenantId,
|
|
297
|
+
clientId,
|
|
298
|
+
actorDocument: gates.actorDocument,
|
|
299
|
+
environment,
|
|
300
|
+
documentType,
|
|
301
|
+
now,
|
|
302
|
+
job: { name: deps.job.name, version: deps.job.version, leaseId: lease.id },
|
|
303
|
+
}));
|
|
304
|
+
}
|
|
305
|
+
catch (err) {
|
|
306
|
+
// Falha que o pipeline não absorveu: a transação dele já reverteu. A
|
|
307
|
+
// decisão e a trilha vão em transação NOVA, senão voltariam junto e a
|
|
308
|
+
// falha ficaria invisível — o modo de falha que a trilha existe para
|
|
309
|
+
// eliminar.
|
|
310
|
+
const decision = decideFromError(err, {
|
|
311
|
+
previousFailures: gates.cursor.consecutiveFailures,
|
|
312
|
+
now,
|
|
313
|
+
});
|
|
314
|
+
await withContext(deps.db, { tenantId }, async (tx) => {
|
|
315
|
+
if (decision.countsAgainstProvider) {
|
|
316
|
+
await recordProviderFailure(tx, { tenantId, source, environment }, {
|
|
317
|
+
errorClass: decision.category,
|
|
318
|
+
now,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
if (decision.interventionKind) {
|
|
322
|
+
await raiseFiscalIntervention(tx, {
|
|
323
|
+
tenantId,
|
|
324
|
+
clientId,
|
|
325
|
+
kind: decision.interventionKind,
|
|
326
|
+
source,
|
|
327
|
+
environment,
|
|
328
|
+
documentType,
|
|
329
|
+
detail: `${decision.category} (${decision.code})`,
|
|
330
|
+
now,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
await appendAudit(tx, {
|
|
334
|
+
actorType: 'system',
|
|
335
|
+
action: 'fiscal.sync.failed',
|
|
336
|
+
resourceType: 'client',
|
|
337
|
+
resourceId: clientId,
|
|
338
|
+
result: 'failure',
|
|
339
|
+
metadata: {
|
|
340
|
+
source,
|
|
341
|
+
environment,
|
|
342
|
+
documentType,
|
|
343
|
+
category: decision.category,
|
|
344
|
+
code: decision.code,
|
|
345
|
+
retryable: decision.retryable,
|
|
346
|
+
nextAttemptAt: decision.nextAttemptAt?.toISOString() ?? null,
|
|
347
|
+
},
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
return vazio(base, 'failed', `${decision.category} (${decision.code})`, {
|
|
351
|
+
leaseId: lease.id,
|
|
352
|
+
leaseRecovered: lease.recovered,
|
|
353
|
+
nextRunAt: decision.nextAttemptAt?.toISOString() ?? null,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
// ── Desfecho: cadência, disjuntor, fila humana, trilha ──────────────
|
|
357
|
+
const sucesso = report.outcome === 'completed' || report.outcome === 'no_documents';
|
|
358
|
+
const cadencia = sucesso ? nextRunAfter(policy, now, now) : null;
|
|
359
|
+
await withContext(deps.db, { tenantId }, async (tx) => {
|
|
360
|
+
await stampCursorSchedule(tx, {
|
|
361
|
+
clientId,
|
|
362
|
+
source,
|
|
363
|
+
environment,
|
|
364
|
+
startedAt: now,
|
|
365
|
+
completedAt: sucesso ? new Date() : null,
|
|
366
|
+
nextEligibleRunAt: cadencia,
|
|
367
|
+
});
|
|
368
|
+
if (sucesso) {
|
|
369
|
+
await recordProviderSuccess(tx, { tenantId, source, environment }, now);
|
|
370
|
+
// Fechamento automático só do que foi OBSERVADO voltar a funcionar.
|
|
371
|
+
// `unsupported_source` fica: uma sincronização bem-sucedida por outro
|
|
372
|
+
// caminho não prova que a fonte que faltava passou a existir.
|
|
373
|
+
await resolveFiscalInterventions(tx, {
|
|
374
|
+
clientId,
|
|
375
|
+
kinds: [
|
|
376
|
+
'auth_required',
|
|
377
|
+
'certificate_expired',
|
|
378
|
+
'certificate_invalid',
|
|
379
|
+
'provider_access_denied',
|
|
380
|
+
'repeated_failure',
|
|
381
|
+
],
|
|
382
|
+
source,
|
|
383
|
+
environment,
|
|
384
|
+
now,
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
else if (report.errorClass) {
|
|
388
|
+
// A classe do provedor é RECONSTRUÍDA, e não descartada.
|
|
389
|
+
//
|
|
390
|
+
// A primeira escrita passava `new Error(report.detail)` aqui, e
|
|
391
|
+
// `decideFromError` caía em `INTERNAL_ERROR` — que não abre tarefa
|
|
392
|
+
// nenhuma. Na prática: um 401 do ambiente nacional era registrado
|
|
393
|
+
// como falha e NÃO gerava a pendência de credencial, exatamente o
|
|
394
|
+
// caso em que só uma pessoa resolve. A classe já está no relatório;
|
|
395
|
+
// jogá-la fora para depois adivinhá-la era a inversão do problema.
|
|
396
|
+
const decision = decideFromError(new FiscalProviderError(report.errorClass, report.detail), { previousFailures: gates.cursor.consecutiveFailures, now });
|
|
397
|
+
// O disjuntor precisa contar ESTA falha também.
|
|
398
|
+
//
|
|
399
|
+
// O pipeline CAPTURA o erro do provedor e devolve
|
|
400
|
+
// `outcome: 'provider_error'` em vez de propagá-lo — decisão correta
|
|
401
|
+
// dele, porque assim o cursor e a trilha ficam consistentes. A
|
|
402
|
+
// consequência é que o `catch` deste arquivo nunca dispara para o caso
|
|
403
|
+
// mais comum de todos, e a primeira escrita contava só as exceções que
|
|
404
|
+
// escapavam. Resultado: o disjuntor jamais abriria em produção, por
|
|
405
|
+
// mais que o ambiente nacional estivesse fora — o modo de falha mais
|
|
406
|
+
// silencioso possível, porque o mecanismo existe e nunca é acionado.
|
|
407
|
+
if (decision.countsAgainstProvider) {
|
|
408
|
+
await recordProviderFailure(tx, { tenantId, source, environment }, { errorClass: decision.category, now });
|
|
409
|
+
}
|
|
410
|
+
if (decision.interventionKind) {
|
|
411
|
+
await raiseFiscalIntervention(tx, {
|
|
412
|
+
tenantId,
|
|
413
|
+
clientId,
|
|
414
|
+
kind: decision.interventionKind,
|
|
415
|
+
source,
|
|
416
|
+
environment,
|
|
417
|
+
documentType,
|
|
418
|
+
detail: report.detail,
|
|
419
|
+
now,
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
await appendAudit(tx, {
|
|
424
|
+
actorType: 'system',
|
|
425
|
+
action: sucesso ? 'fiscal.sync.completed' : 'fiscal.sync.failed',
|
|
426
|
+
resourceType: 'client',
|
|
427
|
+
resourceId: clientId,
|
|
428
|
+
result: sucesso ? 'success' : 'failure',
|
|
429
|
+
metadata: {
|
|
430
|
+
source,
|
|
431
|
+
environment,
|
|
432
|
+
documentType,
|
|
433
|
+
outcome: report.outcome,
|
|
434
|
+
created: report.documentsNew,
|
|
435
|
+
duplicate: report.documentsDuplicate,
|
|
436
|
+
pending: report.eventsPending,
|
|
437
|
+
reconciled: report.eventsReconciled,
|
|
438
|
+
cursorBefore: report.cursorBefore,
|
|
439
|
+
cursorAfter: report.cursorAfter,
|
|
440
|
+
nextRunAt: cadencia?.toISOString() ?? null,
|
|
441
|
+
},
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
return {
|
|
445
|
+
...base,
|
|
446
|
+
// `provider_error` é FALHA, não bloqueio.
|
|
447
|
+
//
|
|
448
|
+
// A distinção não é vocabulário: `blocked` significa "um portão nosso
|
|
449
|
+
// fechou" — política, elegibilidade, contrato — e não pede retentativa
|
|
450
|
+
// nem tarefa. `failed` significa "tentamos e não deu", e é o que aciona
|
|
451
|
+
// recuo, disjuntor e fila humana. Colapsar os dois faria um 401 do
|
|
452
|
+
// ambiente nacional parecer uma decisão de configuração do escritório.
|
|
453
|
+
outcome: report.outcome === 'completed'
|
|
454
|
+
? 'synced'
|
|
455
|
+
: report.outcome === 'no_documents'
|
|
456
|
+
? 'no_documents'
|
|
457
|
+
: report.outcome === 'failed' || report.outcome === 'provider_error'
|
|
458
|
+
? 'failed'
|
|
459
|
+
: 'blocked',
|
|
460
|
+
detail: report.detail,
|
|
461
|
+
documentsNew: report.documentsNew,
|
|
462
|
+
documentsDuplicate: report.documentsDuplicate,
|
|
463
|
+
eventsPending: report.eventsPending,
|
|
464
|
+
eventsReconciled: report.eventsReconciled,
|
|
465
|
+
cursorBefore: report.cursorBefore,
|
|
466
|
+
cursorAfter: report.cursorAfter,
|
|
467
|
+
nextRunAt: cadencia?.toISOString() ?? null,
|
|
468
|
+
leaseId: lease.id,
|
|
469
|
+
leaseRecovered: lease.recovered,
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
finally {
|
|
473
|
+
// Material de certificado volta ao nada, tenha o lote dado certo ou
|
|
474
|
+
// não. Dentro do lease de propósito: o material vive exatamente o
|
|
475
|
+
// intervalo em que a vez é nossa, e nem um instante além.
|
|
476
|
+
dispose?.();
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
finally {
|
|
480
|
+
// A vez é devolvida em QUALQUER desfecho. Sem isto, um erro inesperado
|
|
481
|
+
// deixaria o cliente bloqueado até o prazo vencer — o prazo é a rede de
|
|
482
|
+
// segurança, não o caminho normal.
|
|
483
|
+
await withContext(deps.db, { tenantId }, (tx) => releaseFiscalSyncLease(tx, { leaseId: lease.id, holder: deps.holder }));
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/fiscal/sync/orchestrator.ts"],"names":[],"mappings":"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"}
|