@baruk/core 0.4.2 → 0.5.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 +103 -0
- package/dist/cjs/clients/ibge.js.map +1 -0
- package/dist/cjs/clients/repository.js +186 -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 +111 -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/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 +127 -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/material.js +168 -0
- package/dist/cjs/fiscal/credentials/material.js.map +1 -0
- package/dist/cjs/fiscal/credentials/readiness.js +163 -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/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 +328 -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 +316 -11
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +100 -15
- 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 +144 -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 +34 -0
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/subscription-billing/index.js +2 -1
- package/dist/cjs/subscription-billing/index.js.map +1 -1
- package/dist/cjs/subscription-billing/service.js +153 -77
- 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/clients/ibge.d.ts +17 -0
- package/dist/clients/ibge.d.ts.map +1 -0
- package/dist/clients/ibge.js +98 -0
- package/dist/clients/ibge.js.map +1 -0
- package/dist/clients/repository.d.ts +154 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +182 -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 +109 -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/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 +86 -0
- package/dist/fiscal/coverage/model.d.ts.map +1 -0
- package/dist/fiscal/coverage/model.js +120 -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/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/readiness.d.ts +92 -0
- package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
- package/dist/fiscal/credentials/readiness.js +159 -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/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 +80 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.js +323 -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 +115 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -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 +98 -14
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +1 -1
- 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 +37 -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 +140 -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 +34 -0
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/subscription-billing/index.d.ts +6 -5
- package/dist/subscription-billing/index.d.ts.map +1 -1
- package/dist/subscription-billing/index.js +3 -3
- package/dist/subscription-billing/index.js.map +1 -1
- package/dist/subscription-billing/service.d.ts +21 -0
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +90 -15
- 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/package.json +9 -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
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* O contrato oficial da NFS-e Nacional — ADN — como artefato versionado.
|
|
3
|
+
*
|
|
4
|
+
* ## Por que um módulo, e não comentários espalhados
|
|
5
|
+
*
|
|
6
|
+
* Até a Fase 2 o que sabíamos do ADN estava disperso em comentários de
|
|
7
|
+
* `nfse-adn.ts` e `adn-transport.ts`, misturado com o que apenas SUPÚNHAMOS. Um
|
|
8
|
+
* leitor não tinha como separar "o manual diz" de "assumimos por simetria com a
|
|
9
|
+
* NF-e" — e a segunda categoria é exatamente a que produz um parser que devolve
|
|
10
|
+
* lote vazio com sucesso aparente.
|
|
11
|
+
*
|
|
12
|
+
* Aqui cada afirmação carrega a fonte que a sustenta e, quando não há fonte, diz
|
|
13
|
+
* que não há. `evidence: 'official'` significa que existe um documento oficial
|
|
14
|
+
* publicado, com versão, data e sha256 registrados abaixo; `evidence:
|
|
15
|
+
* 'unverified'` significa que a afirmação é a melhor leitura disponível e NÃO
|
|
16
|
+
* foi conferida contra o serviço.
|
|
17
|
+
*
|
|
18
|
+
* A distinção não é documental: ela é executável. Um perfil de envelope com
|
|
19
|
+
* `verified: false` fecha o transporte real (`adn-transport.ts`), e é por isso
|
|
20
|
+
* que a Fase 3 termina com o motor pronto e parado em vez de pronto e chutando.
|
|
21
|
+
*
|
|
22
|
+
* ## O que foi medido nesta onda, e como
|
|
23
|
+
*
|
|
24
|
+
* Todo host do ADN — `adn.nfse.gov.br` e `adn.producaorestrita.nfse.gov.br` —
|
|
25
|
+
* exige TLS mútuo com certificado ICP-Brasil para TODOS os seus módulos,
|
|
26
|
+
* documentação inclusive. Medido em 2026-09-08 percorrendo as dezesseis URLs de
|
|
27
|
+
* Swagger publicadas em gov.br (oito módulos × dois ambientes): o handshake
|
|
28
|
+
* completa, o servidor envia `CertificateRequest` — 170 CAs aceitas em produção
|
|
29
|
+
* restrita, 5 em produção — e então encerra a conexão sem UM byte de HTTP.
|
|
30
|
+
* Não há caminho público para ler o envelope de resposta.
|
|
31
|
+
*
|
|
32
|
+
* Por isso o envelope permanece `unverified`, e por isso a Fase 3 não é a
|
|
33
|
+
* primeira conexão real: é a transformação do que ESTÁ publicado num contrato
|
|
34
|
+
* executável que se recusa a adivinhar o que não está.
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* A versão do contrato que este código implementa.
|
|
38
|
+
*
|
|
39
|
+
* Vai gravada em `fiscal_sync_run.contract_version`. O motivo é operacional e
|
|
40
|
+
* concreto: quando o governo alterar o leiaute — e ele já alterou duas vezes
|
|
41
|
+
* entre dez/2025 e fev/2026 —, a pergunta "qual parser processou este lote?"
|
|
42
|
+
* precisa ter resposta no dado, não na arqueologia do `git log`.
|
|
43
|
+
*/
|
|
44
|
+
export const NFSE_ADN_CONTRACT_VERSION = 'nfse-adn:v1';
|
|
45
|
+
/**
|
|
46
|
+
* As fontes primárias. Somente gov.br / Portal Nacional NFS-e.
|
|
47
|
+
*
|
|
48
|
+
* Blog, fórum, artigo de fornecedor e repositório de terceiro ficaram de fora
|
|
49
|
+
* por decisão de fase, e não por desdém: nenhum deles é responsável pelo
|
|
50
|
+
* protocolo, e um deles CONTRADIZ o manual quanto ao papel do certificado.
|
|
51
|
+
* Pista serve para saber onde procurar; certificação, não.
|
|
52
|
+
*/
|
|
53
|
+
export const NFSE_ADN_OFFICIAL_SOURCES = Object.freeze([
|
|
54
|
+
Object.freeze({
|
|
55
|
+
id: 'manual-contribuintes-adn',
|
|
56
|
+
title: 'Manual dos Contribuintes — Sistema Nacional NFS-e — Guia para utilização das API´s do ADN',
|
|
57
|
+
url: 'https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/manual-contribuintes-apis-adn-sistema-nacional-nfse.pdf',
|
|
58
|
+
version: '1.0',
|
|
59
|
+
publishedAt: '2026-02-12',
|
|
60
|
+
sha256: '9ffc97d8b1be4c80a440b3569b0027df61265b9e75ef69437f21f9481a9a1d6d',
|
|
61
|
+
retrievedAt: '2026-09-08',
|
|
62
|
+
scope: 'Métodos do ADN para o contribuinte: GET /DFe/{NSU} e GET /NFSe/{ChaveAcesso}/Eventos; escopo por CNPJ Raiz do certificado.',
|
|
63
|
+
}),
|
|
64
|
+
Object.freeze({
|
|
65
|
+
id: 'manual-municipios-adn',
|
|
66
|
+
title: 'Manual dos Municípios Conveniados ao Sistema Nacional NFS-e — Guia para utilização das API´s do ADN',
|
|
67
|
+
url: 'https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/manual-municipios-apis-adn-sistema-nacional-nfs-e-v1-2-out21025.pdf',
|
|
68
|
+
version: '1.0',
|
|
69
|
+
publishedAt: '2025-03-17',
|
|
70
|
+
sha256: '1e1463e68aa56dbd94e77c3597059b173b8c0a60b1234b3e8424cdcba033b067',
|
|
71
|
+
retrievedAt: '2026-09-08',
|
|
72
|
+
scope: 'Semântica dos quatro NSU, ordem crescente, teto de 50 por lote, ultNSU/maxNSU, espera de uma hora, e os três desfechos possíveis da distribuição.',
|
|
73
|
+
}),
|
|
74
|
+
Object.freeze({
|
|
75
|
+
id: 'anexo-iv-adn',
|
|
76
|
+
title: 'ANEXO_IV — ADN — SNNFSe (regras de negócio e códigos de erro do ADN)',
|
|
77
|
+
url: 'https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/anexo_iv-adn-snnfse-v1-00-20251216.xlsx',
|
|
78
|
+
version: '1.00',
|
|
79
|
+
publishedAt: '2025-12-16',
|
|
80
|
+
sha256: 'fa778d0b6e58d62d90d72225b0495805108a4f4983ac77076044a21d8036302f',
|
|
81
|
+
retrievedAt: '2026-09-08',
|
|
82
|
+
scope: 'Códigos E1xxx (certificado, mensagem, área de dados) e E2xxx (distribuição), incluindo os do contribuinte: E2215, E2230, E2240, E2241.',
|
|
83
|
+
}),
|
|
84
|
+
Object.freeze({
|
|
85
|
+
id: 'esquemas-xsd-v1-01',
|
|
86
|
+
title: 'NFSe-ESQUEMAS_XSD-v1.01-20260209',
|
|
87
|
+
url: 'https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/nfse-esquemas_xsd-v1-01-20260209.zip',
|
|
88
|
+
version: '1.01',
|
|
89
|
+
publishedAt: '2026-02-09',
|
|
90
|
+
sha256: 'e7935cbd9470527c6cc32984c1b2263e614183bf0139ce2733eaaed2de9a8072',
|
|
91
|
+
retrievedAt: '2026-09-08',
|
|
92
|
+
scope: 'Leiaute do CONTEÚDO: NFSe_v1.01, evento_v1.01, tiposComplexos, tiposEventos, tiposSimples. É a fonte do parser de documento e do mapa de eventos.',
|
|
93
|
+
}),
|
|
94
|
+
]);
|
|
95
|
+
/**
|
|
96
|
+
* ═══ A distinção que a Fase 3 existe para tornar precisa ═══════════════════
|
|
97
|
+
*
|
|
98
|
+
* `payloadShapeVerified` — o CONTEÚDO (o XML da NFS-e e do evento). Conferido
|
|
99
|
+
* contra o XSD oficial v1.01, cujo hash está acima. É `true`.
|
|
100
|
+
*
|
|
101
|
+
* `envelopeShapeVerified` — o ENVELOPE de transporte que embrulha esse conteúdo
|
|
102
|
+
* na resposta HTTP do ADN. NÃO existe em nenhum artefato alcançável sem
|
|
103
|
+
* certificado ICP-Brasil: o Swagger é servido pelo próprio host que exige TLS
|
|
104
|
+
* mútuo. É `false`.
|
|
105
|
+
*
|
|
106
|
+
* Uma constante só para os dois esconderia justamente a diferença que importa.
|
|
107
|
+
* O antigo `ADN_RESPONSE_SHAPE_VERIFIED` era essa constante única, e ela dizia
|
|
108
|
+
* `false` por causa do envelope — deixando o leitor concluir que também não
|
|
109
|
+
* sabíamos ler o documento, o que era falso e desnecessariamente pessimista.
|
|
110
|
+
*/
|
|
111
|
+
export const NFSE_ADN_PAYLOAD_SHAPE_VERIFIED = true;
|
|
112
|
+
export const NFSE_ADN_ENVELOPE_SHAPE_VERIFIED = false;
|
|
113
|
+
/**
|
|
114
|
+
* mTLS é exigência do PROTOCOLO neste endpoint — medido e documentado.
|
|
115
|
+
*
|
|
116
|
+
* Duas evidências independentes, e nenhuma delas é dedução:
|
|
117
|
+
*
|
|
118
|
+
* 1. O manual do contribuinte (v1.0, §1.1) fala do "CNPJ do certificado
|
|
119
|
+
* utilizado para ESTABELECER A CONEXÃO" e valida o CNPJ Raiz entre o
|
|
120
|
+
* parâmetro informado e esse certificado. Certificado que estabelece a
|
|
121
|
+
* conexão é certificado de cliente em TLS.
|
|
122
|
+
* 2. As dezesseis URLs oficiais de Swagger do ADN, nos dois ambientes, não
|
|
123
|
+
* devolvem um byte de HTTP sem certificado de cliente (medido 2026-09-08).
|
|
124
|
+
*
|
|
125
|
+
* O escopo desta afirmação é o HOST do ADN, e para nada além dele. A NFS-e
|
|
126
|
+
* nacional tem outros serviços — emissão pela Sefin, sistemas municipais
|
|
127
|
+
* próprios, Emissor Público Web com login gov.br — e generalizar um endpoint
|
|
128
|
+
* para todo o ecossistema seria o mesmo erro de método que a Fase 1 cometeu ao
|
|
129
|
+
* adivinhar código de evento por prefixo.
|
|
130
|
+
*/
|
|
131
|
+
export const NFSE_ADN_MTLS_REQUIREMENT = 'required';
|
|
132
|
+
/**
|
|
133
|
+
* A1 continua REFUTADO como exigência de protocolo.
|
|
134
|
+
*
|
|
135
|
+
* O que as fontes oficiais exigem do certificado é: raiz ICP-Brasil (E1208),
|
|
136
|
+
* `KeyUsage` com Autenticação Cliente (E1200), extensão de CNPJ no `OtherName`
|
|
137
|
+
* OID 2.16.76.1.3.3 (E1209), cadeia e LCR válidas (E1205/E1206/E1207). Nada
|
|
138
|
+
* disso distingue A1 de A3 — um A3 em token satisfaz os cinco.
|
|
139
|
+
*
|
|
140
|
+
* A1 é PREFERÊNCIA DE AUTOMAÇÃO nossa: um worker sem pessoa presente não digita
|
|
141
|
+
* PIN de token. Registrar isso como preferência, e não como obrigação legal, é o
|
|
142
|
+
* que impede o produto de exigir do cliente um certificado que a norma não pede.
|
|
143
|
+
*/
|
|
144
|
+
export const NFSE_ADN_A1_REQUIREMENT = 'refuted';
|
|
145
|
+
export const NFSE_ADN_A1_RATIONALE = 'server_side_automation_preference';
|
|
146
|
+
/** Hosts oficiais, por ambiente. Nunca substituíveis um pelo outro. */
|
|
147
|
+
export const NFSE_ADN_HOSTS = Object.freeze({
|
|
148
|
+
/** Produção RESTRITA: responde como o real sobre documento SEM valor fiscal. */
|
|
149
|
+
homologation: 'adn.producaorestrita.nfse.gov.br',
|
|
150
|
+
production: 'adn.nfse.gov.br',
|
|
151
|
+
});
|
|
152
|
+
/**
|
|
153
|
+
* Limites. Os oficiais vêm da norma; os defensivos são nossos e dizem que são.
|
|
154
|
+
*
|
|
155
|
+
* A separação existe porque um limite oficial ultrapassado é violação de norma —
|
|
156
|
+
* e o CNPJ bloqueado é o do CLIENTE —, enquanto um limite defensivo ultrapassado
|
|
157
|
+
* é só a nossa proteção agindo. Confundi-los faria alguém "afrouxar o limite"
|
|
158
|
+
* numa madrugada sem saber qual dos dois estava afrouxando.
|
|
159
|
+
*/
|
|
160
|
+
export const NFSE_ADN_LIMITS = Object.freeze({
|
|
161
|
+
/** Manual dos Municípios §1.4.2.b: "Quantidade máxima de documentos no lote: 50". */
|
|
162
|
+
maxDocumentsPerBatch: { value: 50, evidence: 'official' },
|
|
163
|
+
/**
|
|
164
|
+
* Manual dos Municípios §1.4.2.b: espera mínima de UMA HORA depois de receber
|
|
165
|
+
* a indicação de que não há mais documentos.
|
|
166
|
+
*
|
|
167
|
+
* Isto corrige o comentário da Fase 1, que dizia que a NFS-e "não publica a
|
|
168
|
+
* regra de uma hora que a NF-e publica" e que adotávamos 3600s por simetria.
|
|
169
|
+
* Ela publica. A regra é dela, não emprestada.
|
|
170
|
+
*/
|
|
171
|
+
exhaustedWaitSeconds: { value: 3600, evidence: 'official' },
|
|
172
|
+
/**
|
|
173
|
+
* Teto de bytes da resposta HTTP. DEFENSIVO — a norma não fixa um.
|
|
174
|
+
*
|
|
175
|
+
* 16 MiB acomoda com folga 50 documentos comprimidos (uma NFS-e tem alguns KB)
|
|
176
|
+
* e impede que um servidor comprometido, um proxy hostil ou um defeito do lado
|
|
177
|
+
* de lá transformem uma sincronização em consumo ilimitado de memória.
|
|
178
|
+
*/
|
|
179
|
+
maxResponseBytes: { value: 16 * 1024 * 1024, evidence: 'unverified' },
|
|
180
|
+
/**
|
|
181
|
+
* Teto de bytes DESCOMPACTADOS por documento. DEFENSIVO.
|
|
182
|
+
*
|
|
183
|
+
* É o mesmo 8 MiB que `decodeFiscalXml` já impõe ao XML. Repeti-lo aqui não é
|
|
184
|
+
* duplicação: sem ele, uma bomba de descompressão estoura a memória ANTES de
|
|
185
|
+
* o leitor de XML ter a chance de recusar o tamanho.
|
|
186
|
+
*/
|
|
187
|
+
maxDecompressedBytesPerDocument: {
|
|
188
|
+
value: 8 * 1024 * 1024,
|
|
189
|
+
evidence: 'unverified',
|
|
190
|
+
},
|
|
191
|
+
/**
|
|
192
|
+
* Teto de bytes descompactados do lote inteiro. DEFENSIVO.
|
|
193
|
+
*
|
|
194
|
+
* 50 × 8 MiB seriam 400 MiB — o produto dos dois tetos anteriores não é um
|
|
195
|
+
* teto útil. 64 MiB é generoso para o caso real e finito para o hostil.
|
|
196
|
+
*/
|
|
197
|
+
maxDecompressedBytesPerBatch: {
|
|
198
|
+
value: 64 * 1024 * 1024,
|
|
199
|
+
evidence: 'unverified',
|
|
200
|
+
},
|
|
201
|
+
/** Teto de espera de uma requisição. DEFENSIVO — ver `FiscalTransportRequest`. */
|
|
202
|
+
requestTimeoutMs: { value: 30_000, evidence: 'unverified' },
|
|
203
|
+
});
|
|
204
|
+
/**
|
|
205
|
+
* As quatro séries de NSU do ADN — Manual dos Municípios §1.3.4.
|
|
206
|
+
*
|
|
207
|
+
* Confundi-las é o erro caro: cada uma numera um conjunto diferente de fatos, e
|
|
208
|
+
* usar o cursor de uma para consultar outra pularia documentos em silêncio.
|
|
209
|
+
* A nossa é a QUARTA, e apenas ela.
|
|
210
|
+
*/
|
|
211
|
+
export const NFSE_ADN_NSU_SERIES = Object.freeze({
|
|
212
|
+
general: 'NSU Geral do ADN (por DF-e) — controle interno do ADN; NÃO é distribuição.',
|
|
213
|
+
municipalReception: 'NSU de Recepção/Backup (por Código de Município) — do município emissor.',
|
|
214
|
+
municipalDistribution: 'NSU de Distribuição (por Código de Município) — do município interessado.',
|
|
215
|
+
actorDistribution: 'NSU de Distribuição para os atores da NFS-e (por CPF/CNPJ) — Prestador, Tomador e Intermediário. É ESTA que o Office consome.',
|
|
216
|
+
});
|
|
217
|
+
/** A série que este adapter consome. Explícito para que nunca seja "a outra". */
|
|
218
|
+
export const NFSE_ADN_NSU_SERIES_IN_USE = 'actorDistribution';
|
|
219
|
+
/**
|
|
220
|
+
* A matriz de contrato. Nada aqui é inferido em silêncio.
|
|
221
|
+
*
|
|
222
|
+
* Onde a fonte oficial não diz, o campo diz "não publicado" e o item entra em
|
|
223
|
+
* `unverified`. Um campo preenchido com a melhor suposição e sem marca seria
|
|
224
|
+
* indistinguível de um campo conferido — e essa indistinção é precisamente o
|
|
225
|
+
* defeito que a Fase 3 fecha.
|
|
226
|
+
*/
|
|
227
|
+
export const NFSE_ADN_OPERATIONS = Object.freeze([
|
|
228
|
+
Object.freeze({
|
|
229
|
+
id: 'dfe-distribution',
|
|
230
|
+
method: 'GET',
|
|
231
|
+
path: '/DFe/{NSU}',
|
|
232
|
+
environments: ['homologation', 'production'],
|
|
233
|
+
authentication: 'TLS mútuo com certificado ICP-Brasil de pessoa jurídica; o certificado estabelece a conexão e identifica o solicitante.',
|
|
234
|
+
identityScope: 'CNPJ Raiz do certificado. O manual v1.0 acrescentou um parâmetro para consultar CNPJ diferente do certificado, validando a RAIZ entre os dois — o que autoriza filial da MESMA raiz, e nada além dela.',
|
|
235
|
+
requestFormat: 'Sem corpo. O NSU de continuação vai no caminho; `0` é o começo disponível.',
|
|
236
|
+
responseFormat: 'JSON (Manual dos Municípios §1.3.2: "As mensagens de comunicação com a API utilizarão o padrão JSON"), transportando DF-e cujo leiaute é XML assinado.',
|
|
237
|
+
cursorSemantics: 'Até 50 DF-e a partir do último NSU informado, em ordem CRESCENTE de NSU. O NSU é gerado por ordem cronológica de RECEPÇÃO pelo ADN, não de emissão. Documentos compartilhados pelo próprio solicitante não são distribuídos a ele.',
|
|
238
|
+
emptySemantics: 'Três desfechos publicados: rejeição com motivo; "nenhum documento localizado"; documento localizado. Para o contribuinte, "nenhum documento" é o código E2215 (a partir do NSU) ou E2230 (NSU pontual). Esgotamento é ultNSU === maxNSU, e obriga espera de 1h.',
|
|
239
|
+
errorShape: 'Códigos E1xxx/E2xxx do ANEXO_IV. O envelope JSON que os carrega NÃO está publicado fora do Swagger protegido por mTLS.',
|
|
240
|
+
rateLimitSemantics: 'Espera mínima de 1 hora após a indicação de esgotamento. A norma não publica cabeçalho de limite nem código HTTP de excesso para este endpoint.',
|
|
241
|
+
sourceId: 'manual-contribuintes-adn',
|
|
242
|
+
implemented: true,
|
|
243
|
+
unverified: Object.freeze([
|
|
244
|
+
'nomes e capitalização dos campos do envelope JSON',
|
|
245
|
+
'status HTTP associado a cada um dos três desfechos',
|
|
246
|
+
'codificação do conteúdo do documento (gzip+base64 é a forma usada pelo docZip da NF-e, não confirmada aqui)',
|
|
247
|
+
'nome do parâmetro de CNPJ de consulta acrescentado na v1.0',
|
|
248
|
+
]),
|
|
249
|
+
}),
|
|
250
|
+
Object.freeze({
|
|
251
|
+
id: 'nfse-events-by-key',
|
|
252
|
+
method: 'GET',
|
|
253
|
+
path: '/NFSe/{ChaveAcesso}/Eventos',
|
|
254
|
+
environments: ['homologation', 'production'],
|
|
255
|
+
authentication: 'TLS mútuo com certificado ICP-Brasil, idem.',
|
|
256
|
+
identityScope: 'A chave precisa referenciar o contribuinte solicitante; caso contrário E2241.',
|
|
257
|
+
requestFormat: 'Sem corpo. Chave de acesso de 53 posições no caminho.',
|
|
258
|
+
responseFormat: 'JSON com os eventos vinculados à chave; conteúdo XML por evento.',
|
|
259
|
+
cursorSemantics: 'Não tem cursor: é consulta pontual por chave.',
|
|
260
|
+
emptySemantics: 'E2240 — chave não localizada. E2241 — chave não referencia o solicitante.',
|
|
261
|
+
errorShape: 'Idem, códigos E2xxx do ANEXO_IV.',
|
|
262
|
+
rateLimitSemantics: 'Não publicada para esta operação.',
|
|
263
|
+
sourceId: 'manual-contribuintes-adn',
|
|
264
|
+
// Deliberadamente NÃO implementada nesta fase. O motor recebe os eventos
|
|
265
|
+
// pela própria distribuição por NSU — a série de atores distribui os eventos
|
|
266
|
+
// junto com os documentos (ANEXO_IV, aba de geração de NSU). Uma segunda
|
|
267
|
+
// porta para o mesmo fato só acrescentaria consumo contra o ambiente
|
|
268
|
+
// nacional sem trazer informação nova.
|
|
269
|
+
implemented: false,
|
|
270
|
+
unverified: Object.freeze(['envelope JSON', 'status HTTP por desfecho']),
|
|
271
|
+
}),
|
|
272
|
+
]);
|
|
273
|
+
export const NFSE_ADN_OFFICIAL_CODES = Object.freeze(Object.fromEntries([
|
|
274
|
+
// ── Distribuição para os ATORES (o nosso caminho) ────────────────────
|
|
275
|
+
[
|
|
276
|
+
'E2215',
|
|
277
|
+
'Não existem DF-e para o contribuinte a partir do NSU informado',
|
|
278
|
+
'no_documents',
|
|
279
|
+
null,
|
|
280
|
+
],
|
|
281
|
+
['E2230', 'Não existe DF-e para o contribuinte com o NSU informado', 'no_documents', null],
|
|
282
|
+
['E2240', 'Chave de acesso não localizada', 'no_documents', null],
|
|
283
|
+
[
|
|
284
|
+
'E2241',
|
|
285
|
+
'Chave de acesso não referencia o contribuinte solicitante',
|
|
286
|
+
'error',
|
|
287
|
+
'not_allowed',
|
|
288
|
+
],
|
|
289
|
+
// ── Certificado de transmissão ───────────────────────────────────────
|
|
290
|
+
['E1200', 'Certificado de transmissão inválido', 'error', 'auth'],
|
|
291
|
+
['E1203', 'Certificado de transmissão expirado', 'error', 'auth'],
|
|
292
|
+
['E1205', 'Erro na cadeia de certificação', 'error', 'auth'],
|
|
293
|
+
['E1206', 'Erro de acesso à LCR', 'error', 'auth'],
|
|
294
|
+
['E1207', 'Certificado de transmissão revogado', 'error', 'auth'],
|
|
295
|
+
['E1208', 'Certificado não tem raiz ICP-Brasil', 'error', 'auth'],
|
|
296
|
+
['E1209', 'Certificado de transmissão sem CNPJ', 'error', 'auth'],
|
|
297
|
+
['E2000', 'Erro no certificado de transmissão', 'error', 'auth'],
|
|
298
|
+
// ── Autorização e cadastro ───────────────────────────────────────────
|
|
299
|
+
[
|
|
300
|
+
'E1262',
|
|
301
|
+
'CNPJ não autorizado a compartilhar DF-e pelo município conveniado',
|
|
302
|
+
'error',
|
|
303
|
+
'not_allowed',
|
|
304
|
+
],
|
|
305
|
+
['E2001', 'CNPJ não cadastrado para nenhum município conveniado', 'error', 'not_allowed'],
|
|
306
|
+
['E2301', 'CNPJ não cadastrado', 'error', 'not_allowed'],
|
|
307
|
+
// ── Serviço ──────────────────────────────────────────────────────────
|
|
308
|
+
['E1217', 'Serviço paralisado para manutenção', 'error', 'transient'],
|
|
309
|
+
// ── Mensagem e área de dados ─────────────────────────────────────────
|
|
310
|
+
['E1219', 'Número de documentos maior que o limite', 'error', 'invalid'],
|
|
311
|
+
['E1225', 'Falha na decodificação da base64 da área de dados', 'error', 'invalid'],
|
|
312
|
+
['E1226', 'Estrutura descompactada mal formada', 'error', 'invalid'],
|
|
313
|
+
['E1228', 'Prefixo de namespace não permitido', 'error', 'invalid'],
|
|
314
|
+
['E1229', 'XML fora de UTF-8', 'error', 'invalid'],
|
|
315
|
+
['E1235', 'Falha no esquema XML do DF-e', 'error', 'invalid'],
|
|
316
|
+
['E1242', 'Tipo de DF-e não tratado pelo Sistema Nacional NFS-e', 'error', 'invalid'],
|
|
317
|
+
['E1245', 'Certificado da assinatura do lote sem CNPJ', 'error', 'invalid'],
|
|
318
|
+
['E1246', 'Certificado da assinatura do lote — erro na cadeia', 'error', 'invalid'],
|
|
319
|
+
['E1250', 'Assinatura difere do calculado', 'error', 'invalid'],
|
|
320
|
+
].map(([code, meaning, outcome, errorClass]) => [
|
|
321
|
+
code,
|
|
322
|
+
Object.freeze({ code, meaning, outcome, errorClass }),
|
|
323
|
+
])));
|
|
324
|
+
/**
|
|
325
|
+
* O perfil OFICIAL — a melhor leitura disponível, e declaradamente não conferida.
|
|
326
|
+
*
|
|
327
|
+
* Os nomes vêm da descrição pública da API e da simetria com o `docZip` da
|
|
328
|
+
* NF-e. Estão aqui para que exista UM lugar onde corrigi-los no dia em que
|
|
329
|
+
* alguém vir a resposta — e para que o `verified: false` mantenha o transporte
|
|
330
|
+
* real fechado até esse dia.
|
|
331
|
+
*/
|
|
332
|
+
export const ADN_OFFICIAL_ENVELOPE_PROFILE = Object.freeze({
|
|
333
|
+
id: 'nfse-adn:v1/official',
|
|
334
|
+
contractVersion: NFSE_ADN_CONTRACT_VERSION,
|
|
335
|
+
verified: NFSE_ADN_ENVELOPE_SHAPE_VERIFIED,
|
|
336
|
+
environments: Object.freeze(['homologation', 'production']),
|
|
337
|
+
batchField: 'LoteDFe',
|
|
338
|
+
itemNsuField: 'NSU',
|
|
339
|
+
itemContentField: 'ArquivoXml',
|
|
340
|
+
lastNsuField: 'UltimoNSU',
|
|
341
|
+
maxNsuField: 'MaximoNSU',
|
|
342
|
+
codeField: 'Codigo',
|
|
343
|
+
contentEncoding: 'gzip+base64',
|
|
344
|
+
});
|
|
345
|
+
/**
|
|
346
|
+
* O perfil SINTÉTICO — conferido, porque somos nós quem o define.
|
|
347
|
+
*
|
|
348
|
+
* Não há circularidade: ele não afirma nada sobre o ADN. Ele descreve o servidor
|
|
349
|
+
* de mentira que a suíte levanta, e `verified: true` aqui significa apenas "o
|
|
350
|
+
* parser e o servidor sintético concordam", que é uma afirmação verificável e
|
|
351
|
+
* verificada. `environments: ['synthetic']` impede que ele seja usado como
|
|
352
|
+
* atalho para abrir o transporte real.
|
|
353
|
+
*/
|
|
354
|
+
export const ADN_SYNTHETIC_ENVELOPE_PROFILE = Object.freeze({
|
|
355
|
+
id: 'nfse-adn:v1/synthetic',
|
|
356
|
+
contractVersion: NFSE_ADN_CONTRACT_VERSION,
|
|
357
|
+
verified: true,
|
|
358
|
+
environments: Object.freeze(['synthetic']),
|
|
359
|
+
batchField: 'LoteDFe',
|
|
360
|
+
itemNsuField: 'NSU',
|
|
361
|
+
itemContentField: 'ArquivoXml',
|
|
362
|
+
lastNsuField: 'UltimoNSU',
|
|
363
|
+
maxNsuField: 'MaximoNSU',
|
|
364
|
+
codeField: 'Codigo',
|
|
365
|
+
contentEncoding: 'gzip+base64',
|
|
366
|
+
});
|
|
367
|
+
/**
|
|
368
|
+
* O transporte real está ligado?
|
|
369
|
+
*
|
|
370
|
+
* Constante, e não variável de ambiente, por decisão de fase: uma variável de
|
|
371
|
+
* ambiente é ligável sem revisão, e a primeira conexão fiscal real do produto
|
|
372
|
+
* não deve poder acontecer por causa de uma linha num painel. Quando o portão
|
|
373
|
+
* humano da Fase 4 for aberto, isto vira um commit — revisável, revertível, e
|
|
374
|
+
* com o nome de quem o abriu.
|
|
375
|
+
*/
|
|
376
|
+
export const ADN_REAL_TRANSPORT_ENABLED = false;
|
|
377
|
+
/** Motivos pelos quais o transporte real está fechado, para tela e trilha. */
|
|
378
|
+
export function adnRealTransportBlockers(profile = ADN_OFFICIAL_ENVELOPE_PROFILE) {
|
|
379
|
+
const razoes = [];
|
|
380
|
+
if (!ADN_REAL_TRANSPORT_ENABLED)
|
|
381
|
+
razoes.push('ADN_REAL_TRANSPORT_DISABLED');
|
|
382
|
+
if (!profile.verified)
|
|
383
|
+
razoes.push('ADN_ENVELOPE_UNVERIFIED');
|
|
384
|
+
return Object.freeze(razoes);
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=nfse-adn-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nfse-adn-contract.js","sourceRoot":"","sources":["../../../src/fiscal/contracts/nfse-adn-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FiscalProviderError, type FiscalEnvironmentTag } from '../ingestion/provider.js';
|
|
2
|
+
export declare class AdnEndpointNotAllowedError extends FiscalProviderError {
|
|
3
|
+
readonly detail: string;
|
|
4
|
+
constructor(detail: string);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Resolve e AUTORIZA a base do ADN para um ambiente.
|
|
8
|
+
*
|
|
9
|
+
* Devolve sempre uma URL sem barra final, para que a composição de caminho em
|
|
10
|
+
* `adnDfeUrl` seja uma concatenação e não uma decisão.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveAdnBaseUrl(environment: FiscalEnvironmentTag, baseUrl?: string | null): string;
|
|
13
|
+
//# sourceMappingURL=nfse-adn-endpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nfse-adn-endpoint.d.ts","sourceRoot":"","sources":["../../../src/fiscal/contracts/nfse-adn-endpoint.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAmC1F,qBAAa,0BAA2B,SAAQ,mBAAmB;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAQpC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,oBAAoB,EACjC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,MAAM,CAkCR"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { URL } from 'node:url';
|
|
2
|
+
import { FiscalProviderError } from '../ingestion/provider.js';
|
|
3
|
+
import { NFSE_ADN_HOSTS } from './nfse-adn-contract.js';
|
|
4
|
+
/**
|
|
5
|
+
* Para onde o worker fiscal PODE abrir socket — e a resposta é uma lista curta.
|
|
6
|
+
*
|
|
7
|
+
* ## O risco concreto, e não teórico
|
|
8
|
+
*
|
|
9
|
+
* O transporte do ADN aceitava `baseUrl` livre. Ela existe por um motivo
|
|
10
|
+
* legítimo: o servidor sintético da suíte precisa entrar no lugar do host
|
|
11
|
+
* oficial. Mas nada impedia que esse mesmo campo chegasse de configuração de
|
|
12
|
+
* tenant, de uma coluna de cadastro de provedor ou de um parâmetro de rota — e
|
|
13
|
+
* então o worker fiscal, que roda dentro da rede com o certificado do cliente
|
|
14
|
+
* carregado, vira um proxy HTTP de destino escolhido por terceiro.
|
|
15
|
+
*
|
|
16
|
+
* O dano não é abstrato: o alvo natural de um SSRF em nuvem é o metadata do
|
|
17
|
+
* provedor, e o corpo da resposta seria devolvido ao chamador pelo caminho de
|
|
18
|
+
* ingestão. Pior: o certificado ICP-Brasil do CONTRIBUINTE seria apresentado ao
|
|
19
|
+
* destino escolhido pelo atacante.
|
|
20
|
+
*
|
|
21
|
+
* ## Por que allowlist, e por que tão estreita
|
|
22
|
+
*
|
|
23
|
+
* Uma denylist ("não pode ser IP interno") erra por construção: DNS rebinding,
|
|
24
|
+
* redirecionamento, IPv6 mapeado, notação decimal de IP. A allowlist responde à
|
|
25
|
+
* pergunta certa — "quais são os destinos legítimos?" — e a resposta oficial tem
|
|
26
|
+
* exatamente dois nomes.
|
|
27
|
+
*
|
|
28
|
+
* Para o ambiente sintético o destino permitido é o loopback, e só ele. Um
|
|
29
|
+
* servidor de teste que precise sair da máquina é um teste que precisa de outro
|
|
30
|
+
* desenho, não de um portão mais frouxo.
|
|
31
|
+
*/
|
|
32
|
+
/** Onde o ambiente sintético pode falar. Nada além da própria máquina. */
|
|
33
|
+
const LOOPBACK = new Set(['127.0.0.1', 'localhost', '::1', '[::1]']);
|
|
34
|
+
export class AdnEndpointNotAllowedError extends FiscalProviderError {
|
|
35
|
+
detail;
|
|
36
|
+
constructor(detail) {
|
|
37
|
+
super('not_allowed', `destino recusado pela allowlist do ADN: ${detail}`, 'ENDPOINT_NOT_ALLOWED');
|
|
38
|
+
this.detail = detail;
|
|
39
|
+
this.name = 'AdnEndpointNotAllowedError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolve e AUTORIZA a base do ADN para um ambiente.
|
|
44
|
+
*
|
|
45
|
+
* Devolve sempre uma URL sem barra final, para que a composição de caminho em
|
|
46
|
+
* `adnDfeUrl` seja uma concatenação e não uma decisão.
|
|
47
|
+
*/
|
|
48
|
+
export function resolveAdnBaseUrl(environment, baseUrl) {
|
|
49
|
+
if (environment === 'synthetic') {
|
|
50
|
+
if (!baseUrl) {
|
|
51
|
+
// Sem base explícita, o default apontaria para o host oficial — e um teste
|
|
52
|
+
// que "esqueceu" de configurar o servidor de mentira falaria com o governo.
|
|
53
|
+
throw new FiscalProviderError('invalid', 'ambiente sintético exige baseUrl explícita', 'SYNTHETIC_BASE_URL_REQUIRED');
|
|
54
|
+
}
|
|
55
|
+
const u = parseOrRefuse(baseUrl);
|
|
56
|
+
if (!LOOPBACK.has(u.hostname)) {
|
|
57
|
+
throw new AdnEndpointNotAllowedError('sintético só fala com loopback');
|
|
58
|
+
}
|
|
59
|
+
return semBarraFinal(u);
|
|
60
|
+
}
|
|
61
|
+
const oficial = NFSE_ADN_HOSTS[environment === 'production' ? 'production' : 'homologation'];
|
|
62
|
+
if (!baseUrl)
|
|
63
|
+
return `https://${oficial}`;
|
|
64
|
+
const u = parseOrRefuse(baseUrl);
|
|
65
|
+
// Comparação por igualdade do hostname, e nunca `includes`/`endsWith`: um
|
|
66
|
+
// `endsWith('nfse.gov.br')` aceitaria `adn.nfse.gov.br.exemplo.com`, que é o
|
|
67
|
+
// truque mais antigo do gênero.
|
|
68
|
+
if (u.hostname !== oficial) {
|
|
69
|
+
throw new AdnEndpointNotAllowedError('host fora da lista oficial do ambiente');
|
|
70
|
+
}
|
|
71
|
+
// Porta não padrão contra o host oficial não é um cenário legítimo: seria um
|
|
72
|
+
// desvio para um serviço diferente no mesmo nome.
|
|
73
|
+
if (u.port !== '' && u.port !== '443') {
|
|
74
|
+
throw new AdnEndpointNotAllowedError('porta não padrão contra host oficial');
|
|
75
|
+
}
|
|
76
|
+
return semBarraFinal(u);
|
|
77
|
+
}
|
|
78
|
+
function parseOrRefuse(raw) {
|
|
79
|
+
let u;
|
|
80
|
+
try {
|
|
81
|
+
u = new URL(raw);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
throw new AdnEndpointNotAllowedError('URL ilegível');
|
|
85
|
+
}
|
|
86
|
+
// `http:` aqui não é degradação de conforto: é o certificado do CLIENTE
|
|
87
|
+
// viajando em claro contra a Receita.
|
|
88
|
+
if (u.protocol !== 'https:')
|
|
89
|
+
throw new AdnEndpointNotAllowedError('esquema não é https');
|
|
90
|
+
// Credencial embutida na URL vaza em log, em `err.stack` e em trilha. O
|
|
91
|
+
// caminho legítimo para credencial neste motor é o material de TLS.
|
|
92
|
+
if (u.username !== '' || u.password !== '') {
|
|
93
|
+
throw new AdnEndpointNotAllowedError('URL com credencial embutida');
|
|
94
|
+
}
|
|
95
|
+
if (u.search !== '' || u.hash !== '') {
|
|
96
|
+
throw new AdnEndpointNotAllowedError('base com query ou fragmento');
|
|
97
|
+
}
|
|
98
|
+
return u;
|
|
99
|
+
}
|
|
100
|
+
function semBarraFinal(u) {
|
|
101
|
+
return `${u.origin}${u.pathname}`.replace(/\/+$/, '');
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=nfse-adn-endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nfse-adn-endpoint.js","sourceRoot":"","sources":["../../../src/fiscal/contracts/nfse-adn-endpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { FiscalProviderError, type FiscalFetchResult } from '../ingestion/provider.js';
|
|
2
|
+
import { type AdnEnvelopeProfile } from './nfse-adn-contract.js';
|
|
3
|
+
/**
|
|
4
|
+
* O leitor de envelope do ADN — estrito por construção.
|
|
5
|
+
*
|
|
6
|
+
* ## A propriedade que este arquivo inteiro existe para garantir
|
|
7
|
+
*
|
|
8
|
+
* RESPOSTA NÃO RECONHECIDA ≠ SUCESSO COM ZERO DOCUMENTOS
|
|
9
|
+
*
|
|
10
|
+
* São indistinguíveis para o cursor e opostos para o negócio. "Zero documentos"
|
|
11
|
+
* é o dia normal de um cliente que não emitiu nem recebeu nota; "não reconheci"
|
|
12
|
+
* é um defeito que precisa parar tudo. A versão anterior deste leitor podia
|
|
13
|
+
* confundi-los de três maneiras, e todas as três estão fechadas aqui:
|
|
14
|
+
*
|
|
15
|
+
* 1. `LoteDFe ?? loteDFe` — se o nome real fosse um terceiro, o `??`
|
|
16
|
+
* devolveria `undefined` e o parser lançaria; mas um envelope que POSSUÍSSE
|
|
17
|
+
* `LoteDFe: []` por outro motivo passaria como lote vazio legítimo. Agora
|
|
18
|
+
* os nomes vêm do PERFIL, um só conjunto, e o que não bate não é lido.
|
|
19
|
+
* 2. `gunzipSync(...)` com `catch { raw = compactado }` — conteúdo que não é
|
|
20
|
+
* gzip virava "conteúdo não compactado" em silêncio. Um base64 de HTML de
|
|
21
|
+
* página de erro de proxy passaria por aqui como documento fiscal, e só
|
|
22
|
+
* falharia lá adiante, sem dizer que o problema era o transporte.
|
|
23
|
+
* 3. Ausência de teto de descompressão — 200 bytes de gzip hostil viram
|
|
24
|
+
* gigabytes na memória do worker.
|
|
25
|
+
*
|
|
26
|
+
* ## O terceiro estado, que não é erro nem sucesso genérico
|
|
27
|
+
*
|
|
28
|
+
* O ADN representa "não há documentos" como uma REJEIÇÃO com código (E2215 a
|
|
29
|
+
* partir de um NSU, E2230 para NSU pontual — ANEXO_IV, aba
|
|
30
|
+
* `ADN-RN_DISTRIB_MUN_CONTRIB`). No vocabulário dele é rejeição; no nosso é o
|
|
31
|
+
* dia normal. Tratá-lo como erro encheria a caixa de intervenções de escritórios
|
|
32
|
+
* cujos clientes simplesmente não tiveram nota na semana.
|
|
33
|
+
*
|
|
34
|
+
* Ele é reconhecido, nomeado, e devolvido como lote vazio COM o código na
|
|
35
|
+
* trilha — o que o mantém distinguível de um envelope que mudou, que lança.
|
|
36
|
+
*/
|
|
37
|
+
/** As formas de não reconhecer uma resposta. Códigos estáveis para a trilha. */
|
|
38
|
+
export type AdnMismatchReason = 'BODY_EMPTY' | 'NOT_JSON' | 'MARKUP_INSTEAD_OF_JSON' | 'NOT_OBJECT' | 'BATCH_FIELD_MISSING' | 'BATCH_NOT_ARRAY' | 'BATCH_OVER_OFFICIAL_LIMIT' | 'ITEM_NOT_OBJECT' | 'ITEM_NSU_INVALID' | 'ITEM_CONTENT_MISSING' | 'ITEM_CONTENT_NOT_BASE64' | 'ITEM_CONTENT_NOT_GZIP' | 'ITEM_CONTENT_DECOMPRESSION_FAILED' | 'ITEM_CONTENT_TOO_LARGE' | 'BATCH_DECOMPRESSED_TOO_LARGE' | 'NSU_POSITION_INVALID' | 'RESPONSE_TOO_LARGE';
|
|
39
|
+
/**
|
|
40
|
+
* A resposta não corresponde ao contrato declarado.
|
|
41
|
+
*
|
|
42
|
+
* Classe `invalid` porque retentar não resolve: o formato não muda entre
|
|
43
|
+
* tentativas. `providerCode` é SEMPRE `PROTOCOL_CONTRACT_MISMATCH` — um código
|
|
44
|
+
* único é o que permite ao painel perguntar "o contrato quebrou?" com uma
|
|
45
|
+
* comparação de igualdade. O detalhe fica em `reason`, que é enumerado e não
|
|
46
|
+
* carrega um byte do corpo recebido: um corpo hostil não escreve na nossa trilha.
|
|
47
|
+
*/
|
|
48
|
+
export declare class AdnContractMismatchError extends FiscalProviderError {
|
|
49
|
+
readonly reason: AdnMismatchReason;
|
|
50
|
+
readonly profileId: string;
|
|
51
|
+
constructor(reason: AdnMismatchReason, profileId: string);
|
|
52
|
+
}
|
|
53
|
+
export interface AdnEnvelopeReadOptions {
|
|
54
|
+
readonly profile: AdnEnvelopeProfile;
|
|
55
|
+
/**
|
|
56
|
+
* O cursor com que a consulta foi feita.
|
|
57
|
+
*
|
|
58
|
+
* Necessário porque um desfecho "não há documentos" NÃO pode devolver
|
|
59
|
+
* `lastNsu: null`: o pipeline gravaria `null` como posição alcançada e a
|
|
60
|
+
* próxima execução recomeçaria do zero, reprocessando tudo. A posição de quem
|
|
61
|
+
* não achou nada é a de onde ele partiu.
|
|
62
|
+
*/
|
|
63
|
+
readonly fromNsu: string | null;
|
|
64
|
+
readonly maxResponseBytes?: number;
|
|
65
|
+
readonly maxDecompressedBytesPerDocument?: number;
|
|
66
|
+
readonly maxDecompressedBytesPerBatch?: number;
|
|
67
|
+
readonly maxDocumentsPerBatch?: number;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Lê o envelope. Devolve lote (possivelmente vazio e RECONHECIDO), ou lança.
|
|
71
|
+
*
|
|
72
|
+
* Nunca devolve `documents: []` para uma resposta que não entendeu. Essa é a
|
|
73
|
+
* invariante, e o teste de mutação da Fase 3 a exercita reintroduzindo o
|
|
74
|
+
* comportamento antigo e exigindo que a suíte fique vermelha.
|
|
75
|
+
*/
|
|
76
|
+
export declare function readAdnEnvelope(body: Uint8Array, options: AdnEnvelopeReadOptions): FiscalFetchResult;
|
|
77
|
+
//# sourceMappingURL=nfse-adn-envelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nfse-adn-envelope.d.ts","sourceRoot":"","sources":["../../../src/fiscal/contracts/nfse-adn-envelope.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,gFAAgF;AAChF,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,UAAU,GACV,wBAAwB,GACxB,YAAY,GACZ,qBAAqB,GACrB,iBAAiB,GACjB,2BAA2B,GAC3B,iBAAiB,GACjB,kBAAkB,GAClB,sBAAsB,GACtB,yBAAyB,GACzB,uBAAuB,GACvB,mCAAmC,GACnC,wBAAwB,GACxB,8BAA8B,GAC9B,sBAAsB,GACtB,oBAAoB,CAAC;AAEzB;;;;;;;;GAQG;AACH,qBAAa,wBAAyB,SAAQ,mBAAmB;IAE7D,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM;gBADjB,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,MAAM;CAS7B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,MAAM,CAAC;IAClD,QAAQ,CAAC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IAC/C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAOD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,sBAAsB,GAC9B,iBAAiB,CAoJnB"}
|