@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,119 @@
|
|
|
1
|
+
import type { Tx } from '../../db/client.js';
|
|
2
|
+
import type { Keyring } from '../../vault/crypto.js';
|
|
3
|
+
import { type IdentityMatch } from './inspect.js';
|
|
4
|
+
/**
|
|
5
|
+
* O caminho de entrada do certificado digital — o único.
|
|
6
|
+
*
|
|
7
|
+
* ## O que esta frente entrega, e por que ela existe
|
|
8
|
+
*
|
|
9
|
+
* Até aqui o produto sabia USAR um certificado (`material.ts`) e sabia dizer se
|
|
10
|
+
* ele estava pronto (`readiness.ts`). O que não existia era como ele ENTRA:
|
|
11
|
+
* `POST /v1/compliance/certificates` aceitava um `vaultCredentialId` já
|
|
12
|
+
* existente, e nada no produto criava esse ponteiro. Na prática, a única forma
|
|
13
|
+
* de cadastrar um A1 era alguém colar o base64 do `.pfx` — e a senha — na tela
|
|
14
|
+
* genérica do cofre, ou digitá-los num terminal.
|
|
15
|
+
*
|
|
16
|
+
* Uma senha de certificado digitada num terminal é uma senha no histórico do
|
|
17
|
+
* shell, no scrollback e, se o comando falhar, na mensagem de erro. O objetivo
|
|
18
|
+
* declarado desta fase é que ela nunca precise sair do navegador.
|
|
19
|
+
*
|
|
20
|
+
* ## Três recusas que acontecem ANTES de qualquer escrita
|
|
21
|
+
*
|
|
22
|
+
* **Senha que não abre.** Sem isso, o cadastro fica `active` e o defeito só
|
|
23
|
+
* aparece no dia em que o worker apresentar o material à Receita.
|
|
24
|
+
*
|
|
25
|
+
* **Certificado vencido.** Guardar material vencido é assumir o risco de
|
|
26
|
+
* custodiar uma chave privada sem nenhum uso possível em troca.
|
|
27
|
+
*
|
|
28
|
+
* **Certificado de outra empresa.** É o caso que a arquitetura precisa impedir
|
|
29
|
+
* em silêncio total: cliente A com o certificado da empresa B consulta a Receita
|
|
30
|
+
* em nome de quem não autorizou. Aqui ele exige assinatura — nome e motivo —, e
|
|
31
|
+
* a 0060 repete a exigência como CHECK, para o caminho que ainda não foi escrito.
|
|
32
|
+
*
|
|
33
|
+
* ## O que NUNCA sai daqui
|
|
34
|
+
*
|
|
35
|
+
* Nenhum retorno desta função carrega material nem senha. O que volta é
|
|
36
|
+
* metadata: sujeito, emissor, validade, impressão digital e estado. É essa
|
|
37
|
+
* estrutura que a tela mostra, e é por isso que ela não tem como mostrar mais.
|
|
38
|
+
*/
|
|
39
|
+
export type CertificateRejection = 'wrong_password' | 'malformed_material' | 'unsupported_material' | 'inspection_failed' | 'expired' | 'identity_mismatch' | 'client_not_found';
|
|
40
|
+
/** Metadata segura para tela, trilha e resposta de API. Nunca há material aqui. */
|
|
41
|
+
export interface FiscalCertificateSummary {
|
|
42
|
+
id: string;
|
|
43
|
+
clientId: string;
|
|
44
|
+
certType: 'A1' | 'A3';
|
|
45
|
+
status: string;
|
|
46
|
+
subjectCommonName: string | null;
|
|
47
|
+
issuerCommonName: string | null;
|
|
48
|
+
serialTail: string | null;
|
|
49
|
+
/** sha256 do certificado apresentado, truncado — identifica sem revelar. */
|
|
50
|
+
fingerprint: string;
|
|
51
|
+
certificateDocument: string | null;
|
|
52
|
+
identityMatch: IdentityMatch;
|
|
53
|
+
identityOverrideReason: string | null;
|
|
54
|
+
issuedAt: string | null;
|
|
55
|
+
expiresOn: string;
|
|
56
|
+
uploadedAt: string | null;
|
|
57
|
+
/** Já exercido contra o ambiente oficial? Preenchido por execução, nunca aqui. */
|
|
58
|
+
verifiedAt: string | null;
|
|
59
|
+
/** `true` quando esta chamada substituiu material que já existia. */
|
|
60
|
+
replaced: boolean;
|
|
61
|
+
}
|
|
62
|
+
export type CertificateOnboardingResult = {
|
|
63
|
+
status: 'stored';
|
|
64
|
+
certificate: FiscalCertificateSummary;
|
|
65
|
+
} | {
|
|
66
|
+
status: 'rejected';
|
|
67
|
+
reason: CertificateRejection;
|
|
68
|
+
identityMatch?: IdentityMatch;
|
|
69
|
+
};
|
|
70
|
+
export interface CertificateOnboardingInput {
|
|
71
|
+
clientId: string;
|
|
72
|
+
certType?: 'A1' | 'A3';
|
|
73
|
+
/** O `.pfx`/`.p12` em bytes. Nunca um caminho de arquivo: não há arquivo. */
|
|
74
|
+
material: Buffer;
|
|
75
|
+
passphrase?: string;
|
|
76
|
+
actorId: string;
|
|
77
|
+
/**
|
|
78
|
+
* A assinatura humana que destrava um titular divergente. Sem ela, divergência
|
|
79
|
+
* é recusa — e é assim que "cliente A + certificado B" deixa de ser possível
|
|
80
|
+
* por distração.
|
|
81
|
+
*/
|
|
82
|
+
identityOverrideReason?: string;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Nome determinístico da credencial no cofre.
|
|
86
|
+
*
|
|
87
|
+
* Determinístico porque a substituição precisa ENCONTRAR o que já existe: o
|
|
88
|
+
* índice único do cofre é `(tenant, cliente, lower(nome))`, e um nome novo a
|
|
89
|
+
* cada upload deixaria uma trilha de chaves privadas órfãs, todas ainda
|
|
90
|
+
* decifráveis, nenhuma referenciada.
|
|
91
|
+
*/
|
|
92
|
+
export declare function fiscalCertificateCredentialName(clientId: string, certType: 'A1' | 'A3'): string;
|
|
93
|
+
export declare function onboardFiscalCertificate(tx: Tx, keyring: Keyring, tenantId: string, input: CertificateOnboardingInput): Promise<CertificateOnboardingResult>;
|
|
94
|
+
/** Os certificados de um cliente, só metadata. É o que a tela lê. */
|
|
95
|
+
export declare function listFiscalCertificates(tx: Tx, clientId: string): Promise<FiscalCertificateSummary[]>;
|
|
96
|
+
/**
|
|
97
|
+
* Revoga o uso do certificado DENTRO deste produto.
|
|
98
|
+
*
|
|
99
|
+
* Não toca a ICP-Brasil, e é por isso que a função se chama assim. Revogar de
|
|
100
|
+
* verdade um certificado é um ato junto à Autoridade Certificadora que o emitiu;
|
|
101
|
+
* apagar a linha daqui apenas garante que este produto pare de apresentá-lo. A
|
|
102
|
+
* tela repete a distinção, porque um operador que acredite ter revogado o
|
|
103
|
+
* certificado do cliente não vai à AC — e o certificado segue válido no mundo.
|
|
104
|
+
*
|
|
105
|
+
* O material sai do cofre no mesmo movimento (`deleted_at`), de modo que a
|
|
106
|
+
* revogação não deixa chave privada decifrável para trás.
|
|
107
|
+
*/
|
|
108
|
+
export declare function revokeFiscalCertificate(tx: Tx, clientId: string, certificateId: string): Promise<{
|
|
109
|
+
revoked: boolean;
|
|
110
|
+
}>;
|
|
111
|
+
/**
|
|
112
|
+
* Impressão digital do material recebido, antes de qualquer decisão.
|
|
113
|
+
*
|
|
114
|
+
* Serve à trilha do upload recusado: registrar "tentaram subir algo" sem
|
|
115
|
+
* registrar o quê. É o mesmo cálculo de `material.ts`, e é seguro por
|
|
116
|
+
* construção — um hash não volta a ser um certificado.
|
|
117
|
+
*/
|
|
118
|
+
export declare function materialFingerprint(material: Buffer): string;
|
|
119
|
+
//# sourceMappingURL=onboarding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../../src/fiscal/credentials/onboarding.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAgC,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,MAAM,MAAM,oBAAoB,GAC5B,gBAAgB,GAChB,oBAAoB,GACpB,sBAAsB,GACtB,mBAAmB,GACnB,SAAS,GACT,mBAAmB,GACnB,kBAAkB,CAAC;AAEvB,mFAAmF;AACnF,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kFAAkF;IAClF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qEAAqE;IACrE,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,2BAA2B,GACnC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,wBAAwB,CAAA;CAAE,GAC3D;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,aAAa,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC;AAExF,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAOD;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,CAE/F;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,2BAA2B,CAAC,CA0HtC;AAiHD,qEAAqE;AACrE,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAQrC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAgB/B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { uuidv7 } from '@baruk/shared';
|
|
3
|
+
import { encryptSecret } from '../../vault/crypto.js';
|
|
4
|
+
import { inspectPkcs12, matchIdentity } from './inspect.js';
|
|
5
|
+
/** Impressão digital truncada. 16 hex identificam sem virar um segundo identificador. */
|
|
6
|
+
function shortFingerprint(full) {
|
|
7
|
+
return full.slice(0, 16);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Nome determinístico da credencial no cofre.
|
|
11
|
+
*
|
|
12
|
+
* Determinístico porque a substituição precisa ENCONTRAR o que já existe: o
|
|
13
|
+
* índice único do cofre é `(tenant, cliente, lower(nome))`, e um nome novo a
|
|
14
|
+
* cada upload deixaria uma trilha de chaves privadas órfãs, todas ainda
|
|
15
|
+
* decifráveis, nenhuma referenciada.
|
|
16
|
+
*/
|
|
17
|
+
export function fiscalCertificateCredentialName(clientId, certType) {
|
|
18
|
+
return `fiscal:certificate:${certType}:${clientId}`;
|
|
19
|
+
}
|
|
20
|
+
export async function onboardFiscalCertificate(tx, keyring, tenantId, input) {
|
|
21
|
+
const certType = input.certType ?? 'A1';
|
|
22
|
+
const clients = await tx `
|
|
23
|
+
SELECT id, document_number FROM client
|
|
24
|
+
WHERE id = ${input.clientId} AND deleted_at IS NULL
|
|
25
|
+
`;
|
|
26
|
+
const client = clients[0];
|
|
27
|
+
if (!client)
|
|
28
|
+
return { status: 'rejected', reason: 'client_not_found' };
|
|
29
|
+
const inspection = await inspectPkcs12(input.material, input.passphrase);
|
|
30
|
+
if (inspection.status === 'failed') {
|
|
31
|
+
return { status: 'rejected', reason: inspection.reason };
|
|
32
|
+
}
|
|
33
|
+
const facts = inspection.facts;
|
|
34
|
+
if (facts.expired)
|
|
35
|
+
return { status: 'rejected', reason: 'expired' };
|
|
36
|
+
const identity = matchIdentity(facts.document, client.document_number);
|
|
37
|
+
if (identity === 'mismatch' && !input.identityOverrideReason) {
|
|
38
|
+
return { status: 'rejected', reason: 'identity_mismatch', identityMatch: identity };
|
|
39
|
+
}
|
|
40
|
+
// O envelope é o MESMO que `material.ts` sabe abrir. Um segundo formato aqui
|
|
41
|
+
// significaria que o certificado que entra não é o que o transporte usa.
|
|
42
|
+
const envelope = JSON.stringify({
|
|
43
|
+
format: 'pkcs12',
|
|
44
|
+
material: input.material.toString('base64'),
|
|
45
|
+
...(input.passphrase ? { passphrase: input.passphrase } : {}),
|
|
46
|
+
});
|
|
47
|
+
const credentialName = fiscalCertificateCredentialName(input.clientId, certType);
|
|
48
|
+
const credentialId = await upsertWriteOnlyCredential(tx, keyring, tenantId, {
|
|
49
|
+
name: credentialName,
|
|
50
|
+
clientId: input.clientId,
|
|
51
|
+
secret: envelope,
|
|
52
|
+
expiresAt: facts.validTo,
|
|
53
|
+
actorId: input.actorId,
|
|
54
|
+
metadata: {
|
|
55
|
+
// Metadata do cofre é lida por telas e por trilha: só o que é público no
|
|
56
|
+
// certificado entra aqui.
|
|
57
|
+
fingerprint: shortFingerprint(facts.fingerprintSha256),
|
|
58
|
+
certType,
|
|
59
|
+
subject: facts.subjectCommonName,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
const expiresOn = facts.validTo.slice(0, 10);
|
|
63
|
+
const issuedAt = facts.validFrom.slice(0, 10);
|
|
64
|
+
const holderName = facts.subjectCommonName ?? 'Titular não identificado no certificado';
|
|
65
|
+
const existing = await tx `
|
|
66
|
+
SELECT id FROM digital_certificate
|
|
67
|
+
WHERE client_id = ${input.clientId} AND cert_type = ${certType} AND deleted_at IS NULL
|
|
68
|
+
ORDER BY created_at DESC LIMIT 1
|
|
69
|
+
`;
|
|
70
|
+
const override = identity === 'mismatch' ? (input.identityOverrideReason ?? null) : null;
|
|
71
|
+
const overrideBy = override ? input.actorId : null;
|
|
72
|
+
let rows;
|
|
73
|
+
if (existing[0]) {
|
|
74
|
+
rows = await tx `
|
|
75
|
+
UPDATE digital_certificate SET
|
|
76
|
+
holder_name = ${holderName},
|
|
77
|
+
holder_document = ${facts.document ?? client.document_number},
|
|
78
|
+
issued_at = ${issuedAt},
|
|
79
|
+
expires_at = ${expiresOn},
|
|
80
|
+
vault_credential_id = ${credentialId},
|
|
81
|
+
status = 'active',
|
|
82
|
+
fingerprint_sha256 = ${facts.fingerprintSha256},
|
|
83
|
+
subject_common_name = ${facts.subjectCommonName},
|
|
84
|
+
issuer_common_name = ${facts.issuerCommonName},
|
|
85
|
+
serial_tail = ${facts.serialTail},
|
|
86
|
+
certificate_document = ${facts.document},
|
|
87
|
+
identity_match = ${identity},
|
|
88
|
+
identity_override_by = ${overrideBy},
|
|
89
|
+
identity_override_reason = ${override},
|
|
90
|
+
uploaded_by = ${input.actorId},
|
|
91
|
+
uploaded_at = now(),
|
|
92
|
+
-- O material acabou de ser aberto pela inspeção — o mesmo OpenSSL do
|
|
93
|
+
-- handshake real. Isso é a validação LOCAL, e ela é fato deste instante:
|
|
94
|
+
-- senha correta, chave casando com o certificado, titular e datas
|
|
95
|
+
-- conferidos. Ver 1006.
|
|
96
|
+
local_validated_at = now(),
|
|
97
|
+
-- Material novo é uma afirmação nova: o que o ambiente oficial aceitou
|
|
98
|
+
-- foi o certificado ANTERIOR, e herdar a verificação diria que o novo
|
|
99
|
+
-- já funcionou. Ver 1004.
|
|
100
|
+
verified_at = NULL,
|
|
101
|
+
verified_by = NULL,
|
|
102
|
+
remote_verification_provider = NULL,
|
|
103
|
+
remote_verification_last_attempt_at = NULL,
|
|
104
|
+
last_verification_error = NULL,
|
|
105
|
+
updated_at = now()
|
|
106
|
+
WHERE id = ${existing[0].id}
|
|
107
|
+
RETURNING ${tx.unsafe(CERTIFICATE_COLUMNS)}
|
|
108
|
+
`;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
rows = await tx `
|
|
112
|
+
INSERT INTO digital_certificate (
|
|
113
|
+
id, tenant_id, client_id, cert_type, holder_name, holder_document,
|
|
114
|
+
issued_at, expires_at, vault_credential_id, status,
|
|
115
|
+
fingerprint_sha256, subject_common_name, issuer_common_name, serial_tail,
|
|
116
|
+
certificate_document, identity_match, identity_override_by, identity_override_reason,
|
|
117
|
+
uploaded_by, uploaded_at, local_validated_at
|
|
118
|
+
) VALUES (
|
|
119
|
+
${uuidv7()}, current_setting('app.current_tenant')::uuid, ${input.clientId},
|
|
120
|
+
${certType}, ${holderName}, ${facts.document ?? client.document_number},
|
|
121
|
+
${issuedAt}, ${expiresOn}, ${credentialId}, 'active',
|
|
122
|
+
${facts.fingerprintSha256}, ${facts.subjectCommonName}, ${facts.issuerCommonName},
|
|
123
|
+
${facts.serialTail}, ${facts.document}, ${identity}, ${overrideBy}, ${override},
|
|
124
|
+
-- As duas datas coincidem aqui, e é correto: o material só chega a
|
|
125
|
+
-- esta linha porque a inspeção passou.
|
|
126
|
+
${input.actorId}, now(), now()
|
|
127
|
+
)
|
|
128
|
+
RETURNING ${tx.unsafe(CERTIFICATE_COLUMNS)}
|
|
129
|
+
`;
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
status: 'stored',
|
|
133
|
+
certificate: mapCertificate(rows[0], { replaced: Boolean(existing[0]) }),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Grava (ou rotaciona) o segredo no cofre com `exposure = 'write_only'`.
|
|
138
|
+
*
|
|
139
|
+
* Não reutiliza `createCredential`/`rotateSecret` de `vault/repository.ts` por
|
|
140
|
+
* um motivo específico: aqueles não conhecem `exposure`, e um certificado
|
|
141
|
+
* gravado por eles nasceria `revealable` — a 0060 recusaria o INSERT, o que
|
|
142
|
+
* está correto, mas a mensagem de erro seria uma violação de CHECK em vez de
|
|
143
|
+
* uma decisão explícita. Aqui a classe do segredo é dita na escrita.
|
|
144
|
+
*/
|
|
145
|
+
async function upsertWriteOnlyCredential(tx, keyring, tenantId, input) {
|
|
146
|
+
const enc = encryptSecret(keyring, tenantId, input.secret);
|
|
147
|
+
const existing = await tx `
|
|
148
|
+
SELECT id FROM vault_credential
|
|
149
|
+
WHERE client_id = ${input.clientId}
|
|
150
|
+
AND lower(name) = lower(${input.name})
|
|
151
|
+
AND deleted_at IS NULL
|
|
152
|
+
LIMIT 1
|
|
153
|
+
`;
|
|
154
|
+
if (existing[0]) {
|
|
155
|
+
await tx `
|
|
156
|
+
UPDATE vault_credential SET
|
|
157
|
+
ciphertext = ${enc.ciphertext}, iv = ${enc.iv}, auth_tag = ${enc.authTag},
|
|
158
|
+
key_version = ${enc.keyVersion}, rotated_at = now(), updated_at = now(),
|
|
159
|
+
updated_by = ${input.actorId}, version = version + 1,
|
|
160
|
+
expires_at = ${input.expiresAt},
|
|
161
|
+
metadata = ${tx.json(input.metadata)},
|
|
162
|
+
exposure = 'write_only'
|
|
163
|
+
WHERE id = ${existing[0].id}
|
|
164
|
+
`;
|
|
165
|
+
return existing[0].id;
|
|
166
|
+
}
|
|
167
|
+
const rows = await tx `
|
|
168
|
+
INSERT INTO vault_credential (
|
|
169
|
+
id, tenant_id, client_id, name, category, provider,
|
|
170
|
+
ciphertext, iv, auth_tag, key_version, metadata, expires_at, created_by, exposure
|
|
171
|
+
) VALUES (
|
|
172
|
+
${uuidv7()}, current_setting('app.current_tenant')::uuid, ${input.clientId},
|
|
173
|
+
${input.name}, 'certificate', 'icp_brasil',
|
|
174
|
+
${enc.ciphertext}, ${enc.iv}, ${enc.authTag}, ${enc.keyVersion},
|
|
175
|
+
${tx.json(input.metadata)}, ${input.expiresAt}, ${input.actorId}, 'write_only'
|
|
176
|
+
)
|
|
177
|
+
RETURNING id
|
|
178
|
+
`;
|
|
179
|
+
return rows[0].id;
|
|
180
|
+
}
|
|
181
|
+
const CERTIFICATE_COLUMNS = `
|
|
182
|
+
id, client_id, cert_type, status, subject_common_name, issuer_common_name,
|
|
183
|
+
serial_tail, fingerprint_sha256, certificate_document, identity_match,
|
|
184
|
+
identity_override_reason, issued_at, expires_at, uploaded_at, verified_at,
|
|
185
|
+
local_validated_at, remote_verification_provider
|
|
186
|
+
`;
|
|
187
|
+
function mapCertificate(r, extra) {
|
|
188
|
+
return {
|
|
189
|
+
id: r.id,
|
|
190
|
+
clientId: r.client_id,
|
|
191
|
+
certType: r.cert_type === 'A3' ? 'A3' : 'A1',
|
|
192
|
+
status: r.status,
|
|
193
|
+
subjectCommonName: r.subject_common_name,
|
|
194
|
+
issuerCommonName: r.issuer_common_name,
|
|
195
|
+
serialTail: r.serial_tail,
|
|
196
|
+
fingerprint: shortFingerprint(r.fingerprint_sha256 ?? ''),
|
|
197
|
+
certificateDocument: r.certificate_document,
|
|
198
|
+
identityMatch: r.identity_match ?? 'indeterminate',
|
|
199
|
+
identityOverrideReason: r.identity_override_reason,
|
|
200
|
+
issuedAt: r.issued_at ? isoDate(r.issued_at) : null,
|
|
201
|
+
expiresOn: isoDate(r.expires_at),
|
|
202
|
+
uploadedAt: r.uploaded_at?.toISOString() ?? null,
|
|
203
|
+
verifiedAt: r.verified_at?.toISOString() ?? null,
|
|
204
|
+
replaced: extra.replaced,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function isoDate(d) {
|
|
208
|
+
return d.toISOString().slice(0, 10);
|
|
209
|
+
}
|
|
210
|
+
/** Os certificados de um cliente, só metadata. É o que a tela lê. */
|
|
211
|
+
export async function listFiscalCertificates(tx, clientId) {
|
|
212
|
+
const rows = await tx `
|
|
213
|
+
SELECT ${tx.unsafe(CERTIFICATE_COLUMNS)}
|
|
214
|
+
FROM digital_certificate
|
|
215
|
+
WHERE client_id = ${clientId} AND deleted_at IS NULL
|
|
216
|
+
ORDER BY expires_at DESC
|
|
217
|
+
`;
|
|
218
|
+
return rows.map((r) => mapCertificate(r, { replaced: false }));
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Revoga o uso do certificado DENTRO deste produto.
|
|
222
|
+
*
|
|
223
|
+
* Não toca a ICP-Brasil, e é por isso que a função se chama assim. Revogar de
|
|
224
|
+
* verdade um certificado é um ato junto à Autoridade Certificadora que o emitiu;
|
|
225
|
+
* apagar a linha daqui apenas garante que este produto pare de apresentá-lo. A
|
|
226
|
+
* tela repete a distinção, porque um operador que acredite ter revogado o
|
|
227
|
+
* certificado do cliente não vai à AC — e o certificado segue válido no mundo.
|
|
228
|
+
*
|
|
229
|
+
* O material sai do cofre no mesmo movimento (`deleted_at`), de modo que a
|
|
230
|
+
* revogação não deixa chave privada decifrável para trás.
|
|
231
|
+
*/
|
|
232
|
+
export async function revokeFiscalCertificate(tx, clientId, certificateId) {
|
|
233
|
+
const rows = await tx `
|
|
234
|
+
UPDATE digital_certificate SET status = 'revoked', deleted_at = now(), updated_at = now()
|
|
235
|
+
WHERE id = ${certificateId} AND client_id = ${clientId} AND deleted_at IS NULL
|
|
236
|
+
RETURNING vault_credential_id
|
|
237
|
+
`;
|
|
238
|
+
if (rows.length === 0)
|
|
239
|
+
return { revoked: false };
|
|
240
|
+
const pointer = rows[0]?.vault_credential_id;
|
|
241
|
+
if (pointer) {
|
|
242
|
+
await tx `
|
|
243
|
+
UPDATE vault_credential SET deleted_at = now()
|
|
244
|
+
WHERE id = ${pointer} AND deleted_at IS NULL
|
|
245
|
+
`;
|
|
246
|
+
}
|
|
247
|
+
return { revoked: true };
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Impressão digital do material recebido, antes de qualquer decisão.
|
|
251
|
+
*
|
|
252
|
+
* Serve à trilha do upload recusado: registrar "tentaram subir algo" sem
|
|
253
|
+
* registrar o quê. É o mesmo cálculo de `material.ts`, e é seguro por
|
|
254
|
+
* construção — um hash não volta a ser um certificado.
|
|
255
|
+
*/
|
|
256
|
+
export function materialFingerprint(material) {
|
|
257
|
+
return shortFingerprint(createHash('sha256').update(material).digest('hex'));
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../../src/fiscal/credentials/onboarding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { Tx } from '../../db/client.js';
|
|
2
|
+
import type { FiscalCredentialKind, FiscalEnvironment } from '../eligibility.js';
|
|
3
|
+
/**
|
|
4
|
+
* A prontidão OPERACIONAL da credencial de um cliente.
|
|
5
|
+
*
|
|
6
|
+
* ## Por que não bastava o que a Fase 1 já respondia
|
|
7
|
+
*
|
|
8
|
+
* `readCredentialReadiness` (eligibility.ts) responde à pergunta do PORTÃO:
|
|
9
|
+
* "posso deixar este cliente entrar na automação?". Devolve cinco valores e é
|
|
10
|
+
* suficiente para isso.
|
|
11
|
+
*
|
|
12
|
+
* O worker precisa de outra coisa: quando o portão fecha, ele tem de decidir o
|
|
13
|
+
* que fazer com o fechamento — retentar amanhã, abrir tarefa para uma pessoa, ou
|
|
14
|
+
* nem uma coisa nem outra. `configured_not_verified` e `expired` reprovam
|
|
15
|
+
* igualmente no portão e pedem ações opostas depois dele.
|
|
16
|
+
*
|
|
17
|
+
* ## Cadastrado não é autorizado — e a separação é um campo, não um comentário
|
|
18
|
+
*
|
|
19
|
+
* Existe um erro caro que este módulo existe para tornar indizível: tratar
|
|
20
|
+
* "o cliente cadastrou um A1 válido" como "estamos autorizados a consultar o
|
|
21
|
+
* ambiente nacional em nome dele". São fatos independentes.
|
|
22
|
+
*
|
|
23
|
+
* material o certificado existe, abre, e não venceu.
|
|
24
|
+
* providerAuthorization aquele ambiente JÁ ACEITOU esse material alguma vez.
|
|
25
|
+
*
|
|
26
|
+
* O segundo não se deduz do primeiro. Um A1 impecável cujo titular não outorgou
|
|
27
|
+
* procuração é recusado pelo servidor — e o primeiro campo continua `READY`. Por
|
|
28
|
+
* isso a autorização sai de FATO OBSERVADO (um `fiscal_sync_run` bem-sucedido
|
|
29
|
+
* naquele ambiente), e nunca de inferência sobre o cadastro.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Estados operacionais.
|
|
33
|
+
*
|
|
34
|
+
* `NOT_CONFIGURED` não há credencial. Ninguém prometeu nada.
|
|
35
|
+
* `READY` existe, abre, não venceu, e já foi exercida.
|
|
36
|
+
* `EXPIRED` venceu. Só a renovação resolve.
|
|
37
|
+
* `INVALID` revogada, ou o ponteiro para o cofre não resolve.
|
|
38
|
+
* `ACCESS_DENIED` o material serve; o ambiente recusou o TITULAR.
|
|
39
|
+
* `LOCAL_VALID` o material abre, a chave casa, o titular confere e as
|
|
40
|
+
* datas estão na janela — e NENHUM ambiente oficial o
|
|
41
|
+
* aceitou ainda. É o estado em que todo certificado novo
|
|
42
|
+
* nasce, e o único que o primeiro contato admite.
|
|
43
|
+
* `REQUIRES_REVIEW` cadastrada e sem validação local registrada — ou de um
|
|
44
|
+
* tipo que um cron não consegue usar (A3 vive em token com
|
|
45
|
+
* PIN presencial).
|
|
46
|
+
*/
|
|
47
|
+
export type FiscalCredentialState = 'NOT_CONFIGURED' | 'READY' | 'LOCAL_VALID' | 'EXPIRED' | 'INVALID' | 'ACCESS_DENIED' | 'REQUIRES_REVIEW';
|
|
48
|
+
export interface FiscalCredentialReadiness {
|
|
49
|
+
state: FiscalCredentialState;
|
|
50
|
+
kind: FiscalCredentialKind | null;
|
|
51
|
+
/** Só `READY` autoriza o worker a tentar. Nenhum outro estado, por motivo nenhum. */
|
|
52
|
+
usableByWorker: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* O material passou na verificação LOCAL: abriu com a senha, a chave casa com
|
|
55
|
+
* o certificado, o titular confere e as datas estão na janela.
|
|
56
|
+
*
|
|
57
|
+
* Independente de `usableByWorker` de propósito. Foi a fusão dos dois que
|
|
58
|
+
* produziu o impasse: exigir aceite remoto para executar, quando só executar
|
|
59
|
+
* produz o aceite.
|
|
60
|
+
*/
|
|
61
|
+
localValid: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Esta credencial pode ser usada num PRIMEIRO CONTATO — a execução única,
|
|
64
|
+
* manual e autorizada que existe justamente para obter o aceite remoto.
|
|
65
|
+
*
|
|
66
|
+
* `true` exatamente quando o material é válido localmente e nenhum ambiente o
|
|
67
|
+
* aceitou ainda. Um cron jamais consulta este campo: ele existe para o
|
|
68
|
+
* executor de primeiro contato, e o banco recusa autorização de primeiro
|
|
69
|
+
* contato disparada por agendador.
|
|
70
|
+
*/
|
|
71
|
+
eligibleForFirstContact: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* `true` quando um retry futuro pode mudar o desfecho sem intervenção humana.
|
|
74
|
+
* `EXPIRED`, `INVALID` e `ACCESS_DENIED` são `false` — e é isso que decide se
|
|
75
|
+
* o caso vira linha na fila de pessoas ou só espera.
|
|
76
|
+
*/
|
|
77
|
+
selfHealing: boolean;
|
|
78
|
+
expiresOn: string | null;
|
|
79
|
+
/** Quando o ambiente OFICIAL aceitou. Nunca sai do cadastro. */
|
|
80
|
+
verifiedAt: string | null;
|
|
81
|
+
/** Quando o material passou na verificação local. */
|
|
82
|
+
localValidatedAt: string | null;
|
|
83
|
+
/** sha256 truncado do material, quando registrado. Seguro para tela e trilha. */
|
|
84
|
+
fingerprint: string | null;
|
|
85
|
+
/**
|
|
86
|
+
* O ambiente já aceitou esta credencial? Sai de execução observada, jamais do
|
|
87
|
+
* cadastro. `unknown` é o estado inicial e honesto de todo cliente novo.
|
|
88
|
+
*/
|
|
89
|
+
providerAuthorization: 'unknown' | 'established';
|
|
90
|
+
/** Classe e contexto. NUNCA a resposta do provedor. */
|
|
91
|
+
detail: string;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Lê a prontidão operacional.
|
|
95
|
+
*
|
|
96
|
+
* Roda dentro de `withContext` com o tenant: `digital_certificate` tem RLS FORCE
|
|
97
|
+
* e é a GUC que decide de quem são as linhas lidas.
|
|
98
|
+
*
|
|
99
|
+
* Tolera a ausência da tabela (`42P01`) porque `digital_certificate` pertence à
|
|
100
|
+
* VERTICAL contábil: um tenant sem ela instalada não tem credencial nenhuma, e
|
|
101
|
+
* a leitura correta disso é `NOT_CONFIGURED` — não uma exceção que derruba o
|
|
102
|
+
* worker no meio da carteira.
|
|
103
|
+
*/
|
|
104
|
+
export declare function readFiscalCredentialReadiness(tx: Tx, input: {
|
|
105
|
+
clientId: string;
|
|
106
|
+
environment: FiscalEnvironment;
|
|
107
|
+
source: string;
|
|
108
|
+
kind?: FiscalCredentialKind;
|
|
109
|
+
}): Promise<FiscalCredentialReadiness>;
|
|
110
|
+
/**
|
|
111
|
+
* O motivo de intervenção que este estado pede — ou `null` quando não pede.
|
|
112
|
+
*
|
|
113
|
+
* Aqui mora a regra de B2.36 que evita a fila ilegível: `REQUIRES_REVIEW` e
|
|
114
|
+
* `NOT_CONFIGURED` NÃO abrem tarefa. Não configurar automação é uma escolha
|
|
115
|
+
* legítima do escritório, e transformá-la em pendência encheria a fila de
|
|
116
|
+
* clientes que ninguém pediu para automatizar.
|
|
117
|
+
*/
|
|
118
|
+
export declare function interventionKindFor(state: FiscalCredentialState): 'certificate_expired' | 'certificate_invalid' | 'auth_required' | null;
|
|
119
|
+
//# sourceMappingURL=readiness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/fiscal/credentials/readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEjF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,qBAAqB,GAC7B,gBAAgB,GAChB,OAAO,GACP,aAAa,GACb,SAAS,GACT,SAAS,GACT,eAAe,GACf,iBAAiB,CAAC;AAEtB,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAClC,qFAAqF;IACrF,cAAc,EAAE,OAAO,CAAC;IACxB;;;;;;;OAOG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;;;;OAQG;IACH,uBAAuB,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gEAAgE;IAChE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qDAAqD;IACrD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iFAAiF;IACjF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,qBAAqB,EAAE,SAAS,GAAG,aAAa,CAAC;IACjD,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;CAChB;AAsBD;;;;;;;;;;GAUG;AACH,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,oBAAoB,CAAC;CAC7B,GACA,OAAO,CAAC,yBAAyB,CAAC,CAkJpC;AAWD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,qBAAqB,GAC3B,qBAAqB,GAAG,qBAAqB,GAAG,eAAe,GAAG,IAAI,CAWxE"}
|