@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,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classes de erro de verificação que significam "o titular foi recusado".
|
|
3
|
+
*
|
|
4
|
+
* Guardadas em `digital_certificate.last_verification_error` como CLASSE — a
|
|
5
|
+
* coluna existe desde a 1004 justamente para não guardar a mensagem.
|
|
6
|
+
*/
|
|
7
|
+
const DENIED_CLASSES = new Set(['auth', 'not_allowed', 'access_denied', 'permission_denied']);
|
|
8
|
+
/**
|
|
9
|
+
* Lê a prontidão operacional.
|
|
10
|
+
*
|
|
11
|
+
* Roda dentro de `withContext` com o tenant: `digital_certificate` tem RLS FORCE
|
|
12
|
+
* e é a GUC que decide de quem são as linhas lidas.
|
|
13
|
+
*
|
|
14
|
+
* Tolera a ausência da tabela (`42P01`) porque `digital_certificate` pertence à
|
|
15
|
+
* VERTICAL contábil: um tenant sem ela instalada não tem credencial nenhuma, e
|
|
16
|
+
* a leitura correta disso é `NOT_CONFIGURED` — não uma exceção que derruba o
|
|
17
|
+
* worker no meio da carteira.
|
|
18
|
+
*/
|
|
19
|
+
export async function readFiscalCredentialReadiness(tx, input) {
|
|
20
|
+
const kind = input.kind ?? 'certificate_a1';
|
|
21
|
+
const base = {
|
|
22
|
+
kind,
|
|
23
|
+
usableByWorker: false,
|
|
24
|
+
localValid: false,
|
|
25
|
+
eligibleForFirstContact: false,
|
|
26
|
+
selfHealing: false,
|
|
27
|
+
expiresOn: null,
|
|
28
|
+
verifiedAt: null,
|
|
29
|
+
localValidatedAt: null,
|
|
30
|
+
fingerprint: null,
|
|
31
|
+
providerAuthorization: 'unknown',
|
|
32
|
+
};
|
|
33
|
+
if (kind === 'municipal_portal') {
|
|
34
|
+
// Login de portal municipal não é certificado ICP-Brasil e ainda não tem
|
|
35
|
+
// onde morar. Um cron também não digita captcha. Negado até existir.
|
|
36
|
+
return {
|
|
37
|
+
...base,
|
|
38
|
+
state: 'NOT_CONFIGURED',
|
|
39
|
+
detail: 'portal municipal não tem credencial automatizável neste produto',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
let rows;
|
|
43
|
+
try {
|
|
44
|
+
rows = await tx `
|
|
45
|
+
SELECT id, cert_type, status, expires_at, verified_at,
|
|
46
|
+
local_validated_at, fingerprint_sha256,
|
|
47
|
+
last_verification_error, vault_credential_id
|
|
48
|
+
FROM digital_certificate
|
|
49
|
+
WHERE client_id = ${input.clientId}
|
|
50
|
+
AND cert_type = ${kind === 'certificate_a3' ? 'A3' : 'A1'}
|
|
51
|
+
AND deleted_at IS NULL
|
|
52
|
+
ORDER BY expires_at DESC
|
|
53
|
+
LIMIT 1
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
const code = err?.code;
|
|
58
|
+
if (code === '42P01' || code === '42703') {
|
|
59
|
+
return { ...base, state: 'NOT_CONFIGURED', detail: 'vertical contábil não aplicada' };
|
|
60
|
+
}
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
const cert = rows[0];
|
|
64
|
+
if (!cert) {
|
|
65
|
+
return { ...base, state: 'NOT_CONFIGURED', detail: 'nenhum certificado cadastrado' };
|
|
66
|
+
}
|
|
67
|
+
const expiresOn = cert.expires_at ? isoDate(cert.expires_at) : null;
|
|
68
|
+
const verifiedAt = cert.verified_at?.toISOString() ?? null;
|
|
69
|
+
const localValidatedAt = cert.local_validated_at?.toISOString() ?? null;
|
|
70
|
+
const withDates = {
|
|
71
|
+
...base,
|
|
72
|
+
expiresOn,
|
|
73
|
+
verifiedAt,
|
|
74
|
+
localValidatedAt,
|
|
75
|
+
fingerprint: cert.fingerprint_sha256 ?? null,
|
|
76
|
+
};
|
|
77
|
+
if (cert.status === 'revoked') {
|
|
78
|
+
return { ...withDates, state: 'INVALID', detail: 'certificado revogado' };
|
|
79
|
+
}
|
|
80
|
+
// Vencimento é fato do calendário, não do registro: um certificado marcado
|
|
81
|
+
// `active` cuja data passou está vencido mesmo que ninguém tenha corrido para
|
|
82
|
+
// atualizar a linha.
|
|
83
|
+
if (cert.expires_at && cert.expires_at < todayUtc()) {
|
|
84
|
+
return { ...withDates, state: 'EXPIRED', detail: `vencido em ${expiresOn}` };
|
|
85
|
+
}
|
|
86
|
+
if (cert.status === 'expired') {
|
|
87
|
+
return { ...withDates, state: 'EXPIRED', detail: 'marcado como vencido' };
|
|
88
|
+
}
|
|
89
|
+
if (cert.last_verification_error && DENIED_CLASSES.has(cert.last_verification_error)) {
|
|
90
|
+
return {
|
|
91
|
+
...withDates,
|
|
92
|
+
state: 'ACCESS_DENIED',
|
|
93
|
+
detail: `último acesso recusado (${cert.last_verification_error})`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (kind === 'certificate_a3') {
|
|
97
|
+
// A3 vive em token ou cartão com PIN digitado por uma pessoa. Ele EXISTE, e
|
|
98
|
+
// dizer "não tem certificado" seria falso; o que ele não é, é automatizável.
|
|
99
|
+
return {
|
|
100
|
+
...withDates,
|
|
101
|
+
state: 'REQUIRES_REVIEW',
|
|
102
|
+
detail: 'A3 exige PIN presencial e não é automatizável por cron',
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (!cert.vault_credential_id) {
|
|
106
|
+
// Cadastro sem material é uma promessa sem lastro: a tela diria "tem
|
|
107
|
+
// certificado" e o worker não teria o que apresentar no handshake.
|
|
108
|
+
return {
|
|
109
|
+
...withDates,
|
|
110
|
+
state: 'INVALID',
|
|
111
|
+
detail: 'certificado cadastrado sem material no cofre',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
if (!cert.verified_at) {
|
|
115
|
+
// Aqui estava o impasse. Antes, tudo que não fora aceito remotamente caía
|
|
116
|
+
// num balde só, e o balde reprovava a execução — inclusive a execução que
|
|
117
|
+
// produziria o aceite. Agora o material conferido localmente tem estado
|
|
118
|
+
// próprio, e é ele que o primeiro contato aceita.
|
|
119
|
+
if (cert.local_validated_at) {
|
|
120
|
+
return {
|
|
121
|
+
...withDates,
|
|
122
|
+
state: 'LOCAL_VALID',
|
|
123
|
+
localValid: true,
|
|
124
|
+
eligibleForFirstContact: true,
|
|
125
|
+
detail: 'válida localmente; nenhum ambiente oficial a aceitou ainda',
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
...withDates,
|
|
130
|
+
state: 'REQUIRES_REVIEW',
|
|
131
|
+
detail: 'cadastrada sem validação local registrada',
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// A autorização do provedor sai de execução OBSERVADA. Um `SELECT` sobre a
|
|
135
|
+
// trilha, e não uma dedução a partir do cadastro.
|
|
136
|
+
const [ok] = await tx `
|
|
137
|
+
SELECT count(*)::int AS n
|
|
138
|
+
FROM fiscal_sync_run
|
|
139
|
+
WHERE client_id = ${input.clientId}
|
|
140
|
+
AND source = ${input.source}
|
|
141
|
+
AND environment = ${input.environment}
|
|
142
|
+
AND outcome IN ('completed', 'no_documents')
|
|
143
|
+
`;
|
|
144
|
+
const established = (ok?.n ?? 0) > 0;
|
|
145
|
+
return {
|
|
146
|
+
...withDates,
|
|
147
|
+
state: 'READY',
|
|
148
|
+
usableByWorker: true,
|
|
149
|
+
localValid: true,
|
|
150
|
+
// Já aceita remotamente: não há primeiro contato a fazer.
|
|
151
|
+
eligibleForFirstContact: false,
|
|
152
|
+
selfHealing: true,
|
|
153
|
+
providerAuthorization: established ? 'established' : 'unknown',
|
|
154
|
+
detail: established
|
|
155
|
+
? 'pronta; o ambiente já aceitou esta credencial'
|
|
156
|
+
: 'pronta; o ambiente ainda não aceitou esta credencial nenhuma vez',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function todayUtc() {
|
|
160
|
+
const now = new Date();
|
|
161
|
+
return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
|
|
162
|
+
}
|
|
163
|
+
function isoDate(d) {
|
|
164
|
+
return d.toISOString().slice(0, 10);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* O motivo de intervenção que este estado pede — ou `null` quando não pede.
|
|
168
|
+
*
|
|
169
|
+
* Aqui mora a regra de B2.36 que evita a fila ilegível: `REQUIRES_REVIEW` e
|
|
170
|
+
* `NOT_CONFIGURED` NÃO abrem tarefa. Não configurar automação é uma escolha
|
|
171
|
+
* legítima do escritório, e transformá-la em pendência encheria a fila de
|
|
172
|
+
* clientes que ninguém pediu para automatizar.
|
|
173
|
+
*/
|
|
174
|
+
export function interventionKindFor(state) {
|
|
175
|
+
switch (state) {
|
|
176
|
+
case 'EXPIRED':
|
|
177
|
+
return 'certificate_expired';
|
|
178
|
+
case 'INVALID':
|
|
179
|
+
return 'certificate_invalid';
|
|
180
|
+
case 'ACCESS_DENIED':
|
|
181
|
+
return 'auth_required';
|
|
182
|
+
default:
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../../src/fiscal/credentials/readiness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { Tx } from '../db/client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Quem entra em automação fiscal — e, sobretudo, quem NÃO entra.
|
|
4
|
+
*
|
|
5
|
+
* ## O caso que dá nome a tudo
|
|
6
|
+
*
|
|
7
|
+
* Um job de ingestão fiscal escrito da forma óbvia selecionaria
|
|
8
|
+
* `WHERE deleted_at IS NULL`. No tenant da SC isso alcança hoje dois cadastros
|
|
9
|
+
* que foram criados em teste do próprio sistema — e alcançaria a carteira real
|
|
10
|
+
* inteira no dia seguinte a uma importação, sem que ninguém tivesse dito que
|
|
11
|
+
* aqueles clientes deviam ser acompanhados.
|
|
12
|
+
*
|
|
13
|
+
* Documento fiscal não é e-mail. Uma consulta indevida ao DF-e usa o
|
|
14
|
+
* certificado do CLIENTE contra a Receita, e o `cStat 656` que ela pode render
|
|
15
|
+
* bloqueia o CNPJ dele — não o nosso. O custo do falso positivo recai sobre um
|
|
16
|
+
* terceiro que não pediu nada.
|
|
17
|
+
*
|
|
18
|
+
* ## Quatro camadas, porque quatro coisas diferentes podem faltar
|
|
19
|
+
*
|
|
20
|
+
* escritório → ligou automação fiscal? em qual ambiente? (`tenant_fiscal_automation`)
|
|
21
|
+
* cliente → está inscrito, para ESTE tipo de documento? (`client_fiscal_enrollment`)
|
|
22
|
+
* credencial → existe insumo, e alguém o EXERCEU? (`digital_certificate`)
|
|
23
|
+
* operação → o ambiente pedido é real, e o piloto foi declarado? (0047)
|
|
24
|
+
*
|
|
25
|
+
* Nenhuma delas tem default permissivo. A ausência de linha nas três tabelas
|
|
26
|
+
* significa negado, e é isso que faz a migration 0055 não precisar de backfill
|
|
27
|
+
* nenhum para deixar todo mundo fora: ela cria as tabelas vazias, e vazio já é
|
|
28
|
+
* a barreira. É a mesma decisão da 0047 — omissão nunca vira autorização,
|
|
29
|
+
* porque omissão é o estado natural de quem acabou de entrar.
|
|
30
|
+
*
|
|
31
|
+
* ## Ambiente é parte da pergunta, não um detalhe
|
|
32
|
+
*
|
|
33
|
+
* `synthetic` e `production` não se substituem. Um escritório em `synthetic`
|
|
34
|
+
* NUNCA fica elegível para um job real, e um escritório em `production` NUNCA
|
|
35
|
+
* fica elegível para um job sintético. Não há fallback entre eles em nenhuma
|
|
36
|
+
* direção: fallback é exatamente como documento de homologação entra em
|
|
37
|
+
* carteira real, e como credencial real acaba exercida por um ensaio.
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* Os três ambientes, e nenhum substitui outro.
|
|
41
|
+
*
|
|
42
|
+
* `homologation` é a produção restrita oficial — do ADN
|
|
43
|
+
* (`adn.producaorestrita.nfse.gov.br`) ou da SEFAZ. Ela não é laboratório: é o
|
|
44
|
+
* servidor de verdade, respondendo como o real, sobre documento sem valor
|
|
45
|
+
* fiscal. Colapsá-la em `production` faria alguém abrir a elegibilidade para
|
|
46
|
+
* ensaiar e, sem perceber, autorizar o ambiente real.
|
|
47
|
+
*/
|
|
48
|
+
export type FiscalEnvironment = 'synthetic' | 'homologation' | 'production';
|
|
49
|
+
export type FiscalDocumentType = 'nfe' | 'nfse' | 'cte' | 'nfce';
|
|
50
|
+
/** Prontidão da credencial. `no_credential` é a AUSÊNCIA de linha, não um valor. */
|
|
51
|
+
export type CredentialReadiness = 'no_credential' | 'configured_not_verified' | 'verified' | 'expired' | 'revoked';
|
|
52
|
+
/**
|
|
53
|
+
* Tipos de credencial fiscal.
|
|
54
|
+
*
|
|
55
|
+
* `certificate_a3` existe no vocabulário porque `digital_certificate` já o
|
|
56
|
+
* aceita — mas A3 vive em token ou cartão com PIN presencial, e por isso NÃO é
|
|
57
|
+
* automatizável por um cron. Nomeá-lo permite ao produto dizer "este cliente
|
|
58
|
+
* tem certificado, e ele não serve para automação" em vez de dizer que não tem.
|
|
59
|
+
*/
|
|
60
|
+
export type FiscalCredentialKind = 'certificate_a1' | 'certificate_a3' | 'municipal_portal';
|
|
61
|
+
export type FiscalDenialReason = 'tenant_automation_disabled' | 'environment_mismatch' | 'real_operation_not_declared' | 'client_not_found' | 'client_inactive' | 'client_not_enrolled' | 'credential_not_ready';
|
|
62
|
+
export interface FiscalEligibility {
|
|
63
|
+
eligible: boolean;
|
|
64
|
+
/** Vazio quando elegível. Todos os motivos, não só o primeiro. */
|
|
65
|
+
reasons: readonly FiscalDenialReason[];
|
|
66
|
+
environment: FiscalEnvironment | null;
|
|
67
|
+
credential: CredentialReadiness;
|
|
68
|
+
detail: string;
|
|
69
|
+
}
|
|
70
|
+
export interface TenantFiscalAutomation {
|
|
71
|
+
mode: 'disabled' | FiscalEnvironment;
|
|
72
|
+
enabledAt: string | null;
|
|
73
|
+
enabledBy: string | null;
|
|
74
|
+
}
|
|
75
|
+
/** Lê o modo do escritório. Ausência de linha é `disabled` — nunca "herda". */
|
|
76
|
+
export declare function getTenantFiscalAutomation(tx: Tx): Promise<TenantFiscalAutomation>;
|
|
77
|
+
/**
|
|
78
|
+
* Este cliente pode entrar em automação fiscal, neste ambiente, para este tipo?
|
|
79
|
+
*
|
|
80
|
+
* Devolve TODOS os motivos de recusa, e não só o primeiro: quem for habilitar
|
|
81
|
+
* um cliente precisa saber tudo o que falta de uma vez, e não descobrir a
|
|
82
|
+
* próxima pendência a cada tentativa.
|
|
83
|
+
*
|
|
84
|
+
* Precisa rodar dentro de `withContext` com o tenant: as três tabelas têm RLS
|
|
85
|
+
* FORCE, e é a GUC que decide de quem são as linhas lidas.
|
|
86
|
+
*/
|
|
87
|
+
export declare function evaluateFiscalEligibility(tx: Tx, input: {
|
|
88
|
+
clientId: string;
|
|
89
|
+
documentType: FiscalDocumentType;
|
|
90
|
+
environment: FiscalEnvironment;
|
|
91
|
+
/** Tipo de credencial exigido pelo documento. */
|
|
92
|
+
credentialKind?: FiscalCredentialKind;
|
|
93
|
+
}): Promise<FiscalEligibility>;
|
|
94
|
+
/**
|
|
95
|
+
* Os clientes elegíveis do tenant corrente.
|
|
96
|
+
*
|
|
97
|
+
* É esta função — e não uma consulta escrita à mão dentro do worker — que um
|
|
98
|
+
* job fiscal futuro deve usar para montar o lote. A regra vale porque o caminho
|
|
99
|
+
* óbvio (`SELECT id FROM client WHERE deleted_at IS NULL`) é justamente o
|
|
100
|
+
* defeito: ele existe, é fácil de escrever, e não pergunta nada do que importa.
|
|
101
|
+
*/
|
|
102
|
+
export declare function listFiscalEligibleClients(tx: Tx, input: {
|
|
103
|
+
documentType: FiscalDocumentType;
|
|
104
|
+
environment: FiscalEnvironment;
|
|
105
|
+
}): Promise<string[]>;
|
|
106
|
+
//# sourceMappingURL=eligibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eligibility.d.ts","sourceRoot":"","sources":["../../src/fiscal/eligibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAG1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,cAAc,GAAG,YAAY,CAAC;AAC5E,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEjE,oFAAoF;AACpF,MAAM,MAAM,mBAAmB,GAC7B,eAAe,GAAG,yBAAyB,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAEnF;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAE5F,MAAM,MAAM,kBAAkB,GAC1B,4BAA4B,GAC5B,sBAAsB,GACtB,6BAA6B,GAC7B,kBAAkB,GAClB,iBAAiB,GACjB,qBAAqB,GACrB,sBAAsB,CAAC;AAE3B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACvC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACtC,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,GAAG,iBAAiB,CAAC;IACrC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,+EAA+E;AAC/E,wBAAsB,yBAAyB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAWvF;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,kBAAkB,CAAC;IACjC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,iDAAiD;IACjD,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC,GACA,OAAO,CAAC,iBAAiB,CAAC,CAyD5B;AA6ED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IAAE,YAAY,EAAE,kBAAkB,CAAC;IAAC,WAAW,EAAE,iBAAiB,CAAA;CAAE,GAC1E,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BnB"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { getRealPilotStart } from '../pilot/milestone.js';
|
|
2
|
+
/** Lê o modo do escritório. Ausência de linha é `disabled` — nunca "herda". */
|
|
3
|
+
export async function getTenantFiscalAutomation(tx) {
|
|
4
|
+
const rows = await tx `
|
|
5
|
+
SELECT mode, enabled_at, enabled_by FROM tenant_fiscal_automation
|
|
6
|
+
`;
|
|
7
|
+
const r = rows[0];
|
|
8
|
+
if (!r)
|
|
9
|
+
return { mode: 'disabled', enabledAt: null, enabledBy: null };
|
|
10
|
+
return {
|
|
11
|
+
mode: r.mode,
|
|
12
|
+
enabledAt: r.enabled_at?.toISOString() ?? null,
|
|
13
|
+
enabledBy: r.enabled_by,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Este cliente pode entrar em automação fiscal, neste ambiente, para este tipo?
|
|
18
|
+
*
|
|
19
|
+
* Devolve TODOS os motivos de recusa, e não só o primeiro: quem for habilitar
|
|
20
|
+
* um cliente precisa saber tudo o que falta de uma vez, e não descobrir a
|
|
21
|
+
* próxima pendência a cada tentativa.
|
|
22
|
+
*
|
|
23
|
+
* Precisa rodar dentro de `withContext` com o tenant: as três tabelas têm RLS
|
|
24
|
+
* FORCE, e é a GUC que decide de quem são as linhas lidas.
|
|
25
|
+
*/
|
|
26
|
+
export async function evaluateFiscalEligibility(tx, input) {
|
|
27
|
+
const reasons = [];
|
|
28
|
+
// NFS-e nacional (ADN) e NF-e/CT-e (DF-e) exigem o MESMO insumo: certificado
|
|
29
|
+
// ICP-Brasil apresentado por TLS mútuo. Foi MEDIDO nesta onda, não deduzido —
|
|
30
|
+
// o host do ADN pede certificado de cliente no handshake, com CAs ICP-Brasil
|
|
31
|
+
// aceitas, e nem a documentação abre sem ele. Por isso o padrão é A1 para
|
|
32
|
+
// todos os tipos, e não `municipal_portal` para NFS-e como a 0055 supunha.
|
|
33
|
+
const kind = input.credentialKind ?? 'certificate_a1';
|
|
34
|
+
const automation = await getTenantFiscalAutomation(tx);
|
|
35
|
+
if (automation.mode === 'disabled') {
|
|
36
|
+
reasons.push('tenant_automation_disabled');
|
|
37
|
+
}
|
|
38
|
+
else if (automation.mode !== input.environment) {
|
|
39
|
+
// Sem fallback nas duas direções. Ver o cabeçalho.
|
|
40
|
+
reasons.push('environment_mismatch');
|
|
41
|
+
}
|
|
42
|
+
// Operação real exige o marco declarado. Ambiente sintético não — é ele que
|
|
43
|
+
// mantém desenvolvimento e homologação possíveis antes do piloto começar.
|
|
44
|
+
if (input.environment === 'production') {
|
|
45
|
+
const milestone = await getRealPilotStart(tx);
|
|
46
|
+
if (!milestone)
|
|
47
|
+
reasons.push('real_operation_not_declared');
|
|
48
|
+
}
|
|
49
|
+
const clients = await tx `
|
|
50
|
+
SELECT status FROM client WHERE id = ${input.clientId} AND deleted_at IS NULL
|
|
51
|
+
`;
|
|
52
|
+
const client = clients[0];
|
|
53
|
+
if (!client) {
|
|
54
|
+
reasons.push('client_not_found');
|
|
55
|
+
}
|
|
56
|
+
else if (client.status !== 'active') {
|
|
57
|
+
// `deleted_at IS NULL` NÃO basta, e é este o achado do gate: os dois
|
|
58
|
+
// cadastros vivos da SC estão exatamente aqui — não apagados e não ativos.
|
|
59
|
+
reasons.push('client_inactive');
|
|
60
|
+
}
|
|
61
|
+
const enrollments = await tx `
|
|
62
|
+
SELECT id FROM client_fiscal_enrollment
|
|
63
|
+
WHERE client_id = ${input.clientId}
|
|
64
|
+
AND document_type = ${input.documentType}
|
|
65
|
+
AND revoked_at IS NULL
|
|
66
|
+
`;
|
|
67
|
+
if (enrollments.length === 0)
|
|
68
|
+
reasons.push('client_not_enrolled');
|
|
69
|
+
const credential = await readCredentialReadiness(tx, input.clientId, kind);
|
|
70
|
+
if (credential !== 'verified')
|
|
71
|
+
reasons.push('credential_not_ready');
|
|
72
|
+
return {
|
|
73
|
+
eligible: reasons.length === 0,
|
|
74
|
+
reasons,
|
|
75
|
+
environment: automation.mode === 'disabled' ? null : automation.mode,
|
|
76
|
+
credential,
|
|
77
|
+
detail: reasons.length === 0
|
|
78
|
+
? `elegível (${input.documentType}, ${input.environment})`
|
|
79
|
+
: `negado: ${reasons.join(', ')}`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Prontidão do certificado do cliente.
|
|
84
|
+
*
|
|
85
|
+
* ## Por que lê `digital_certificate`, e não uma tabela própria
|
|
86
|
+
*
|
|
87
|
+
* A 0055 criou `client_fiscal_credential` para esta pergunta. Foi invenção: o
|
|
88
|
+
* domínio já existia na vertical contábil (`digital_certificate`, migration
|
|
89
|
+
* 1002), com consumidores vivos. Duas tabelas para o mesmo fato dariam duas
|
|
90
|
+
* respostas para "este cliente tem certificado?", e elas divergiriam na
|
|
91
|
+
* primeira vez que alguém atualizasse só uma. A 0056 removeu a duplicata.
|
|
92
|
+
*
|
|
93
|
+
* ## Por que a consulta é defensiva
|
|
94
|
+
*
|
|
95
|
+
* `digital_certificate` pertence à VERTICAL. Um tenant sem a vertical instalada
|
|
96
|
+
* não tem a tabela — e a leitura correta disso é `no_credential`, não uma
|
|
97
|
+
* exceção. Ausência de tabela e ausência de linha significam a mesma coisa
|
|
98
|
+
* aqui: ninguém provou nada, então nada é autorizado.
|
|
99
|
+
*
|
|
100
|
+
* ## Por que `status = 'active'` não basta
|
|
101
|
+
*
|
|
102
|
+
* `active` diz que ninguém revogou o cadastro. Não diz que a credencial
|
|
103
|
+
* funciona. Um A1 cadastrado com a senha errada fica `active` para sempre e só
|
|
104
|
+
* falha no dia em que o job tentar usá-lo — em nome do cliente, contra a
|
|
105
|
+
* Receita, gerando bloqueio no CNPJ DELE. `verified_at` é o campo que separa
|
|
106
|
+
* cadastro de prova (migration 1004).
|
|
107
|
+
*/
|
|
108
|
+
async function readCredentialReadiness(tx, clientId, kind) {
|
|
109
|
+
if (kind === 'municipal_portal') {
|
|
110
|
+
// Portal municipal não é certificado ICP-Brasil e ainda não tem onde morar.
|
|
111
|
+
// Devolver `no_credential` é a leitura honesta: negado até existir.
|
|
112
|
+
return 'no_credential';
|
|
113
|
+
}
|
|
114
|
+
const certType = kind === 'certificate_a3' ? 'A3' : 'A1';
|
|
115
|
+
let rows;
|
|
116
|
+
try {
|
|
117
|
+
rows = await tx `
|
|
118
|
+
SELECT status, expires_at, verified_at
|
|
119
|
+
FROM digital_certificate
|
|
120
|
+
WHERE client_id = ${clientId}
|
|
121
|
+
AND cert_type = ${certType}
|
|
122
|
+
AND deleted_at IS NULL
|
|
123
|
+
ORDER BY expires_at DESC
|
|
124
|
+
LIMIT 1
|
|
125
|
+
`;
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
const code = err?.code;
|
|
129
|
+
// 42P01 tabela ausente, 42703 coluna ausente: a vertical não está aplicada
|
|
130
|
+
// neste banco. Ausência é negado, nunca exceção.
|
|
131
|
+
if (code === '42P01' || code === '42703')
|
|
132
|
+
return 'no_credential';
|
|
133
|
+
throw err;
|
|
134
|
+
}
|
|
135
|
+
const r = rows[0];
|
|
136
|
+
if (!r)
|
|
137
|
+
return 'no_credential';
|
|
138
|
+
if (r.status === 'revoked')
|
|
139
|
+
return 'revoked';
|
|
140
|
+
// Vencimento é fato do calendário, não do registro: um certificado marcado
|
|
141
|
+
// `active` cuja data passou está EXPIRADO mesmo que ninguém tenha corrido
|
|
142
|
+
// para atualizar a linha. Ler o contrário seria confiar na diligência de um
|
|
143
|
+
// processo que ainda não existe.
|
|
144
|
+
if (r.expires_at && r.expires_at < todayUtc())
|
|
145
|
+
return 'expired';
|
|
146
|
+
if (r.status === 'expired')
|
|
147
|
+
return 'expired';
|
|
148
|
+
if (!r.verified_at)
|
|
149
|
+
return 'configured_not_verified';
|
|
150
|
+
return 'verified';
|
|
151
|
+
}
|
|
152
|
+
function todayUtc() {
|
|
153
|
+
const now = new Date();
|
|
154
|
+
return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Os clientes elegíveis do tenant corrente.
|
|
158
|
+
*
|
|
159
|
+
* É esta função — e não uma consulta escrita à mão dentro do worker — que um
|
|
160
|
+
* job fiscal futuro deve usar para montar o lote. A regra vale porque o caminho
|
|
161
|
+
* óbvio (`SELECT id FROM client WHERE deleted_at IS NULL`) é justamente o
|
|
162
|
+
* defeito: ele existe, é fácil de escrever, e não pergunta nada do que importa.
|
|
163
|
+
*/
|
|
164
|
+
export async function listFiscalEligibleClients(tx, input) {
|
|
165
|
+
const automation = await getTenantFiscalAutomation(tx);
|
|
166
|
+
if (automation.mode === 'disabled' || automation.mode !== input.environment)
|
|
167
|
+
return [];
|
|
168
|
+
if (input.environment === 'production' && !(await getRealPilotStart(tx)))
|
|
169
|
+
return [];
|
|
170
|
+
const candidates = await tx `
|
|
171
|
+
SELECT e.client_id
|
|
172
|
+
FROM client_fiscal_enrollment e
|
|
173
|
+
JOIN client c ON c.id = e.client_id AND c.deleted_at IS NULL
|
|
174
|
+
WHERE e.document_type = ${input.documentType}
|
|
175
|
+
AND e.revoked_at IS NULL
|
|
176
|
+
AND c.status = 'active'
|
|
177
|
+
ORDER BY e.client_id
|
|
178
|
+
`;
|
|
179
|
+
// A credencial é conferida uma a uma, pela MESMA função da decisão
|
|
180
|
+
// individual. Repetir a regra em SQL aqui criaria duas rédeas para a mesma
|
|
181
|
+
// pergunta, e elas divergiriam na primeira mudança.
|
|
182
|
+
const eligible = [];
|
|
183
|
+
for (const row of candidates) {
|
|
184
|
+
const decision = await evaluateFiscalEligibility(tx, {
|
|
185
|
+
clientId: row.client_id,
|
|
186
|
+
documentType: input.documentType,
|
|
187
|
+
environment: input.environment,
|
|
188
|
+
});
|
|
189
|
+
if (decision.eligible)
|
|
190
|
+
eligible.push(row.client_id);
|
|
191
|
+
}
|
|
192
|
+
return eligible;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=eligibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eligibility.js","sourceRoot":"","sources":["../../src/fiscal/eligibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { Tx } from '../db/client.js';
|
|
2
|
+
import { type FiscalDocumentType, type FiscalEnvironment, type TenantFiscalAutomation } from './eligibility.js';
|
|
3
|
+
/**
|
|
4
|
+
* Quem entra na automação fiscal — o escritório, e depois cada cliente.
|
|
5
|
+
*
|
|
6
|
+
* ## Duas chaves, e por que não bastava uma
|
|
7
|
+
*
|
|
8
|
+
* `tenant_fiscal_automation` diz em QUE AMBIENTE o escritório declarou operar.
|
|
9
|
+
* É a chave-geral: enquanto ela estiver desligada, nenhum cliente é consultado,
|
|
10
|
+
* por mais matriculado que esteja.
|
|
11
|
+
*
|
|
12
|
+
* `client_fiscal_enrollment` diz QUAIS clientes, e para QUAIS documentos. É a
|
|
13
|
+
* chave por porta: um cliente pode ter NFS-e habilitada e NF-e não, porque os
|
|
14
|
+
* dois conectores têm maturidades diferentes e o escritório pode querer
|
|
15
|
+
* começar por um.
|
|
16
|
+
*
|
|
17
|
+
* As duas tabelas existem desde a 0058 e nunca tiveram escritor. Este módulo é
|
|
18
|
+
* o escritor — e o motivo de ele existir agora é que, sem ele, habilitar
|
|
19
|
+
* automação fiscal exigia um `INSERT` manual em produção.
|
|
20
|
+
*
|
|
21
|
+
* ## Nada aqui liga nada sozinho
|
|
22
|
+
*
|
|
23
|
+
* Um certificado cadastrado NÃO habilita ninguém. São atos distintos, com
|
|
24
|
+
* autores distintos e trilhas distintas: enviar material é uma coisa, declarar
|
|
25
|
+
* que o escritório opera automação fiscal em produção é outra, e dizer que
|
|
26
|
+
* ESTE cliente entra é uma terceira.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* O modo declarado pelo escritório.
|
|
30
|
+
*
|
|
31
|
+
* Deriva de `TenantFiscalAutomation` (eligibility.ts) em vez de repetir a lista:
|
|
32
|
+
* duas cópias do mesmo vocabulário divergem, e a divergência decide quem entra
|
|
33
|
+
* na automação.
|
|
34
|
+
*/
|
|
35
|
+
export type FiscalAutomationMode = TenantFiscalAutomation['mode'];
|
|
36
|
+
export interface ClientFiscalEnrollment {
|
|
37
|
+
documentType: FiscalDocumentType;
|
|
38
|
+
enrolledAt: string;
|
|
39
|
+
enrolledBy: string | null;
|
|
40
|
+
revokedAt: string | null;
|
|
41
|
+
note: string | null;
|
|
42
|
+
/** Vale agora? Uma matrícula revogada continua no registro, e deve. */
|
|
43
|
+
active: boolean;
|
|
44
|
+
}
|
|
45
|
+
/** O estado das duas chaves, para a tela e para o portão. */
|
|
46
|
+
export interface FiscalEnrollmentView {
|
|
47
|
+
automation: TenantFiscalAutomation;
|
|
48
|
+
enrollments: readonly ClientFiscalEnrollment[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Declara em que ambiente o escritório opera automação fiscal.
|
|
52
|
+
*
|
|
53
|
+
* `production` é a fronteira entre ensaio e operação real: a partir dela, o
|
|
54
|
+
* material de um contribuinte pode ser apresentado a um servidor da Receita. Por
|
|
55
|
+
* isso o ato é auditado com o modo anterior e o novo — "passou a ser produção"
|
|
56
|
+
* não responde a pergunta que se faz meses depois.
|
|
57
|
+
*/
|
|
58
|
+
export declare function setTenantFiscalAutomation(tx: Tx, input: {
|
|
59
|
+
mode: FiscalAutomationMode;
|
|
60
|
+
actorId: string;
|
|
61
|
+
note?: string | null;
|
|
62
|
+
}): Promise<TenantFiscalAutomation>;
|
|
63
|
+
export declare function listClientFiscalEnrollments(tx: Tx, clientId: string): Promise<ClientFiscalEnrollment[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Matricula um cliente para UM tipo de documento.
|
|
66
|
+
*
|
|
67
|
+
* A granularidade é o ponto: NFS-e e NF-e são conectores diferentes, com
|
|
68
|
+
* maturidades diferentes. Uma matrícula que valesse "para tudo" habilitaria o
|
|
69
|
+
* cliente num conector que talvez nem exista.
|
|
70
|
+
*
|
|
71
|
+
* Rematricular um cliente revogado o reativa — e o registro guarda as duas
|
|
72
|
+
* datas, porque quem revogou tinha um motivo e ele não deve sumir.
|
|
73
|
+
*/
|
|
74
|
+
export declare function enrollClientFiscal(tx: Tx, input: {
|
|
75
|
+
clientId: string;
|
|
76
|
+
documentType: FiscalDocumentType;
|
|
77
|
+
actorId: string;
|
|
78
|
+
note?: string | null;
|
|
79
|
+
}): Promise<ClientFiscalEnrollment[]>;
|
|
80
|
+
/** Tira o cliente da automação. Não apaga o histórico. */
|
|
81
|
+
export declare function revokeClientFiscalEnrollment(tx: Tx, input: {
|
|
82
|
+
clientId: string;
|
|
83
|
+
documentType: FiscalDocumentType;
|
|
84
|
+
actorId: string;
|
|
85
|
+
reason?: string | null;
|
|
86
|
+
}): Promise<ClientFiscalEnrollment[]>;
|
|
87
|
+
/** As duas chaves numa leitura só, para a tela não fazer duas viagens. */
|
|
88
|
+
export declare function readFiscalEnrollmentView(tx: Tx, clientId: string): Promise<FiscalEnrollmentView>;
|
|
89
|
+
/** O ambiente declarado casa com o pedido? Chave-geral do portão. */
|
|
90
|
+
export declare function automationCovers(automation: TenantFiscalAutomation, environment: FiscalEnvironment): boolean;
|
|
91
|
+
//# sourceMappingURL=enrollment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrollment.d.ts","sourceRoot":"","sources":["../../src/fiscal/enrollment.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,kBAAkB,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,6DAA6D;AAC7D,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,sBAAsB,CAAC;IACnC,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAChD;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC3E,OAAO,CAAC,sBAAsB,CAAC,CA4BjC;AAED,wBAAsB,2BAA2B,CAC/C,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAuBnC;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,kBAAkB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,GACA,OAAO,CAAC,sBAAsB,EAAE,CAAC,CA6BnC;AAED,0DAA0D;AAC1D,wBAAsB,4BAA4B,CAChD,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,kBAAkB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,GACA,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAuBnC;AAED,0EAA0E;AAC1E,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAK/B;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,sBAAsB,EAClC,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAET"}
|