@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,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.raiseFiscalIntervention = raiseFiscalIntervention;
|
|
4
|
+
exports.resolveFiscalInterventions = resolveFiscalInterventions;
|
|
5
|
+
exports.listFiscalInterventions = listFiscalInterventions;
|
|
6
|
+
const shared_1 = require("@baruk/shared");
|
|
7
|
+
/**
|
|
8
|
+
* Abre a tarefa, ou soma uma ocorrência à que já existe.
|
|
9
|
+
*
|
|
10
|
+
* `detail` é atualizado a cada ocorrência: o motivo mais recente é o mais útil
|
|
11
|
+
* para quem for resolver. É CLASSE e contexto — nunca a resposta do provedor,
|
|
12
|
+
* que cita sujeito de certificado e caminho de arquivo.
|
|
13
|
+
*/
|
|
14
|
+
async function raiseFiscalIntervention(tx, input) {
|
|
15
|
+
const now = input.now ?? new Date();
|
|
16
|
+
// O índice único é parcial (`WHERE state <> 'resolved'`), então `ON CONFLICT`
|
|
17
|
+
// não o alcança por nome de coluna. O caminho é tentar o UPDATE primeiro e
|
|
18
|
+
// inserir só quando ninguém foi atingido — nesta ordem, porque a inversa
|
|
19
|
+
// dispararia violação de unicidade no caso comum (a tarefa já existe).
|
|
20
|
+
const atualizados = await tx `
|
|
21
|
+
UPDATE fiscal_intervention
|
|
22
|
+
SET occurrences = occurrences + 1, last_seen_at = ${now}, detail = ${input.detail}
|
|
23
|
+
WHERE state <> 'resolved'
|
|
24
|
+
AND kind = ${input.kind}
|
|
25
|
+
AND client_id IS NOT DISTINCT FROM ${input.clientId ?? null}
|
|
26
|
+
AND source IS NOT DISTINCT FROM ${input.source ?? null}
|
|
27
|
+
AND environment IS NOT DISTINCT FROM ${input.environment ?? null}
|
|
28
|
+
RETURNING id, occurrences
|
|
29
|
+
`;
|
|
30
|
+
const existente = atualizados[0];
|
|
31
|
+
if (existente) {
|
|
32
|
+
return { id: existente.id, created: false, occurrences: existente.occurrences };
|
|
33
|
+
}
|
|
34
|
+
/*
|
|
35
|
+
* A corrida que o lease NÃO cobre.
|
|
36
|
+
*
|
|
37
|
+
* A vez de sincronizar é tomada DEPOIS do portão de credencial — de propósito,
|
|
38
|
+
* porque não faz sentido travar um cliente para descobrir em seguida que o
|
|
39
|
+
* certificado dele venceu. A consequência é que dois workers podem chegar a
|
|
40
|
+
* este ponto ao mesmo tempo para o mesmo cliente: os dois não encontram
|
|
41
|
+
* pendência aberta, e os dois tentam inserir.
|
|
42
|
+
*
|
|
43
|
+
* O segundo bate no índice único parcial. Sem tratamento, a exceção aborta a
|
|
44
|
+
* transação inteira e o ciclo daquele escritório cai — um erro de
|
|
45
|
+
* infraestrutura produzido por dois processos concordando sobre um fato.
|
|
46
|
+
*
|
|
47
|
+
* O `SAVEPOINT` é o que torna a recuperação possível: no PostgreSQL um comando
|
|
48
|
+
* que falha aborta a transação, e daí em diante todo comando devolve `25P02`
|
|
49
|
+
* — inclusive o UPDATE de recuperação. Com savepoint, só a tentativa de
|
|
50
|
+
* inserção é desfeita.
|
|
51
|
+
*/
|
|
52
|
+
const id = (0, shared_1.uuidv7)();
|
|
53
|
+
try {
|
|
54
|
+
await tx.savepoint((sp) => sp `
|
|
55
|
+
INSERT INTO fiscal_intervention (
|
|
56
|
+
id, tenant_id, client_id, kind, source, environment, document_type,
|
|
57
|
+
state, detail, occurrences, first_seen_at, last_seen_at
|
|
58
|
+
) VALUES (
|
|
59
|
+
${id}, ${input.tenantId}, ${input.clientId ?? null}, ${input.kind},
|
|
60
|
+
${input.source ?? null}, ${input.environment ?? null}, ${input.documentType ?? null},
|
|
61
|
+
'open', ${input.detail}, 1, ${now}, ${now}
|
|
62
|
+
)
|
|
63
|
+
`);
|
|
64
|
+
return { id, created: true, occurrences: 1 };
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
// `23505` é violação de unicidade: alguém abriu a MESMA pendência entre o
|
|
68
|
+
// nosso UPDATE e o nosso INSERT. O desfecho correto é o mesmo do caminho
|
|
69
|
+
// comum — somar uma ocorrência à linha que agora existe.
|
|
70
|
+
const code = err?.code;
|
|
71
|
+
if (code !== '23505')
|
|
72
|
+
throw err;
|
|
73
|
+
const concorrente = await tx `
|
|
74
|
+
UPDATE fiscal_intervention
|
|
75
|
+
SET occurrences = occurrences + 1, last_seen_at = ${now}, detail = ${input.detail}
|
|
76
|
+
WHERE state <> 'resolved'
|
|
77
|
+
AND kind = ${input.kind}
|
|
78
|
+
AND client_id IS NOT DISTINCT FROM ${input.clientId ?? null}
|
|
79
|
+
AND source IS NOT DISTINCT FROM ${input.source ?? null}
|
|
80
|
+
AND environment IS NOT DISTINCT FROM ${input.environment ?? null}
|
|
81
|
+
RETURNING id, occurrences
|
|
82
|
+
`;
|
|
83
|
+
const linha = concorrente[0];
|
|
84
|
+
if (linha)
|
|
85
|
+
return { id: linha.id, created: false, occurrences: linha.occurrences };
|
|
86
|
+
// Nem inseriu nem encontrou: alguém resolveu a pendência no intervalo. Não é
|
|
87
|
+
// erro, e não vale reabrir — o problema deixou de existir para quem olhou.
|
|
88
|
+
return { id, created: false, occurrences: 0 };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Fecha a tarefa quando o problema deixou de existir.
|
|
93
|
+
*
|
|
94
|
+
* Fechamento AUTOMÁTICO só para o que foi observado voltar a funcionar — nunca
|
|
95
|
+
* por decurso de prazo. Uma tarefa que some sozinha depois de uma semana é uma
|
|
96
|
+
* tarefa que ninguém resolveu, apresentada como resolvida.
|
|
97
|
+
*/
|
|
98
|
+
async function resolveFiscalInterventions(tx, input) {
|
|
99
|
+
if (input.kinds.length === 0)
|
|
100
|
+
return 0;
|
|
101
|
+
const now = input.now ?? new Date();
|
|
102
|
+
const rows = await tx `
|
|
103
|
+
UPDATE fiscal_intervention
|
|
104
|
+
SET state = 'resolved', resolved_at = ${now}, resolved_by = ${input.resolvedBy ?? null}
|
|
105
|
+
WHERE state <> 'resolved'
|
|
106
|
+
AND kind = ANY (${input.kinds})
|
|
107
|
+
AND client_id IS NOT DISTINCT FROM ${input.clientId ?? null}
|
|
108
|
+
AND source IS NOT DISTINCT FROM ${input.source ?? null}
|
|
109
|
+
AND environment IS NOT DISTINCT FROM ${input.environment ?? null}
|
|
110
|
+
RETURNING id
|
|
111
|
+
`;
|
|
112
|
+
return rows.length;
|
|
113
|
+
}
|
|
114
|
+
/** A fila aberta do escritório, a mais recente primeiro. */
|
|
115
|
+
async function listFiscalInterventions(tx, input = {}) {
|
|
116
|
+
const limit = Math.min(Math.max(input.limit ?? 100, 1), 500);
|
|
117
|
+
const state = input.state ?? 'open';
|
|
118
|
+
const rows = await tx `
|
|
119
|
+
SELECT id, client_id, kind, source, environment, document_type, state, detail,
|
|
120
|
+
occurrences, first_seen_at, last_seen_at
|
|
121
|
+
FROM fiscal_intervention
|
|
122
|
+
WHERE ${state === 'any' ? tx `true` : tx `state = ${state}`}
|
|
123
|
+
ORDER BY last_seen_at DESC
|
|
124
|
+
LIMIT ${limit}
|
|
125
|
+
`;
|
|
126
|
+
return rows.map((r) => ({
|
|
127
|
+
id: r.id,
|
|
128
|
+
clientId: r.client_id,
|
|
129
|
+
kind: r.kind,
|
|
130
|
+
source: r.source,
|
|
131
|
+
environment: r.environment,
|
|
132
|
+
documentType: r.document_type,
|
|
133
|
+
state: r.state,
|
|
134
|
+
detail: r.detail,
|
|
135
|
+
occurrences: r.occurrences,
|
|
136
|
+
firstSeenAt: r.first_seen_at.toISOString(),
|
|
137
|
+
lastSeenAt: r.last_seen_at.toISOString(),
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=intervention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intervention.js","sourceRoot":"","sources":["../../../../src/fiscal/sync/intervention.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_LEASE_TTL_MS = void 0;
|
|
4
|
+
exports.acquireFiscalSyncLease = acquireFiscalSyncLease;
|
|
5
|
+
exports.heartbeatFiscalSyncLease = heartbeatFiscalSyncLease;
|
|
6
|
+
exports.releaseFiscalSyncLease = releaseFiscalSyncLease;
|
|
7
|
+
exports.listStaleFiscalSyncLeases = listStaleFiscalSyncLeases;
|
|
8
|
+
const shared_1 = require("@baruk/shared");
|
|
9
|
+
/**
|
|
10
|
+
* Prazo padrão da vez.
|
|
11
|
+
*
|
|
12
|
+
* Dez minutos: mais do que qualquer lote de 50 documentos precisa, e menos do
|
|
13
|
+
* que o intervalo entre ciclos diários — de modo que um worker morto nunca
|
|
14
|
+
* atrase o cliente para o dia seguinte. Lotes longos renovam com `heartbeat`.
|
|
15
|
+
*/
|
|
16
|
+
exports.DEFAULT_LEASE_TTL_MS = 10 * 60_000;
|
|
17
|
+
/**
|
|
18
|
+
* Toma a vez. Devolve `null` quando outro processo VIVO a tem.
|
|
19
|
+
*
|
|
20
|
+
* `null` não é erro e não merece log de erro: é a resposta correta e frequente
|
|
21
|
+
* quando dois workers percorrem a mesma carteira.
|
|
22
|
+
*/
|
|
23
|
+
async function acquireFiscalSyncLease(tx, input) {
|
|
24
|
+
const now = input.now ?? new Date();
|
|
25
|
+
const expiresAt = new Date(now.getTime() + (input.ttlMs ?? exports.DEFAULT_LEASE_TTL_MS));
|
|
26
|
+
const { stream } = input;
|
|
27
|
+
// A CTE fotografa o titular ANTERIOR. Ela não participa da exclusão — quem
|
|
28
|
+
// exclui é o `ON CONFLICT` —, serve só para dizer se esta tomada veio de uma
|
|
29
|
+
// vez devolvida (caminho normal) ou arrancada de um titular vencido (worker
|
|
30
|
+
// morto). Sob disputa real a segunda transação nem chega aqui: ela bloqueia
|
|
31
|
+
// na linha e depois reprova no `WHERE`.
|
|
32
|
+
const rows = await tx `
|
|
33
|
+
WITH anterior AS (
|
|
34
|
+
SELECT released_at
|
|
35
|
+
FROM fiscal_sync_lease
|
|
36
|
+
WHERE tenant_id = ${input.tenantId} AND client_id = ${stream.clientId}
|
|
37
|
+
AND source = ${stream.source} AND environment = ${stream.environment}
|
|
38
|
+
AND document_type = ${stream.documentType}
|
|
39
|
+
)
|
|
40
|
+
INSERT INTO fiscal_sync_lease (
|
|
41
|
+
id, tenant_id, client_id, source, environment, document_type,
|
|
42
|
+
holder, run_id, acquired_at, heartbeat_at, expires_at, released_at, updated_at
|
|
43
|
+
) VALUES (
|
|
44
|
+
${(0, shared_1.uuidv7)()}, ${input.tenantId}, ${stream.clientId}, ${stream.source},
|
|
45
|
+
${stream.environment}, ${stream.documentType},
|
|
46
|
+
${input.holder}, ${input.runId ?? null}, ${now}, ${now}, ${expiresAt}, NULL, now()
|
|
47
|
+
)
|
|
48
|
+
ON CONFLICT (tenant_id, client_id, source, environment, document_type)
|
|
49
|
+
DO UPDATE SET
|
|
50
|
+
holder = EXCLUDED.holder,
|
|
51
|
+
run_id = EXCLUDED.run_id,
|
|
52
|
+
acquired_at = EXCLUDED.acquired_at,
|
|
53
|
+
heartbeat_at = EXCLUDED.heartbeat_at,
|
|
54
|
+
expires_at = EXCLUDED.expires_at,
|
|
55
|
+
released_at = NULL,
|
|
56
|
+
-- Só conta como RETOMADA quando o titular anterior não devolveu. Uma vez
|
|
57
|
+
-- livre e devolvida é o caminho normal, e inflá-lo apagaria o sinal de
|
|
58
|
+
-- que existe um worker morrendo no meio do lote.
|
|
59
|
+
recovered_count = fiscal_sync_lease.recovered_count
|
|
60
|
+
+ CASE WHEN fiscal_sync_lease.released_at IS NULL THEN 1 ELSE 0 END,
|
|
61
|
+
updated_at = now()
|
|
62
|
+
WHERE fiscal_sync_lease.released_at IS NOT NULL
|
|
63
|
+
OR fiscal_sync_lease.expires_at <= ${now}
|
|
64
|
+
RETURNING id, holder, acquired_at, expires_at, recovered_count,
|
|
65
|
+
(SELECT released_at IS NULL FROM anterior) AS recovered
|
|
66
|
+
`;
|
|
67
|
+
const r = rows[0];
|
|
68
|
+
if (!r)
|
|
69
|
+
return null;
|
|
70
|
+
return {
|
|
71
|
+
id: r.id,
|
|
72
|
+
holder: r.holder,
|
|
73
|
+
acquiredAt: r.acquired_at,
|
|
74
|
+
expiresAt: r.expires_at,
|
|
75
|
+
recoveredCount: r.recovered_count,
|
|
76
|
+
// Sem linha anterior a CTE devolve NULL: é uma vez nova, não uma retomada.
|
|
77
|
+
recovered: r.recovered === true,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Renova o prazo — e confirma que a vez ainda é nossa.
|
|
82
|
+
*
|
|
83
|
+
* O `WHERE holder = ...` não é zelo: um lote que demorou mais do que o prazo já
|
|
84
|
+
* PERDEU a vez para outro worker, e continuar escrevendo depois disso é
|
|
85
|
+
* exatamente a corrida que o lease existe para impedir. `false` significa
|
|
86
|
+
* "pare agora", e quem chama tem de obedecer.
|
|
87
|
+
*/
|
|
88
|
+
async function heartbeatFiscalSyncLease(tx, input) {
|
|
89
|
+
const now = input.now ?? new Date();
|
|
90
|
+
const expiresAt = new Date(now.getTime() + (input.ttlMs ?? exports.DEFAULT_LEASE_TTL_MS));
|
|
91
|
+
const rows = await tx `
|
|
92
|
+
UPDATE fiscal_sync_lease
|
|
93
|
+
SET heartbeat_at = ${now}, expires_at = ${expiresAt}, updated_at = now()
|
|
94
|
+
WHERE id = ${input.leaseId}
|
|
95
|
+
AND holder = ${input.holder}
|
|
96
|
+
AND released_at IS NULL
|
|
97
|
+
AND expires_at > ${now}
|
|
98
|
+
RETURNING id
|
|
99
|
+
`;
|
|
100
|
+
return rows.length > 0;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Devolve a vez.
|
|
104
|
+
*
|
|
105
|
+
* Idempotente e tolerante: devolver uma vez que já foi tomada por outro não é
|
|
106
|
+
* erro, é o desfecho normal de um worker que demorou demais. Devolve `false`
|
|
107
|
+
* para que a trilha saiba, sem lançar.
|
|
108
|
+
*/
|
|
109
|
+
async function releaseFiscalSyncLease(tx, input) {
|
|
110
|
+
const now = input.now ?? new Date();
|
|
111
|
+
const rows = await tx `
|
|
112
|
+
UPDATE fiscal_sync_lease
|
|
113
|
+
SET released_at = ${now}, updated_at = now()
|
|
114
|
+
WHERE id = ${input.leaseId} AND holder = ${input.holder} AND released_at IS NULL
|
|
115
|
+
RETURNING id
|
|
116
|
+
`;
|
|
117
|
+
return rows.length > 0;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* As vezes vencidas que ninguém devolveu.
|
|
121
|
+
*
|
|
122
|
+
* A retomada não depende desta função — `acquire` já toma o que venceu. Ela
|
|
123
|
+
* existe para OBSERVAÇÃO: uma lista que nunca esvazia é um worker que morre
|
|
124
|
+
* sempre no mesmo cliente, e isso é uma pergunta que nenhum contador agregado
|
|
125
|
+
* responde.
|
|
126
|
+
*/
|
|
127
|
+
async function listStaleFiscalSyncLeases(tx, now = new Date()) {
|
|
128
|
+
const rows = await tx `
|
|
129
|
+
SELECT id, client_id, source, environment, document_type, holder,
|
|
130
|
+
expires_at, recovered_count
|
|
131
|
+
FROM fiscal_sync_lease
|
|
132
|
+
WHERE released_at IS NULL AND expires_at <= ${now}
|
|
133
|
+
ORDER BY expires_at
|
|
134
|
+
`;
|
|
135
|
+
return rows.map((r) => ({
|
|
136
|
+
id: r.id,
|
|
137
|
+
clientId: r.client_id,
|
|
138
|
+
source: r.source,
|
|
139
|
+
environment: r.environment,
|
|
140
|
+
documentType: r.document_type,
|
|
141
|
+
holder: r.holder,
|
|
142
|
+
expiresAt: r.expires_at,
|
|
143
|
+
recoveredCount: r.recovered_count,
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease.js","sourceRoot":"","sources":["../../../../src/fiscal/sync/lease.ts"],"names":[],"mappings":";;;AAsEA,wDA4EC;AAUD,4DAgBC;AASD,wDAYC;AAqBD,8DAgCC;AAtPD,0CAAuC;AAuDvC;;;;;;GAMG;AACU,QAAA,oBAAoB,GAAG,EAAE,GAAG,MAAM,CAAC;AAEhD;;;;;GAKG;AACI,KAAK,UAAU,sBAAsB,CAC1C,EAAM,EACN,KAOC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,4BAAoB,CAAC,CAAC,CAAC;IAClF,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAEzB,2EAA2E;IAC3E,6EAA6E;IAC7E,4EAA4E;IAC5E,4EAA4E;IAC5E,wCAAwC;IACxC,MAAM,IAAI,GAAG,MAAM,EAAE,CASpB;;;;2BAIwB,KAAK,CAAC,QAAQ,oBAAoB,MAAM,CAAC,QAAQ;wBACpD,MAAM,CAAC,MAAM,sBAAsB,MAAM,CAAC,WAAW;+BAC9C,MAAM,CAAC,YAAY;;;;;;QAM1C,IAAA,eAAM,GAAE,KAAK,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,MAAM;QACjE,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,YAAY;QAC1C,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,SAAS;;;;;;;;;;;;;;;;;4CAiB9B,GAAG;;;GAG5C,CAAC;IAEF,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,UAAU,EAAE,CAAC,CAAC,WAAW;QACzB,SAAS,EAAE,CAAC,CAAC,UAAU;QACvB,cAAc,EAAE,CAAC,CAAC,eAAe;QACjC,2EAA2E;QAC3E,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,IAAI;KAChC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,wBAAwB,CAC5C,EAAM,EACN,KAAsE;IAEtE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,4BAAoB,CAAC,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,MAAM,EAAE,CAAkB;;4BAEb,GAAG,kBAAkB,SAAS;kBACxC,KAAK,CAAC,OAAO;sBACT,KAAK,CAAC,MAAM;;0BAER,GAAG;;GAE1B,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,sBAAsB,CAC1C,EAAM,EACN,KAAsD;IAEtD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAkB;;2BAEd,GAAG;kBACZ,KAAK,CAAC,OAAO,iBAAiB,KAAK,CAAC,MAAM;;GAEzD,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzB,CAAC;AAaD;;;;;;;GAOG;AACI,KAAK,UAAU,yBAAyB,CAC7C,EAAM,EACN,MAAY,IAAI,IAAI,EAAE;IAEtB,MAAM,IAAI,GAAG,MAAM,EAAE,CAWpB;;;;mDAIgD,GAAG;;GAEnD,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,QAAQ,EAAE,CAAC,CAAC,SAAS;QACrB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,YAAY,EAAE,CAAC,CAAC,aAAa;QAC7B,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,SAAS,EAAE,CAAC,CAAC,UAAU;QACvB,cAAc,EAAE,CAAC,CAAC,eAAe;KAClC,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fiscalOperationalMetrics = fiscalOperationalMetrics;
|
|
4
|
+
exports.fiscalValueMetrics = fiscalValueMetrics;
|
|
5
|
+
exports.listFiscalClientSyncStatus = listFiscalClientSyncStatus;
|
|
6
|
+
async function fiscalOperationalMetrics(tx, now = new Date()) {
|
|
7
|
+
const [runs] = await tx `
|
|
8
|
+
SELECT count(*)::int AS total,
|
|
9
|
+
count(*) FILTER (WHERE outcome IN ('completed','no_documents'))::int AS success,
|
|
10
|
+
count(*) FILTER (WHERE outcome IN ('failed','provider_error'))::int AS failure,
|
|
11
|
+
count(*) FILTER (WHERE outcome LIKE 'blocked%' OR outcome = 'throttled')::int
|
|
12
|
+
AS blocked,
|
|
13
|
+
coalesce(sum(documents_fetched), 0)::int AS fetched,
|
|
14
|
+
coalesce(sum(documents_new), 0)::int AS novos,
|
|
15
|
+
coalesce(sum(documents_duplicate), 0)::int AS dup,
|
|
16
|
+
coalesce(sum(documents_failed), 0)::int AS falhos,
|
|
17
|
+
coalesce(sum(events_pending), 0)::int AS pend,
|
|
18
|
+
coalesce(sum(events_applied), 0)::int AS apl,
|
|
19
|
+
coalesce(sum(events_reconciled), 0)::int AS rec,
|
|
20
|
+
count(*) FILTER (WHERE outcome = 'provider_error')::int AS prov,
|
|
21
|
+
-- Percentil, e não média: uma execução de dez minutos entre mil de um
|
|
22
|
+
-- segundo move a média e não move a mediana — e é a mediana que
|
|
23
|
+
-- descreve o que acontece na maioria das vezes.
|
|
24
|
+
(percentile_disc(0.5) WITHIN GROUP (ORDER BY duration_ms)
|
|
25
|
+
FILTER (WHERE duration_ms IS NOT NULL))::int AS p50,
|
|
26
|
+
max(duration_ms)::int AS max,
|
|
27
|
+
max(finished_at) FILTER (WHERE outcome IN ('completed','no_documents')) AS ultimo
|
|
28
|
+
FROM fiscal_sync_run
|
|
29
|
+
`;
|
|
30
|
+
const [leases] = await tx `
|
|
31
|
+
SELECT coalesce(sum(recovered_count), 0)::int AS recuperacoes,
|
|
32
|
+
count(*) FILTER (WHERE released_at IS NULL AND expires_at <= ${now})::int AS vencidos
|
|
33
|
+
FROM fiscal_sync_lease
|
|
34
|
+
`;
|
|
35
|
+
const [fila] = await tx `
|
|
36
|
+
SELECT count(*)::int AS abertas FROM fiscal_intervention WHERE state <> 'resolved'
|
|
37
|
+
`;
|
|
38
|
+
const [circuitos] = await tx `
|
|
39
|
+
SELECT count(*)::int AS abertos
|
|
40
|
+
FROM fiscal_provider_circuit
|
|
41
|
+
WHERE state = 'open' AND (open_until IS NULL OR open_until > ${now})
|
|
42
|
+
`;
|
|
43
|
+
return {
|
|
44
|
+
runsTotal: runs?.total ?? 0,
|
|
45
|
+
runsSuccess: runs?.success ?? 0,
|
|
46
|
+
runsFailure: runs?.failure ?? 0,
|
|
47
|
+
runsBlocked: runs?.blocked ?? 0,
|
|
48
|
+
documentsFetched: runs?.fetched ?? 0,
|
|
49
|
+
documentsNew: runs?.novos ?? 0,
|
|
50
|
+
documentsDuplicate: runs?.dup ?? 0,
|
|
51
|
+
documentsFailed: runs?.falhos ?? 0,
|
|
52
|
+
eventsPending: runs?.pend ?? 0,
|
|
53
|
+
eventsApplied: runs?.apl ?? 0,
|
|
54
|
+
eventsReconciled: runs?.rec ?? 0,
|
|
55
|
+
providerErrors: runs?.prov ?? 0,
|
|
56
|
+
syncDurationMsP50: runs?.p50 ?? null,
|
|
57
|
+
syncDurationMsMax: runs?.max ?? null,
|
|
58
|
+
lastSuccessfulSyncAt: runs?.ultimo?.toISOString() ?? null,
|
|
59
|
+
leaseRecoveries: leases?.recuperacoes ?? 0,
|
|
60
|
+
staleLeases: leases?.vencidos ?? 0,
|
|
61
|
+
openInterventions: fila?.abertas ?? 0,
|
|
62
|
+
openCircuits: circuitos?.abertos ?? 0,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async function fiscalValueMetrics(tx) {
|
|
66
|
+
const [docs] = await tx `
|
|
67
|
+
SELECT count(*) FILTER (WHERE source <> 'manual')::int AS automaticos,
|
|
68
|
+
count(*) FILTER (WHERE source <> 'manual' AND raw_blob_id IS NOT NULL
|
|
69
|
+
AND content_kind = 'full')::int AS "comRaw"
|
|
70
|
+
FROM fiscal_document
|
|
71
|
+
`;
|
|
72
|
+
const [pedidos] = await tx `
|
|
73
|
+
-- Competências de "Documentos fiscais do mês" em que a automação trouxe ao
|
|
74
|
+
-- menos um documento daquele cliente. A junção é pela COMPETÊNCIA, não pela
|
|
75
|
+
-- data de emissão: são conceitos independentes, e confundi-los erraria o
|
|
76
|
+
-- fechamento (a mesma distinção que a 0056 registra em competence_label).
|
|
77
|
+
SELECT count(DISTINCT (ri.client_id, c.label))::int AS n
|
|
78
|
+
FROM recurring_instance ri
|
|
79
|
+
JOIN recurring_item_type rit ON rit.id = ri.item_type_id
|
|
80
|
+
JOIN competence c ON c.id = ri.competence_id
|
|
81
|
+
WHERE rit.key = 'docs_fiscais_mes'
|
|
82
|
+
AND ri.deleted_at IS NULL
|
|
83
|
+
AND EXISTS (
|
|
84
|
+
SELECT 1 FROM fiscal_document fd
|
|
85
|
+
WHERE fd.client_id = ri.client_id
|
|
86
|
+
AND fd.competence_label = c.label
|
|
87
|
+
AND fd.source <> 'manual'
|
|
88
|
+
)
|
|
89
|
+
`;
|
|
90
|
+
const [fila] = await tx `
|
|
91
|
+
SELECT count(*) FILTER (WHERE state <> 'resolved')::int AS abertas,
|
|
92
|
+
count(*) FILTER (WHERE state = 'resolved')::int AS resolvidas
|
|
93
|
+
FROM fiscal_intervention
|
|
94
|
+
`;
|
|
95
|
+
return {
|
|
96
|
+
documentsAutomaticallyCollected: docs?.automaticos ?? 0,
|
|
97
|
+
manualDownloadsAvoided: docs?.comRaw ?? 0,
|
|
98
|
+
clientRequestsAvoided: pedidos?.n ?? 0,
|
|
99
|
+
clientRequestsAvoidedBasis: 'upper_bound_no_human_baseline',
|
|
100
|
+
humanInterventionsRequired: fila?.abertas ?? 0,
|
|
101
|
+
humanInterventionsResolved: fila?.resolvidas ?? 0,
|
|
102
|
+
estimatedMinutesSaved: null,
|
|
103
|
+
minutesSavedBlockedBy: 'human_baseline_not_measured',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* O painel por cliente.
|
|
108
|
+
*
|
|
109
|
+
* Uma consulta só, e não N+1: a tela lista a carteira inteira, e um `for` com
|
|
110
|
+
* quatro consultas por cliente transformaria trinta clientes em cento e vinte
|
|
111
|
+
* viagens ao banco. A cobertura entra por junção lateral com a MESMA regra do
|
|
112
|
+
* módulo de cobertura — pergunta municipal só é respondida por linha municipal.
|
|
113
|
+
*/
|
|
114
|
+
async function listFiscalClientSyncStatus(tx, input = {}) {
|
|
115
|
+
const documentType = input.documentType ?? 'nfse';
|
|
116
|
+
const now = input.now ?? new Date();
|
|
117
|
+
const rows = await tx `
|
|
118
|
+
SELECT c.id AS client_id,
|
|
119
|
+
c.display_name AS client_name,
|
|
120
|
+
c.municipality_ibge_code,
|
|
121
|
+
cur.source,
|
|
122
|
+
cur.environment,
|
|
123
|
+
pol.frequency,
|
|
124
|
+
cur.last_success_at,
|
|
125
|
+
cur.last_started_at,
|
|
126
|
+
cur.next_attempt_after,
|
|
127
|
+
cur.next_eligible_run_at,
|
|
128
|
+
cur.last_error_class,
|
|
129
|
+
cur.consecutive_failures,
|
|
130
|
+
cur.last_nsu,
|
|
131
|
+
(SELECT count(*)::int FROM fiscal_document d
|
|
132
|
+
WHERE d.client_id = c.id AND d.document_type = ${documentType}) AS documentos,
|
|
133
|
+
(SELECT count(*)::int FROM fiscal_intervention i
|
|
134
|
+
WHERE i.client_id = c.id AND i.state <> 'resolved') AS intervencoes,
|
|
135
|
+
(SELECT bool_or(i.kind IN ('certificate_expired','certificate_invalid','auth_required'))
|
|
136
|
+
FROM fiscal_intervention i
|
|
137
|
+
WHERE i.client_id = c.id AND i.state <> 'resolved') AS cred_expirada,
|
|
138
|
+
(SELECT l.holder FROM fiscal_sync_lease l
|
|
139
|
+
WHERE l.client_id = c.id AND l.document_type = ${documentType}
|
|
140
|
+
AND l.released_at IS NULL AND l.expires_at > ${now}
|
|
141
|
+
LIMIT 1) AS lease_holder,
|
|
142
|
+
cov.coverage_status
|
|
143
|
+
FROM client c
|
|
144
|
+
JOIN client_fiscal_enrollment e
|
|
145
|
+
ON e.client_id = c.id AND e.document_type = ${documentType} AND e.revoked_at IS NULL
|
|
146
|
+
LEFT JOIN fiscal_sync_cursor cur
|
|
147
|
+
ON cur.client_id = c.id AND cur.environment = (
|
|
148
|
+
SELECT mode FROM tenant_fiscal_automation LIMIT 1
|
|
149
|
+
)
|
|
150
|
+
LEFT JOIN LATERAL (
|
|
151
|
+
SELECT frequency FROM fiscal_sync_policy p
|
|
152
|
+
WHERE p.document_type = ${documentType}
|
|
153
|
+
AND (p.client_id = c.id OR p.client_id IS NULL)
|
|
154
|
+
ORDER BY p.client_id NULLS LAST
|
|
155
|
+
LIMIT 1
|
|
156
|
+
) pol ON true
|
|
157
|
+
LEFT JOIN LATERAL (
|
|
158
|
+
-- A MESMA regra do módulo de cobertura, e a razão de ela estar repetida
|
|
159
|
+
-- aqui é performance de listagem: uma pergunta municipal só encontra
|
|
160
|
+
-- linha municipal (a exata do IBGE, senão a padrão). Nunca sobe para a
|
|
161
|
+
-- nacional — é assim que "o ADN cobre o Brasil inteiro" entraria.
|
|
162
|
+
SELECT fc.coverage_status
|
|
163
|
+
FROM fiscal_coverage fc
|
|
164
|
+
WHERE fc.document_type = ${documentType}
|
|
165
|
+
AND fc.jurisdiction_scope = ${documentType === 'nfse' ? 'municipal' : 'national'}
|
|
166
|
+
AND (fc.jurisdiction_code = c.municipality_ibge_code OR fc.jurisdiction_code IS NULL)
|
|
167
|
+
ORDER BY fc.jurisdiction_code NULLS LAST
|
|
168
|
+
LIMIT 1
|
|
169
|
+
) cov ON true
|
|
170
|
+
WHERE c.deleted_at IS NULL
|
|
171
|
+
ORDER BY c.display_name
|
|
172
|
+
`;
|
|
173
|
+
return rows.map((r) => {
|
|
174
|
+
const cobertura = r.coverage_status ?? 'UNKNOWN';
|
|
175
|
+
const frequency = r.frequency ?? 'disabled';
|
|
176
|
+
const gate = maior(r.next_eligible_run_at, r.next_attempt_after);
|
|
177
|
+
const status = (() => {
|
|
178
|
+
if (r.cred_expirada)
|
|
179
|
+
return 'AUTH_REQUIRED';
|
|
180
|
+
if (cobertura === 'UNSUPPORTED')
|
|
181
|
+
return 'UNSUPPORTED';
|
|
182
|
+
if (frequency === 'disabled')
|
|
183
|
+
return 'DISABLED';
|
|
184
|
+
if (r.lease_holder)
|
|
185
|
+
return 'SYNCING';
|
|
186
|
+
if (r.last_error_class)
|
|
187
|
+
return 'ERROR';
|
|
188
|
+
if (r.last_success_at)
|
|
189
|
+
return (r.intervencoes ?? 0) > 0 ? 'DEGRADED' : 'HEALTHY';
|
|
190
|
+
return 'READY';
|
|
191
|
+
})();
|
|
192
|
+
return {
|
|
193
|
+
clientId: r.client_id,
|
|
194
|
+
clientName: r.client_name,
|
|
195
|
+
documentType,
|
|
196
|
+
source: r.source,
|
|
197
|
+
environment: r.environment,
|
|
198
|
+
status,
|
|
199
|
+
frequency,
|
|
200
|
+
lastSuccessAt: r.last_success_at?.toISOString() ?? null,
|
|
201
|
+
lastStartedAt: r.last_started_at?.toISOString() ?? null,
|
|
202
|
+
nextRunAt: gate?.toISOString() ?? null,
|
|
203
|
+
lastErrorClass: r.last_error_class,
|
|
204
|
+
consecutiveFailures: r.consecutive_failures ?? 0,
|
|
205
|
+
cursor: r.last_nsu,
|
|
206
|
+
documentsCollected: r.documentos,
|
|
207
|
+
openInterventions: r.intervencoes,
|
|
208
|
+
coverageStatus: cobertura,
|
|
209
|
+
leaseHolder: r.lease_holder,
|
|
210
|
+
detail: describe(status, cobertura, frequency),
|
|
211
|
+
};
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
function maior(a, b) {
|
|
215
|
+
if (!a)
|
|
216
|
+
return b;
|
|
217
|
+
if (!b)
|
|
218
|
+
return a;
|
|
219
|
+
return a > b ? a : b;
|
|
220
|
+
}
|
|
221
|
+
/** A frase que explica o estado. Fato, nunca conselho genérico. */
|
|
222
|
+
function describe(status, coverage, frequency) {
|
|
223
|
+
switch (status) {
|
|
224
|
+
case 'DISABLED':
|
|
225
|
+
return 'Cadência desligada. Inscrever o cliente não liga a busca automática.';
|
|
226
|
+
case 'UNSUPPORTED':
|
|
227
|
+
return 'Não há caminho de coleta automática conhecido para esta jurisdição.';
|
|
228
|
+
case 'AUTH_REQUIRED':
|
|
229
|
+
return 'Certificado vencido, inválido ou recusado. Só uma pessoa resolve.';
|
|
230
|
+
case 'SYNCING':
|
|
231
|
+
return 'Uma execução está com a vez deste fluxo agora.';
|
|
232
|
+
case 'ERROR':
|
|
233
|
+
return 'A última execução falhou. O cursor não avançou — nada foi perdido.';
|
|
234
|
+
case 'DEGRADED':
|
|
235
|
+
return 'A última execução deu certo, mas há pendência humana aberta.';
|
|
236
|
+
case 'HEALTHY':
|
|
237
|
+
return `Sincronizando em cadência ${frequency}.`;
|
|
238
|
+
case 'READY':
|
|
239
|
+
return coverage === 'UNKNOWN'
|
|
240
|
+
? 'Habilitado, mas a cobertura desta jurisdição é desconhecida.'
|
|
241
|
+
: 'Habilitado e ainda sem execução concluída.';
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=observability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.js","sourceRoot":"","sources":["../../../../src/fiscal/sync/observability.ts"],"names":[],"mappings":"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"}
|