@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,73 @@
|
|
|
1
|
+
import { type FiscalProfile } from './conditions.js';
|
|
2
|
+
/**
|
|
3
|
+
* O motor de aplicabilidade.
|
|
4
|
+
*
|
|
5
|
+
* Recebe perfil + regra + competência e devolve uma DECISÃO, não um booleano.
|
|
6
|
+
* A diferença não é estilística: "não gerar" tem meia dúzia de causas, cada uma
|
|
7
|
+
* com uma ação diferente do outro lado. Um booleano faz a obrigação sumir da
|
|
8
|
+
* lista sem que ninguém saiba se faltou dado do cliente, se a regra venceu, ou
|
|
9
|
+
* se ela simplesmente não se aplica.
|
|
10
|
+
*
|
|
11
|
+
* A regra que organiza a ordem das checagens: **primeiro o que é do produto,
|
|
12
|
+
* depois o que é do cliente.** Uma regra desabilitada não deve produzir
|
|
13
|
+
* "faltou informar se o cliente tem empregados" — a informação não seria
|
|
14
|
+
* usada de todo jeito, e o operador iria atrás do dado errado.
|
|
15
|
+
*/
|
|
16
|
+
export type ApplicabilityOutcome = 'APPLICABLE' | 'NOT_APPLICABLE'
|
|
17
|
+
/** Falta atributo do perfil para decidir. **Nunca** vira `NOT_APPLICABLE`. */
|
|
18
|
+
| 'INSUFFICIENT_DATA'
|
|
19
|
+
/** Não há regra para esta jurisdição e competência. */
|
|
20
|
+
| 'RULE_NOT_CONFIGURED' | 'RULE_PENDING_VALIDATION' | 'RULE_EXPIRED' | 'RULE_DISABLED';
|
|
21
|
+
export type RuleStatus = 'not_configured' | 'pending_validation' | 'validated' | 'expired' | 'disabled';
|
|
22
|
+
export interface JurisdictionRef {
|
|
23
|
+
scope: 'federal' | 'state' | 'municipal';
|
|
24
|
+
uf: string | null;
|
|
25
|
+
cityIbge: string | null;
|
|
26
|
+
}
|
|
27
|
+
export interface FiscalRuleRef {
|
|
28
|
+
id: string;
|
|
29
|
+
tenantId: string | null;
|
|
30
|
+
itemTypeId: string;
|
|
31
|
+
version: number;
|
|
32
|
+
jurisdiction: JurisdictionRef;
|
|
33
|
+
validFrom: string;
|
|
34
|
+
validUntil: string | null;
|
|
35
|
+
status: RuleStatus;
|
|
36
|
+
conditions: unknown;
|
|
37
|
+
dueRule: Record<string, unknown> | null;
|
|
38
|
+
sourceReference: string | null;
|
|
39
|
+
}
|
|
40
|
+
export interface ClientJurisdiction {
|
|
41
|
+
uf: string | null;
|
|
42
|
+
cityIbge: string | null;
|
|
43
|
+
}
|
|
44
|
+
export interface ApplicabilityDecision {
|
|
45
|
+
outcome: ApplicabilityOutcome;
|
|
46
|
+
/** Frase curta para a tela. Explica a decisão, não o código. */
|
|
47
|
+
reason: string;
|
|
48
|
+
/** O que o motor consultou para decidir — a prova, sem PII. */
|
|
49
|
+
evidence: {
|
|
50
|
+
ruleId: string | null;
|
|
51
|
+
ruleVersion: number | null;
|
|
52
|
+
jurisdiction: JurisdictionRef | null;
|
|
53
|
+
/** Atributos que a condição cita e o perfil não conhece. */
|
|
54
|
+
missingAttributes: string[];
|
|
55
|
+
/** Atributos que a condição de fato usou. Nunca o perfil inteiro. */
|
|
56
|
+
consideredAttributes: string[];
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export interface ApplicabilityInput {
|
|
60
|
+
rule: FiscalRuleRef | null;
|
|
61
|
+
profile: FiscalProfile;
|
|
62
|
+
clientJurisdiction: ClientJurisdiction;
|
|
63
|
+
/**
|
|
64
|
+
* Data que representa a competência — normalmente o primeiro dia dela.
|
|
65
|
+
* É contra ela que a vigência é medida, e não contra "hoje": reprocessar
|
|
66
|
+
* uma competência antiga precisa usar a regra que valia NAQUELE mês.
|
|
67
|
+
*/
|
|
68
|
+
referenceDate: string;
|
|
69
|
+
}
|
|
70
|
+
export declare function decideApplicability(input: ApplicabilityInput): ApplicabilityDecision;
|
|
71
|
+
/** Só `APPLICABLE` gera. Todo o resto é espera, ausência ou decisão contrária. */
|
|
72
|
+
export declare function generates(decision: ApplicabilityDecision): boolean;
|
|
73
|
+
//# sourceMappingURL=applicability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applicability.d.ts","sourceRoot":"","sources":["../../src/fiscal/applicability.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,oBAAoB,GAC5B,YAAY,GACZ,gBAAgB;AAClB,8EAA8E;GAC5E,mBAAmB;AACrB,uDAAuD;GACrD,qBAAqB,GACrB,yBAAyB,GACzB,cAAc,GACd,eAAe,CAAC;AAEpB,MAAM,MAAM,UAAU,GACpB,gBAAgB,GAAG,oBAAoB,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;IACzC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,eAAe,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;QACrC,4DAA4D;QAC5D,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,qEAAqE;QACrE,oBAAoB,EAAE,MAAM,EAAE,CAAC;KAChC,CAAC;CACH;AA0CD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,aAAa,CAAC;IACvB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,qBAAqB,CA8HpF;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAElE"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { evaluate, missingAttributes, parseCondition, referencedAttributes, } from './conditions.js';
|
|
2
|
+
const semRegra = (reason) => ({
|
|
3
|
+
outcome: 'RULE_NOT_CONFIGURED',
|
|
4
|
+
reason,
|
|
5
|
+
evidence: {
|
|
6
|
+
ruleId: null,
|
|
7
|
+
ruleVersion: null,
|
|
8
|
+
jurisdiction: null,
|
|
9
|
+
missingAttributes: [],
|
|
10
|
+
consideredAttributes: [],
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* A regra alcança este cliente geograficamente?
|
|
15
|
+
*
|
|
16
|
+
* Federal alcança todos. Estadual exige UF igual. Municipal exige UF **e**
|
|
17
|
+
* código IBGE iguais — nome de município não entra na comparação, porque
|
|
18
|
+
* "Goiania" e "Goiânia" são o mesmo lugar e strings diferentes.
|
|
19
|
+
*
|
|
20
|
+
* Cliente sem a informação não é "fora": é desconhecido, e vira
|
|
21
|
+
* `INSUFFICIENT_DATA` em vez de sumir da lista.
|
|
22
|
+
*/
|
|
23
|
+
function jurisdictionMatch(rule, client) {
|
|
24
|
+
if (rule.scope === 'federal')
|
|
25
|
+
return 'match';
|
|
26
|
+
if (client.uf === null)
|
|
27
|
+
return 'unknown';
|
|
28
|
+
if (client.uf !== rule.uf)
|
|
29
|
+
return 'no_match';
|
|
30
|
+
if (rule.scope === 'state')
|
|
31
|
+
return 'match';
|
|
32
|
+
if (client.cityIbge === null)
|
|
33
|
+
return 'unknown';
|
|
34
|
+
return client.cityIbge === rule.cityIbge ? 'match' : 'no_match';
|
|
35
|
+
}
|
|
36
|
+
/** A competência cai dentro da vigência? Compara datas ISO, sem fuso. */
|
|
37
|
+
function withinValidity(rule, referenceDate) {
|
|
38
|
+
if (referenceDate < rule.validFrom)
|
|
39
|
+
return false;
|
|
40
|
+
return rule.validUntil === null || referenceDate <= rule.validUntil;
|
|
41
|
+
}
|
|
42
|
+
export function decideApplicability(input) {
|
|
43
|
+
const { rule, profile, clientJurisdiction, referenceDate } = input;
|
|
44
|
+
if (!rule) {
|
|
45
|
+
return semRegra('Não há regra cadastrada para esta obrigação nesta jurisdição.');
|
|
46
|
+
}
|
|
47
|
+
const jurisdiction = rule.jurisdiction;
|
|
48
|
+
const base = { ruleId: rule.id, ruleVersion: rule.version, jurisdiction };
|
|
49
|
+
// ── 1 · Estado da regra, antes de qualquer coisa do cliente ─────────────
|
|
50
|
+
if (rule.status === 'disabled') {
|
|
51
|
+
return {
|
|
52
|
+
outcome: 'RULE_DISABLED',
|
|
53
|
+
reason: 'A regra está desligada.',
|
|
54
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: [] },
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (rule.status === 'not_configured') {
|
|
58
|
+
return {
|
|
59
|
+
outcome: 'RULE_NOT_CONFIGURED',
|
|
60
|
+
reason: 'A regra existe como marcador, mas ninguém configurou jurisdição ou vencimento — não há data a aplicar.',
|
|
61
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: [] },
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// ── 2 · Vigência ────────────────────────────────────────────────────────
|
|
65
|
+
if (!withinValidity(rule, referenceDate)) {
|
|
66
|
+
const futura = referenceDate < rule.validFrom;
|
|
67
|
+
return {
|
|
68
|
+
outcome: futura ? 'RULE_NOT_CONFIGURED' : 'RULE_EXPIRED',
|
|
69
|
+
reason: futura
|
|
70
|
+
? `A regra só passa a valer em ${rule.validFrom}; para esta competência não há regra vigente.`
|
|
71
|
+
: `A regra deixou de valer em ${rule.validUntil}.`,
|
|
72
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: [] },
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (rule.status === 'expired') {
|
|
76
|
+
return {
|
|
77
|
+
outcome: 'RULE_EXPIRED',
|
|
78
|
+
reason: 'A regra está marcada como vencida.',
|
|
79
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: [] },
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// ── 3 · Jurisdição ──────────────────────────────────────────────────────
|
|
83
|
+
const geo = jurisdictionMatch(jurisdiction, clientJurisdiction);
|
|
84
|
+
if (geo === 'no_match') {
|
|
85
|
+
return {
|
|
86
|
+
outcome: 'NOT_APPLICABLE',
|
|
87
|
+
reason: jurisdiction.scope === 'state'
|
|
88
|
+
? `Regra de ${jurisdiction.uf}; o cliente está em ${clientJurisdiction.uf}.`
|
|
89
|
+
: 'A regra é de outro município.',
|
|
90
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: [] },
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (geo === 'unknown') {
|
|
94
|
+
const falta = jurisdiction.scope === 'state' ? 'UF' : 'código IBGE do município';
|
|
95
|
+
return {
|
|
96
|
+
outcome: 'INSUFFICIENT_DATA',
|
|
97
|
+
reason: `Falta ${falta} no cadastro do cliente para saber se esta regra o alcança.`,
|
|
98
|
+
evidence: {
|
|
99
|
+
...base,
|
|
100
|
+
missingAttributes: [jurisdiction.scope === 'state' ? 'state_uf' : 'municipality_ibge_code'],
|
|
101
|
+
consideredAttributes: [],
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// ── 4 · Condições declarativas ──────────────────────────────────────────
|
|
106
|
+
let condition;
|
|
107
|
+
try {
|
|
108
|
+
condition = parseCondition(rule.conditions);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
// Regra malformada é defeito do catálogo, não decisão sobre o cliente.
|
|
112
|
+
// Nunca vira "não se aplica": isso esconderia a obrigação.
|
|
113
|
+
return {
|
|
114
|
+
outcome: 'RULE_NOT_CONFIGURED',
|
|
115
|
+
reason: `A condição desta regra está malformada: ${err instanceof Error ? err.message : 'inválida'}.`,
|
|
116
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: [] },
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const considerados = [...referencedAttributes(condition)].sort();
|
|
120
|
+
const faltando = missingAttributes(condition, profile);
|
|
121
|
+
const veredito = evaluate(condition, profile);
|
|
122
|
+
if (veredito === 'unknown') {
|
|
123
|
+
return {
|
|
124
|
+
outcome: 'INSUFFICIENT_DATA',
|
|
125
|
+
reason: faltando.length === 1
|
|
126
|
+
? `Falta informar "${faltando[0]}" no perfil do cliente.`
|
|
127
|
+
: `Faltam informações no perfil do cliente: ${faltando.join(', ')}.`,
|
|
128
|
+
evidence: { ...base, missingAttributes: faltando, consideredAttributes: considerados },
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (veredito === false) {
|
|
132
|
+
return {
|
|
133
|
+
outcome: 'NOT_APPLICABLE',
|
|
134
|
+
reason: 'O perfil do cliente não atende às condições desta regra.',
|
|
135
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: considerados },
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// ── 5 · Conferência humana, por último ──────────────────────────────────
|
|
139
|
+
//
|
|
140
|
+
// Fica depois da aplicabilidade de propósito: dizer "pendente de conferência"
|
|
141
|
+
// sobre uma regra que nem se aplica a este cliente mandaria o escritório
|
|
142
|
+
// conferir o que não usaria.
|
|
143
|
+
if (rule.status === 'pending_validation') {
|
|
144
|
+
return {
|
|
145
|
+
outcome: 'RULE_PENDING_VALIDATION',
|
|
146
|
+
reason: 'A regra se aplica, mas ainda não foi conferida por uma pessoa.',
|
|
147
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: considerados },
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
outcome: 'APPLICABLE',
|
|
152
|
+
reason: 'A regra está vigente, conferida, e o perfil do cliente a atende.',
|
|
153
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: considerados },
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/** Só `APPLICABLE` gera. Todo o resto é espera, ausência ou decisão contrária. */
|
|
157
|
+
export function generates(decision) {
|
|
158
|
+
return decision.outcome === 'APPLICABLE';
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=applicability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applicability.js","sourceRoot":"","sources":["../../src/fiscal/applicability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { Tx } from '../../db/client.js';
|
|
2
|
+
import type { FiscalCredentialKind, FiscalDocumentType, FiscalEnvironment } from '../eligibility.js';
|
|
3
|
+
import { type FiscalCompetence } from './competence.js';
|
|
4
|
+
/**
|
|
5
|
+
* O portão que se gasta.
|
|
6
|
+
*
|
|
7
|
+
* ## Por que os três desligamentos da Fase 2 não bastavam
|
|
8
|
+
*
|
|
9
|
+
* O motor fiscal já tem `FISCAL_SYNC_ENABLED`, elegibilidade por cliente e
|
|
10
|
+
* política de cadência. Todos são ESTADO: uma vez ligados, ficam ligados, e essa
|
|
11
|
+
* é a forma certa de autorizar um REGIME — "este escritório opera automação
|
|
12
|
+
* fiscal para estes clientes".
|
|
13
|
+
*
|
|
14
|
+
* A primeira consulta real a um ambiente oficial não é um regime. É um ato: o
|
|
15
|
+
* titular autorizou UMA leitura, de UM cliente, sobre UM período, e o que ele
|
|
16
|
+
* autorizou não deve sobreviver à própria execução. Um estado permanente aqui
|
|
17
|
+
* significaria que a segunda consulta — a que ninguém aprovou — acontece com a
|
|
18
|
+
* mesma bênção da primeira.
|
|
19
|
+
*
|
|
20
|
+
* ## As quatro propriedades, e onde cada uma mora
|
|
21
|
+
*
|
|
22
|
+
* uma execução `max_runs = 1`, CHECK na 0060. Não é configuração.
|
|
23
|
+
* somente leitura `operation = 'READ_ONLY'`, CHECK na 0060. Mutação é ingravável.
|
|
24
|
+
* prazo `expires_at`. Uma autorização esquecida morre sozinha.
|
|
25
|
+
* consumo `runs_consumed`, com o teto no CHECK e a corrida resolvida
|
|
26
|
+
* pelo `UPDATE ... WHERE consumed_at IS NULL`, no banco.
|
|
27
|
+
*
|
|
28
|
+
* O consumo é a parte que não pode viver no TypeScript. Dois workers lendo
|
|
29
|
+
* "ainda não consumida" e executando os dois é exatamente a segunda consulta não
|
|
30
|
+
* autorizada; quem decide é a linha, num único `UPDATE` condicional que devolve
|
|
31
|
+
* zero para o perdedor.
|
|
32
|
+
*/
|
|
33
|
+
export type FiscalRunOperation = 'READ_ONLY';
|
|
34
|
+
export interface FiscalRunAuthorization {
|
|
35
|
+
id: string;
|
|
36
|
+
clientId: string;
|
|
37
|
+
documentType: FiscalDocumentType;
|
|
38
|
+
environment: FiscalEnvironment;
|
|
39
|
+
source: string;
|
|
40
|
+
credentialKind: FiscalCredentialKind;
|
|
41
|
+
operation: FiscalRunOperation;
|
|
42
|
+
competence: FiscalCompetence;
|
|
43
|
+
maxRuns: number;
|
|
44
|
+
runsConsumed: number;
|
|
45
|
+
authorizedBy: string;
|
|
46
|
+
authorizedAt: string;
|
|
47
|
+
responsibleName: string | null;
|
|
48
|
+
expiresAt: string;
|
|
49
|
+
consumedAt: string | null;
|
|
50
|
+
revokedAt: string | null;
|
|
51
|
+
revokeReason: string | null;
|
|
52
|
+
/** Declara que a credencial ainda não fora aceita por nenhum ambiente. */
|
|
53
|
+
firstContact: boolean;
|
|
54
|
+
/** Quem disparou. Primeiro contato só aceita `manual`. */
|
|
55
|
+
triggerKind: 'manual' | 'scheduled';
|
|
56
|
+
/** O material aprovado. Trocar o certificado invalida esta autorização. */
|
|
57
|
+
credentialFingerprint: string | null;
|
|
58
|
+
/** O estado derivado, calculado contra o relógio de quem pergunta. */
|
|
59
|
+
state: FiscalAuthorizationState;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* `expired` é distinto de `consumed`, e ambos de `revoked`.
|
|
63
|
+
*
|
|
64
|
+
* Colapsá-los em "inválida" custaria a única informação útil na tela: uma
|
|
65
|
+
* autorização vencida pede que se emita outra; uma consumida diz que a execução
|
|
66
|
+
* já aconteceu e a pergunta certa é sobre o resultado dela; uma revogada diz que
|
|
67
|
+
* alguém decidiu parar, e o motivo está gravado.
|
|
68
|
+
*/
|
|
69
|
+
export type FiscalAuthorizationState = 'live' | 'consumed' | 'expired' | 'revoked';
|
|
70
|
+
export declare class AuthorizationConflictError extends Error {
|
|
71
|
+
readonly detail: string;
|
|
72
|
+
constructor(detail: string);
|
|
73
|
+
}
|
|
74
|
+
export interface GrantRunAuthorizationInput {
|
|
75
|
+
clientId: string;
|
|
76
|
+
documentType: FiscalDocumentType;
|
|
77
|
+
environment: FiscalEnvironment;
|
|
78
|
+
source: string;
|
|
79
|
+
credentialKind?: FiscalCredentialKind;
|
|
80
|
+
competenceYear: number;
|
|
81
|
+
competenceMonth: number;
|
|
82
|
+
/** Recorte manual dentro da competência. Ausente = a competência inteira. */
|
|
83
|
+
periodStart?: string;
|
|
84
|
+
periodEnd?: string;
|
|
85
|
+
responsibleName?: string | null;
|
|
86
|
+
authorizedBy: string;
|
|
87
|
+
/** Validade em horas. Curta de propósito: um portão aberto ontem não vale hoje. */
|
|
88
|
+
validForHours?: number;
|
|
89
|
+
/**
|
|
90
|
+
* PRIMEIRO CONTATO: quem autoriza declara saber que esta credencial ainda não
|
|
91
|
+
* foi aceita por nenhum ambiente oficial, e aceita que esta execução seja o
|
|
92
|
+
* ato que descobre. Sem isto, a autorização exige credencial já verificada — e
|
|
93
|
+
* a primeira nunca aconteceria. Ver `first-contact.ts`.
|
|
94
|
+
*/
|
|
95
|
+
firstContact?: boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Quem disparou. `scheduled` NUNCA pode acompanhar `firstContact` — e é um
|
|
98
|
+
* CHECK da 0062 que garante, não este comentário.
|
|
99
|
+
*/
|
|
100
|
+
triggerKind?: 'manual' | 'scheduled';
|
|
101
|
+
/**
|
|
102
|
+
* Impressão digital do certificado vigente no momento da autorização.
|
|
103
|
+
*
|
|
104
|
+
* Autorizar é aprovar UM material. Trocar o certificado depois invalida a
|
|
105
|
+
* autorização, porque o que a pessoa aprovou deixou de existir.
|
|
106
|
+
*/
|
|
107
|
+
credentialFingerprint?: string | null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Emite a autorização.
|
|
111
|
+
*
|
|
112
|
+
* Recusa por CONFLITO quando já existe uma viva para o mesmo par
|
|
113
|
+
* (cliente, fonte, ambiente, competência) — não por capricho de unicidade, mas
|
|
114
|
+
* porque duas autorizações vivas somam duas execuções, e o produto teria
|
|
115
|
+
* prometido uma.
|
|
116
|
+
*
|
|
117
|
+
* A unicidade é do índice parcial da 0060; o `SELECT` prévio existe só para
|
|
118
|
+
* devolver um erro legível em vez de uma violação de constraint.
|
|
119
|
+
*/
|
|
120
|
+
export declare function grantRunAuthorization(tx: Tx, input: GrantRunAuthorizationInput): Promise<FiscalRunAuthorization>;
|
|
121
|
+
/**
|
|
122
|
+
* Consome a autorização — e é AQUI que a unicidade da execução acontece.
|
|
123
|
+
*
|
|
124
|
+
* Um `SELECT` seguido de `UPDATE` deixaria a janela em que dois processos leem
|
|
125
|
+
* "viva" e ambos executam. O `WHERE consumed_at IS NULL` dentro do próprio
|
|
126
|
+
* `UPDATE` fecha essa janela no banco: o segundo afeta zero linhas e recebe
|
|
127
|
+
* `null`, que é o sinal de "não execute".
|
|
128
|
+
*
|
|
129
|
+
* Devolve `null` — e não lança — para todo desfecho de recusa. Quem chama é o
|
|
130
|
+
* orquestrador no meio de uma carteira, e uma exceção aqui derrubaria o lote por
|
|
131
|
+
* causa de um portão fechado, que é estado normal.
|
|
132
|
+
*/
|
|
133
|
+
export declare function consumeRunAuthorization(tx: Tx, input: {
|
|
134
|
+
authorizationId: string;
|
|
135
|
+
runId: string;
|
|
136
|
+
}): Promise<FiscalRunAuthorization | null>;
|
|
137
|
+
/**
|
|
138
|
+
* Cancela antes da execução.
|
|
139
|
+
*
|
|
140
|
+
* O mecanismo de abortar (C1.34) não precisa de tabela nova: revogar a
|
|
141
|
+
* autorização é o cancelamento, porque sem ela não há execução real. Revogar uma
|
|
142
|
+
* já consumida é permitido e não desfaz nada — só registra a decisão, para o
|
|
143
|
+
* caso em que alguém descobre depois que não deveria ter autorizado.
|
|
144
|
+
*/
|
|
145
|
+
export declare function revokeRunAuthorization(tx: Tx, input: {
|
|
146
|
+
authorizationId: string;
|
|
147
|
+
revokedBy: string;
|
|
148
|
+
reason: string;
|
|
149
|
+
}): Promise<boolean>;
|
|
150
|
+
/** As autorizações de um cliente, mais recentes primeiro. Sem segredo por construção. */
|
|
151
|
+
export declare function listRunAuthorizations(tx: Tx, clientId: string): Promise<FiscalRunAuthorization[]>;
|
|
152
|
+
//# sourceMappingURL=authorization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../../src/fiscal/collection/authorization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { uuidv7 } from '@baruk/shared';
|
|
2
|
+
import { competenceOf, validateWindow } from './competence.js';
|
|
3
|
+
export class AuthorizationConflictError extends Error {
|
|
4
|
+
detail;
|
|
5
|
+
constructor(detail) {
|
|
6
|
+
super(`autorização recusada: ${detail}`);
|
|
7
|
+
this.detail = detail;
|
|
8
|
+
this.name = 'AuthorizationConflictError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const DEFAULT_VALIDITY_HOURS = 48;
|
|
12
|
+
const MAX_VALIDITY_HOURS = 168; // sete dias
|
|
13
|
+
/**
|
|
14
|
+
* Emite a autorização.
|
|
15
|
+
*
|
|
16
|
+
* Recusa por CONFLITO quando já existe uma viva para o mesmo par
|
|
17
|
+
* (cliente, fonte, ambiente, competência) — não por capricho de unicidade, mas
|
|
18
|
+
* porque duas autorizações vivas somam duas execuções, e o produto teria
|
|
19
|
+
* prometido uma.
|
|
20
|
+
*
|
|
21
|
+
* A unicidade é do índice parcial da 0060; o `SELECT` prévio existe só para
|
|
22
|
+
* devolver um erro legível em vez de uma violação de constraint.
|
|
23
|
+
*/
|
|
24
|
+
export async function grantRunAuthorization(tx, input) {
|
|
25
|
+
const competence = competenceOf(input.competenceYear, input.competenceMonth);
|
|
26
|
+
const periodStart = input.periodStart ?? competence.periodStart;
|
|
27
|
+
const periodEnd = input.periodEnd ?? competence.periodEnd;
|
|
28
|
+
validateWindow(competence, periodStart, periodEnd);
|
|
29
|
+
const hours = input.validForHours ?? DEFAULT_VALIDITY_HOURS;
|
|
30
|
+
if (!Number.isInteger(hours) || hours < 1 || hours > MAX_VALIDITY_HOURS) {
|
|
31
|
+
throw new AuthorizationConflictError(`validade deve estar entre 1 e ${MAX_VALIDITY_HOURS} horas`);
|
|
32
|
+
}
|
|
33
|
+
const live = await tx `
|
|
34
|
+
SELECT id FROM fiscal_run_authorization
|
|
35
|
+
WHERE client_id = ${input.clientId}
|
|
36
|
+
AND source = ${input.source}
|
|
37
|
+
AND environment = ${input.environment}
|
|
38
|
+
AND competence_year = ${competence.year}
|
|
39
|
+
AND competence_month = ${competence.month}
|
|
40
|
+
AND consumed_at IS NULL AND revoked_at IS NULL
|
|
41
|
+
LIMIT 1
|
|
42
|
+
`;
|
|
43
|
+
if (live[0]) {
|
|
44
|
+
throw new AuthorizationConflictError('já existe uma autorização viva para este cliente, fonte, ambiente e competência');
|
|
45
|
+
}
|
|
46
|
+
const rows = await tx `
|
|
47
|
+
INSERT INTO fiscal_run_authorization (
|
|
48
|
+
id, tenant_id, client_id, document_type, environment, source, credential_kind,
|
|
49
|
+
operation, competence_year, competence_month, period_start, period_end,
|
|
50
|
+
max_runs, runs_consumed, authorized_by, responsible_name, expires_at,
|
|
51
|
+
first_contact, trigger_kind, credential_fingerprint
|
|
52
|
+
) VALUES (
|
|
53
|
+
${uuidv7()}, current_setting('app.current_tenant')::uuid, ${input.clientId},
|
|
54
|
+
${input.documentType}, ${input.environment}, ${input.source},
|
|
55
|
+
${input.credentialKind ?? 'certificate_a1'},
|
|
56
|
+
'READ_ONLY', ${competence.year}, ${competence.month}, ${periodStart}, ${periodEnd},
|
|
57
|
+
1, 0, ${input.authorizedBy}, ${input.responsibleName ?? null},
|
|
58
|
+
now() + (${hours}::int * interval '1 hour'),
|
|
59
|
+
${input.firstContact ?? false}, ${input.triggerKind ?? 'manual'},
|
|
60
|
+
${input.credentialFingerprint ?? null}
|
|
61
|
+
)
|
|
62
|
+
RETURNING ${tx.unsafe(AUTHORIZATION_COLUMNS)}
|
|
63
|
+
`;
|
|
64
|
+
return mapAuthorization(rows[0]);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Consome a autorização — e é AQUI que a unicidade da execução acontece.
|
|
68
|
+
*
|
|
69
|
+
* Um `SELECT` seguido de `UPDATE` deixaria a janela em que dois processos leem
|
|
70
|
+
* "viva" e ambos executam. O `WHERE consumed_at IS NULL` dentro do próprio
|
|
71
|
+
* `UPDATE` fecha essa janela no banco: o segundo afeta zero linhas e recebe
|
|
72
|
+
* `null`, que é o sinal de "não execute".
|
|
73
|
+
*
|
|
74
|
+
* Devolve `null` — e não lança — para todo desfecho de recusa. Quem chama é o
|
|
75
|
+
* orquestrador no meio de uma carteira, e uma exceção aqui derrubaria o lote por
|
|
76
|
+
* causa de um portão fechado, que é estado normal.
|
|
77
|
+
*/
|
|
78
|
+
export async function consumeRunAuthorization(tx, input) {
|
|
79
|
+
const rows = await tx `
|
|
80
|
+
UPDATE fiscal_run_authorization SET
|
|
81
|
+
runs_consumed = runs_consumed + 1,
|
|
82
|
+
consumed_at = now(),
|
|
83
|
+
consumed_by_run_id = ${input.runId},
|
|
84
|
+
updated_at = now()
|
|
85
|
+
WHERE id = ${input.authorizationId}
|
|
86
|
+
AND consumed_at IS NULL
|
|
87
|
+
AND revoked_at IS NULL
|
|
88
|
+
AND expires_at > now()
|
|
89
|
+
AND runs_consumed < max_runs
|
|
90
|
+
RETURNING ${tx.unsafe(AUTHORIZATION_COLUMNS)}
|
|
91
|
+
`;
|
|
92
|
+
return rows[0] ? mapAuthorization(rows[0]) : null;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Cancela antes da execução.
|
|
96
|
+
*
|
|
97
|
+
* O mecanismo de abortar (C1.34) não precisa de tabela nova: revogar a
|
|
98
|
+
* autorização é o cancelamento, porque sem ela não há execução real. Revogar uma
|
|
99
|
+
* já consumida é permitido e não desfaz nada — só registra a decisão, para o
|
|
100
|
+
* caso em que alguém descobre depois que não deveria ter autorizado.
|
|
101
|
+
*/
|
|
102
|
+
export async function revokeRunAuthorization(tx, input) {
|
|
103
|
+
const rows = await tx `
|
|
104
|
+
UPDATE fiscal_run_authorization SET
|
|
105
|
+
revoked_at = now(), revoked_by = ${input.revokedBy},
|
|
106
|
+
revoke_reason = ${input.reason}, updated_at = now()
|
|
107
|
+
WHERE id = ${input.authorizationId} AND revoked_at IS NULL
|
|
108
|
+
RETURNING id
|
|
109
|
+
`;
|
|
110
|
+
return rows.count > 0;
|
|
111
|
+
}
|
|
112
|
+
/** As autorizações de um cliente, mais recentes primeiro. Sem segredo por construção. */
|
|
113
|
+
export async function listRunAuthorizations(tx, clientId) {
|
|
114
|
+
const rows = await tx `
|
|
115
|
+
SELECT ${tx.unsafe(AUTHORIZATION_COLUMNS)}
|
|
116
|
+
FROM fiscal_run_authorization
|
|
117
|
+
WHERE client_id = ${clientId}
|
|
118
|
+
ORDER BY authorized_at DESC
|
|
119
|
+
LIMIT 50
|
|
120
|
+
`;
|
|
121
|
+
return rows.map(mapAuthorization);
|
|
122
|
+
}
|
|
123
|
+
const AUTHORIZATION_COLUMNS = `
|
|
124
|
+
id, client_id, document_type, environment, source, credential_kind, operation,
|
|
125
|
+
competence_year, competence_month, period_start, period_end, max_runs, runs_consumed,
|
|
126
|
+
authorized_by, authorized_at, responsible_name, expires_at, consumed_at,
|
|
127
|
+
revoked_at, revoke_reason, first_contact, trigger_kind, credential_fingerprint
|
|
128
|
+
`;
|
|
129
|
+
function mapAuthorization(r) {
|
|
130
|
+
return {
|
|
131
|
+
id: r.id,
|
|
132
|
+
clientId: r.client_id,
|
|
133
|
+
documentType: r.document_type,
|
|
134
|
+
environment: r.environment,
|
|
135
|
+
source: r.source,
|
|
136
|
+
credentialKind: r.credential_kind,
|
|
137
|
+
operation: 'READ_ONLY',
|
|
138
|
+
competence: {
|
|
139
|
+
year: r.competence_year,
|
|
140
|
+
month: r.competence_month,
|
|
141
|
+
label: `${r.competence_year}-${String(r.competence_month).padStart(2, '0')}`,
|
|
142
|
+
periodStart: isoDate(r.period_start),
|
|
143
|
+
periodEnd: isoDate(r.period_end),
|
|
144
|
+
},
|
|
145
|
+
maxRuns: r.max_runs,
|
|
146
|
+
runsConsumed: r.runs_consumed,
|
|
147
|
+
authorizedBy: r.authorized_by,
|
|
148
|
+
authorizedAt: r.authorized_at.toISOString(),
|
|
149
|
+
responsibleName: r.responsible_name,
|
|
150
|
+
firstContact: r.first_contact ?? false,
|
|
151
|
+
triggerKind: r.trigger_kind ?? 'manual',
|
|
152
|
+
credentialFingerprint: r.credential_fingerprint ?? null,
|
|
153
|
+
expiresAt: r.expires_at.toISOString(),
|
|
154
|
+
consumedAt: r.consumed_at?.toISOString() ?? null,
|
|
155
|
+
revokedAt: r.revoked_at?.toISOString() ?? null,
|
|
156
|
+
revokeReason: r.revoke_reason,
|
|
157
|
+
state: stateOf(r),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* A ordem das perguntas importa: revogada vence consumida, que vence vencida.
|
|
162
|
+
*
|
|
163
|
+
* Uma autorização consumida e depois revogada deve aparecer como revogada — é a
|
|
164
|
+
* decisão mais recente, e é a que alguém precisa ver ao investigar.
|
|
165
|
+
*/
|
|
166
|
+
function stateOf(r) {
|
|
167
|
+
if (r.revoked_at)
|
|
168
|
+
return 'revoked';
|
|
169
|
+
if (r.consumed_at)
|
|
170
|
+
return 'consumed';
|
|
171
|
+
if (r.expires_at.getTime() <= Date.now())
|
|
172
|
+
return 'expired';
|
|
173
|
+
return 'live';
|
|
174
|
+
}
|
|
175
|
+
function isoDate(d) {
|
|
176
|
+
return d.toISOString().slice(0, 10);
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=authorization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../../src/fiscal/collection/authorization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A janela da coleta — dita por extenso, nunca deduzida.
|
|
3
|
+
*
|
|
4
|
+
* ## O relato que originou este módulo
|
|
5
|
+
*
|
|
6
|
+
* A equipe do escritório chama de "dar baixa nas notas" o trabalho de, na virada
|
|
7
|
+
* do mês, entrar nos portais e recolher os documentos do período. Ao descrever
|
|
8
|
+
* esse trabalho, o relato humano trouxe exemplos de datas que não fechavam entre
|
|
9
|
+
* si — o que é absolutamente normal em conversa, e absolutamente perigoso como
|
|
10
|
+
* fonte de regra.
|
|
11
|
+
*
|
|
12
|
+
* A tentação é transformar "mês anterior" em constante. O erro que isso produz é
|
|
13
|
+
* silencioso: uma coleta rodada em 01/11 sobre uma janela que ninguém confirmou
|
|
14
|
+
* traz documentos de um período que não é o que a pessoa tinha em mente, e a
|
|
15
|
+
* ausência do que faltava só aparece no fechamento.
|
|
16
|
+
*
|
|
17
|
+
* Aqui a competência é um par ano/mês, e o período é um par de DATAS derivado
|
|
18
|
+
* dele. A sugestão padrão existe — mês calendário anterior —, mas ela é uma
|
|
19
|
+
* SUGESTÃO exibida, não um valor implícito: a tela mostra "serão consultados
|
|
20
|
+
* documentos de DD/MM/AAAA a DD/MM/AAAA" antes de qualquer execução, e as duas
|
|
21
|
+
* datas são gravadas na autorização.
|
|
22
|
+
*/
|
|
23
|
+
export interface FiscalCompetence {
|
|
24
|
+
year: number;
|
|
25
|
+
month: number;
|
|
26
|
+
/** `YYYY-MM`, o mesmo vocabulário de `competence.label` (0026). */
|
|
27
|
+
label: string;
|
|
28
|
+
/** Primeiro dia da competência, `YYYY-MM-DD`. */
|
|
29
|
+
periodStart: string;
|
|
30
|
+
/** Último dia da competência, `YYYY-MM-DD`. Nunca "hoje", nunca 30 fixo. */
|
|
31
|
+
periodEnd: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class InvalidCompetenceError extends Error {
|
|
34
|
+
readonly detail: string;
|
|
35
|
+
constructor(detail: string);
|
|
36
|
+
}
|
|
37
|
+
/** A política padrão desta fase, nomeada para poder ser citada e mudada. */
|
|
38
|
+
export declare const DEFAULT_COMPETENCE_POLICY: "PREVIOUS_CALENDAR_MONTH";
|
|
39
|
+
/**
|
|
40
|
+
* A competência de um par ano/mês.
|
|
41
|
+
*
|
|
42
|
+
* O último dia sai do calendário: `Date.UTC(ano, mês, 0)` — com o mês em base 1
|
|
43
|
+
* — devolve o último dia daquele mês. Fevereiro bissexto sai de graça, que é o
|
|
44
|
+
* ponto de não escrever `30`.
|
|
45
|
+
*/
|
|
46
|
+
export declare function competenceOf(year: number, month: number): FiscalCompetence;
|
|
47
|
+
/**
|
|
48
|
+
* A SUGESTÃO padrão para uma execução feita em `reference`: o mês calendário
|
|
49
|
+
* anterior.
|
|
50
|
+
*
|
|
51
|
+
* Chama-se `suggest` e não `default` de propósito. Uma função chamada
|
|
52
|
+
* `defaultCompetence()` acaba sendo usada como valor efetivo por quem não leu;
|
|
53
|
+
* `suggestCompetenceFor()` obriga quem chama a decidir o que fazer com a
|
|
54
|
+
* sugestão — que é exibi-la ao lado das duas datas.
|
|
55
|
+
*/
|
|
56
|
+
export declare function suggestCompetenceFor(reference: Date): FiscalCompetence;
|
|
57
|
+
/**
|
|
58
|
+
* Confere uma janela informada à mão contra a competência declarada.
|
|
59
|
+
*
|
|
60
|
+
* Permitir janela manual e conferi-la não são opostos: o operador pode querer um
|
|
61
|
+
* recorte menor dentro do mês — o que é legítimo —, mas uma janela que atravessa
|
|
62
|
+
* a competência declarada significa que um dos dois campos está errado, e gravar
|
|
63
|
+
* os dois deixaria a autorização dizendo duas coisas.
|
|
64
|
+
*/
|
|
65
|
+
export declare function validateWindow(competence: FiscalCompetence, periodStart: string, periodEnd: string): void;
|
|
66
|
+
//# sourceMappingURL=competence.d.ts.map
|