@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,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Provisiona a identidade de automação E2E de um escritório.
|
|
5
|
+
*
|
|
6
|
+
* ## Por que é um script, e não uma rota
|
|
7
|
+
*
|
|
8
|
+
* Criar a identidade que valida o produto é ato de PROVISIONAMENTO, não de
|
|
9
|
+
* operação. Expor isso como rota daria a alguém dentro do produto o poder de
|
|
10
|
+
* fabricar uma conta de automação — e o valor de uma identidade de privilégio
|
|
11
|
+
* mínimo desaparece se qualquer administrador puder criar outra.
|
|
12
|
+
*
|
|
13
|
+
* ## O que ele garante
|
|
14
|
+
*
|
|
15
|
+
* - `user_type = 'service'` — reconhecível como não-humana em toda consulta;
|
|
16
|
+
* - papel `e2e_automation` e nada além: cinco permissões, tenant único;
|
|
17
|
+
* - idempotente: rodar de novo não duplica nem escala privilégio;
|
|
18
|
+
* - a senha vem do ambiente e **nunca** é impressa, ecoada ou gravada em log.
|
|
19
|
+
*
|
|
20
|
+
* ## Uso
|
|
21
|
+
*
|
|
22
|
+
* OFFICE_MIGRATION_DATABASE_URL=… \
|
|
23
|
+
* E2E_IDENTITY_EMAIL=… E2E_IDENTITY_PASSWORD=… \
|
|
24
|
+
* pnpm --filter @baruk/core provision:e2e --tenant sc
|
|
25
|
+
*
|
|
26
|
+
* Revogar é o caminho inverso e existe na interface: Administração → Usuários →
|
|
27
|
+
* situação "revogado". Rotacionar é rodar de novo com `--rotate` e uma senha
|
|
28
|
+
* nova.
|
|
29
|
+
*/
|
|
30
|
+
const client_js_1 = require("./client.js");
|
|
31
|
+
const context_js_1 = require("./context.js");
|
|
32
|
+
const provisioning_js_1 = require("../tenancy/provisioning.js");
|
|
33
|
+
const catalog_js_1 = require("../rbac/catalog.js");
|
|
34
|
+
const service_js_1 = require("../auth/service.js");
|
|
35
|
+
const ROLE = 'e2e_automation';
|
|
36
|
+
function arg(nome, padrao) {
|
|
37
|
+
const i = process.argv.indexOf(`--${nome}`);
|
|
38
|
+
return i >= 0 ? (process.argv[i + 1] ?? padrao) : padrao;
|
|
39
|
+
}
|
|
40
|
+
async function main() {
|
|
41
|
+
const url = process.env.OFFICE_MIGRATION_DATABASE_URL ?? process.env.DATABASE_URL;
|
|
42
|
+
const email = process.env.E2E_IDENTITY_EMAIL;
|
|
43
|
+
const senha = process.env.E2E_IDENTITY_PASSWORD;
|
|
44
|
+
const tenantCode = arg('tenant', 'sc');
|
|
45
|
+
const rotate = process.argv.includes('--rotate');
|
|
46
|
+
if (!url)
|
|
47
|
+
throw new Error('OFFICE_MIGRATION_DATABASE_URL ausente.');
|
|
48
|
+
if (!email)
|
|
49
|
+
throw new Error('E2E_IDENTITY_EMAIL ausente.');
|
|
50
|
+
if (!senha || senha.length < 24) {
|
|
51
|
+
throw new Error('E2E_IDENTITY_PASSWORD ausente ou curta demais (mínimo 24 caracteres).');
|
|
52
|
+
}
|
|
53
|
+
const db = (0, client_js_1.createDb)(url, { role: 'owner', max: 2 });
|
|
54
|
+
try {
|
|
55
|
+
const [tenant] = await db `
|
|
56
|
+
SELECT id FROM tenant WHERE code = ${tenantCode} AND deleted_at IS NULL
|
|
57
|
+
`;
|
|
58
|
+
if (!tenant)
|
|
59
|
+
throw new Error(`Organização "${tenantCode}" não encontrada.`);
|
|
60
|
+
// `user_type: 'service'` é o que separa esta conta de uma pessoa. O tipo já
|
|
61
|
+
// existe no domínio e na constraint do banco desde a identidade do Core —
|
|
62
|
+
// não é campo inventado para este caso.
|
|
63
|
+
const user = await (0, service_js_1.upsertUserWithPassword)(db, {
|
|
64
|
+
email,
|
|
65
|
+
fullName: 'Automação de teste (E2E)',
|
|
66
|
+
password: senha,
|
|
67
|
+
userType: 'service',
|
|
68
|
+
overwritePassword: rotate,
|
|
69
|
+
});
|
|
70
|
+
await (0, provisioning_js_1.ensureMembership)(db, tenant.id, user.id);
|
|
71
|
+
await (0, provisioning_js_1.assignSystemRole)(db, tenant.id, user.id, ROLE);
|
|
72
|
+
// Conferência de saída: o que foi concedido é exatamente o esperado.
|
|
73
|
+
const permissoes = await (0, context_js_1.withContext)(db, { tenantId: tenant.id, userId: user.id }, async (tx) => {
|
|
74
|
+
const rows = await tx `
|
|
75
|
+
SELECT p.key
|
|
76
|
+
FROM user_role ur
|
|
77
|
+
JOIN role r ON r.id = ur.role_id
|
|
78
|
+
JOIN role_permission rp ON rp.role_id = r.id
|
|
79
|
+
JOIN permission p ON p.id = rp.permission_id
|
|
80
|
+
WHERE ur.user_id = ${user.id} AND ur.deleted_at IS NULL
|
|
81
|
+
ORDER BY p.key
|
|
82
|
+
`;
|
|
83
|
+
return rows.map((r) => r.key);
|
|
84
|
+
});
|
|
85
|
+
// Nada de e-mail, id ou senha na saída: só o que se precisa conferir.
|
|
86
|
+
console.log(`✓ identidade E2E provisionada em "${tenantCode}"`);
|
|
87
|
+
console.log(` tipo: service`);
|
|
88
|
+
console.log(` papel: ${ROLE}`);
|
|
89
|
+
console.log(` permissões (${permissoes.length}): ${permissoes.join(', ')}`);
|
|
90
|
+
console.log(` senha definida nesta execução: ${user.passwordWasSet ? 'sim' : 'não (já existia)'}`);
|
|
91
|
+
// O número vem do catálogo, e não de um literal repetido aqui: duas cópias
|
|
92
|
+
// da mesma régua divergem, e a divergência aparece como um provisionamento
|
|
93
|
+
// que aborta sem motivo — ou, pior, que aceita uma permissão a mais.
|
|
94
|
+
const esperadas = catalog_js_1.SYSTEM_ROLES.find((r) => r.key === ROLE)?.permissions.length ?? 0;
|
|
95
|
+
if (permissoes.length !== esperadas) {
|
|
96
|
+
throw new Error(`Esperava ${esperadas} permissões e encontrei ${permissoes.length}. Abortando: uma identidade de automação com privilégio a mais não deve ficar de pé.`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
await db.end({ timeout: 5 });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Erro de driver de banco costuma trazer a connection string inteira dentro da
|
|
105
|
+
* mensagem. Quem redige tem de ser a ferramenta: confiar em quem chama é
|
|
106
|
+
* confiar que ninguém vai esquecer o filtro uma vez.
|
|
107
|
+
*/
|
|
108
|
+
function semSegredo(err) {
|
|
109
|
+
const bruto = err instanceof Error ? err.message : String(err);
|
|
110
|
+
return bruto.replace(/postgres(?:ql)?:\/\/\S+/gi, '[connection string redigida]');
|
|
111
|
+
}
|
|
112
|
+
main().catch((err) => {
|
|
113
|
+
console.error('✗ provisionamento falhou:', semSegredo(err));
|
|
114
|
+
process.exit(1);
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=provision-e2e-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision-e2e-identity.js","sourceRoot":"","sources":["../../../src/db/provision-e2e-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decideApplicability = decideApplicability;
|
|
4
|
+
exports.generates = generates;
|
|
5
|
+
const conditions_js_1 = require("./conditions.js");
|
|
6
|
+
const semRegra = (reason) => ({
|
|
7
|
+
outcome: 'RULE_NOT_CONFIGURED',
|
|
8
|
+
reason,
|
|
9
|
+
evidence: {
|
|
10
|
+
ruleId: null,
|
|
11
|
+
ruleVersion: null,
|
|
12
|
+
jurisdiction: null,
|
|
13
|
+
missingAttributes: [],
|
|
14
|
+
consideredAttributes: [],
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* A regra alcança este cliente geograficamente?
|
|
19
|
+
*
|
|
20
|
+
* Federal alcança todos. Estadual exige UF igual. Municipal exige UF **e**
|
|
21
|
+
* código IBGE iguais — nome de município não entra na comparação, porque
|
|
22
|
+
* "Goiania" e "Goiânia" são o mesmo lugar e strings diferentes.
|
|
23
|
+
*
|
|
24
|
+
* Cliente sem a informação não é "fora": é desconhecido, e vira
|
|
25
|
+
* `INSUFFICIENT_DATA` em vez de sumir da lista.
|
|
26
|
+
*/
|
|
27
|
+
function jurisdictionMatch(rule, client) {
|
|
28
|
+
if (rule.scope === 'federal')
|
|
29
|
+
return 'match';
|
|
30
|
+
if (client.uf === null)
|
|
31
|
+
return 'unknown';
|
|
32
|
+
if (client.uf !== rule.uf)
|
|
33
|
+
return 'no_match';
|
|
34
|
+
if (rule.scope === 'state')
|
|
35
|
+
return 'match';
|
|
36
|
+
if (client.cityIbge === null)
|
|
37
|
+
return 'unknown';
|
|
38
|
+
return client.cityIbge === rule.cityIbge ? 'match' : 'no_match';
|
|
39
|
+
}
|
|
40
|
+
/** A competência cai dentro da vigência? Compara datas ISO, sem fuso. */
|
|
41
|
+
function withinValidity(rule, referenceDate) {
|
|
42
|
+
if (referenceDate < rule.validFrom)
|
|
43
|
+
return false;
|
|
44
|
+
return rule.validUntil === null || referenceDate <= rule.validUntil;
|
|
45
|
+
}
|
|
46
|
+
function decideApplicability(input) {
|
|
47
|
+
const { rule, profile, clientJurisdiction, referenceDate } = input;
|
|
48
|
+
if (!rule) {
|
|
49
|
+
return semRegra('Não há regra cadastrada para esta obrigação nesta jurisdição.');
|
|
50
|
+
}
|
|
51
|
+
const jurisdiction = rule.jurisdiction;
|
|
52
|
+
const base = { ruleId: rule.id, ruleVersion: rule.version, jurisdiction };
|
|
53
|
+
// ── 1 · Estado da regra, antes de qualquer coisa do cliente ─────────────
|
|
54
|
+
if (rule.status === 'disabled') {
|
|
55
|
+
return {
|
|
56
|
+
outcome: 'RULE_DISABLED',
|
|
57
|
+
reason: 'A regra está desligada.',
|
|
58
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: [] },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (rule.status === 'not_configured') {
|
|
62
|
+
return {
|
|
63
|
+
outcome: 'RULE_NOT_CONFIGURED',
|
|
64
|
+
reason: 'A regra existe como marcador, mas ninguém configurou jurisdição ou vencimento — não há data a aplicar.',
|
|
65
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: [] },
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// ── 2 · Vigência ────────────────────────────────────────────────────────
|
|
69
|
+
if (!withinValidity(rule, referenceDate)) {
|
|
70
|
+
const futura = referenceDate < rule.validFrom;
|
|
71
|
+
return {
|
|
72
|
+
outcome: futura ? 'RULE_NOT_CONFIGURED' : 'RULE_EXPIRED',
|
|
73
|
+
reason: futura
|
|
74
|
+
? `A regra só passa a valer em ${rule.validFrom}; para esta competência não há regra vigente.`
|
|
75
|
+
: `A regra deixou de valer em ${rule.validUntil}.`,
|
|
76
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: [] },
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (rule.status === 'expired') {
|
|
80
|
+
return {
|
|
81
|
+
outcome: 'RULE_EXPIRED',
|
|
82
|
+
reason: 'A regra está marcada como vencida.',
|
|
83
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: [] },
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// ── 3 · Jurisdição ──────────────────────────────────────────────────────
|
|
87
|
+
const geo = jurisdictionMatch(jurisdiction, clientJurisdiction);
|
|
88
|
+
if (geo === 'no_match') {
|
|
89
|
+
return {
|
|
90
|
+
outcome: 'NOT_APPLICABLE',
|
|
91
|
+
reason: jurisdiction.scope === 'state'
|
|
92
|
+
? `Regra de ${jurisdiction.uf}; o cliente está em ${clientJurisdiction.uf}.`
|
|
93
|
+
: 'A regra é de outro município.',
|
|
94
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: [] },
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (geo === 'unknown') {
|
|
98
|
+
const falta = jurisdiction.scope === 'state' ? 'UF' : 'código IBGE do município';
|
|
99
|
+
return {
|
|
100
|
+
outcome: 'INSUFFICIENT_DATA',
|
|
101
|
+
reason: `Falta ${falta} no cadastro do cliente para saber se esta regra o alcança.`,
|
|
102
|
+
evidence: {
|
|
103
|
+
...base,
|
|
104
|
+
missingAttributes: [jurisdiction.scope === 'state' ? 'state_uf' : 'municipality_ibge_code'],
|
|
105
|
+
consideredAttributes: [],
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// ── 4 · Condições declarativas ──────────────────────────────────────────
|
|
110
|
+
let condition;
|
|
111
|
+
try {
|
|
112
|
+
condition = (0, conditions_js_1.parseCondition)(rule.conditions);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
// Regra malformada é defeito do catálogo, não decisão sobre o cliente.
|
|
116
|
+
// Nunca vira "não se aplica": isso esconderia a obrigação.
|
|
117
|
+
return {
|
|
118
|
+
outcome: 'RULE_NOT_CONFIGURED',
|
|
119
|
+
reason: `A condição desta regra está malformada: ${err instanceof Error ? err.message : 'inválida'}.`,
|
|
120
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: [] },
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const considerados = [...(0, conditions_js_1.referencedAttributes)(condition)].sort();
|
|
124
|
+
const faltando = (0, conditions_js_1.missingAttributes)(condition, profile);
|
|
125
|
+
const veredito = (0, conditions_js_1.evaluate)(condition, profile);
|
|
126
|
+
if (veredito === 'unknown') {
|
|
127
|
+
return {
|
|
128
|
+
outcome: 'INSUFFICIENT_DATA',
|
|
129
|
+
reason: faltando.length === 1
|
|
130
|
+
? `Falta informar "${faltando[0]}" no perfil do cliente.`
|
|
131
|
+
: `Faltam informações no perfil do cliente: ${faltando.join(', ')}.`,
|
|
132
|
+
evidence: { ...base, missingAttributes: faltando, consideredAttributes: considerados },
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
if (veredito === false) {
|
|
136
|
+
return {
|
|
137
|
+
outcome: 'NOT_APPLICABLE',
|
|
138
|
+
reason: 'O perfil do cliente não atende às condições desta regra.',
|
|
139
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: considerados },
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// ── 5 · Conferência humana, por último ──────────────────────────────────
|
|
143
|
+
//
|
|
144
|
+
// Fica depois da aplicabilidade de propósito: dizer "pendente de conferência"
|
|
145
|
+
// sobre uma regra que nem se aplica a este cliente mandaria o escritório
|
|
146
|
+
// conferir o que não usaria.
|
|
147
|
+
if (rule.status === 'pending_validation') {
|
|
148
|
+
return {
|
|
149
|
+
outcome: 'RULE_PENDING_VALIDATION',
|
|
150
|
+
reason: 'A regra se aplica, mas ainda não foi conferida por uma pessoa.',
|
|
151
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: considerados },
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
outcome: 'APPLICABLE',
|
|
156
|
+
reason: 'A regra está vigente, conferida, e o perfil do cliente a atende.',
|
|
157
|
+
evidence: { ...base, missingAttributes: [], consideredAttributes: considerados },
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/** Só `APPLICABLE` gera. Todo o resto é espera, ausência ou decisão contrária. */
|
|
161
|
+
function generates(decision) {
|
|
162
|
+
return decision.outcome === 'APPLICABLE';
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=applicability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applicability.js","sourceRoot":"","sources":["../../../src/fiscal/applicability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthorizationConflictError = void 0;
|
|
4
|
+
exports.grantRunAuthorization = grantRunAuthorization;
|
|
5
|
+
exports.consumeRunAuthorization = consumeRunAuthorization;
|
|
6
|
+
exports.revokeRunAuthorization = revokeRunAuthorization;
|
|
7
|
+
exports.listRunAuthorizations = listRunAuthorizations;
|
|
8
|
+
const shared_1 = require("@baruk/shared");
|
|
9
|
+
const competence_js_1 = require("./competence.js");
|
|
10
|
+
class AuthorizationConflictError extends Error {
|
|
11
|
+
detail;
|
|
12
|
+
constructor(detail) {
|
|
13
|
+
super(`autorização recusada: ${detail}`);
|
|
14
|
+
this.detail = detail;
|
|
15
|
+
this.name = 'AuthorizationConflictError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.AuthorizationConflictError = AuthorizationConflictError;
|
|
19
|
+
const DEFAULT_VALIDITY_HOURS = 48;
|
|
20
|
+
const MAX_VALIDITY_HOURS = 168; // sete dias
|
|
21
|
+
/**
|
|
22
|
+
* Emite a autorização.
|
|
23
|
+
*
|
|
24
|
+
* Recusa por CONFLITO quando já existe uma viva para o mesmo par
|
|
25
|
+
* (cliente, fonte, ambiente, competência) — não por capricho de unicidade, mas
|
|
26
|
+
* porque duas autorizações vivas somam duas execuções, e o produto teria
|
|
27
|
+
* prometido uma.
|
|
28
|
+
*
|
|
29
|
+
* A unicidade é do índice parcial da 0060; o `SELECT` prévio existe só para
|
|
30
|
+
* devolver um erro legível em vez de uma violação de constraint.
|
|
31
|
+
*/
|
|
32
|
+
async function grantRunAuthorization(tx, input) {
|
|
33
|
+
const competence = (0, competence_js_1.competenceOf)(input.competenceYear, input.competenceMonth);
|
|
34
|
+
const periodStart = input.periodStart ?? competence.periodStart;
|
|
35
|
+
const periodEnd = input.periodEnd ?? competence.periodEnd;
|
|
36
|
+
(0, competence_js_1.validateWindow)(competence, periodStart, periodEnd);
|
|
37
|
+
const hours = input.validForHours ?? DEFAULT_VALIDITY_HOURS;
|
|
38
|
+
if (!Number.isInteger(hours) || hours < 1 || hours > MAX_VALIDITY_HOURS) {
|
|
39
|
+
throw new AuthorizationConflictError(`validade deve estar entre 1 e ${MAX_VALIDITY_HOURS} horas`);
|
|
40
|
+
}
|
|
41
|
+
const live = await tx `
|
|
42
|
+
SELECT id FROM fiscal_run_authorization
|
|
43
|
+
WHERE client_id = ${input.clientId}
|
|
44
|
+
AND source = ${input.source}
|
|
45
|
+
AND environment = ${input.environment}
|
|
46
|
+
AND competence_year = ${competence.year}
|
|
47
|
+
AND competence_month = ${competence.month}
|
|
48
|
+
AND consumed_at IS NULL AND revoked_at IS NULL
|
|
49
|
+
LIMIT 1
|
|
50
|
+
`;
|
|
51
|
+
if (live[0]) {
|
|
52
|
+
throw new AuthorizationConflictError('já existe uma autorização viva para este cliente, fonte, ambiente e competência');
|
|
53
|
+
}
|
|
54
|
+
const rows = await tx `
|
|
55
|
+
INSERT INTO fiscal_run_authorization (
|
|
56
|
+
id, tenant_id, client_id, document_type, environment, source, credential_kind,
|
|
57
|
+
operation, competence_year, competence_month, period_start, period_end,
|
|
58
|
+
max_runs, runs_consumed, authorized_by, responsible_name, expires_at,
|
|
59
|
+
first_contact, trigger_kind, credential_fingerprint
|
|
60
|
+
) VALUES (
|
|
61
|
+
${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid, ${input.clientId},
|
|
62
|
+
${input.documentType}, ${input.environment}, ${input.source},
|
|
63
|
+
${input.credentialKind ?? 'certificate_a1'},
|
|
64
|
+
'READ_ONLY', ${competence.year}, ${competence.month}, ${periodStart}, ${periodEnd},
|
|
65
|
+
1, 0, ${input.authorizedBy}, ${input.responsibleName ?? null},
|
|
66
|
+
now() + (${hours}::int * interval '1 hour'),
|
|
67
|
+
${input.firstContact ?? false}, ${input.triggerKind ?? 'manual'},
|
|
68
|
+
${input.credentialFingerprint ?? null}
|
|
69
|
+
)
|
|
70
|
+
RETURNING ${tx.unsafe(AUTHORIZATION_COLUMNS)}
|
|
71
|
+
`;
|
|
72
|
+
return mapAuthorization(rows[0]);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Consome a autorização — e é AQUI que a unicidade da execução acontece.
|
|
76
|
+
*
|
|
77
|
+
* Um `SELECT` seguido de `UPDATE` deixaria a janela em que dois processos leem
|
|
78
|
+
* "viva" e ambos executam. O `WHERE consumed_at IS NULL` dentro do próprio
|
|
79
|
+
* `UPDATE` fecha essa janela no banco: o segundo afeta zero linhas e recebe
|
|
80
|
+
* `null`, que é o sinal de "não execute".
|
|
81
|
+
*
|
|
82
|
+
* Devolve `null` — e não lança — para todo desfecho de recusa. Quem chama é o
|
|
83
|
+
* orquestrador no meio de uma carteira, e uma exceção aqui derrubaria o lote por
|
|
84
|
+
* causa de um portão fechado, que é estado normal.
|
|
85
|
+
*/
|
|
86
|
+
async function consumeRunAuthorization(tx, input) {
|
|
87
|
+
const rows = await tx `
|
|
88
|
+
UPDATE fiscal_run_authorization SET
|
|
89
|
+
runs_consumed = runs_consumed + 1,
|
|
90
|
+
consumed_at = now(),
|
|
91
|
+
consumed_by_run_id = ${input.runId},
|
|
92
|
+
updated_at = now()
|
|
93
|
+
WHERE id = ${input.authorizationId}
|
|
94
|
+
AND consumed_at IS NULL
|
|
95
|
+
AND revoked_at IS NULL
|
|
96
|
+
AND expires_at > now()
|
|
97
|
+
AND runs_consumed < max_runs
|
|
98
|
+
RETURNING ${tx.unsafe(AUTHORIZATION_COLUMNS)}
|
|
99
|
+
`;
|
|
100
|
+
return rows[0] ? mapAuthorization(rows[0]) : null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Cancela antes da execução.
|
|
104
|
+
*
|
|
105
|
+
* O mecanismo de abortar (C1.34) não precisa de tabela nova: revogar a
|
|
106
|
+
* autorização é o cancelamento, porque sem ela não há execução real. Revogar uma
|
|
107
|
+
* já consumida é permitido e não desfaz nada — só registra a decisão, para o
|
|
108
|
+
* caso em que alguém descobre depois que não deveria ter autorizado.
|
|
109
|
+
*/
|
|
110
|
+
async function revokeRunAuthorization(tx, input) {
|
|
111
|
+
const rows = await tx `
|
|
112
|
+
UPDATE fiscal_run_authorization SET
|
|
113
|
+
revoked_at = now(), revoked_by = ${input.revokedBy},
|
|
114
|
+
revoke_reason = ${input.reason}, updated_at = now()
|
|
115
|
+
WHERE id = ${input.authorizationId} AND revoked_at IS NULL
|
|
116
|
+
RETURNING id
|
|
117
|
+
`;
|
|
118
|
+
return rows.count > 0;
|
|
119
|
+
}
|
|
120
|
+
/** As autorizações de um cliente, mais recentes primeiro. Sem segredo por construção. */
|
|
121
|
+
async function listRunAuthorizations(tx, clientId) {
|
|
122
|
+
const rows = await tx `
|
|
123
|
+
SELECT ${tx.unsafe(AUTHORIZATION_COLUMNS)}
|
|
124
|
+
FROM fiscal_run_authorization
|
|
125
|
+
WHERE client_id = ${clientId}
|
|
126
|
+
ORDER BY authorized_at DESC
|
|
127
|
+
LIMIT 50
|
|
128
|
+
`;
|
|
129
|
+
return rows.map(mapAuthorization);
|
|
130
|
+
}
|
|
131
|
+
const AUTHORIZATION_COLUMNS = `
|
|
132
|
+
id, client_id, document_type, environment, source, credential_kind, operation,
|
|
133
|
+
competence_year, competence_month, period_start, period_end, max_runs, runs_consumed,
|
|
134
|
+
authorized_by, authorized_at, responsible_name, expires_at, consumed_at,
|
|
135
|
+
revoked_at, revoke_reason, first_contact, trigger_kind, credential_fingerprint
|
|
136
|
+
`;
|
|
137
|
+
function mapAuthorization(r) {
|
|
138
|
+
return {
|
|
139
|
+
id: r.id,
|
|
140
|
+
clientId: r.client_id,
|
|
141
|
+
documentType: r.document_type,
|
|
142
|
+
environment: r.environment,
|
|
143
|
+
source: r.source,
|
|
144
|
+
credentialKind: r.credential_kind,
|
|
145
|
+
operation: 'READ_ONLY',
|
|
146
|
+
competence: {
|
|
147
|
+
year: r.competence_year,
|
|
148
|
+
month: r.competence_month,
|
|
149
|
+
label: `${r.competence_year}-${String(r.competence_month).padStart(2, '0')}`,
|
|
150
|
+
periodStart: isoDate(r.period_start),
|
|
151
|
+
periodEnd: isoDate(r.period_end),
|
|
152
|
+
},
|
|
153
|
+
maxRuns: r.max_runs,
|
|
154
|
+
runsConsumed: r.runs_consumed,
|
|
155
|
+
authorizedBy: r.authorized_by,
|
|
156
|
+
authorizedAt: r.authorized_at.toISOString(),
|
|
157
|
+
responsibleName: r.responsible_name,
|
|
158
|
+
firstContact: r.first_contact ?? false,
|
|
159
|
+
triggerKind: r.trigger_kind ?? 'manual',
|
|
160
|
+
credentialFingerprint: r.credential_fingerprint ?? null,
|
|
161
|
+
expiresAt: r.expires_at.toISOString(),
|
|
162
|
+
consumedAt: r.consumed_at?.toISOString() ?? null,
|
|
163
|
+
revokedAt: r.revoked_at?.toISOString() ?? null,
|
|
164
|
+
revokeReason: r.revoke_reason,
|
|
165
|
+
state: stateOf(r),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* A ordem das perguntas importa: revogada vence consumida, que vence vencida.
|
|
170
|
+
*
|
|
171
|
+
* Uma autorização consumida e depois revogada deve aparecer como revogada — é a
|
|
172
|
+
* decisão mais recente, e é a que alguém precisa ver ao investigar.
|
|
173
|
+
*/
|
|
174
|
+
function stateOf(r) {
|
|
175
|
+
if (r.revoked_at)
|
|
176
|
+
return 'revoked';
|
|
177
|
+
if (r.consumed_at)
|
|
178
|
+
return 'consumed';
|
|
179
|
+
if (r.expires_at.getTime() <= Date.now())
|
|
180
|
+
return 'expired';
|
|
181
|
+
return 'live';
|
|
182
|
+
}
|
|
183
|
+
function isoDate(d) {
|
|
184
|
+
return d.toISOString().slice(0, 10);
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=authorization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../../../src/fiscal/collection/authorization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A janela da coleta — dita por extenso, nunca deduzida.
|
|
4
|
+
*
|
|
5
|
+
* ## O relato que originou este módulo
|
|
6
|
+
*
|
|
7
|
+
* A equipe do escritório chama de "dar baixa nas notas" o trabalho de, na virada
|
|
8
|
+
* do mês, entrar nos portais e recolher os documentos do período. Ao descrever
|
|
9
|
+
* esse trabalho, o relato humano trouxe exemplos de datas que não fechavam entre
|
|
10
|
+
* si — o que é absolutamente normal em conversa, e absolutamente perigoso como
|
|
11
|
+
* fonte de regra.
|
|
12
|
+
*
|
|
13
|
+
* A tentação é transformar "mês anterior" em constante. O erro que isso produz é
|
|
14
|
+
* silencioso: uma coleta rodada em 01/11 sobre uma janela que ninguém confirmou
|
|
15
|
+
* traz documentos de um período que não é o que a pessoa tinha em mente, e a
|
|
16
|
+
* ausência do que faltava só aparece no fechamento.
|
|
17
|
+
*
|
|
18
|
+
* Aqui a competência é um par ano/mês, e o período é um par de DATAS derivado
|
|
19
|
+
* dele. A sugestão padrão existe — mês calendário anterior —, mas ela é uma
|
|
20
|
+
* SUGESTÃO exibida, não um valor implícito: a tela mostra "serão consultados
|
|
21
|
+
* documentos de DD/MM/AAAA a DD/MM/AAAA" antes de qualquer execução, e as duas
|
|
22
|
+
* datas são gravadas na autorização.
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.DEFAULT_COMPETENCE_POLICY = exports.InvalidCompetenceError = void 0;
|
|
26
|
+
exports.competenceOf = competenceOf;
|
|
27
|
+
exports.suggestCompetenceFor = suggestCompetenceFor;
|
|
28
|
+
exports.validateWindow = validateWindow;
|
|
29
|
+
class InvalidCompetenceError extends Error {
|
|
30
|
+
detail;
|
|
31
|
+
constructor(detail) {
|
|
32
|
+
super(`competência inválida: ${detail}`);
|
|
33
|
+
this.detail = detail;
|
|
34
|
+
this.name = 'InvalidCompetenceError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.InvalidCompetenceError = InvalidCompetenceError;
|
|
38
|
+
/** A política padrão desta fase, nomeada para poder ser citada e mudada. */
|
|
39
|
+
exports.DEFAULT_COMPETENCE_POLICY = 'PREVIOUS_CALENDAR_MONTH';
|
|
40
|
+
/**
|
|
41
|
+
* A competência de um par ano/mês.
|
|
42
|
+
*
|
|
43
|
+
* O último dia sai do calendário: `Date.UTC(ano, mês, 0)` — com o mês em base 1
|
|
44
|
+
* — devolve o último dia daquele mês. Fevereiro bissexto sai de graça, que é o
|
|
45
|
+
* ponto de não escrever `30`.
|
|
46
|
+
*/
|
|
47
|
+
function competenceOf(year, month) {
|
|
48
|
+
if (!Number.isInteger(year) || year < 2000 || year > 2100) {
|
|
49
|
+
throw new InvalidCompetenceError('ano fora de 2000–2100');
|
|
50
|
+
}
|
|
51
|
+
if (!Number.isInteger(month) || month < 1 || month > 12) {
|
|
52
|
+
throw new InvalidCompetenceError('mês fora de 1–12');
|
|
53
|
+
}
|
|
54
|
+
const mm = String(month).padStart(2, '0');
|
|
55
|
+
const lastDay = new Date(Date.UTC(year, month, 0)).getUTCDate();
|
|
56
|
+
return {
|
|
57
|
+
year,
|
|
58
|
+
month,
|
|
59
|
+
label: `${year}-${mm}`,
|
|
60
|
+
periodStart: `${year}-${mm}-01`,
|
|
61
|
+
periodEnd: `${year}-${mm}-${String(lastDay).padStart(2, '0')}`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A SUGESTÃO padrão para uma execução feita em `reference`: o mês calendário
|
|
66
|
+
* anterior.
|
|
67
|
+
*
|
|
68
|
+
* Chama-se `suggest` e não `default` de propósito. Uma função chamada
|
|
69
|
+
* `defaultCompetence()` acaba sendo usada como valor efetivo por quem não leu;
|
|
70
|
+
* `suggestCompetenceFor()` obriga quem chama a decidir o que fazer com a
|
|
71
|
+
* sugestão — que é exibi-la ao lado das duas datas.
|
|
72
|
+
*/
|
|
73
|
+
function suggestCompetenceFor(reference) {
|
|
74
|
+
const year = reference.getUTCFullYear();
|
|
75
|
+
const month = reference.getUTCMonth() + 1; // base 1
|
|
76
|
+
return month === 1 ? competenceOf(year - 1, 12) : competenceOf(year, month - 1);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Confere uma janela informada à mão contra a competência declarada.
|
|
80
|
+
*
|
|
81
|
+
* Permitir janela manual e conferi-la não são opostos: o operador pode querer um
|
|
82
|
+
* recorte menor dentro do mês — o que é legítimo —, mas uma janela que atravessa
|
|
83
|
+
* a competência declarada significa que um dos dois campos está errado, e gravar
|
|
84
|
+
* os dois deixaria a autorização dizendo duas coisas.
|
|
85
|
+
*/
|
|
86
|
+
function validateWindow(competence, periodStart, periodEnd) {
|
|
87
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(periodStart) || !/^\d{4}-\d{2}-\d{2}$/.test(periodEnd)) {
|
|
88
|
+
throw new InvalidCompetenceError('datas devem estar em YYYY-MM-DD');
|
|
89
|
+
}
|
|
90
|
+
if (periodEnd < periodStart) {
|
|
91
|
+
throw new InvalidCompetenceError('data final anterior à inicial');
|
|
92
|
+
}
|
|
93
|
+
if (periodStart < competence.periodStart || periodEnd > competence.periodEnd) {
|
|
94
|
+
throw new InvalidCompetenceError(`janela ${periodStart}..${periodEnd} sai da competência ${competence.label}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=competence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"competence.js","sourceRoot":"","sources":["../../../../src/fiscal/collection/competence.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;AA8BH,oCAgBC;AAWD,oDAIC;AAUD,wCAgBC;AA1ED,MAAa,sBAAuB,SAAQ,KAAK;IAC1B;IAArB,YAAqB,MAAc;QACjC,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;QADtB,WAAM,GAAN,MAAM,CAAQ;QAEjC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AALD,wDAKC;AAED,4EAA4E;AAC/D,QAAA,yBAAyB,GAAG,yBAAkC,CAAC;AAE5E;;;;;;GAMG;AACH,SAAgB,YAAY,CAAC,IAAY,EAAE,KAAa;IACtD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;QAC1D,MAAM,IAAI,sBAAsB,CAAC,uBAAuB,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,sBAAsB,CAAC,kBAAkB,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAChE,OAAO;QACL,IAAI;QACJ,KAAK;QACL,KAAK,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE;QACtB,WAAW,EAAE,GAAG,IAAI,IAAI,EAAE,KAAK;QAC/B,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;KAC/D,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAAC,SAAe;IAClD,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS;IACpD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAC5B,UAA4B,EAC5B,WAAmB,EACnB,SAAiB;IAEjB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,sBAAsB,CAAC,iCAAiC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,SAAS,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,IAAI,sBAAsB,CAAC,+BAA+B,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;QAC7E,MAAM,IAAI,sBAAsB,CAC9B,UAAU,WAAW,KAAK,SAAS,uBAAuB,UAAU,CAAC,KAAK,EAAE,CAC7E,CAAC;IACJ,CAAC;AACH,CAAC"}
|