@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,490 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runTenantFiscalSyncCycle = runTenantFiscalSyncCycle;
|
|
4
|
+
const context_js_1 = require("../../db/context.js");
|
|
5
|
+
const audit_js_1 = require("../../audit/audit.js");
|
|
6
|
+
const eligibility_js_1 = require("../eligibility.js");
|
|
7
|
+
const pipeline_js_1 = require("../ingestion/pipeline.js");
|
|
8
|
+
const provider_js_1 = require("../ingestion/provider.js");
|
|
9
|
+
const readiness_js_1 = require("../credentials/readiness.js");
|
|
10
|
+
const secret_boundary_js_1 = require("./secret-boundary.js");
|
|
11
|
+
const lease_js_1 = require("./lease.js");
|
|
12
|
+
const circuit_js_1 = require("./circuit.js");
|
|
13
|
+
const policy_js_1 = require("./policy.js");
|
|
14
|
+
const intervention_js_1 = require("./intervention.js");
|
|
15
|
+
const retry_js_1 = require("./retry.js");
|
|
16
|
+
/** O documento do ator consultado. Sem ele não há a quem perguntar. */
|
|
17
|
+
async function actorDocumentOf(tx, clientId) {
|
|
18
|
+
const [c] = await tx `
|
|
19
|
+
SELECT document_number FROM client WHERE id = ${clientId} AND deleted_at IS NULL
|
|
20
|
+
`;
|
|
21
|
+
const raw = c?.document_number ?? null;
|
|
22
|
+
return raw ? raw.replace(/\D/g, '') : null;
|
|
23
|
+
}
|
|
24
|
+
async function readCursorSnapshot(tx, input) {
|
|
25
|
+
const [r] = await tx `
|
|
26
|
+
SELECT next_attempt_after, next_eligible_run_at, last_completed_at, consecutive_failures
|
|
27
|
+
FROM fiscal_sync_cursor
|
|
28
|
+
WHERE client_id = ${input.clientId} AND source = ${input.source}
|
|
29
|
+
AND environment = ${input.environment}
|
|
30
|
+
`;
|
|
31
|
+
return {
|
|
32
|
+
nextAttemptAfter: r?.next_attempt_after ?? null,
|
|
33
|
+
nextEligibleRunAt: r?.next_eligible_run_at ?? null,
|
|
34
|
+
lastCompletedAt: r?.last_completed_at ?? null,
|
|
35
|
+
consecutiveFailures: r?.consecutive_failures ?? 0,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Grava a cadência e os marcos de execução no cursor.
|
|
40
|
+
*
|
|
41
|
+
* `next_eligible_run_at` é NOSSO; `next_attempt_after` é do provedor e continua
|
|
42
|
+
* sendo escrito pelo pipeline. Este UPDATE não toca naquele — misturá-los faria
|
|
43
|
+
* uma política diária apagar a espera obrigatória de uma hora.
|
|
44
|
+
*/
|
|
45
|
+
async function stampCursorSchedule(tx, input) {
|
|
46
|
+
await tx `
|
|
47
|
+
UPDATE fiscal_sync_cursor
|
|
48
|
+
SET last_started_at = ${input.startedAt},
|
|
49
|
+
last_completed_at = ${input.completedAt},
|
|
50
|
+
next_eligible_run_at = ${input.nextEligibleRunAt},
|
|
51
|
+
updated_at = now()
|
|
52
|
+
WHERE client_id = ${input.clientId} AND source = ${input.source}
|
|
53
|
+
AND environment = ${input.environment}
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Um ciclo completo para um tenant.
|
|
58
|
+
*
|
|
59
|
+
* O chamador já provou a compatibilidade do worker (Gate B0). Aqui só se decide
|
|
60
|
+
* QUEM roda, e todo "não roda" tem motivo registrado.
|
|
61
|
+
*/
|
|
62
|
+
async function runTenantFiscalSyncCycle(deps, tenantId) {
|
|
63
|
+
const now = deps.now ?? (() => new Date());
|
|
64
|
+
const tipos = deps.documentTypes ?? ['nfse'];
|
|
65
|
+
const results = [];
|
|
66
|
+
const automation = await (0, context_js_1.withContext)(deps.db, { tenantId }, (tx) => (0, eligibility_js_1.getTenantFiscalAutomation)(tx));
|
|
67
|
+
if (automation.mode === 'disabled') {
|
|
68
|
+
// Escritório que não ligou automação. Não é falha, não abre tarefa, e não
|
|
69
|
+
// consome nada — mas o relatório o diz, porque "zero clientes" e "automação
|
|
70
|
+
// desligada" são estados diferentes com ações diferentes.
|
|
71
|
+
return {
|
|
72
|
+
tenantId,
|
|
73
|
+
environment: null,
|
|
74
|
+
eligibleClients: 0,
|
|
75
|
+
results: [],
|
|
76
|
+
documentsNew: 0,
|
|
77
|
+
documentsDuplicate: 0,
|
|
78
|
+
eventsPending: 0,
|
|
79
|
+
eventsReconciled: 0,
|
|
80
|
+
failures: 0,
|
|
81
|
+
synced: 0,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const environment = automation.mode;
|
|
85
|
+
for (const documentType of tipos) {
|
|
86
|
+
const eligible = await (0, context_js_1.withContext)(deps.db, { tenantId }, (tx) => (0, eligibility_js_1.listFiscalEligibleClients)(tx, { documentType, environment }));
|
|
87
|
+
for (const clientId of eligible) {
|
|
88
|
+
results.push(await runClientCycle(deps, {
|
|
89
|
+
tenantId,
|
|
90
|
+
clientId,
|
|
91
|
+
documentType,
|
|
92
|
+
environment,
|
|
93
|
+
now: now(),
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const somar = (f) => results.reduce((acc, r) => acc + f(r), 0);
|
|
98
|
+
return {
|
|
99
|
+
tenantId,
|
|
100
|
+
environment,
|
|
101
|
+
eligibleClients: results.length,
|
|
102
|
+
results,
|
|
103
|
+
documentsNew: somar((r) => r.documentsNew),
|
|
104
|
+
documentsDuplicate: somar((r) => r.documentsDuplicate),
|
|
105
|
+
eventsPending: somar((r) => r.eventsPending),
|
|
106
|
+
eventsReconciled: somar((r) => r.eventsReconciled),
|
|
107
|
+
failures: results.filter((r) => r.outcome === 'failed').length,
|
|
108
|
+
synced: results.filter((r) => r.outcome === 'synced' || r.outcome === 'no_documents').length,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const vazio = (base, outcome, detail, extra = {}) => ({
|
|
112
|
+
...base,
|
|
113
|
+
outcome,
|
|
114
|
+
detail,
|
|
115
|
+
documentsNew: 0,
|
|
116
|
+
documentsDuplicate: 0,
|
|
117
|
+
eventsPending: 0,
|
|
118
|
+
eventsReconciled: 0,
|
|
119
|
+
cursorBefore: null,
|
|
120
|
+
cursorAfter: null,
|
|
121
|
+
nextRunAt: null,
|
|
122
|
+
leaseId: null,
|
|
123
|
+
leaseRecovered: false,
|
|
124
|
+
...extra,
|
|
125
|
+
});
|
|
126
|
+
/**
|
|
127
|
+
* Um cliente, do primeiro portão à devolução da vez.
|
|
128
|
+
*
|
|
129
|
+
* A fonte (`source`) sai do DESCRITOR, e não de configuração: é a fonte que sabe
|
|
130
|
+
* com quem fala. Isso amarra a ordem em dois pontos: o descritor vem DEPOIS da
|
|
131
|
+
* cadência, que não depende de fonte nenhuma, e ANTES do cursor, do disjuntor e
|
|
132
|
+
* da prontidão, que dependem.
|
|
133
|
+
*
|
|
134
|
+
* O que mudou na R1: resolver o descritor não é mais montar o adapter. Nenhuma
|
|
135
|
+
* das linhas abaixo da cadência até o lease toca em material criptográfico —
|
|
136
|
+
* verificável por leitura, porque a única função que abre o cofre exige um
|
|
137
|
+
* passe, e o passe é emitido uma vez, depois do lease.
|
|
138
|
+
*/
|
|
139
|
+
async function runClientCycle(deps, input) {
|
|
140
|
+
const { tenantId, clientId, documentType, environment, now } = input;
|
|
141
|
+
/*
|
|
142
|
+
* A cadência vem antes de tudo, e a ordem não é estética.
|
|
143
|
+
*
|
|
144
|
+
* Um escritório com duzentos clientes inscritos e nenhum com cadência ligada
|
|
145
|
+
* — que é exatamente o estado de hoje — não deve pagar duzentas resoluções de
|
|
146
|
+
* fonte para descobrir, logo depois, que nenhuma delas devia acontecer.
|
|
147
|
+
*/
|
|
148
|
+
const policy = await (0, context_js_1.withContext)(deps.db, { tenantId }, (tx) => (0, policy_js_1.resolveFiscalSyncPolicy)(tx, { clientId, documentType }));
|
|
149
|
+
if (!policy.enabled) {
|
|
150
|
+
return vazio({ clientId, documentType, source: 'nao-resolvido', environment }, 'policy_disabled', `cadência ${policy.frequency}`);
|
|
151
|
+
}
|
|
152
|
+
/*
|
|
153
|
+
* O DESCRITOR — metadata da fonte, e nada além disso.
|
|
154
|
+
*
|
|
155
|
+
* Custa leitura de tabela: quem é o provedor, qual slug, que credencial ele
|
|
156
|
+
* exige. Não abre cofre, não decifra, não fala com a rede. É o que os portões
|
|
157
|
+
* seguintes precisam, porque cursor, disjuntor e prontidão são todos POR
|
|
158
|
+
* FONTE — e é só isso que eles precisam.
|
|
159
|
+
*/
|
|
160
|
+
const resolution = await (0, context_js_1.withContext)(deps.db, { tenantId }, (tx) => deps.sourceResolver({ tx, tenantId, clientId, documentType, environment }));
|
|
161
|
+
if (!resolution) {
|
|
162
|
+
// Sem caminho de coleta para este cliente. É uma pergunta de PRODUTO — a
|
|
163
|
+
// prefeitura não aderiu, o tipo não tem adapter —, e vira tarefa humana
|
|
164
|
+
// porque nenhuma retentativa a resolve.
|
|
165
|
+
await (0, context_js_1.withContext)(deps.db, { tenantId }, (tx) => (0, intervention_js_1.raiseFiscalIntervention)(tx, {
|
|
166
|
+
tenantId,
|
|
167
|
+
clientId,
|
|
168
|
+
kind: 'unsupported_source',
|
|
169
|
+
environment,
|
|
170
|
+
documentType,
|
|
171
|
+
detail: `nenhum adapter para ${documentType} em ${environment}`,
|
|
172
|
+
now,
|
|
173
|
+
}));
|
|
174
|
+
return vazio({ clientId, documentType, source: 'nenhum', environment }, 'no_adapter', `nenhum adapter para ${documentType} em ${environment}`);
|
|
175
|
+
}
|
|
176
|
+
const { descriptor, materialize } = resolution;
|
|
177
|
+
const source = descriptor.source;
|
|
178
|
+
const base = { clientId, documentType, source, environment };
|
|
179
|
+
{
|
|
180
|
+
// ── Portões que fecham SEM segredo, em ordem de custo ──────────────────
|
|
181
|
+
const gates = await (0, context_js_1.withContext)(deps.db, { tenantId }, async (tx) => {
|
|
182
|
+
const cursor = await readCursorSnapshot(tx, { clientId, source, environment });
|
|
183
|
+
const circuit = await (0, circuit_js_1.readProviderCircuit)(tx, { tenantId, source, environment }, now);
|
|
184
|
+
const credential = await (0, readiness_js_1.readFiscalCredentialReadiness)(tx, {
|
|
185
|
+
clientId,
|
|
186
|
+
environment,
|
|
187
|
+
source,
|
|
188
|
+
// A fonte declara a credencial que exige. Metadata pergunta a metadata:
|
|
189
|
+
// saber que o ADN pede A1 não exige ter um A1 aberto.
|
|
190
|
+
kind: descriptor.credentialKind,
|
|
191
|
+
});
|
|
192
|
+
const actorDocument = await actorDocumentOf(tx, clientId);
|
|
193
|
+
return { cursor, circuit, credential, actorDocument };
|
|
194
|
+
});
|
|
195
|
+
const gate = (0, policy_js_1.nextEffectiveRun)(gates.cursor.nextEligibleRunAt, gates.cursor.nextAttemptAfter);
|
|
196
|
+
if (gate && gate > now) {
|
|
197
|
+
return vazio(base, 'waiting_window', `próxima janela em ${gate.toISOString()}`, {
|
|
198
|
+
nextRunAt: gate.toISOString(),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
if (!gates.circuit.allows) {
|
|
202
|
+
// O disjuntor do provedor está aberto: nem chega a olhar credencial. É a
|
|
203
|
+
// diferença entre cem requisições contra um serviço fora e nenhuma.
|
|
204
|
+
return vazio(base, 'circuit_open', `provedor em recuo até ${gates.circuit.openUntil?.toISOString() ?? 'indefinido'}`, { nextRunAt: gates.circuit.openUntil?.toISOString() ?? null });
|
|
205
|
+
}
|
|
206
|
+
if (!gates.credential.usableByWorker) {
|
|
207
|
+
const kind = (0, readiness_js_1.interventionKindFor)(gates.credential.state);
|
|
208
|
+
if (kind) {
|
|
209
|
+
await (0, context_js_1.withContext)(deps.db, { tenantId }, (tx) => (0, intervention_js_1.raiseFiscalIntervention)(tx, {
|
|
210
|
+
tenantId,
|
|
211
|
+
clientId,
|
|
212
|
+
kind,
|
|
213
|
+
source,
|
|
214
|
+
environment,
|
|
215
|
+
documentType,
|
|
216
|
+
detail: gates.credential.detail,
|
|
217
|
+
now,
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
return vazio(base, 'credential_not_ready', `${gates.credential.state}`);
|
|
221
|
+
}
|
|
222
|
+
if (!gates.actorDocument) {
|
|
223
|
+
return vazio(base, 'blocked', 'cliente sem CNPJ/CPF: não há ator a consultar');
|
|
224
|
+
}
|
|
225
|
+
// ── A vez ─────────────────────────────────────────────────────────────
|
|
226
|
+
const lease = await (0, context_js_1.withContext)(deps.db, { tenantId }, (tx) => (0, lease_js_1.acquireFiscalSyncLease)(tx, {
|
|
227
|
+
tenantId,
|
|
228
|
+
stream: { clientId, source, environment, documentType },
|
|
229
|
+
holder: deps.holder,
|
|
230
|
+
ttlMs: deps.leaseTtlMs ?? lease_js_1.DEFAULT_LEASE_TTL_MS,
|
|
231
|
+
now,
|
|
232
|
+
}));
|
|
233
|
+
if (!lease) {
|
|
234
|
+
// Outro processo está com o cliente. Desfecho normal e frequente — não é
|
|
235
|
+
// erro, não conta para o disjuntor e não abre tarefa.
|
|
236
|
+
return vazio(base, 'lease_unavailable', 'outro processo está sincronizando este fluxo');
|
|
237
|
+
}
|
|
238
|
+
try {
|
|
239
|
+
/*
|
|
240
|
+
* ══════════════ A FRONTEIRA DO SEGREDO ══════════════
|
|
241
|
+
*
|
|
242
|
+
* Tudo acima desta linha decidiu SEM segredo. Daqui para baixo, e só
|
|
243
|
+
* daqui para baixo, o cofre pode ser aberto — e o passe que autoriza a
|
|
244
|
+
* abertura é emitido aqui, uma única vez, em posse da vez.
|
|
245
|
+
*
|
|
246
|
+
* `grantFiscalSecretAccess` é a única emissora, e não é reexportada pelo
|
|
247
|
+
* `index` do pacote: fora de `@baruk/core` não existe caminho para
|
|
248
|
+
* fabricar um passe. Um `materialize` que tente abrir o cofre antes de
|
|
249
|
+
* receber o seu recebe `FiscalSecretBoundaryError`, e não uma chave.
|
|
250
|
+
*/
|
|
251
|
+
const authorization = (0, secret_boundary_js_1.grantFiscalSecretAccess)({
|
|
252
|
+
tenantId,
|
|
253
|
+
clientId,
|
|
254
|
+
source,
|
|
255
|
+
environment,
|
|
256
|
+
documentType,
|
|
257
|
+
credentialKind: descriptor.credentialKind,
|
|
258
|
+
leaseId: lease.id,
|
|
259
|
+
credentialFingerprint: gates.credential.fingerprint,
|
|
260
|
+
});
|
|
261
|
+
const materialized = await (0, context_js_1.withContext)(deps.db, { tenantId }, (tx) => materialize({ tx, authorization }));
|
|
262
|
+
if (!materialized) {
|
|
263
|
+
// A prontidão disse READY a partir do CADASTRO; o material não abriu.
|
|
264
|
+
// Ponteiro pendurado, envelope ilegível, cofre fora. Os dois fatos são
|
|
265
|
+
// independentes — e este é o estado em que só uma pessoa resolve.
|
|
266
|
+
await (0, context_js_1.withContext)(deps.db, { tenantId }, (tx) => (0, intervention_js_1.raiseFiscalIntervention)(tx, {
|
|
267
|
+
tenantId,
|
|
268
|
+
clientId,
|
|
269
|
+
kind: 'certificate_invalid',
|
|
270
|
+
source,
|
|
271
|
+
environment,
|
|
272
|
+
documentType,
|
|
273
|
+
detail: 'credencial pronta no cadastro, material indisponível no cofre',
|
|
274
|
+
now,
|
|
275
|
+
}));
|
|
276
|
+
return vazio(base, 'material_unavailable', 'credencial pronta no cadastro, material indisponível no cofre', { leaseId: lease.id, leaseRecovered: lease.recovered });
|
|
277
|
+
}
|
|
278
|
+
const { adapter, dispose } = materialized;
|
|
279
|
+
try {
|
|
280
|
+
await (0, context_js_1.withContext)(deps.db, { tenantId }, (tx) => (0, audit_js_1.appendAudit)(tx, {
|
|
281
|
+
actorType: 'system',
|
|
282
|
+
action: 'fiscal.sync.started',
|
|
283
|
+
resourceType: 'client',
|
|
284
|
+
resourceId: clientId,
|
|
285
|
+
metadata: {
|
|
286
|
+
source,
|
|
287
|
+
environment,
|
|
288
|
+
documentType,
|
|
289
|
+
job: deps.job.name,
|
|
290
|
+
jobVersion: deps.job.version,
|
|
291
|
+
leaseId: lease.id,
|
|
292
|
+
leaseRecovered: lease.recovered,
|
|
293
|
+
credentialFingerprint: gates.credential.fingerprint,
|
|
294
|
+
},
|
|
295
|
+
}));
|
|
296
|
+
let report;
|
|
297
|
+
try {
|
|
298
|
+
report = await (0, context_js_1.withContext)(deps.db, { tenantId }, (tx) => (0, pipeline_js_1.ingestFiscalDocuments)(tx, { adapter, storage: deps.storage ?? null }, {
|
|
299
|
+
tenantId,
|
|
300
|
+
clientId,
|
|
301
|
+
actorDocument: gates.actorDocument,
|
|
302
|
+
environment,
|
|
303
|
+
documentType,
|
|
304
|
+
now,
|
|
305
|
+
job: { name: deps.job.name, version: deps.job.version, leaseId: lease.id },
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
catch (err) {
|
|
309
|
+
// Falha que o pipeline não absorveu: a transação dele já reverteu. A
|
|
310
|
+
// decisão e a trilha vão em transação NOVA, senão voltariam junto e a
|
|
311
|
+
// falha ficaria invisível — o modo de falha que a trilha existe para
|
|
312
|
+
// eliminar.
|
|
313
|
+
const decision = (0, retry_js_1.decideFromError)(err, {
|
|
314
|
+
previousFailures: gates.cursor.consecutiveFailures,
|
|
315
|
+
now,
|
|
316
|
+
});
|
|
317
|
+
await (0, context_js_1.withContext)(deps.db, { tenantId }, async (tx) => {
|
|
318
|
+
if (decision.countsAgainstProvider) {
|
|
319
|
+
await (0, circuit_js_1.recordProviderFailure)(tx, { tenantId, source, environment }, {
|
|
320
|
+
errorClass: decision.category,
|
|
321
|
+
now,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
if (decision.interventionKind) {
|
|
325
|
+
await (0, intervention_js_1.raiseFiscalIntervention)(tx, {
|
|
326
|
+
tenantId,
|
|
327
|
+
clientId,
|
|
328
|
+
kind: decision.interventionKind,
|
|
329
|
+
source,
|
|
330
|
+
environment,
|
|
331
|
+
documentType,
|
|
332
|
+
detail: `${decision.category} (${decision.code})`,
|
|
333
|
+
now,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
await (0, audit_js_1.appendAudit)(tx, {
|
|
337
|
+
actorType: 'system',
|
|
338
|
+
action: 'fiscal.sync.failed',
|
|
339
|
+
resourceType: 'client',
|
|
340
|
+
resourceId: clientId,
|
|
341
|
+
result: 'failure',
|
|
342
|
+
metadata: {
|
|
343
|
+
source,
|
|
344
|
+
environment,
|
|
345
|
+
documentType,
|
|
346
|
+
category: decision.category,
|
|
347
|
+
code: decision.code,
|
|
348
|
+
retryable: decision.retryable,
|
|
349
|
+
nextAttemptAt: decision.nextAttemptAt?.toISOString() ?? null,
|
|
350
|
+
},
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
return vazio(base, 'failed', `${decision.category} (${decision.code})`, {
|
|
354
|
+
leaseId: lease.id,
|
|
355
|
+
leaseRecovered: lease.recovered,
|
|
356
|
+
nextRunAt: decision.nextAttemptAt?.toISOString() ?? null,
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
// ── Desfecho: cadência, disjuntor, fila humana, trilha ──────────────
|
|
360
|
+
const sucesso = report.outcome === 'completed' || report.outcome === 'no_documents';
|
|
361
|
+
const cadencia = sucesso ? (0, policy_js_1.nextRunAfter)(policy, now, now) : null;
|
|
362
|
+
await (0, context_js_1.withContext)(deps.db, { tenantId }, async (tx) => {
|
|
363
|
+
await stampCursorSchedule(tx, {
|
|
364
|
+
clientId,
|
|
365
|
+
source,
|
|
366
|
+
environment,
|
|
367
|
+
startedAt: now,
|
|
368
|
+
completedAt: sucesso ? new Date() : null,
|
|
369
|
+
nextEligibleRunAt: cadencia,
|
|
370
|
+
});
|
|
371
|
+
if (sucesso) {
|
|
372
|
+
await (0, circuit_js_1.recordProviderSuccess)(tx, { tenantId, source, environment }, now);
|
|
373
|
+
// Fechamento automático só do que foi OBSERVADO voltar a funcionar.
|
|
374
|
+
// `unsupported_source` fica: uma sincronização bem-sucedida por outro
|
|
375
|
+
// caminho não prova que a fonte que faltava passou a existir.
|
|
376
|
+
await (0, intervention_js_1.resolveFiscalInterventions)(tx, {
|
|
377
|
+
clientId,
|
|
378
|
+
kinds: [
|
|
379
|
+
'auth_required',
|
|
380
|
+
'certificate_expired',
|
|
381
|
+
'certificate_invalid',
|
|
382
|
+
'provider_access_denied',
|
|
383
|
+
'repeated_failure',
|
|
384
|
+
],
|
|
385
|
+
source,
|
|
386
|
+
environment,
|
|
387
|
+
now,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
else if (report.errorClass) {
|
|
391
|
+
// A classe do provedor é RECONSTRUÍDA, e não descartada.
|
|
392
|
+
//
|
|
393
|
+
// A primeira escrita passava `new Error(report.detail)` aqui, e
|
|
394
|
+
// `decideFromError` caía em `INTERNAL_ERROR` — que não abre tarefa
|
|
395
|
+
// nenhuma. Na prática: um 401 do ambiente nacional era registrado
|
|
396
|
+
// como falha e NÃO gerava a pendência de credencial, exatamente o
|
|
397
|
+
// caso em que só uma pessoa resolve. A classe já está no relatório;
|
|
398
|
+
// jogá-la fora para depois adivinhá-la era a inversão do problema.
|
|
399
|
+
const decision = (0, retry_js_1.decideFromError)(new provider_js_1.FiscalProviderError(report.errorClass, report.detail), { previousFailures: gates.cursor.consecutiveFailures, now });
|
|
400
|
+
// O disjuntor precisa contar ESTA falha também.
|
|
401
|
+
//
|
|
402
|
+
// O pipeline CAPTURA o erro do provedor e devolve
|
|
403
|
+
// `outcome: 'provider_error'` em vez de propagá-lo — decisão correta
|
|
404
|
+
// dele, porque assim o cursor e a trilha ficam consistentes. A
|
|
405
|
+
// consequência é que o `catch` deste arquivo nunca dispara para o caso
|
|
406
|
+
// mais comum de todos, e a primeira escrita contava só as exceções que
|
|
407
|
+
// escapavam. Resultado: o disjuntor jamais abriria em produção, por
|
|
408
|
+
// mais que o ambiente nacional estivesse fora — o modo de falha mais
|
|
409
|
+
// silencioso possível, porque o mecanismo existe e nunca é acionado.
|
|
410
|
+
if (decision.countsAgainstProvider) {
|
|
411
|
+
await (0, circuit_js_1.recordProviderFailure)(tx, { tenantId, source, environment }, { errorClass: decision.category, now });
|
|
412
|
+
}
|
|
413
|
+
if (decision.interventionKind) {
|
|
414
|
+
await (0, intervention_js_1.raiseFiscalIntervention)(tx, {
|
|
415
|
+
tenantId,
|
|
416
|
+
clientId,
|
|
417
|
+
kind: decision.interventionKind,
|
|
418
|
+
source,
|
|
419
|
+
environment,
|
|
420
|
+
documentType,
|
|
421
|
+
detail: report.detail,
|
|
422
|
+
now,
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
await (0, audit_js_1.appendAudit)(tx, {
|
|
427
|
+
actorType: 'system',
|
|
428
|
+
action: sucesso ? 'fiscal.sync.completed' : 'fiscal.sync.failed',
|
|
429
|
+
resourceType: 'client',
|
|
430
|
+
resourceId: clientId,
|
|
431
|
+
result: sucesso ? 'success' : 'failure',
|
|
432
|
+
metadata: {
|
|
433
|
+
source,
|
|
434
|
+
environment,
|
|
435
|
+
documentType,
|
|
436
|
+
outcome: report.outcome,
|
|
437
|
+
created: report.documentsNew,
|
|
438
|
+
duplicate: report.documentsDuplicate,
|
|
439
|
+
pending: report.eventsPending,
|
|
440
|
+
reconciled: report.eventsReconciled,
|
|
441
|
+
cursorBefore: report.cursorBefore,
|
|
442
|
+
cursorAfter: report.cursorAfter,
|
|
443
|
+
nextRunAt: cadencia?.toISOString() ?? null,
|
|
444
|
+
},
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
return {
|
|
448
|
+
...base,
|
|
449
|
+
// `provider_error` é FALHA, não bloqueio.
|
|
450
|
+
//
|
|
451
|
+
// A distinção não é vocabulário: `blocked` significa "um portão nosso
|
|
452
|
+
// fechou" — política, elegibilidade, contrato — e não pede retentativa
|
|
453
|
+
// nem tarefa. `failed` significa "tentamos e não deu", e é o que aciona
|
|
454
|
+
// recuo, disjuntor e fila humana. Colapsar os dois faria um 401 do
|
|
455
|
+
// ambiente nacional parecer uma decisão de configuração do escritório.
|
|
456
|
+
outcome: report.outcome === 'completed'
|
|
457
|
+
? 'synced'
|
|
458
|
+
: report.outcome === 'no_documents'
|
|
459
|
+
? 'no_documents'
|
|
460
|
+
: report.outcome === 'failed' || report.outcome === 'provider_error'
|
|
461
|
+
? 'failed'
|
|
462
|
+
: 'blocked',
|
|
463
|
+
detail: report.detail,
|
|
464
|
+
documentsNew: report.documentsNew,
|
|
465
|
+
documentsDuplicate: report.documentsDuplicate,
|
|
466
|
+
eventsPending: report.eventsPending,
|
|
467
|
+
eventsReconciled: report.eventsReconciled,
|
|
468
|
+
cursorBefore: report.cursorBefore,
|
|
469
|
+
cursorAfter: report.cursorAfter,
|
|
470
|
+
nextRunAt: cadencia?.toISOString() ?? null,
|
|
471
|
+
leaseId: lease.id,
|
|
472
|
+
leaseRecovered: lease.recovered,
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
finally {
|
|
476
|
+
// Material de certificado volta ao nada, tenha o lote dado certo ou
|
|
477
|
+
// não. Dentro do lease de propósito: o material vive exatamente o
|
|
478
|
+
// intervalo em que a vez é nossa, e nem um instante além.
|
|
479
|
+
dispose?.();
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
finally {
|
|
483
|
+
// A vez é devolvida em QUALQUER desfecho. Sem isto, um erro inesperado
|
|
484
|
+
// deixaria o cliente bloqueado até o prazo vencer — o prazo é a rede de
|
|
485
|
+
// segurança, não o caminho normal.
|
|
486
|
+
await (0, context_js_1.withContext)(deps.db, { tenantId }, (tx) => (0, lease_js_1.releaseFiscalSyncLease)(tx, { leaseId: lease.id, holder: deps.holder }));
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
//# 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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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FISCAL_SYNC_POLICY_DEFAULT = void 0;
|
|
4
|
+
exports.resolveFiscalSyncPolicy = resolveFiscalSyncPolicy;
|
|
5
|
+
exports.nextRunAfter = nextRunAfter;
|
|
6
|
+
exports.nextEffectiveRun = nextEffectiveRun;
|
|
7
|
+
exports.setFiscalSyncPolicy = setFiscalSyncPolicy;
|
|
8
|
+
const shared_1 = require("@baruk/shared");
|
|
9
|
+
/** O que vale quando ninguém configurou nada. Desligado, sempre. */
|
|
10
|
+
exports.FISCAL_SYNC_POLICY_DEFAULT = {
|
|
11
|
+
frequency: 'disabled',
|
|
12
|
+
windowHourLocal: 8,
|
|
13
|
+
origin: 'default',
|
|
14
|
+
enabled: false,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a política de um cliente.
|
|
18
|
+
*
|
|
19
|
+
* Roda sob `withContext` com o tenant — a tabela tem RLS FORCE.
|
|
20
|
+
*/
|
|
21
|
+
async function resolveFiscalSyncPolicy(tx, input) {
|
|
22
|
+
const rows = await tx `
|
|
23
|
+
SELECT client_id, frequency, window_hour_local
|
|
24
|
+
FROM fiscal_sync_policy
|
|
25
|
+
WHERE document_type = ${input.documentType}
|
|
26
|
+
AND (client_id = ${input.clientId} OR client_id IS NULL)
|
|
27
|
+
-- A linha do cliente primeiro: "NULLS LAST" faz o padrão do escritório
|
|
28
|
+
-- ficar para trás sem precisar de duas consultas.
|
|
29
|
+
ORDER BY client_id NULLS LAST
|
|
30
|
+
LIMIT 1
|
|
31
|
+
`;
|
|
32
|
+
const r = rows[0];
|
|
33
|
+
if (!r)
|
|
34
|
+
return exports.FISCAL_SYNC_POLICY_DEFAULT;
|
|
35
|
+
const frequency = r.frequency;
|
|
36
|
+
return {
|
|
37
|
+
frequency,
|
|
38
|
+
windowHourLocal: r.window_hour_local,
|
|
39
|
+
origin: r.client_id ? 'client' : 'tenant',
|
|
40
|
+
enabled: frequency !== 'disabled',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Quando este fluxo volta a ser elegível, pela CADÊNCIA.
|
|
45
|
+
*
|
|
46
|
+
* Distinto de `next_attempt_after`, que é espera do PROVEDOR. Desobedecer aquela
|
|
47
|
+
* bloqueia o CNPJ do cliente; antecipar esta é só desperdício. O gate efetivo é
|
|
48
|
+
* o maior dos dois, e quem os combina é `nextEffectiveRun`.
|
|
49
|
+
*
|
|
50
|
+
* `business_day` avança para segunda quando cai no fim de semana. Não é
|
|
51
|
+
* cosmético: nota emitida no sábado só é vista na segunda de qualquer forma, e
|
|
52
|
+
* uma consulta que ninguém vai olhar ainda assim consome a cota do cliente.
|
|
53
|
+
*/
|
|
54
|
+
function nextRunAfter(policy, lastCompletedAt, now) {
|
|
55
|
+
if (!policy.enabled)
|
|
56
|
+
return null;
|
|
57
|
+
const base = lastCompletedAt ?? now;
|
|
58
|
+
if (policy.frequency === 'hourly') {
|
|
59
|
+
return new Date(base.getTime() + 3_600_000);
|
|
60
|
+
}
|
|
61
|
+
// A janela diária é ancorada na hora LOCAL do escritório. O deslocamento é
|
|
62
|
+
// fixo em -3 porque o Brasil não tem mais horário de verão desde 2019; se
|
|
63
|
+
// voltar, este é o ponto único a mudar — e o comentário é o que faz alguém
|
|
64
|
+
// encontrá-lo.
|
|
65
|
+
const OFFSET_HOURS = -3;
|
|
66
|
+
const alvo = new Date(base.getTime());
|
|
67
|
+
alvo.setUTCHours(policy.windowHourLocal - OFFSET_HOURS, 0, 0, 0);
|
|
68
|
+
if (alvo <= base)
|
|
69
|
+
alvo.setUTCDate(alvo.getUTCDate() + 1);
|
|
70
|
+
if (policy.frequency === 'business_day') {
|
|
71
|
+
// 0 = domingo, 6 = sábado, no fuso local.
|
|
72
|
+
for (let i = 0; i < 7; i += 1) {
|
|
73
|
+
const localDay = new Date(alvo.getTime() + OFFSET_HOURS * 3_600_000).getUTCDay();
|
|
74
|
+
if (localDay !== 0 && localDay !== 6)
|
|
75
|
+
break;
|
|
76
|
+
alvo.setUTCDate(alvo.getUTCDate() + 1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return alvo;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* O gate efetivo: o MAIOR entre a cadência nossa e a espera do provedor.
|
|
83
|
+
*
|
|
84
|
+
* Colapsá-los numa coluna só faria uma política diária apagar uma espera
|
|
85
|
+
* obrigatória de uma hora — e essa espera é o que separa a automação do
|
|
86
|
+
* `cStat 656`.
|
|
87
|
+
*/
|
|
88
|
+
function nextEffectiveRun(cadence, providerWait) {
|
|
89
|
+
if (!cadence)
|
|
90
|
+
return providerWait;
|
|
91
|
+
if (!providerWait)
|
|
92
|
+
return cadence;
|
|
93
|
+
return cadence > providerWait ? cadence : providerWait;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Grava a política de cadência.
|
|
97
|
+
*
|
|
98
|
+
* ## Por que existe uma função, e não um `INSERT` em cada chamador
|
|
99
|
+
*
|
|
100
|
+
* Os índices únicos da 0058 são PARCIAIS (`WHERE client_id IS NOT NULL` e
|
|
101
|
+
* `WHERE client_id IS NULL`), porque NULL não colide com NULL num índice comum
|
|
102
|
+
* e sem isso o padrão do escritório poderia ser gravado duas vezes. A
|
|
103
|
+
* consequência é que `ON CONFLICT (tenant_id, client_id, document_type)`
|
|
104
|
+
* **não encontra o índice** — o PostgreSQL exige o predicado junto.
|
|
105
|
+
*
|
|
106
|
+
* É uma armadilha que todo chamador cairia uma vez. Uma função só, que a
|
|
107
|
+
* conhece, é mais barata do que três lugares que a redescobrem.
|
|
108
|
+
*/
|
|
109
|
+
async function setFiscalSyncPolicy(tx, input) {
|
|
110
|
+
const now = input.now ?? new Date();
|
|
111
|
+
// Ligado exige registro de quem ligou e quando — o CHECK da 0058 recusa
|
|
112
|
+
// automação sem dono, e a data é gravada aqui em vez de num `DEFAULT`.
|
|
113
|
+
const enabledAt = input.frequency === 'disabled' ? null : now;
|
|
114
|
+
const hora = input.windowHourLocal ?? 8;
|
|
115
|
+
if (input.clientId) {
|
|
116
|
+
await tx `
|
|
117
|
+
INSERT INTO fiscal_sync_policy (id, tenant_id, client_id, document_type, frequency,
|
|
118
|
+
window_hour_local, enabled_at, enabled_by, updated_at)
|
|
119
|
+
VALUES (${(0, shared_1.uuidv7)()}, ${input.tenantId}, ${input.clientId}, ${input.documentType},
|
|
120
|
+
${input.frequency}, ${hora}, ${enabledAt}, ${input.enabledBy ?? null}, now())
|
|
121
|
+
ON CONFLICT (tenant_id, client_id, document_type) WHERE client_id IS NOT NULL
|
|
122
|
+
DO UPDATE SET frequency = EXCLUDED.frequency,
|
|
123
|
+
window_hour_local = EXCLUDED.window_hour_local,
|
|
124
|
+
enabled_at = EXCLUDED.enabled_at,
|
|
125
|
+
enabled_by = EXCLUDED.enabled_by,
|
|
126
|
+
updated_at = now()
|
|
127
|
+
`;
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
await tx `
|
|
131
|
+
INSERT INTO fiscal_sync_policy (id, tenant_id, client_id, document_type, frequency,
|
|
132
|
+
window_hour_local, enabled_at, enabled_by, updated_at)
|
|
133
|
+
VALUES (${(0, shared_1.uuidv7)()}, ${input.tenantId}, NULL, ${input.documentType},
|
|
134
|
+
${input.frequency}, ${hora}, ${enabledAt}, ${input.enabledBy ?? null}, now())
|
|
135
|
+
ON CONFLICT (tenant_id, document_type) WHERE client_id IS NULL
|
|
136
|
+
DO UPDATE SET frequency = EXCLUDED.frequency,
|
|
137
|
+
window_hour_local = EXCLUDED.window_hour_local,
|
|
138
|
+
enabled_at = EXCLUDED.enabled_at,
|
|
139
|
+
enabled_by = EXCLUDED.enabled_by,
|
|
140
|
+
updated_at = now()
|
|
141
|
+
`;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=policy.js.map
|