@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,470 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvalidAttributeValue = exports.UnknownFiscalAttribute = void 0;
|
|
4
|
+
exports.listFiscalAttributes = listFiscalAttributes;
|
|
5
|
+
exports.setClientFiscalAttribute = setClientFiscalAttribute;
|
|
6
|
+
exports.clearClientFiscalAttribute = clearClientFiscalAttribute;
|
|
7
|
+
exports.loadFiscalProfile = loadFiscalProfile;
|
|
8
|
+
exports.loadClientJurisdiction = loadClientJurisdiction;
|
|
9
|
+
exports.candidateRules = candidateRules;
|
|
10
|
+
exports.resolveRule = resolveRule;
|
|
11
|
+
exports.createFiscalRule = createFiscalRule;
|
|
12
|
+
exports.supersedeFiscalRule = supersedeFiscalRule;
|
|
13
|
+
exports.getFiscalRule = getFiscalRule;
|
|
14
|
+
exports.setTenantRulePolicy = setTenantRulePolicy;
|
|
15
|
+
exports.listTenantRulePolicies = listTenantRulePolicies;
|
|
16
|
+
exports.listGovernanceRules = listGovernanceRules;
|
|
17
|
+
exports.summarizeGovernance = summarizeGovernance;
|
|
18
|
+
exports.annotateFiscalRule = annotateFiscalRule;
|
|
19
|
+
exports.validateFiscalRule = validateFiscalRule;
|
|
20
|
+
const shared_1 = require("@baruk/shared");
|
|
21
|
+
const conditions_js_1 = require("./conditions.js");
|
|
22
|
+
async function listFiscalAttributes(tx) {
|
|
23
|
+
const rows = await tx `
|
|
24
|
+
SELECT key, label, description, value_type, allowed_values
|
|
25
|
+
FROM fiscal_attribute_definition ORDER BY key
|
|
26
|
+
`;
|
|
27
|
+
return rows.map((r) => ({
|
|
28
|
+
key: r.key,
|
|
29
|
+
label: r.label,
|
|
30
|
+
description: r.description,
|
|
31
|
+
valueType: r.value_type,
|
|
32
|
+
allowedValues: Array.isArray(r.allowed_values) ? r.allowed_values : null,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
class UnknownFiscalAttribute extends Error {
|
|
36
|
+
constructor(key) {
|
|
37
|
+
super(`Atributo fiscal desconhecido: ${key}`);
|
|
38
|
+
this.name = 'UnknownFiscalAttribute';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.UnknownFiscalAttribute = UnknownFiscalAttribute;
|
|
42
|
+
class InvalidAttributeValue extends Error {
|
|
43
|
+
constructor(message) {
|
|
44
|
+
super(message);
|
|
45
|
+
this.name = 'InvalidAttributeValue';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.InvalidAttributeValue = InvalidAttributeValue;
|
|
49
|
+
/**
|
|
50
|
+
* Grava um atributo do perfil.
|
|
51
|
+
*
|
|
52
|
+
* Valida o valor CONTRA A DEFINIÇÃO antes de gravar: booleano recebe booleano,
|
|
53
|
+
* enum recebe um dos valores declarados. Sem isso, `activity_segment` aceitaria
|
|
54
|
+
* "industria " com espaço e a regra que compara com "industria" nunca casaria —
|
|
55
|
+
* e ninguém saberia por quê, porque o dado *parece* certo na tela.
|
|
56
|
+
*/
|
|
57
|
+
async function setClientFiscalAttribute(tx, input) {
|
|
58
|
+
const [def] = await tx `
|
|
59
|
+
SELECT value_type, allowed_values FROM fiscal_attribute_definition WHERE key = ${input.attributeKey}
|
|
60
|
+
`;
|
|
61
|
+
if (!def)
|
|
62
|
+
throw new UnknownFiscalAttribute(input.attributeKey);
|
|
63
|
+
let vBool = null;
|
|
64
|
+
let vText = null;
|
|
65
|
+
if (def.value_type === 'boolean') {
|
|
66
|
+
if (typeof input.value !== 'boolean') {
|
|
67
|
+
throw new InvalidAttributeValue(`"${input.attributeKey}" espera verdadeiro ou falso.`);
|
|
68
|
+
}
|
|
69
|
+
vBool = input.value;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
if (typeof input.value !== 'string' || input.value.trim() === '') {
|
|
73
|
+
throw new InvalidAttributeValue(`"${input.attributeKey}" espera texto não vazio.`);
|
|
74
|
+
}
|
|
75
|
+
vText = input.value.trim();
|
|
76
|
+
if (def.value_type === 'enum') {
|
|
77
|
+
const permitidos = Array.isArray(def.allowed_values) ? def.allowed_values : [];
|
|
78
|
+
if (!permitidos.includes(vText)) {
|
|
79
|
+
throw new InvalidAttributeValue(`"${vText}" não é aceito em "${input.attributeKey}". Valores: ${permitidos.join(', ')}.`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
await tx `
|
|
84
|
+
INSERT INTO client_fiscal_attribute
|
|
85
|
+
(id, tenant_id, client_id, attribute_key, value_bool, value_text, source, updated_by)
|
|
86
|
+
VALUES (
|
|
87
|
+
${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid, ${input.clientId},
|
|
88
|
+
${input.attributeKey}, ${vBool}, ${vText}, ${input.source ?? null}, ${input.actorId ?? null}
|
|
89
|
+
)
|
|
90
|
+
ON CONFLICT (tenant_id, client_id, attribute_key) DO UPDATE SET
|
|
91
|
+
value_bool = EXCLUDED.value_bool,
|
|
92
|
+
value_text = EXCLUDED.value_text,
|
|
93
|
+
source = EXCLUDED.source,
|
|
94
|
+
updated_by = EXCLUDED.updated_by,
|
|
95
|
+
updated_at = now()
|
|
96
|
+
`;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Remove um atributo — devolvendo-o ao estado DESCONHECIDO.
|
|
100
|
+
*
|
|
101
|
+
* Existe porque "não sei mais" é um estado legítimo e diferente de `false`.
|
|
102
|
+
* Sem esta operação, corrigir um dado errado exigiria gravar um valor que
|
|
103
|
+
* ninguém confirmou.
|
|
104
|
+
*/
|
|
105
|
+
async function clearClientFiscalAttribute(tx, input) {
|
|
106
|
+
await tx `
|
|
107
|
+
DELETE FROM client_fiscal_attribute
|
|
108
|
+
WHERE client_id = ${input.clientId} AND attribute_key = ${input.attributeKey}
|
|
109
|
+
`;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* O perfil como o motor o enxerga.
|
|
113
|
+
*
|
|
114
|
+
* Atributo ausente simplesmente não aparece no objeto — e é assim que
|
|
115
|
+
* `evaluate` o distingue de `false`.
|
|
116
|
+
*/
|
|
117
|
+
async function loadFiscalProfile(tx, clientId) {
|
|
118
|
+
const rows = await tx `
|
|
119
|
+
SELECT attribute_key, value_bool, value_text
|
|
120
|
+
FROM client_fiscal_attribute WHERE client_id = ${clientId}
|
|
121
|
+
`;
|
|
122
|
+
const perfil = {};
|
|
123
|
+
for (const r of rows) {
|
|
124
|
+
perfil[r.attribute_key] = r.value_bool !== null ? r.value_bool : r.value_text;
|
|
125
|
+
}
|
|
126
|
+
return perfil;
|
|
127
|
+
}
|
|
128
|
+
async function loadClientJurisdiction(tx, clientId) {
|
|
129
|
+
const [r] = await tx `
|
|
130
|
+
SELECT state_uf, municipality_ibge_code FROM client WHERE id = ${clientId} AND deleted_at IS NULL
|
|
131
|
+
`;
|
|
132
|
+
return { uf: r?.state_uf ?? null, cityIbge: r?.municipality_ibge_code ?? null };
|
|
133
|
+
}
|
|
134
|
+
const iso = (d) => d.toISOString().slice(0, 10);
|
|
135
|
+
const mapRule = (r) => ({
|
|
136
|
+
id: r.id,
|
|
137
|
+
tenantId: r.tenant_id,
|
|
138
|
+
itemTypeId: r.item_type_id,
|
|
139
|
+
version: r.version,
|
|
140
|
+
jurisdiction: {
|
|
141
|
+
scope: r.jurisdiction_scope,
|
|
142
|
+
uf: r.jurisdiction_uf,
|
|
143
|
+
cityIbge: r.jurisdiction_city_ibge,
|
|
144
|
+
},
|
|
145
|
+
validFrom: iso(r.valid_from),
|
|
146
|
+
validUntil: r.valid_until ? iso(r.valid_until) : null,
|
|
147
|
+
status: r.status,
|
|
148
|
+
conditions: r.conditions ?? { op: 'always' },
|
|
149
|
+
dueRule: r.due_rule,
|
|
150
|
+
sourceReference: r.source_reference,
|
|
151
|
+
});
|
|
152
|
+
const RULE_COLS = `
|
|
153
|
+
id, tenant_id, item_type_id, version, jurisdiction_scope, jurisdiction_uf,
|
|
154
|
+
jurisdiction_city_ibge, valid_from, valid_until, status, conditions, due_rule, source_reference
|
|
155
|
+
`;
|
|
156
|
+
/**
|
|
157
|
+
* As regras candidatas para um tipo de item numa competência.
|
|
158
|
+
*
|
|
159
|
+
* **Pré-filtra por jurisdição e vigência no banco**, antes de qualquer
|
|
160
|
+
* avaliação de condição. Avaliar a AST de todas as regras do país para cada
|
|
161
|
+
* cliente seria o desenho ingênuo que a premissa pede para evitar; aqui o
|
|
162
|
+
* índice `fiscal_rule_lookup_idx` reduz o conjunto a um punhado antes de o
|
|
163
|
+
* motor tocar nele.
|
|
164
|
+
*
|
|
165
|
+
* A regra do ESCRITÓRIO tem precedência sobre a global na mesma jurisdição —
|
|
166
|
+
* `DISTINCT ON` com `tenant_id NULLS LAST`, o mesmo padrão de
|
|
167
|
+
* `recurring_item_type`.
|
|
168
|
+
*/
|
|
169
|
+
async function candidateRules(tx, input) {
|
|
170
|
+
const rows = await tx `
|
|
171
|
+
SELECT DISTINCT ON (jurisdiction_scope, coalesce(jurisdiction_uf,'-'), coalesce(jurisdiction_city_ibge,'-'))
|
|
172
|
+
${tx.unsafe(RULE_COLS)}
|
|
173
|
+
FROM fiscal_rule
|
|
174
|
+
WHERE deleted_at IS NULL
|
|
175
|
+
AND item_type_id = ${input.itemTypeId}
|
|
176
|
+
AND valid_from <= ${input.referenceDate}::date
|
|
177
|
+
AND (valid_until IS NULL OR valid_until >= ${input.referenceDate}::date)
|
|
178
|
+
AND (
|
|
179
|
+
jurisdiction_scope = 'federal'
|
|
180
|
+
OR (jurisdiction_scope = 'state'
|
|
181
|
+
AND jurisdiction_uf = ${input.jurisdiction.uf})
|
|
182
|
+
OR (jurisdiction_scope = 'municipal'
|
|
183
|
+
AND jurisdiction_uf = ${input.jurisdiction.uf}
|
|
184
|
+
AND jurisdiction_city_ibge = ${input.jurisdiction.cityIbge})
|
|
185
|
+
)
|
|
186
|
+
ORDER BY jurisdiction_scope, coalesce(jurisdiction_uf,'-'), coalesce(jurisdiction_city_ibge,'-'),
|
|
187
|
+
tenant_id NULLS LAST, version DESC
|
|
188
|
+
`;
|
|
189
|
+
return rows.map(mapRule);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* A regra mais específica que alcança o cliente.
|
|
193
|
+
*
|
|
194
|
+
* Municipal vence estadual, que vence federal. Um município que legisla sobre
|
|
195
|
+
* a obrigação está mais perto do fato que a União.
|
|
196
|
+
*/
|
|
197
|
+
async function resolveRule(tx, input) {
|
|
198
|
+
const candidatas = await candidateRules(tx, input);
|
|
199
|
+
const ordem = { municipal: 0, state: 1, federal: 2 };
|
|
200
|
+
return ([...candidatas].sort((a, b) => ordem[a.jurisdiction.scope] - ordem[b.jurisdiction.scope])[0] ??
|
|
201
|
+
null);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Cria uma regra.
|
|
205
|
+
*
|
|
206
|
+
* A condição é validada AQUI, na escrita. Gravar uma AST malformada seria
|
|
207
|
+
* empurrar o erro para a madrugada da geração, onde a única saída seria não
|
|
208
|
+
* gerar sem explicar.
|
|
209
|
+
*/
|
|
210
|
+
async function createFiscalRule(tx, input) {
|
|
211
|
+
(0, conditions_js_1.parseCondition)(input.conditions ?? { op: 'always' });
|
|
212
|
+
const status = input.status ?? 'pending_validation';
|
|
213
|
+
if (status === 'validated' && !input.validatedBy) {
|
|
214
|
+
throw new Error('Uma regra validada precisa de quem a validou.');
|
|
215
|
+
}
|
|
216
|
+
const validadaEm = status === 'validated' ? new Date() : null;
|
|
217
|
+
const validadaPor = status === 'validated' ? input.validatedBy : null;
|
|
218
|
+
// Três destinos possíveis, e cada um precisa de SQL diferente:
|
|
219
|
+
//
|
|
220
|
+
// `tenantId: null` → regra GLOBAL. Só o provisionamento consegue: a
|
|
221
|
+
// policy recusa `tenant_id NULL` vindo de sessão
|
|
222
|
+
// com tenant, e é essa recusa que impede um
|
|
223
|
+
// escritório de forjar regra nacional.
|
|
224
|
+
// `tenantId: '<uuid>'` → tenant explícito (provisionamento).
|
|
225
|
+
// ausente → o tenant da sessão, lido da GUC.
|
|
226
|
+
//
|
|
227
|
+
// Resolver isso com um único parâmetro misturaria valor e fragmento SQL —
|
|
228
|
+
// que compila e não faz o que parece.
|
|
229
|
+
const global = input.tenantId === null;
|
|
230
|
+
const explicito = typeof input.tenantId === 'string' ? input.tenantId : null;
|
|
231
|
+
const cond = tx.json((input.conditions ?? { op: 'always' }));
|
|
232
|
+
const due = input.dueRule ? tx.json(input.dueRule) : null;
|
|
233
|
+
const rows = global
|
|
234
|
+
? await tx `
|
|
235
|
+
INSERT INTO fiscal_rule (
|
|
236
|
+
id, tenant_id, item_type_id, jurisdiction_scope, jurisdiction_uf, jurisdiction_city_ibge,
|
|
237
|
+
version, valid_from, valid_until, status, conditions, due_rule, source_reference, note,
|
|
238
|
+
validated_by, validated_at
|
|
239
|
+
) VALUES (
|
|
240
|
+
${(0, shared_1.uuidv7)()}, NULL, ${input.itemTypeId}, ${input.jurisdictionScope},
|
|
241
|
+
${input.jurisdictionUf ?? null}, ${input.jurisdictionCityIbge ?? null},
|
|
242
|
+
${input.version ?? 1}, ${input.validFrom}, ${input.validUntil ?? null},
|
|
243
|
+
${status}, ${cond}, ${due},
|
|
244
|
+
${input.sourceReference ?? null}, ${input.note ?? null}, ${validadaPor}, ${validadaEm}
|
|
245
|
+
)
|
|
246
|
+
RETURNING ${tx.unsafe(RULE_COLS)}
|
|
247
|
+
`
|
|
248
|
+
: await tx `
|
|
249
|
+
INSERT INTO fiscal_rule (
|
|
250
|
+
id, tenant_id, item_type_id, jurisdiction_scope, jurisdiction_uf, jurisdiction_city_ibge,
|
|
251
|
+
version, valid_from, valid_until, status, conditions, due_rule, source_reference, note,
|
|
252
|
+
validated_by, validated_at
|
|
253
|
+
) VALUES (
|
|
254
|
+
${(0, shared_1.uuidv7)()},
|
|
255
|
+
${explicito ?? tx.unsafe("current_setting('app.current_tenant')::uuid")},
|
|
256
|
+
${input.itemTypeId}, ${input.jurisdictionScope},
|
|
257
|
+
${input.jurisdictionUf ?? null}, ${input.jurisdictionCityIbge ?? null},
|
|
258
|
+
${input.version ?? 1}, ${input.validFrom}, ${input.validUntil ?? null},
|
|
259
|
+
${status}, ${cond}, ${due},
|
|
260
|
+
${input.sourceReference ?? null}, ${input.note ?? null}, ${validadaPor}, ${validadaEm}
|
|
261
|
+
)
|
|
262
|
+
RETURNING ${tx.unsafe(RULE_COLS)}
|
|
263
|
+
`;
|
|
264
|
+
return mapRule(rows[0]);
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Publica uma nova versão, encerrando a anterior.
|
|
268
|
+
*
|
|
269
|
+
* **Não altera a versão antiga.** Ela recebe `valid_until` e continua lá,
|
|
270
|
+
* inteira: é ela que explica as obrigações já geradas. Editar a regra vigente
|
|
271
|
+
* em vez de versioná-la é como a mudança de amanhã reescreve o vencimento de
|
|
272
|
+
* ontem — e ninguém consegue mais dizer por que aquela data foi aquela.
|
|
273
|
+
*/
|
|
274
|
+
async function supersedeFiscalRule(tx, input) {
|
|
275
|
+
const [atual] = await tx `
|
|
276
|
+
SELECT ${tx.unsafe(RULE_COLS)} FROM fiscal_rule
|
|
277
|
+
WHERE id = ${input.currentRuleId} AND deleted_at IS NULL
|
|
278
|
+
`;
|
|
279
|
+
if (!atual)
|
|
280
|
+
throw new Error('Regra não encontrada.');
|
|
281
|
+
if (input.validFrom <= iso(atual.valid_from)) {
|
|
282
|
+
throw new Error('A nova versão precisa começar depois do início da anterior.');
|
|
283
|
+
}
|
|
284
|
+
// O dia anterior ao início da nova: sem vão e sem sobreposição.
|
|
285
|
+
const fim = new Date(`${input.validFrom}T00:00:00Z`);
|
|
286
|
+
fim.setUTCDate(fim.getUTCDate() - 1);
|
|
287
|
+
await tx `
|
|
288
|
+
UPDATE fiscal_rule SET valid_until = ${iso(fim)}, updated_at = now()
|
|
289
|
+
WHERE id = ${input.currentRuleId}
|
|
290
|
+
`;
|
|
291
|
+
const proxima = await createFiscalRule(tx, {
|
|
292
|
+
itemTypeId: atual.item_type_id,
|
|
293
|
+
jurisdictionScope: atual.jurisdiction_scope,
|
|
294
|
+
jurisdictionUf: atual.jurisdiction_uf,
|
|
295
|
+
jurisdictionCityIbge: atual.jurisdiction_city_ibge,
|
|
296
|
+
validFrom: input.validFrom,
|
|
297
|
+
version: atual.version + 1,
|
|
298
|
+
tenantId: atual.tenant_id,
|
|
299
|
+
conditions: input.changes.conditions ?? atual.conditions,
|
|
300
|
+
dueRule: input.changes.dueRule ?? atual.due_rule,
|
|
301
|
+
status: input.changes.status ?? 'pending_validation',
|
|
302
|
+
sourceReference: input.changes.sourceReference ?? atual.source_reference,
|
|
303
|
+
...(input.changes.note !== undefined ? { note: input.changes.note } : {}),
|
|
304
|
+
});
|
|
305
|
+
return { previous: mapRule({ ...atual, valid_until: fim }), next: proxima };
|
|
306
|
+
}
|
|
307
|
+
async function getFiscalRule(tx, id) {
|
|
308
|
+
const [r] = await tx `
|
|
309
|
+
SELECT ${tx.unsafe(RULE_COLS)} FROM fiscal_rule WHERE id = ${id} AND deleted_at IS NULL
|
|
310
|
+
`;
|
|
311
|
+
return r ? mapRule(r) : null;
|
|
312
|
+
}
|
|
313
|
+
async function setTenantRulePolicy(tx, input) {
|
|
314
|
+
await tx `
|
|
315
|
+
INSERT INTO tenant_rule_policy
|
|
316
|
+
(id, tenant_id, item_type_id, internal_lead_days, enabled, note, updated_by)
|
|
317
|
+
VALUES (
|
|
318
|
+
${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid, ${input.itemTypeId},
|
|
319
|
+
${input.internalLeadDays ?? null}, ${input.enabled ?? true}, ${input.note ?? null},
|
|
320
|
+
${input.actorId ?? null}
|
|
321
|
+
)
|
|
322
|
+
ON CONFLICT (tenant_id, item_type_id) DO UPDATE SET
|
|
323
|
+
internal_lead_days = EXCLUDED.internal_lead_days,
|
|
324
|
+
enabled = EXCLUDED.enabled,
|
|
325
|
+
note = EXCLUDED.note,
|
|
326
|
+
updated_by = EXCLUDED.updated_by,
|
|
327
|
+
updated_at = now()
|
|
328
|
+
`;
|
|
329
|
+
}
|
|
330
|
+
async function listTenantRulePolicies(tx) {
|
|
331
|
+
const rows = await tx `
|
|
332
|
+
SELECT item_type_id, internal_lead_days, enabled, note FROM tenant_rule_policy
|
|
333
|
+
`;
|
|
334
|
+
return rows.map((r) => ({
|
|
335
|
+
itemTypeId: r.item_type_id,
|
|
336
|
+
internalLeadDays: r.internal_lead_days,
|
|
337
|
+
enabled: r.enabled,
|
|
338
|
+
note: r.note,
|
|
339
|
+
}));
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* A fila inteira: global e do escritório, com a procedência de cada linha.
|
|
343
|
+
*
|
|
344
|
+
* Sem filtro de vigência nem de jurisdição, ao contrário de `candidateRules` —
|
|
345
|
+
* são perguntas diferentes. Aquela responde "qual regra vale para este cliente
|
|
346
|
+
* hoje"; esta responde "o que existe e o que ainda não foi conferido", e uma
|
|
347
|
+
* regra vencida ou de outra UF continua sendo trabalho de governança.
|
|
348
|
+
*/
|
|
349
|
+
async function listGovernanceRules(tx) {
|
|
350
|
+
const rows = await tx `
|
|
351
|
+
SELECT r.id, r.tenant_id, r.item_type_id,
|
|
352
|
+
t.key AS item_key, t.label AS item_label, t.sphere,
|
|
353
|
+
r.jurisdiction_scope, r.jurisdiction_uf, r.jurisdiction_city_ibge,
|
|
354
|
+
r.version, r.valid_from, r.valid_until, r.status,
|
|
355
|
+
r.source_reference, r.source_url, r.validated_at,
|
|
356
|
+
u.full_name AS validated_by_name, r.note
|
|
357
|
+
FROM fiscal_rule r
|
|
358
|
+
JOIN recurring_item_type t ON t.id = r.item_type_id
|
|
359
|
+
LEFT JOIN "user" u ON u.id = r.validated_by
|
|
360
|
+
WHERE r.deleted_at IS NULL AND t.deleted_at IS NULL
|
|
361
|
+
ORDER BY (r.status <> 'validated') DESC, t.sphere, t.label, r.version DESC
|
|
362
|
+
`;
|
|
363
|
+
return rows.map((r) => ({
|
|
364
|
+
id: r.id,
|
|
365
|
+
itemTypeId: r.item_type_id,
|
|
366
|
+
itemTypeKey: r.item_key,
|
|
367
|
+
itemTypeLabel: r.item_label,
|
|
368
|
+
sphere: r.sphere,
|
|
369
|
+
origin: r.tenant_id === null ? 'global' : 'tenant',
|
|
370
|
+
jurisdiction: {
|
|
371
|
+
scope: r.jurisdiction_scope,
|
|
372
|
+
uf: r.jurisdiction_uf,
|
|
373
|
+
cityIbge: r.jurisdiction_city_ibge,
|
|
374
|
+
},
|
|
375
|
+
version: r.version,
|
|
376
|
+
validFrom: iso(r.valid_from),
|
|
377
|
+
validUntil: r.valid_until ? iso(r.valid_until) : null,
|
|
378
|
+
status: r.status,
|
|
379
|
+
sourceReference: r.source_reference,
|
|
380
|
+
sourceUrl: r.source_url,
|
|
381
|
+
validatedAt: r.validated_at ? r.validated_at.toISOString() : null,
|
|
382
|
+
validatedByName: r.validated_by_name,
|
|
383
|
+
note: r.note,
|
|
384
|
+
// Regra global é do PRODUTO. O escritório lê, cria a própria em cima, e não
|
|
385
|
+
// reescreve a de todo mundo — a RLS já recusaria, e oferecer o botão seria
|
|
386
|
+
// prometer uma ação que o banco nega.
|
|
387
|
+
editable: r.tenant_id !== null,
|
|
388
|
+
}));
|
|
389
|
+
}
|
|
390
|
+
function summarizeGovernance(rules) {
|
|
391
|
+
const byStatus = {};
|
|
392
|
+
for (const r of rules)
|
|
393
|
+
byStatus[r.status] = (byStatus[r.status] ?? 0) + 1;
|
|
394
|
+
const withSource = rules.filter((r) => r.sourceUrl || r.sourceReference).length;
|
|
395
|
+
return {
|
|
396
|
+
total: rules.length,
|
|
397
|
+
byStatus,
|
|
398
|
+
withSource,
|
|
399
|
+
withoutSource: rules.length - withSource,
|
|
400
|
+
/*
|
|
401
|
+
* "Pronta para revisão" NÃO é "validada".
|
|
402
|
+
*
|
|
403
|
+
* Uma regra entra nesta contagem quando está pendente E tem uma fonte
|
|
404
|
+
* oficial anexada — ou seja, quando existe algo concreto para a pessoa
|
|
405
|
+
* conferir. Sem a fonte, pedir conferência é pedir que alguém procure a
|
|
406
|
+
* norma sozinho, e é assim que uma fila de governança vira uma fila parada.
|
|
407
|
+
*/
|
|
408
|
+
readyForHumanReview: rules.filter((r) => r.status === 'pending_validation' && Boolean(r.sourceUrl || r.sourceReference)).length,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Registra a fonte e a observação de uma regra DO ESCRITÓRIO.
|
|
413
|
+
*
|
|
414
|
+
* Separado de validar de propósito: anexar evidência é preparação, e quem
|
|
415
|
+
* prepara não carimba. Não toca em `status`.
|
|
416
|
+
*/
|
|
417
|
+
async function annotateFiscalRule(tx, input) {
|
|
418
|
+
if (input.sourceUrl && !/^https:\/\/[^\s"'<>]+$/i.test(input.sourceUrl)) {
|
|
419
|
+
throw new shared_1.ValidationError('A fonte precisa ser uma URL https.');
|
|
420
|
+
}
|
|
421
|
+
const rows = await tx `
|
|
422
|
+
UPDATE fiscal_rule
|
|
423
|
+
SET source_url = COALESCE(${input.sourceUrl ?? null}, source_url),
|
|
424
|
+
source_reference = COALESCE(${input.sourceReference ?? null}, source_reference),
|
|
425
|
+
note = COALESCE(${input.note ?? null}, note),
|
|
426
|
+
updated_at = now()
|
|
427
|
+
WHERE id = ${input.id} AND tenant_id IS NOT NULL AND deleted_at IS NULL
|
|
428
|
+
RETURNING id
|
|
429
|
+
`;
|
|
430
|
+
if (!rows[0]) {
|
|
431
|
+
throw new shared_1.ValidationError('Regra não encontrada neste escritório. Regras globais do produto não são editáveis aqui — crie uma regra do escritório para sobrepor.');
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* O carimbo humano de conferência.
|
|
436
|
+
*
|
|
437
|
+
* Três guardas, e nenhum é redundante:
|
|
438
|
+
*
|
|
439
|
+
* 1. **Só regra do escritório.** A global é do produto; conferi-la para todo o
|
|
440
|
+
* Brasil não é decisão de um tenant.
|
|
441
|
+
* 2. **`validatedBy` obrigatório e vindo da SESSÃO**, nunca do corpo. Uma regra
|
|
442
|
+
* validada precisa responder "quem conferiu" com um nome que a pessoa não
|
|
443
|
+
* escolheu para si.
|
|
444
|
+
* 3. **Fonte obrigatória.** Validar sem apontar a norma é registrar uma opinião
|
|
445
|
+
* com aparência de conferência — e é exatamente o que a trilha não deve
|
|
446
|
+
* permitir que se pareça com evidência depois.
|
|
447
|
+
*/
|
|
448
|
+
async function validateFiscalRule(tx, input) {
|
|
449
|
+
const atual = await tx `
|
|
450
|
+
SELECT id, source_url, source_reference FROM fiscal_rule
|
|
451
|
+
WHERE id = ${input.id} AND tenant_id IS NOT NULL AND deleted_at IS NULL
|
|
452
|
+
`;
|
|
453
|
+
const regra = atual[0];
|
|
454
|
+
if (!regra) {
|
|
455
|
+
throw new shared_1.ValidationError('Regra não encontrada neste escritório. Regras globais do produto não são conferidas aqui.');
|
|
456
|
+
}
|
|
457
|
+
if (!regra.source_url && !regra.source_reference) {
|
|
458
|
+
throw new shared_1.ValidationError('Antes de conferir, registre a fonte oficial da regra. Conferência sem fonte não é evidência.');
|
|
459
|
+
}
|
|
460
|
+
await tx `
|
|
461
|
+
UPDATE fiscal_rule
|
|
462
|
+
SET status = 'validated',
|
|
463
|
+
validated_by = ${input.validatedBy},
|
|
464
|
+
validated_at = now(),
|
|
465
|
+
note = COALESCE(${input.note ?? null}, note),
|
|
466
|
+
updated_at = now()
|
|
467
|
+
WHERE id = ${input.id} AND tenant_id IS NOT NULL AND deleted_at IS NULL
|
|
468
|
+
`;
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/fiscal/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CIRCUIT_MAX_OPEN_MS = exports.CIRCUIT_BASE_OPEN_MS = exports.CIRCUIT_FAILURE_THRESHOLD = void 0;
|
|
4
|
+
exports.readProviderCircuit = readProviderCircuit;
|
|
5
|
+
exports.recordProviderSuccess = recordProviderSuccess;
|
|
6
|
+
exports.recordProviderFailure = recordProviderFailure;
|
|
7
|
+
const shared_1 = require("@baruk/shared");
|
|
8
|
+
/**
|
|
9
|
+
* Quantas falhas seguidas abrem o disjuntor.
|
|
10
|
+
*
|
|
11
|
+
* Três, e não uma: um `503` isolado é ruído normal de um serviço público, e
|
|
12
|
+
* abrir na primeira faria a automação passar mais tempo desligada do que ligada.
|
|
13
|
+
* Três seguidas já não são ruído.
|
|
14
|
+
*/
|
|
15
|
+
exports.CIRCUIT_FAILURE_THRESHOLD = 3;
|
|
16
|
+
/** Espera inicial com o disjuntor aberto; dobra a cada reabertura falha. */
|
|
17
|
+
exports.CIRCUIT_BASE_OPEN_MS = 15 * 60_000;
|
|
18
|
+
exports.CIRCUIT_MAX_OPEN_MS = 4 * 60 * 60_000;
|
|
19
|
+
/**
|
|
20
|
+
* Lê o disjuntor e diz se este ciclo pode chamar o provedor.
|
|
21
|
+
*
|
|
22
|
+
* Ausência de linha é `closed`: um provedor que nunca falhou não precisa de
|
|
23
|
+
* registro para ser confiável, e criar a linha na leitura faria toda consulta
|
|
24
|
+
* escrever.
|
|
25
|
+
*/
|
|
26
|
+
async function readProviderCircuit(tx, key, now = new Date()) {
|
|
27
|
+
const [row] = await tx `
|
|
28
|
+
SELECT state, consecutive_failures, open_until, last_error_class
|
|
29
|
+
FROM fiscal_provider_circuit
|
|
30
|
+
WHERE source = ${key.source} AND environment = ${key.environment}
|
|
31
|
+
`;
|
|
32
|
+
if (!row) {
|
|
33
|
+
return {
|
|
34
|
+
state: 'closed',
|
|
35
|
+
consecutiveFailures: 0,
|
|
36
|
+
openUntil: null,
|
|
37
|
+
lastErrorClass: null,
|
|
38
|
+
allows: true,
|
|
39
|
+
probe: false,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Aberto com o prazo vencido é meio-aberto NA LEITURA, sem escrita: quem
|
|
43
|
+
// materializa a transição é a primeira tentativa que de fato acontecer.
|
|
44
|
+
// Escrever aqui faria toda leitura de painel mexer no estado do disjuntor.
|
|
45
|
+
const expirou = row.state === 'open' && row.open_until !== null && row.open_until <= now;
|
|
46
|
+
const state = expirou ? 'half_open' : row.state;
|
|
47
|
+
return {
|
|
48
|
+
state,
|
|
49
|
+
consecutiveFailures: row.consecutive_failures,
|
|
50
|
+
openUntil: row.open_until,
|
|
51
|
+
lastErrorClass: row.last_error_class,
|
|
52
|
+
allows: state !== 'open',
|
|
53
|
+
probe: state === 'half_open',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Registra sucesso: fecha o disjuntor e zera o contador.
|
|
58
|
+
*
|
|
59
|
+
* Zera de uma vez, e não gradualmente. Um contador que decai devagar mantém o
|
|
60
|
+
* provedor "quase aberto" por horas depois de ele ter voltado — e a primeira
|
|
61
|
+
* oscilação seguinte o reabre sem motivo.
|
|
62
|
+
*/
|
|
63
|
+
async function recordProviderSuccess(tx, key, now = new Date()) {
|
|
64
|
+
await tx `
|
|
65
|
+
INSERT INTO fiscal_provider_circuit (
|
|
66
|
+
id, tenant_id, source, environment, state, consecutive_failures,
|
|
67
|
+
last_error_class, opened_at, open_until, last_success_at, updated_at
|
|
68
|
+
) VALUES (
|
|
69
|
+
${(0, shared_1.uuidv7)()}, ${key.tenantId}, ${key.source}, ${key.environment}, 'closed', 0,
|
|
70
|
+
NULL, NULL, NULL, ${now}, now()
|
|
71
|
+
)
|
|
72
|
+
ON CONFLICT (tenant_id, source, environment)
|
|
73
|
+
DO UPDATE SET state = 'closed', consecutive_failures = 0, last_error_class = NULL,
|
|
74
|
+
opened_at = NULL, open_until = NULL, last_success_at = ${now},
|
|
75
|
+
updated_at = now()
|
|
76
|
+
`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Registra falha atribuível ao provedor. Abre o disjuntor ao atingir o limite.
|
|
80
|
+
*
|
|
81
|
+
* A espera dobra a cada abertura porque um provedor que falha três vezes,
|
|
82
|
+
* volta, e falha três vezes de novo não está oscilando — está fora, e insistir
|
|
83
|
+
* no mesmo intervalo é a rajada de novo, só que espaçada.
|
|
84
|
+
*/
|
|
85
|
+
async function recordProviderFailure(tx, key, input) {
|
|
86
|
+
const now = input.now ?? new Date();
|
|
87
|
+
const atual = await readProviderCircuit(tx, key, now);
|
|
88
|
+
const falhas = atual.consecutiveFailures + 1;
|
|
89
|
+
const abre = falhas >= exports.CIRCUIT_FAILURE_THRESHOLD;
|
|
90
|
+
// O expoente conta as aberturas ALÉM do limite, e não as falhas: sem isso a
|
|
91
|
+
// terceira falha já pediria a espera de uma décima segunda.
|
|
92
|
+
const excedente = Math.max(0, falhas - exports.CIRCUIT_FAILURE_THRESHOLD);
|
|
93
|
+
const esperaMs = abre
|
|
94
|
+
? Math.min(exports.CIRCUIT_BASE_OPEN_MS * 2 ** Math.min(excedente, 4), exports.CIRCUIT_MAX_OPEN_MS)
|
|
95
|
+
: 0;
|
|
96
|
+
const openUntil = abre ? new Date(now.getTime() + esperaMs) : null;
|
|
97
|
+
await tx `
|
|
98
|
+
INSERT INTO fiscal_provider_circuit (
|
|
99
|
+
id, tenant_id, source, environment, state, consecutive_failures,
|
|
100
|
+
last_error_class, opened_at, open_until, last_failure_at, updated_at
|
|
101
|
+
) VALUES (
|
|
102
|
+
${(0, shared_1.uuidv7)()}, ${key.tenantId}, ${key.source}, ${key.environment},
|
|
103
|
+
${abre ? 'open' : 'closed'}, ${falhas}, ${input.errorClass},
|
|
104
|
+
${abre ? now : null}, ${openUntil}, ${now}, now()
|
|
105
|
+
)
|
|
106
|
+
ON CONFLICT (tenant_id, source, environment)
|
|
107
|
+
DO UPDATE SET state = ${abre ? 'open' : 'closed'},
|
|
108
|
+
consecutive_failures = ${falhas},
|
|
109
|
+
last_error_class = ${input.errorClass},
|
|
110
|
+
opened_at = ${abre ? now : null},
|
|
111
|
+
open_until = ${openUntil},
|
|
112
|
+
last_failure_at = ${now},
|
|
113
|
+
updated_at = now()
|
|
114
|
+
`;
|
|
115
|
+
return {
|
|
116
|
+
state: abre ? 'open' : 'closed',
|
|
117
|
+
consecutiveFailures: falhas,
|
|
118
|
+
openUntil,
|
|
119
|
+
lastErrorClass: input.errorClass,
|
|
120
|
+
allows: !abre,
|
|
121
|
+
probe: false,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=circuit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit.js","sourceRoot":"","sources":["../../../../src/fiscal/sync/circuit.ts"],"names":[],"mappings":"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"}
|