@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,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calendário de dias úteis brasileiro.
|
|
3
|
+
*
|
|
4
|
+
* Fica no Core, e não numa vertical, pela mesma razão que `client.document_number`
|
|
5
|
+
* fica: CPF/CNPJ e feriado nacional são do PAÍS, não do segmento. Um produto
|
|
6
|
+
* odontológico ou industrial que opere no Brasil precisa igualmente saber que
|
|
7
|
+
* 12 de outubro não é dia útil. O que é do segmento — quais obrigações existem e
|
|
8
|
+
* quando vencem — mora em `@baruk/contabil`.
|
|
9
|
+
*
|
|
10
|
+
* Escopo deliberado: feriados NACIONAIS. Feriado estadual e municipal deslocam
|
|
11
|
+
* prazos reais (o ISS de São Paulo não vence no aniversário da cidade), mas
|
|
12
|
+
* dependem do município de cada cliente e não têm fonte única. Tratá-los aqui
|
|
13
|
+
* daria a impressão de cobertura que o dado não sustenta — o escritório ajusta a
|
|
14
|
+
* data na instância quando isso acontecer.
|
|
15
|
+
*/
|
|
16
|
+
/** Domingo = 0 … sábado = 6. */
|
|
17
|
+
function weekday(iso) {
|
|
18
|
+
return new Date(`${iso}T12:00:00Z`).getUTCDay();
|
|
19
|
+
}
|
|
20
|
+
function toIso(y, m, d) {
|
|
21
|
+
return `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`;
|
|
22
|
+
}
|
|
23
|
+
function addDays(iso, delta) {
|
|
24
|
+
const d = new Date(`${iso}T12:00:00Z`);
|
|
25
|
+
d.setUTCDate(d.getUTCDate() + delta);
|
|
26
|
+
return d.toISOString().slice(0, 10);
|
|
27
|
+
}
|
|
28
|
+
/** Último dia do mês (trata ano bissexto). */
|
|
29
|
+
export function lastDayOfMonth(year, month) {
|
|
30
|
+
return new Date(Date.UTC(year, month, 0)).getUTCDate();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Domingo de Páscoa pelo algoritmo de Meeus/Jones/Butcher (calendário gregoriano).
|
|
34
|
+
* Carnaval, Sexta-Feira Santa e Corpus Christi derivam dele.
|
|
35
|
+
*/
|
|
36
|
+
export function easterSunday(year) {
|
|
37
|
+
const a = year % 19;
|
|
38
|
+
const b = Math.floor(year / 100);
|
|
39
|
+
const c = year % 100;
|
|
40
|
+
const d = Math.floor(b / 4);
|
|
41
|
+
const e = b % 4;
|
|
42
|
+
const f = Math.floor((b + 8) / 25);
|
|
43
|
+
const g = Math.floor((b - f + 1) / 3);
|
|
44
|
+
const h = (19 * a + b - d - g + 15) % 30;
|
|
45
|
+
const i = Math.floor(c / 4);
|
|
46
|
+
const k = c % 4;
|
|
47
|
+
const l = (32 + 2 * e + 2 * i - h - k) % 7;
|
|
48
|
+
const m = Math.floor((a + 11 * h + 22 * l) / 451);
|
|
49
|
+
const month = Math.floor((h + l - 7 * m + 114) / 31);
|
|
50
|
+
const day = ((h + l - 7 * m + 114) % 31) + 1;
|
|
51
|
+
return toIso(year, month, day);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Feriados nacionais de um ano, em ISO.
|
|
55
|
+
*
|
|
56
|
+
* Inclui Carnaval (segunda e terça) e Corpus Christi, que não são feriados civis
|
|
57
|
+
* nacionais mas são feriados BANCÁRIOS — e prazo de recolhimento se mede em dia
|
|
58
|
+
* bancário, não em dia civil. Quarta-feira de Cinzas é meio expediente e conta
|
|
59
|
+
* como dia útil.
|
|
60
|
+
*
|
|
61
|
+
* 20 de novembro (Consciência Negra) entrou como feriado nacional pela Lei
|
|
62
|
+
* 14.759/2023, valendo a partir de 2024.
|
|
63
|
+
*/
|
|
64
|
+
export function nationalHolidays(year) {
|
|
65
|
+
const easter = easterSunday(year);
|
|
66
|
+
const fixed = [
|
|
67
|
+
toIso(year, 1, 1), // Confraternização Universal
|
|
68
|
+
toIso(year, 4, 21), // Tiradentes
|
|
69
|
+
toIso(year, 5, 1), // Dia do Trabalho
|
|
70
|
+
toIso(year, 9, 7), // Independência
|
|
71
|
+
toIso(year, 10, 12), // Nossa Senhora Aparecida
|
|
72
|
+
toIso(year, 11, 2), // Finados
|
|
73
|
+
toIso(year, 11, 15), // Proclamação da República
|
|
74
|
+
toIso(year, 12, 25), // Natal
|
|
75
|
+
];
|
|
76
|
+
if (year >= 2024)
|
|
77
|
+
fixed.push(toIso(year, 11, 20)); // Consciência Negra
|
|
78
|
+
const movable = [
|
|
79
|
+
addDays(easter, -48), // Carnaval (segunda)
|
|
80
|
+
addDays(easter, -47), // Carnaval (terça)
|
|
81
|
+
addDays(easter, -2), // Sexta-Feira Santa
|
|
82
|
+
addDays(easter, 60), // Corpus Christi
|
|
83
|
+
];
|
|
84
|
+
return [...fixed, ...movable].sort();
|
|
85
|
+
}
|
|
86
|
+
const holidayCache = new Map();
|
|
87
|
+
function holidaySet(year) {
|
|
88
|
+
let s = holidayCache.get(year);
|
|
89
|
+
if (!s) {
|
|
90
|
+
s = new Set(nationalHolidays(year));
|
|
91
|
+
holidayCache.set(year, s);
|
|
92
|
+
}
|
|
93
|
+
return s;
|
|
94
|
+
}
|
|
95
|
+
/** Dia útil = não é sábado, domingo nem feriado nacional/bancário. */
|
|
96
|
+
export function isBusinessDay(iso) {
|
|
97
|
+
const wd = weekday(iso);
|
|
98
|
+
if (wd === 0 || wd === 6)
|
|
99
|
+
return false;
|
|
100
|
+
return !holidaySet(Number(iso.slice(0, 4))).has(iso);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Move a data para um dia útil.
|
|
104
|
+
*
|
|
105
|
+
* `previous` é o padrão do vencimento fiscal brasileiro: quando o prazo cai em
|
|
106
|
+
* dia sem expediente bancário, ANTECIPA-SE. Postergar seria o erro caro — o
|
|
107
|
+
* contribuinte pagaria com multa por confiar no sistema.
|
|
108
|
+
*/
|
|
109
|
+
export function adjustToBusinessDay(iso, direction = 'previous') {
|
|
110
|
+
if (direction === 'none')
|
|
111
|
+
return iso;
|
|
112
|
+
const step = direction === 'previous' ? -1 : 1;
|
|
113
|
+
let cur = iso;
|
|
114
|
+
// 15 passos cobrem o maior bloco possível (fim de semana + emendas).
|
|
115
|
+
for (let i = 0; i < 15; i++) {
|
|
116
|
+
if (isBusinessDay(cur))
|
|
117
|
+
return cur;
|
|
118
|
+
cur = addDays(cur, step);
|
|
119
|
+
}
|
|
120
|
+
return cur;
|
|
121
|
+
}
|
|
122
|
+
/** Último dia útil do mês. */
|
|
123
|
+
export function lastBusinessDayOfMonth(year, month) {
|
|
124
|
+
return adjustToBusinessDay(toIso(year, month, lastDayOfMonth(year, month)), 'previous');
|
|
125
|
+
}
|
|
126
|
+
/** N-ésimo dia útil do mês (1 = primeiro). Devolve `null` se o mês não tiver tantos. */
|
|
127
|
+
export function nthBusinessDayOfMonth(year, month, n) {
|
|
128
|
+
const last = lastDayOfMonth(year, month);
|
|
129
|
+
let count = 0;
|
|
130
|
+
for (let d = 1; d <= last; d++) {
|
|
131
|
+
const iso = toIso(year, month, d);
|
|
132
|
+
if (isBusinessDay(iso)) {
|
|
133
|
+
count += 1;
|
|
134
|
+
if (count === n)
|
|
135
|
+
return iso;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
/** Soma meses a um par (ano, mês) 1-based, normalizando a virada de ano. */
|
|
141
|
+
export function shiftMonth(year, month, months) {
|
|
142
|
+
const zero = year * 12 + (month - 1) + months;
|
|
143
|
+
return [Math.floor(zero / 12), (zero % 12) + 1];
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=business-days.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"business-days.js","sourceRoot":"","sources":["../../src/competence/business-days.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { Tx } from '../db/client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Conferência humana do catálogo fiscal — por escritório.
|
|
4
|
+
*
|
|
5
|
+
* ## O problema que isto resolve
|
|
6
|
+
*
|
|
7
|
+
* O catálogo foi semeado tecnicamente e nunca foi confrontado com os serviços
|
|
8
|
+
* que o escritório de fato presta. Um catálogo semeado que ninguém conferiu é
|
|
9
|
+
* pior que catálogo nenhum: o escritório passa a confiar numa lista, e descobre
|
|
10
|
+
* o erro no dia do vencimento.
|
|
11
|
+
*
|
|
12
|
+
* O estado padrão é `pending_validation`, e esse é o ponto inteiro. Enquanto
|
|
13
|
+
* ninguém conferiu, o produto tem de DIZER que ninguém conferiu, em vez de
|
|
14
|
+
* deixar o seed passar por verdade operacional.
|
|
15
|
+
*
|
|
16
|
+
* ## Por que tabela própria, e não coluna em `recurring_item_type`
|
|
17
|
+
*
|
|
18
|
+
* As linhas de sistema do catálogo (`tenant_id IS NULL`) são COMPARTILHADAS
|
|
19
|
+
* entre todos os escritórios. Uma coluna `validation_status` nelas faria um
|
|
20
|
+
* escritório carimbar a validação do outro — exatamente a classe de vazamento
|
|
21
|
+
* que a Fase 4 fechou em `role`. O estado de conferência é por tenant, então
|
|
22
|
+
* mora numa tabela por tenant.
|
|
23
|
+
*
|
|
24
|
+
* ## `depends_on_locality`
|
|
25
|
+
*
|
|
26
|
+
* Três itens do catálogo são de esfera estadual ou municipal, e o prazo deles
|
|
27
|
+
* varia por UF e por município. Este campo não é um prazo: é a **ausência**
|
|
28
|
+
* de prazo, declarada. Inventar uma data seria pior que não ter nenhuma,
|
|
29
|
+
* porque o alerta dispararia no dia errado e alguém confiaria nele.
|
|
30
|
+
*/
|
|
31
|
+
export type CatalogValidationStatus =
|
|
32
|
+
/** Conferido por uma pessoa contra os serviços prestados. */
|
|
33
|
+
'validated'
|
|
34
|
+
/** Padrão: veio do seed e ninguém olhou ainda. */
|
|
35
|
+
| 'pending_validation'
|
|
36
|
+
/** O escritório não atende esta obrigação — não deve aparecer na geração. */
|
|
37
|
+
| 'not_applicable'
|
|
38
|
+
/** Desligada deliberadamente, com motivo. */
|
|
39
|
+
| 'disabled';
|
|
40
|
+
export interface CatalogValidationRecord {
|
|
41
|
+
itemTypeId: string;
|
|
42
|
+
status: CatalogValidationStatus;
|
|
43
|
+
dependsOnLocality: boolean;
|
|
44
|
+
note: string | null;
|
|
45
|
+
validatedBy: string | null;
|
|
46
|
+
validatedAt: string | null;
|
|
47
|
+
}
|
|
48
|
+
export declare function listCatalogValidations(tx: Tx): Promise<CatalogValidationRecord[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Grava a decisão do escritório sobre um item.
|
|
51
|
+
*
|
|
52
|
+
* `validated_at` só é preenchido quando o status é `validated` — o CHECK da
|
|
53
|
+
* tabela recusa a combinação inversa, então a data não pode mentir sobre ter
|
|
54
|
+
* havido conferência.
|
|
55
|
+
*/
|
|
56
|
+
export declare function setCatalogValidation(tx: Tx, input: {
|
|
57
|
+
itemTypeId: string;
|
|
58
|
+
status: CatalogValidationStatus;
|
|
59
|
+
note?: string | null;
|
|
60
|
+
dependsOnLocality?: boolean;
|
|
61
|
+
actorId?: string | null;
|
|
62
|
+
}): Promise<CatalogValidationRecord>;
|
|
63
|
+
/**
|
|
64
|
+
* Semeia o estado inicial da conferência para o escritório.
|
|
65
|
+
*
|
|
66
|
+
* Idempotente e conservador: só cria as linhas que faltam, e **nunca** rebaixa
|
|
67
|
+
* um item já conferido. Rodar de novo depois de uma conferência não a apaga.
|
|
68
|
+
*
|
|
69
|
+
* Itens de esfera estadual ou municipal nascem marcados como dependentes de
|
|
70
|
+
* localidade, porque é isso que eles são.
|
|
71
|
+
*/
|
|
72
|
+
export declare function seedCatalogValidation(tx: Tx): Promise<{
|
|
73
|
+
created: number;
|
|
74
|
+
}>;
|
|
75
|
+
export interface CatalogValidationSummary {
|
|
76
|
+
total: number;
|
|
77
|
+
validated: number;
|
|
78
|
+
pending: number;
|
|
79
|
+
notApplicable: number;
|
|
80
|
+
disabled: number;
|
|
81
|
+
dependsOnLocality: number;
|
|
82
|
+
/** O gate que o go-live consulta: nada pendente e ao menos um item conferido. */
|
|
83
|
+
humanValidationComplete: boolean;
|
|
84
|
+
}
|
|
85
|
+
export declare function catalogValidationSummary(tx: Tx): Promise<CatalogValidationSummary>;
|
|
86
|
+
//# sourceMappingURL=catalog-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-validation.d.ts","sourceRoot":"","sources":["../../src/competence/catalog-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAG1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,MAAM,uBAAuB;AACjC,6DAA6D;AAC3D,WAAW;AACb,kDAAkD;GAChD,oBAAoB;AACtB,6EAA6E;GAC3E,gBAAgB;AAClB,6CAA6C;GAC3C,UAAU,CAAC;AAEf,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,uBAAuB,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAoBD,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAMvF;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,uBAAuB,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,GACA,OAAO,CAAC,uBAAuB,CAAC,CAsBlC;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBhF;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAED,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA+BxF"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { uuidv7 } from '@baruk/shared';
|
|
2
|
+
const map = (r) => ({
|
|
3
|
+
itemTypeId: r.item_type_id,
|
|
4
|
+
status: r.status,
|
|
5
|
+
dependsOnLocality: r.depends_on_locality,
|
|
6
|
+
note: r.note,
|
|
7
|
+
validatedBy: r.validated_by,
|
|
8
|
+
validatedAt: r.validated_at?.toISOString() ?? null,
|
|
9
|
+
});
|
|
10
|
+
export async function listCatalogValidations(tx) {
|
|
11
|
+
const rows = await tx `
|
|
12
|
+
SELECT item_type_id, status, depends_on_locality, note, validated_by, validated_at
|
|
13
|
+
FROM recurring_item_type_validation
|
|
14
|
+
`;
|
|
15
|
+
return rows.map(map);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Grava a decisão do escritório sobre um item.
|
|
19
|
+
*
|
|
20
|
+
* `validated_at` só é preenchido quando o status é `validated` — o CHECK da
|
|
21
|
+
* tabela recusa a combinação inversa, então a data não pode mentir sobre ter
|
|
22
|
+
* havido conferência.
|
|
23
|
+
*/
|
|
24
|
+
export async function setCatalogValidation(tx, input) {
|
|
25
|
+
const validado = input.status === 'validated';
|
|
26
|
+
const rows = await tx `
|
|
27
|
+
INSERT INTO recurring_item_type_validation
|
|
28
|
+
(id, tenant_id, item_type_id, status, depends_on_locality, note, validated_by, validated_at)
|
|
29
|
+
VALUES (
|
|
30
|
+
${uuidv7()}, current_setting('app.current_tenant')::uuid, ${input.itemTypeId},
|
|
31
|
+
${input.status}, ${input.dependsOnLocality ?? false}, ${input.note ?? null},
|
|
32
|
+
${validado ? (input.actorId ?? null) : null},
|
|
33
|
+
${validado ? new Date() : null}
|
|
34
|
+
)
|
|
35
|
+
ON CONFLICT (tenant_id, item_type_id) DO UPDATE SET
|
|
36
|
+
status = EXCLUDED.status,
|
|
37
|
+
depends_on_locality = EXCLUDED.depends_on_locality,
|
|
38
|
+
note = EXCLUDED.note,
|
|
39
|
+
validated_by = EXCLUDED.validated_by,
|
|
40
|
+
validated_at = EXCLUDED.validated_at,
|
|
41
|
+
updated_at = now()
|
|
42
|
+
RETURNING item_type_id, status, depends_on_locality, note, validated_by, validated_at
|
|
43
|
+
`;
|
|
44
|
+
if (validado)
|
|
45
|
+
await adotarRegras(tx, input.itemTypeId, input.actorId ?? null);
|
|
46
|
+
return map(rows[0]);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Semeia o estado inicial da conferência para o escritório.
|
|
50
|
+
*
|
|
51
|
+
* Idempotente e conservador: só cria as linhas que faltam, e **nunca** rebaixa
|
|
52
|
+
* um item já conferido. Rodar de novo depois de uma conferência não a apaga.
|
|
53
|
+
*
|
|
54
|
+
* Itens de esfera estadual ou municipal nascem marcados como dependentes de
|
|
55
|
+
* localidade, porque é isso que eles são.
|
|
56
|
+
*/
|
|
57
|
+
export async function seedCatalogValidation(tx) {
|
|
58
|
+
const rows = await tx `
|
|
59
|
+
WITH visiveis AS (
|
|
60
|
+
SELECT DISTINCT ON (key) id, sphere
|
|
61
|
+
FROM recurring_item_type
|
|
62
|
+
WHERE deleted_at IS NULL AND active = true
|
|
63
|
+
ORDER BY key, tenant_id NULLS LAST
|
|
64
|
+
),
|
|
65
|
+
inseridos AS (
|
|
66
|
+
INSERT INTO recurring_item_type_validation
|
|
67
|
+
(id, tenant_id, item_type_id, status, depends_on_locality)
|
|
68
|
+
SELECT gen_random_uuid(), current_setting('app.current_tenant')::uuid, v.id,
|
|
69
|
+
'pending_validation', (v.sphere IN ('estadual', 'municipal'))
|
|
70
|
+
FROM visiveis v
|
|
71
|
+
ON CONFLICT (tenant_id, item_type_id) DO NOTHING
|
|
72
|
+
RETURNING 1
|
|
73
|
+
)
|
|
74
|
+
SELECT count(*)::int AS n FROM inseridos
|
|
75
|
+
`;
|
|
76
|
+
return { created: rows[0]?.n ?? 0 };
|
|
77
|
+
}
|
|
78
|
+
export async function catalogValidationSummary(tx) {
|
|
79
|
+
const [r] = await tx `
|
|
80
|
+
SELECT count(*)::int AS total,
|
|
81
|
+
count(*) FILTER (WHERE status = 'validated')::int AS validated,
|
|
82
|
+
count(*) FILTER (WHERE status = 'pending_validation')::int AS pending,
|
|
83
|
+
count(*) FILTER (WHERE status = 'not_applicable')::int AS not_applicable,
|
|
84
|
+
count(*) FILTER (WHERE status = 'disabled')::int AS disabled,
|
|
85
|
+
count(*) FILTER (WHERE depends_on_locality)::int AS locality
|
|
86
|
+
FROM recurring_item_type_validation
|
|
87
|
+
`;
|
|
88
|
+
const total = r?.total ?? 0;
|
|
89
|
+
const validated = r?.validated ?? 0;
|
|
90
|
+
const pending = r?.pending ?? 0;
|
|
91
|
+
return {
|
|
92
|
+
total,
|
|
93
|
+
validated,
|
|
94
|
+
pending,
|
|
95
|
+
notApplicable: r?.not_applicable ?? 0,
|
|
96
|
+
disabled: r?.disabled ?? 0,
|
|
97
|
+
dependsOnLocality: r?.locality ?? 0,
|
|
98
|
+
humanValidationComplete: total > 0 && pending === 0 && validated > 0,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Conferir o item faz o escritório ADOTAR a regra.
|
|
103
|
+
*
|
|
104
|
+
* ## O impasse que isto resolve
|
|
105
|
+
*
|
|
106
|
+
* Uma regra do catálogo nacional nasce `pending_validation`, e um escritório
|
|
107
|
+
* não pode validá-la: a correção nacional dela é outra autoridade, e a policy
|
|
108
|
+
* recusa a escrita de qualquer forma. Sem mais nada, o catálogo travava —
|
|
109
|
+
* nenhum escritório conseguiria usar item nenhum, para sempre.
|
|
110
|
+
*
|
|
111
|
+
* A saída não é afrouxar a regra nacional. É reconhecer o que o operador de
|
|
112
|
+
* fato faz quando marca "conferida": ele está dizendo **"este prazo é o que eu
|
|
113
|
+
* pratico"**, e assumindo isso. Então o ato cria uma regra DO ESCRITÓRIO, cópia
|
|
114
|
+
* da nacional, validada por ele.
|
|
115
|
+
*
|
|
116
|
+
* O que se ganha:
|
|
117
|
+
*
|
|
118
|
+
* - a regra nacional continua pendente, e continua sendo a nacional;
|
|
119
|
+
* - o escritório opera sob a própria responsabilidade, com autor e data;
|
|
120
|
+
* - quando a regra nacional for validada e mudar, dá para comparar as duas —
|
|
121
|
+
* a adoção fica visível em vez de virar edição silenciosa do catálogo.
|
|
122
|
+
*
|
|
123
|
+
* Regra do próprio escritório que ainda estava pendente é simplesmente
|
|
124
|
+
* validada: ali não há nada a adotar, é dele desde o início.
|
|
125
|
+
*/
|
|
126
|
+
async function adotarRegras(tx, itemTypeId, actorId) {
|
|
127
|
+
// 1 · As que já são do escritório: conferir é o mesmo ato.
|
|
128
|
+
await tx `
|
|
129
|
+
UPDATE fiscal_rule
|
|
130
|
+
SET status = 'validated', validated_by = ${actorId}, validated_at = now(), updated_at = now()
|
|
131
|
+
WHERE item_type_id = ${itemTypeId}
|
|
132
|
+
AND tenant_id IS NOT NULL
|
|
133
|
+
AND deleted_at IS NULL
|
|
134
|
+
AND status = 'pending_validation'
|
|
135
|
+
AND due_rule IS NOT NULL
|
|
136
|
+
`;
|
|
137
|
+
// 2 · As nacionais pendentes viram adoção — uma por jurisdição, e só onde o
|
|
138
|
+
// escritório ainda não tem regra própria vigente.
|
|
139
|
+
await tx `
|
|
140
|
+
INSERT INTO fiscal_rule (
|
|
141
|
+
id, tenant_id, item_type_id, jurisdiction_scope, jurisdiction_uf, jurisdiction_city_ibge,
|
|
142
|
+
version, valid_from, status, conditions, due_rule, source_reference, note,
|
|
143
|
+
validated_by, validated_at
|
|
144
|
+
)
|
|
145
|
+
SELECT gen_random_uuid(), current_setting('app.current_tenant')::uuid, g.item_type_id,
|
|
146
|
+
g.jurisdiction_scope, g.jurisdiction_uf, g.jurisdiction_city_ibge,
|
|
147
|
+
1, g.valid_from, 'validated', g.conditions, g.due_rule, g.source_reference,
|
|
148
|
+
'Adotada pelo escritório ao conferir o catálogo. A regra nacional segue pendente.',
|
|
149
|
+
${actorId}, now()
|
|
150
|
+
FROM fiscal_rule g
|
|
151
|
+
WHERE g.item_type_id = ${itemTypeId}
|
|
152
|
+
AND g.tenant_id IS NULL
|
|
153
|
+
AND g.deleted_at IS NULL
|
|
154
|
+
AND g.status = 'pending_validation'
|
|
155
|
+
AND g.due_rule IS NOT NULL
|
|
156
|
+
AND NOT EXISTS (
|
|
157
|
+
SELECT 1 FROM fiscal_rule p
|
|
158
|
+
WHERE p.item_type_id = g.item_type_id
|
|
159
|
+
AND p.tenant_id = current_setting('app.current_tenant')::uuid
|
|
160
|
+
AND p.jurisdiction_scope = g.jurisdiction_scope
|
|
161
|
+
AND coalesce(p.jurisdiction_uf, '-') = coalesce(g.jurisdiction_uf, '-')
|
|
162
|
+
AND coalesce(p.jurisdiction_city_ibge, '-') = coalesce(g.jurisdiction_city_ibge, '-')
|
|
163
|
+
AND p.valid_until IS NULL
|
|
164
|
+
AND p.deleted_at IS NULL
|
|
165
|
+
)
|
|
166
|
+
`;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=catalog-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-validation.js","sourceRoot":"","sources":["../../src/competence/catalog-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { Tx } from '../db/client.js';
|
|
2
|
+
import { type ApplicabilityOutcome } from '../fiscal/applicability.js';
|
|
3
|
+
/**
|
|
4
|
+
* Prévia das obrigações antes de gerar.
|
|
5
|
+
*
|
|
6
|
+
* ## Por que um passo a mais
|
|
7
|
+
*
|
|
8
|
+
* `generateInstancesForCompetence` escreve direto. Isso é aceitável quando o
|
|
9
|
+
* catálogo é o de sempre e o operador conhece a carteira; deixa de ser quando o
|
|
10
|
+
* catálogo veio de um seed que ninguém conferiu e a carteira acabou de ser
|
|
11
|
+
* importada. Nesse cenário, gerar é criar prazo legal para trezentos clientes
|
|
12
|
+
* com base numa lista que nunca foi lida.
|
|
13
|
+
*
|
|
14
|
+
* A prévia devolve, por item, o que seria criado, o que já existe e **o que foi
|
|
15
|
+
* descartado, com o motivo**. O motivo é a parte que importa: uma obrigação que
|
|
16
|
+
* some da lista sem explicação é indistinguível de um defeito.
|
|
17
|
+
*
|
|
18
|
+
* ## O que faz um item ser descartado
|
|
19
|
+
*
|
|
20
|
+
* - `regime` — o item não se aplica ao regime do cliente;
|
|
21
|
+
* - `nao_conferido` — o catálogo ainda está `pending_validation` para este item;
|
|
22
|
+
* - `nao_aplicavel` / `desativado` — o escritório disse que não atende;
|
|
23
|
+
* - `sem_localidade` — o item depende de UF ou município e o cliente não tem
|
|
24
|
+
* nenhum dos dois cadastrados. Este é o caso em que gerar seria pior que não
|
|
25
|
+
* gerar: sem localidade não há como saber o prazo, e uma data inventada
|
|
26
|
+
* dispararia o alerta no dia errado;
|
|
27
|
+
* - `sem_vencimento` — a regra de vencimento não é interpretável.
|
|
28
|
+
*/
|
|
29
|
+
export type ObligationSkipReason = 'regime' | 'nao_conferido' | 'nao_aplicavel' | 'desativado' | 'sem_localidade' | 'sem_vencimento'
|
|
30
|
+
/**
|
|
31
|
+
* O motor nacional recusou, e o desfecho dele diz por quê.
|
|
32
|
+
*
|
|
33
|
+
* Distinto dos anteriores, que são checagens locais do escritório: este vem
|
|
34
|
+
* da avaliação de jurisdição, vigência e condições declarativas, e carrega o
|
|
35
|
+
* motivo em texto — a prévia repassa a explicação em vez de traduzi-la para
|
|
36
|
+
* um rótulo genérico que perderia o que o operador precisa fazer.
|
|
37
|
+
*/
|
|
38
|
+
| 'motor_nacional';
|
|
39
|
+
export interface PreviewItem {
|
|
40
|
+
itemTypeId: string;
|
|
41
|
+
/** Desfecho do motor nacional, quando ele foi consultado. */
|
|
42
|
+
applicability?: ApplicabilityOutcome;
|
|
43
|
+
/** Explicação do motor, para a tela. */
|
|
44
|
+
applicabilityReason?: string;
|
|
45
|
+
/** Atributos do perfil que faltaram — o que o escritório precisa preencher. */
|
|
46
|
+
missingAttributes?: string[];
|
|
47
|
+
/** Versão exata da regra usada; entra na instância gerada. */
|
|
48
|
+
fiscalRuleId?: string;
|
|
49
|
+
fiscalRuleVersion?: number;
|
|
50
|
+
key: string;
|
|
51
|
+
label: string;
|
|
52
|
+
nature: 'obligation' | 'task';
|
|
53
|
+
sphere: string | null;
|
|
54
|
+
dueDate: string | null;
|
|
55
|
+
/** `existing` = já foi gerada antes; gerar de novo não a duplica. */
|
|
56
|
+
outcome: 'create' | 'existing' | 'skip';
|
|
57
|
+
skipReason?: ObligationSkipReason;
|
|
58
|
+
}
|
|
59
|
+
export interface ObligationPreview {
|
|
60
|
+
competenceId: string;
|
|
61
|
+
competenceLabel: string;
|
|
62
|
+
clientId: string;
|
|
63
|
+
regime: string | null;
|
|
64
|
+
locality: {
|
|
65
|
+
municipality: string | null;
|
|
66
|
+
stateUf: string | null;
|
|
67
|
+
};
|
|
68
|
+
items: PreviewItem[];
|
|
69
|
+
counts: {
|
|
70
|
+
create: number;
|
|
71
|
+
existing: number;
|
|
72
|
+
skip: number;
|
|
73
|
+
};
|
|
74
|
+
/** Falso quando algo do catálogo ainda não foi conferido por uma pessoa. */
|
|
75
|
+
catalogFullyValidated: boolean;
|
|
76
|
+
}
|
|
77
|
+
export declare function previewInstancesForCompetence(tx: Tx, input: {
|
|
78
|
+
competenceId: string;
|
|
79
|
+
regime?: string | null;
|
|
80
|
+
}): Promise<ObligationPreview>;
|
|
81
|
+
export declare class PreviewMismatch extends Error {
|
|
82
|
+
constructor(message: string);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Gera exatamente o que a prévia mostrou.
|
|
86
|
+
*
|
|
87
|
+
* `approvedItemTypeIds` é a lista que o operador aprovou na tela. A geração
|
|
88
|
+
* recusa qualquer id que não esteja marcado como `create` na prévia recalculada
|
|
89
|
+
* — se o mundo mudou entre a conferência e a aprovação, o certo é falhar e
|
|
90
|
+
* pedir nova conferência, não gerar algo que ninguém viu.
|
|
91
|
+
*
|
|
92
|
+
* A idempotência continua vindo do índice único `(tenant, cliente, competência,
|
|
93
|
+
* tipo)` com `ON CONFLICT DO NOTHING`: aprovar duas vezes cria uma vez.
|
|
94
|
+
*/
|
|
95
|
+
export declare function generateFromPreview(tx: Tx, input: {
|
|
96
|
+
competenceId: string;
|
|
97
|
+
regime?: string | null;
|
|
98
|
+
approvedItemTypeIds: string[];
|
|
99
|
+
}): Promise<{
|
|
100
|
+
created: number;
|
|
101
|
+
alreadyExisted: number;
|
|
102
|
+
}>;
|
|
103
|
+
//# sourceMappingURL=obligation-preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obligation-preview.d.ts","sourceRoot":"","sources":["../../src/competence/obligation-preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAG1C,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAG5F;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,eAAe,GACf,eAAe,GACf,YAAY,GACZ,gBAAgB,GAChB,gBAAgB;AAClB;;;;;;;GAOG;GACD,gBAAgB,CAAC;AAErB,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,wCAAwC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,qEAAqE;IACrE,OAAO,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACxC,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE;QAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAClE,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,4EAA4E;IAC5E,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACtD,OAAO,CAAC,iBAAiB,CAAC,CA0I5B;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,mBAAmB,EAAE,MAAM,EAAE,CAAA;CAAE,GACrF,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CA6CtD"}
|