@baruk/core 0.4.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.baruk-provenance.json +4 -4
- package/CHANGELOG.md +42 -0
- package/dist/audit/repository.d.ts +33 -1
- package/dist/audit/repository.d.ts.map +1 -1
- package/dist/audit/repository.js +41 -7
- package/dist/audit/repository.js.map +1 -1
- package/dist/auth/service.d.ts +21 -0
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +46 -1
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +41 -1
- package/dist/billing/ar-repository.d.ts.map +1 -1
- package/dist/billing/ar-repository.js +82 -6
- package/dist/billing/ar-repository.js.map +1 -1
- package/dist/billing/provider-account.d.ts +38 -0
- package/dist/billing/provider-account.d.ts.map +1 -1
- package/dist/billing/provider-account.js +58 -2
- package/dist/billing/provider-account.js.map +1 -1
- package/dist/billing/repository.d.ts +44 -0
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +49 -5
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/audit/repository.js +41 -7
- package/dist/cjs/audit/repository.js.map +1 -1
- package/dist/cjs/auth/service.js +46 -1
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +82 -6
- package/dist/cjs/billing/ar-repository.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +60 -1
- package/dist/cjs/billing/provider-account.js.map +1 -1
- package/dist/cjs/billing/repository.js +51 -5
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/ibge.js +117 -0
- package/dist/cjs/clients/ibge.js.map +1 -0
- package/dist/cjs/clients/registry/http.js +157 -0
- package/dist/cjs/clients/registry/http.js.map +1 -0
- package/dist/cjs/clients/registry/ibge-municipios.js +28 -0
- package/dist/cjs/clients/registry/ibge-municipios.js.map +1 -0
- package/dist/cjs/clients/registry/ibge.js +63 -0
- package/dist/cjs/clients/registry/ibge.js.map +1 -0
- package/dist/cjs/clients/registry/lookup.js +191 -0
- package/dist/cjs/clients/registry/lookup.js.map +1 -0
- package/dist/cjs/clients/registry/provider.js +34 -0
- package/dist/cjs/clients/registry/provider.js.map +1 -0
- package/dist/cjs/clients/registry/resolve.js +47 -0
- package/dist/cjs/clients/registry/resolve.js.map +1 -0
- package/dist/cjs/clients/registry/serpro.js +149 -0
- package/dist/cjs/clients/registry/serpro.js.map +1 -0
- package/dist/cjs/clients/registry/service.js +230 -0
- package/dist/cjs/clients/registry/service.js.map +1 -0
- package/dist/cjs/clients/registry/synthetic.js +165 -0
- package/dist/cjs/clients/registry/synthetic.js.map +1 -0
- package/dist/cjs/clients/repository.js +190 -9
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +190 -0
- package/dist/cjs/collection/branding.js.map +1 -1
- package/dist/cjs/collection/clearance-store.js +74 -0
- package/dist/cjs/collection/clearance-store.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +65 -2
- package/dist/cjs/collection/communication-runtime.js.map +1 -1
- package/dist/cjs/collection/engine.js +20 -0
- package/dist/cjs/collection/engine.js.map +1 -1
- package/dist/cjs/collection/policy.js +29 -1
- package/dist/cjs/collection/policy.js.map +1 -1
- package/dist/cjs/communication/clearance.js +18 -0
- package/dist/cjs/communication/clearance.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +5 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -1
- package/dist/cjs/communication/engine.js +12 -0
- package/dist/cjs/communication/engine.js.map +1 -1
- package/dist/cjs/communication/policy.js.map +1 -1
- package/dist/cjs/competence/business-days.js +155 -0
- package/dist/cjs/competence/business-days.js.map +1 -0
- package/dist/cjs/competence/catalog-validation.js +174 -0
- package/dist/cjs/competence/catalog-validation.js.map +1 -0
- package/dist/cjs/competence/obligation-preview.js +190 -0
- package/dist/cjs/competence/obligation-preview.js.map +1 -0
- package/dist/cjs/competence/repository.js +330 -17
- package/dist/cjs/competence/repository.js.map +1 -1
- package/dist/cjs/dashboard/pilot-panel.js +90 -0
- package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
- package/dist/cjs/dashboard/repository.js +11 -1
- package/dist/cjs/dashboard/repository.js.map +1 -1
- package/dist/cjs/db/client.js +17 -11
- package/dist/cjs/db/client.js.map +1 -1
- package/dist/cjs/db/provision-e2e-identity.js +116 -0
- package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
- package/dist/cjs/fiscal/applicability.js +164 -0
- package/dist/cjs/fiscal/applicability.js.map +1 -0
- package/dist/cjs/fiscal/collection/authorization.js +186 -0
- package/dist/cjs/fiscal/collection/authorization.js.map +1 -0
- package/dist/cjs/fiscal/collection/competence.js +97 -0
- package/dist/cjs/fiscal/collection/competence.js.map +1 -0
- package/dist/cjs/fiscal/collection/first-contact.js +204 -0
- package/dist/cjs/fiscal/collection/first-contact.js.map +1 -0
- package/dist/cjs/fiscal/collection/plan.js +122 -0
- package/dist/cjs/fiscal/collection/plan.js.map +1 -0
- package/dist/cjs/fiscal/conditions.js +198 -0
- package/dist/cjs/fiscal/conditions.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/cjs/fiscal/coverage/model.js +137 -0
- package/dist/cjs/fiscal/coverage/model.js.map +1 -0
- package/dist/cjs/fiscal/coverage/requests.js +99 -0
- package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
- package/dist/cjs/fiscal/credentials/inspect.js +182 -0
- package/dist/cjs/fiscal/credentials/inspect.js.map +1 -0
- package/dist/cjs/fiscal/credentials/material.js +168 -0
- package/dist/cjs/fiscal/credentials/material.js.map +1 -0
- package/dist/cjs/fiscal/credentials/onboarding.js +266 -0
- package/dist/cjs/fiscal/credentials/onboarding.js.map +1 -0
- package/dist/cjs/fiscal/credentials/readiness.js +190 -0
- package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
- package/dist/cjs/fiscal/eligibility.js +199 -0
- package/dist/cjs/fiscal/eligibility.js.map +1 -0
- package/dist/cjs/fiscal/enrollment.js +134 -0
- package/dist/cjs/fiscal/enrollment.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/direction.js +36 -0
- package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/provider.js +51 -0
- package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/repository.js +132 -0
- package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/cjs/fiscal/repository.js +470 -0
- package/dist/cjs/fiscal/repository.js.map +1 -0
- package/dist/cjs/fiscal/sync/circuit.js +124 -0
- package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
- package/dist/cjs/fiscal/sync/intervention.js +140 -0
- package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
- package/dist/cjs/fiscal/sync/lease.js +146 -0
- package/dist/cjs/fiscal/sync/lease.js.map +1 -0
- package/dist/cjs/fiscal/sync/observability.js +244 -0
- package/dist/cjs/fiscal/sync/observability.js.map +1 -0
- package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
- package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/cjs/fiscal/sync/policy.js +143 -0
- package/dist/cjs/fiscal/sync/policy.js.map +1 -0
- package/dist/cjs/fiscal/sync/reprocess.js +241 -0
- package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
- package/dist/cjs/fiscal/sync/retry.js +183 -0
- package/dist/cjs/fiscal/sync/retry.js.map +1 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/cjs/fiscal/transport/https.js +309 -0
- package/dist/cjs/fiscal/transport/https.js.map +1 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js +380 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/cjs/fiscal/transport/types.js +93 -0
- package/dist/cjs/fiscal/transport/types.js.map +1 -0
- package/dist/cjs/import/br-documents.js +85 -0
- package/dist/cjs/import/br-documents.js.map +1 -0
- package/dist/cjs/import/clients-import.js +347 -40
- package/dist/cjs/import/clients-import.js.map +1 -1
- package/dist/cjs/index.js +461 -73
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +164 -19
- package/dist/cjs/legal/documents.js.map +1 -1
- package/dist/cjs/legal/index.js +3 -1
- package/dist/cjs/legal/index.js.map +1 -1
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/onboarding/persistence.js +4 -4
- package/dist/cjs/onboarding/persistence.js.map +1 -1
- package/dist/cjs/pilot/go-live-checklist.js +212 -0
- package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
- package/dist/cjs/pilot/milestone.js +79 -0
- package/dist/cjs/pilot/milestone.js.map +1 -0
- package/dist/cjs/platform/capabilities.js +173 -0
- package/dist/cjs/platform/capabilities.js.map +1 -0
- package/dist/cjs/platform/job-contract.js +411 -0
- package/dist/cjs/platform/job-contract.js.map +1 -0
- package/dist/cjs/rbac/catalog.js +110 -0
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/subscription-billing/index.js +9 -1
- package/dist/cjs/subscription-billing/index.js.map +1 -1
- package/dist/cjs/subscription-billing/platform-exemption.js +121 -0
- package/dist/cjs/subscription-billing/platform-exemption.js.map +1 -0
- package/dist/cjs/subscription-billing/service.js +246 -78
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/tenancy/features.js +131 -0
- package/dist/cjs/tenancy/features.js.map +1 -0
- package/dist/cjs/tenancy/settings.js +224 -0
- package/dist/cjs/tenancy/settings.js.map +1 -0
- package/dist/cjs/users/repository.js +24 -1
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +92 -5
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/ibge.d.ts +17 -0
- package/dist/clients/ibge.d.ts.map +1 -0
- package/dist/clients/ibge.js +112 -0
- package/dist/clients/ibge.js.map +1 -0
- package/dist/clients/registry/http.d.ts +61 -0
- package/dist/clients/registry/http.d.ts.map +1 -0
- package/dist/clients/registry/http.js +151 -0
- package/dist/clients/registry/http.js.map +1 -0
- package/dist/clients/registry/ibge-municipios.d.ts +25 -0
- package/dist/clients/registry/ibge-municipios.d.ts.map +1 -0
- package/dist/clients/registry/ibge-municipios.js +25 -0
- package/dist/clients/registry/ibge-municipios.js.map +1 -0
- package/dist/clients/registry/ibge.d.ts +62 -0
- package/dist/clients/registry/ibge.d.ts.map +1 -0
- package/dist/clients/registry/ibge.js +57 -0
- package/dist/clients/registry/ibge.js.map +1 -0
- package/dist/clients/registry/lookup.d.ts +94 -0
- package/dist/clients/registry/lookup.d.ts.map +1 -0
- package/dist/clients/registry/lookup.js +184 -0
- package/dist/clients/registry/lookup.js.map +1 -0
- package/dist/clients/registry/provider.d.ts +124 -0
- package/dist/clients/registry/provider.d.ts.map +1 -0
- package/dist/clients/registry/provider.js +39 -0
- package/dist/clients/registry/provider.js.map +1 -0
- package/dist/clients/registry/resolve.d.ts +36 -0
- package/dist/clients/registry/resolve.d.ts.map +1 -0
- package/dist/clients/registry/resolve.js +44 -0
- package/dist/clients/registry/resolve.js.map +1 -0
- package/dist/clients/registry/serpro.d.ts +57 -0
- package/dist/clients/registry/serpro.d.ts.map +1 -0
- package/dist/clients/registry/serpro.js +143 -0
- package/dist/clients/registry/serpro.js.map +1 -0
- package/dist/clients/registry/service.d.ts +59 -0
- package/dist/clients/registry/service.d.ts.map +1 -0
- package/dist/clients/registry/service.js +225 -0
- package/dist/clients/registry/service.js.map +1 -0
- package/dist/clients/registry/synthetic.d.ts +30 -0
- package/dist/clients/registry/synthetic.d.ts.map +1 -0
- package/dist/clients/registry/synthetic.js +161 -0
- package/dist/clients/registry/synthetic.js.map +1 -0
- package/dist/clients/repository.d.ts +158 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +186 -9
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +65 -0
- package/dist/collection/branding.d.ts.map +1 -1
- package/dist/collection/branding.js +186 -0
- package/dist/collection/branding.js.map +1 -1
- package/dist/collection/clearance-store.d.ts +39 -0
- package/dist/collection/clearance-store.d.ts.map +1 -0
- package/dist/collection/clearance-store.js +69 -0
- package/dist/collection/clearance-store.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +37 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -1
- package/dist/collection/communication-runtime.js +63 -1
- package/dist/collection/communication-runtime.js.map +1 -1
- package/dist/collection/engine.d.ts +23 -0
- package/dist/collection/engine.d.ts.map +1 -1
- package/dist/collection/engine.js +20 -0
- package/dist/collection/engine.js.map +1 -1
- package/dist/collection/policy.d.ts +25 -0
- package/dist/collection/policy.d.ts.map +1 -1
- package/dist/collection/policy.js +27 -0
- package/dist/collection/policy.js.map +1 -1
- package/dist/communication/clearance.d.ts +53 -0
- package/dist/communication/clearance.d.ts.map +1 -0
- package/dist/communication/clearance.js +15 -0
- package/dist/communication/clearance.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -1
- package/dist/communication/dry-run-scenario.js +5 -0
- package/dist/communication/dry-run-scenario.js.map +1 -1
- package/dist/communication/engine.d.ts +10 -0
- package/dist/communication/engine.d.ts.map +1 -1
- package/dist/communication/engine.js +12 -0
- package/dist/communication/engine.js.map +1 -1
- package/dist/communication/policy.d.ts +16 -0
- package/dist/communication/policy.d.ts.map +1 -1
- package/dist/communication/policy.js.map +1 -1
- package/dist/competence/business-days.d.ts +51 -0
- package/dist/competence/business-days.d.ts.map +1 -0
- package/dist/competence/business-days.js +145 -0
- package/dist/competence/business-days.js.map +1 -0
- package/dist/competence/catalog-validation.d.ts +86 -0
- package/dist/competence/catalog-validation.d.ts.map +1 -0
- package/dist/competence/catalog-validation.js +168 -0
- package/dist/competence/catalog-validation.js.map +1 -0
- package/dist/competence/obligation-preview.d.ts +103 -0
- package/dist/competence/obligation-preview.d.ts.map +1 -0
- package/dist/competence/obligation-preview.js +184 -0
- package/dist/competence/obligation-preview.js.map +1 -0
- package/dist/competence/repository.d.ts +139 -1
- package/dist/competence/repository.d.ts.map +1 -1
- package/dist/competence/repository.js +325 -17
- package/dist/competence/repository.js.map +1 -1
- package/dist/dashboard/pilot-panel.d.ts +100 -0
- package/dist/dashboard/pilot-panel.d.ts.map +1 -0
- package/dist/dashboard/pilot-panel.js +87 -0
- package/dist/dashboard/pilot-panel.js.map +1 -0
- package/dist/dashboard/repository.d.ts.map +1 -1
- package/dist/dashboard/repository.js +11 -1
- package/dist/dashboard/repository.js.map +1 -1
- package/dist/db/client.d.ts +45 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +16 -11
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrate.d.ts +36 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +199 -32
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/provision-e2e-identity.d.ts +2 -0
- package/dist/db/provision-e2e-identity.d.ts.map +1 -0
- package/dist/db/provision-e2e-identity.js +114 -0
- package/dist/db/provision-e2e-identity.js.map +1 -0
- package/dist/fiscal/applicability.d.ts +73 -0
- package/dist/fiscal/applicability.d.ts.map +1 -0
- package/dist/fiscal/applicability.js +160 -0
- package/dist/fiscal/applicability.js.map +1 -0
- package/dist/fiscal/collection/authorization.d.ts +152 -0
- package/dist/fiscal/collection/authorization.d.ts.map +1 -0
- package/dist/fiscal/collection/authorization.js +178 -0
- package/dist/fiscal/collection/authorization.js.map +1 -0
- package/dist/fiscal/collection/competence.d.ts +66 -0
- package/dist/fiscal/collection/competence.d.ts.map +1 -0
- package/dist/fiscal/collection/competence.js +90 -0
- package/dist/fiscal/collection/competence.js.map +1 -0
- package/dist/fiscal/collection/first-contact.d.ts +103 -0
- package/dist/fiscal/collection/first-contact.d.ts.map +1 -0
- package/dist/fiscal/collection/first-contact.js +201 -0
- package/dist/fiscal/collection/first-contact.js.map +1 -0
- package/dist/fiscal/collection/plan.d.ts +74 -0
- package/dist/fiscal/collection/plan.d.ts.map +1 -0
- package/dist/fiscal/collection/plan.js +119 -0
- package/dist/fiscal/collection/plan.js.map +1 -0
- package/dist/fiscal/conditions.d.ts +99 -0
- package/dist/fiscal/conditions.d.ts.map +1 -0
- package/dist/fiscal/conditions.js +190 -0
- package/dist/fiscal/conditions.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/fiscal/coverage/model.d.ts +114 -0
- package/dist/fiscal/coverage/model.d.ts.map +1 -0
- package/dist/fiscal/coverage/model.js +130 -0
- package/dist/fiscal/coverage/model.js.map +1 -0
- package/dist/fiscal/coverage/requests.d.ts +70 -0
- package/dist/fiscal/coverage/requests.d.ts.map +1 -0
- package/dist/fiscal/coverage/requests.js +95 -0
- package/dist/fiscal/coverage/requests.js.map +1 -0
- package/dist/fiscal/credentials/inspect.d.ts +114 -0
- package/dist/fiscal/credentials/inspect.d.ts.map +1 -0
- package/dist/fiscal/credentials/inspect.js +178 -0
- package/dist/fiscal/credentials/inspect.js.map +1 -0
- package/dist/fiscal/credentials/material.d.ts +81 -0
- package/dist/fiscal/credentials/material.d.ts.map +1 -0
- package/dist/fiscal/credentials/material.js +164 -0
- package/dist/fiscal/credentials/material.js.map +1 -0
- package/dist/fiscal/credentials/onboarding.d.ts +119 -0
- package/dist/fiscal/credentials/onboarding.d.ts.map +1 -0
- package/dist/fiscal/credentials/onboarding.js +259 -0
- package/dist/fiscal/credentials/onboarding.js.map +1 -0
- package/dist/fiscal/credentials/readiness.d.ts +119 -0
- package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
- package/dist/fiscal/credentials/readiness.js +186 -0
- package/dist/fiscal/credentials/readiness.js.map +1 -0
- package/dist/fiscal/eligibility.d.ts +106 -0
- package/dist/fiscal/eligibility.d.ts.map +1 -0
- package/dist/fiscal/eligibility.js +194 -0
- package/dist/fiscal/eligibility.js.map +1 -0
- package/dist/fiscal/enrollment.d.ts +91 -0
- package/dist/fiscal/enrollment.d.ts.map +1 -0
- package/dist/fiscal/enrollment.js +126 -0
- package/dist/fiscal/enrollment.js.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.js +220 -0
- package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/fiscal/ingestion/direction.d.ts +60 -0
- package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
- package/dist/fiscal/ingestion/direction.js +32 -0
- package/dist/fiscal/ingestion/direction.js.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.js +222 -0
- package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
- package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
- package/dist/fiscal/ingestion/pipeline.js +699 -0
- package/dist/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/fiscal/ingestion/provider.d.ts +206 -0
- package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/provider.js +47 -0
- package/dist/fiscal/ingestion/provider.js.map +1 -0
- package/dist/fiscal/ingestion/repository.d.ts +82 -0
- package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
- package/dist/fiscal/ingestion/repository.js +127 -0
- package/dist/fiscal/ingestion/repository.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
- package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
- package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.js +112 -0
- package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/fiscal/repository.d.ts +220 -0
- package/dist/fiscal/repository.d.ts.map +1 -0
- package/dist/fiscal/repository.js +449 -0
- package/dist/fiscal/repository.js.map +1 -0
- package/dist/fiscal/sync/circuit.d.ts +86 -0
- package/dist/fiscal/sync/circuit.d.ts.map +1 -0
- package/dist/fiscal/sync/circuit.js +118 -0
- package/dist/fiscal/sync/circuit.js.map +1 -0
- package/dist/fiscal/sync/intervention.d.ts +81 -0
- package/dist/fiscal/sync/intervention.d.ts.map +1 -0
- package/dist/fiscal/sync/intervention.js +135 -0
- package/dist/fiscal/sync/intervention.js.map +1 -0
- package/dist/fiscal/sync/lease.d.ts +118 -0
- package/dist/fiscal/sync/lease.d.ts.map +1 -0
- package/dist/fiscal/sync/lease.js +139 -0
- package/dist/fiscal/sync/lease.js.map +1 -0
- package/dist/fiscal/sync/observability.d.ts +148 -0
- package/dist/fiscal/sync/observability.d.ts.map +1 -0
- package/dist/fiscal/sync/observability.js +239 -0
- package/dist/fiscal/sync/observability.js.map +1 -0
- package/dist/fiscal/sync/orchestrator.d.ts +132 -0
- package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
- package/dist/fiscal/sync/orchestrator.js +487 -0
- package/dist/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/fiscal/sync/policy.d.ts +87 -0
- package/dist/fiscal/sync/policy.d.ts.map +1 -0
- package/dist/fiscal/sync/policy.js +136 -0
- package/dist/fiscal/sync/policy.js.map +1 -0
- package/dist/fiscal/sync/reprocess.d.ts +76 -0
- package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
- package/dist/fiscal/sync/reprocess.js +237 -0
- package/dist/fiscal/sync/reprocess.js.map +1 -0
- package/dist/fiscal/sync/retry.d.ts +82 -0
- package/dist/fiscal/sync/retry.d.ts.map +1 -0
- package/dist/fiscal/sync/retry.js +176 -0
- package/dist/fiscal/sync/retry.js.map +1 -0
- package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
- package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
- package/dist/fiscal/sync/secret-boundary.js +116 -0
- package/dist/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/fiscal/transport/https.d.ts +86 -0
- package/dist/fiscal/transport/https.d.ts.map +1 -0
- package/dist/fiscal/transport/https.js +303 -0
- package/dist/fiscal/transport/https.js.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts +99 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.js +374 -0
- package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/fiscal/transport/types.d.ts +134 -0
- package/dist/fiscal/transport/types.d.ts.map +1 -0
- package/dist/fiscal/transport/types.js +88 -0
- package/dist/fiscal/transport/types.js.map +1 -0
- package/dist/import/br-documents.d.ts +26 -0
- package/dist/import/br-documents.d.ts.map +1 -0
- package/dist/import/br-documents.js +78 -0
- package/dist/import/br-documents.js.map +1 -0
- package/dist/import/clients-import.d.ts +122 -4
- package/dist/import/clients-import.d.ts.map +1 -1
- package/dist/import/clients-import.js +341 -41
- package/dist/import/clients-import.js.map +1 -1
- package/dist/index.d.ts +145 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +120 -7
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts +12 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +162 -18
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +2 -2
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/index.js +1 -1
- package/dist/legal/index.js.map +1 -1
- package/dist/legal/types.d.ts +114 -2
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js.map +1 -1
- package/dist/onboarding/persistence.d.ts +10 -1
- package/dist/onboarding/persistence.d.ts.map +1 -1
- package/dist/onboarding/persistence.js +4 -4
- package/dist/onboarding/persistence.js.map +1 -1
- package/dist/pilot/go-live-checklist.d.ts +41 -0
- package/dist/pilot/go-live-checklist.d.ts.map +1 -0
- package/dist/pilot/go-live-checklist.js +209 -0
- package/dist/pilot/go-live-checklist.js.map +1 -0
- package/dist/pilot/milestone.d.ts +56 -0
- package/dist/pilot/milestone.d.ts.map +1 -0
- package/dist/pilot/milestone.js +74 -0
- package/dist/pilot/milestone.js.map +1 -0
- package/dist/platform/capabilities.d.ts +88 -0
- package/dist/platform/capabilities.d.ts.map +1 -0
- package/dist/platform/capabilities.js +169 -0
- package/dist/platform/capabilities.js.map +1 -0
- package/dist/platform/job-contract.d.ts +232 -0
- package/dist/platform/job-contract.d.ts.map +1 -0
- package/dist/platform/job-contract.js +403 -0
- package/dist/platform/job-contract.js.map +1 -0
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +110 -0
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/subscription-billing/index.d.ts +8 -5
- package/dist/subscription-billing/index.d.ts.map +1 -1
- package/dist/subscription-billing/index.js +4 -3
- package/dist/subscription-billing/index.js.map +1 -1
- package/dist/subscription-billing/platform-exemption.d.ts +89 -0
- package/dist/subscription-billing/platform-exemption.d.ts.map +1 -0
- package/dist/subscription-billing/platform-exemption.js +113 -0
- package/dist/subscription-billing/platform-exemption.js.map +1 -0
- package/dist/subscription-billing/service.d.ts +74 -0
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +182 -16
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/tenancy/features.d.ts +69 -0
- package/dist/tenancy/features.d.ts.map +1 -0
- package/dist/tenancy/features.js +123 -0
- package/dist/tenancy/features.js.map +1 -0
- package/dist/tenancy/settings.d.ts +63 -0
- package/dist/tenancy/settings.d.ts.map +1 -0
- package/dist/tenancy/settings.js +218 -0
- package/dist/tenancy/settings.js.map +1 -0
- package/dist/users/repository.d.ts +16 -1
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +24 -1
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +69 -1
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +88 -5
- package/dist/vault/repository.js.map +1 -1
- package/package.json +10 -2
- package/src/db/migrations/0045_role_write_scope.sql +122 -0
- package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
- package/src/db/migrations/0047_recipient_clearance.sql +89 -0
- package/src/db/migrations/0048_item_type_note.sql +16 -0
- package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
- package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
- package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
- package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
- package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
- package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
- package/src/db/migrations/0055_job_capability_contract.sql +300 -0
- package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
- package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
- package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
- package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
- package/src/db/migrations/0060_fiscal_credential_vault_and_run_authorization.sql +321 -0
- package/src/db/migrations/0061_client_official_registry_provenance.sql +193 -0
- package/src/db/migrations/0062_first_contact_and_capability_truth.sql +119 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { uuidv7 } from '@baruk/shared';
|
|
2
|
+
/**
|
|
3
|
+
* Prazo padrão da vez.
|
|
4
|
+
*
|
|
5
|
+
* Dez minutos: mais do que qualquer lote de 50 documentos precisa, e menos do
|
|
6
|
+
* que o intervalo entre ciclos diários — de modo que um worker morto nunca
|
|
7
|
+
* atrase o cliente para o dia seguinte. Lotes longos renovam com `heartbeat`.
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_LEASE_TTL_MS = 10 * 60_000;
|
|
10
|
+
/**
|
|
11
|
+
* Toma a vez. Devolve `null` quando outro processo VIVO a tem.
|
|
12
|
+
*
|
|
13
|
+
* `null` não é erro e não merece log de erro: é a resposta correta e frequente
|
|
14
|
+
* quando dois workers percorrem a mesma carteira.
|
|
15
|
+
*/
|
|
16
|
+
export async function acquireFiscalSyncLease(tx, input) {
|
|
17
|
+
const now = input.now ?? new Date();
|
|
18
|
+
const expiresAt = new Date(now.getTime() + (input.ttlMs ?? DEFAULT_LEASE_TTL_MS));
|
|
19
|
+
const { stream } = input;
|
|
20
|
+
// A CTE fotografa o titular ANTERIOR. Ela não participa da exclusão — quem
|
|
21
|
+
// exclui é o `ON CONFLICT` —, serve só para dizer se esta tomada veio de uma
|
|
22
|
+
// vez devolvida (caminho normal) ou arrancada de um titular vencido (worker
|
|
23
|
+
// morto). Sob disputa real a segunda transação nem chega aqui: ela bloqueia
|
|
24
|
+
// na linha e depois reprova no `WHERE`.
|
|
25
|
+
const rows = await tx `
|
|
26
|
+
WITH anterior AS (
|
|
27
|
+
SELECT released_at
|
|
28
|
+
FROM fiscal_sync_lease
|
|
29
|
+
WHERE tenant_id = ${input.tenantId} AND client_id = ${stream.clientId}
|
|
30
|
+
AND source = ${stream.source} AND environment = ${stream.environment}
|
|
31
|
+
AND document_type = ${stream.documentType}
|
|
32
|
+
)
|
|
33
|
+
INSERT INTO fiscal_sync_lease (
|
|
34
|
+
id, tenant_id, client_id, source, environment, document_type,
|
|
35
|
+
holder, run_id, acquired_at, heartbeat_at, expires_at, released_at, updated_at
|
|
36
|
+
) VALUES (
|
|
37
|
+
${uuidv7()}, ${input.tenantId}, ${stream.clientId}, ${stream.source},
|
|
38
|
+
${stream.environment}, ${stream.documentType},
|
|
39
|
+
${input.holder}, ${input.runId ?? null}, ${now}, ${now}, ${expiresAt}, NULL, now()
|
|
40
|
+
)
|
|
41
|
+
ON CONFLICT (tenant_id, client_id, source, environment, document_type)
|
|
42
|
+
DO UPDATE SET
|
|
43
|
+
holder = EXCLUDED.holder,
|
|
44
|
+
run_id = EXCLUDED.run_id,
|
|
45
|
+
acquired_at = EXCLUDED.acquired_at,
|
|
46
|
+
heartbeat_at = EXCLUDED.heartbeat_at,
|
|
47
|
+
expires_at = EXCLUDED.expires_at,
|
|
48
|
+
released_at = NULL,
|
|
49
|
+
-- Só conta como RETOMADA quando o titular anterior não devolveu. Uma vez
|
|
50
|
+
-- livre e devolvida é o caminho normal, e inflá-lo apagaria o sinal de
|
|
51
|
+
-- que existe um worker morrendo no meio do lote.
|
|
52
|
+
recovered_count = fiscal_sync_lease.recovered_count
|
|
53
|
+
+ CASE WHEN fiscal_sync_lease.released_at IS NULL THEN 1 ELSE 0 END,
|
|
54
|
+
updated_at = now()
|
|
55
|
+
WHERE fiscal_sync_lease.released_at IS NOT NULL
|
|
56
|
+
OR fiscal_sync_lease.expires_at <= ${now}
|
|
57
|
+
RETURNING id, holder, acquired_at, expires_at, recovered_count,
|
|
58
|
+
(SELECT released_at IS NULL FROM anterior) AS recovered
|
|
59
|
+
`;
|
|
60
|
+
const r = rows[0];
|
|
61
|
+
if (!r)
|
|
62
|
+
return null;
|
|
63
|
+
return {
|
|
64
|
+
id: r.id,
|
|
65
|
+
holder: r.holder,
|
|
66
|
+
acquiredAt: r.acquired_at,
|
|
67
|
+
expiresAt: r.expires_at,
|
|
68
|
+
recoveredCount: r.recovered_count,
|
|
69
|
+
// Sem linha anterior a CTE devolve NULL: é uma vez nova, não uma retomada.
|
|
70
|
+
recovered: r.recovered === true,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Renova o prazo — e confirma que a vez ainda é nossa.
|
|
75
|
+
*
|
|
76
|
+
* O `WHERE holder = ...` não é zelo: um lote que demorou mais do que o prazo já
|
|
77
|
+
* PERDEU a vez para outro worker, e continuar escrevendo depois disso é
|
|
78
|
+
* exatamente a corrida que o lease existe para impedir. `false` significa
|
|
79
|
+
* "pare agora", e quem chama tem de obedecer.
|
|
80
|
+
*/
|
|
81
|
+
export async function heartbeatFiscalSyncLease(tx, input) {
|
|
82
|
+
const now = input.now ?? new Date();
|
|
83
|
+
const expiresAt = new Date(now.getTime() + (input.ttlMs ?? DEFAULT_LEASE_TTL_MS));
|
|
84
|
+
const rows = await tx `
|
|
85
|
+
UPDATE fiscal_sync_lease
|
|
86
|
+
SET heartbeat_at = ${now}, expires_at = ${expiresAt}, updated_at = now()
|
|
87
|
+
WHERE id = ${input.leaseId}
|
|
88
|
+
AND holder = ${input.holder}
|
|
89
|
+
AND released_at IS NULL
|
|
90
|
+
AND expires_at > ${now}
|
|
91
|
+
RETURNING id
|
|
92
|
+
`;
|
|
93
|
+
return rows.length > 0;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Devolve a vez.
|
|
97
|
+
*
|
|
98
|
+
* Idempotente e tolerante: devolver uma vez que já foi tomada por outro não é
|
|
99
|
+
* erro, é o desfecho normal de um worker que demorou demais. Devolve `false`
|
|
100
|
+
* para que a trilha saiba, sem lançar.
|
|
101
|
+
*/
|
|
102
|
+
export async function releaseFiscalSyncLease(tx, input) {
|
|
103
|
+
const now = input.now ?? new Date();
|
|
104
|
+
const rows = await tx `
|
|
105
|
+
UPDATE fiscal_sync_lease
|
|
106
|
+
SET released_at = ${now}, updated_at = now()
|
|
107
|
+
WHERE id = ${input.leaseId} AND holder = ${input.holder} AND released_at IS NULL
|
|
108
|
+
RETURNING id
|
|
109
|
+
`;
|
|
110
|
+
return rows.length > 0;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* As vezes vencidas que ninguém devolveu.
|
|
114
|
+
*
|
|
115
|
+
* A retomada não depende desta função — `acquire` já toma o que venceu. Ela
|
|
116
|
+
* existe para OBSERVAÇÃO: uma lista que nunca esvazia é um worker que morre
|
|
117
|
+
* sempre no mesmo cliente, e isso é uma pergunta que nenhum contador agregado
|
|
118
|
+
* responde.
|
|
119
|
+
*/
|
|
120
|
+
export async function listStaleFiscalSyncLeases(tx, now = new Date()) {
|
|
121
|
+
const rows = await tx `
|
|
122
|
+
SELECT id, client_id, source, environment, document_type, holder,
|
|
123
|
+
expires_at, recovered_count
|
|
124
|
+
FROM fiscal_sync_lease
|
|
125
|
+
WHERE released_at IS NULL AND expires_at <= ${now}
|
|
126
|
+
ORDER BY expires_at
|
|
127
|
+
`;
|
|
128
|
+
return rows.map((r) => ({
|
|
129
|
+
id: r.id,
|
|
130
|
+
clientId: r.client_id,
|
|
131
|
+
source: r.source,
|
|
132
|
+
environment: r.environment,
|
|
133
|
+
documentType: r.document_type,
|
|
134
|
+
holder: r.holder,
|
|
135
|
+
expiresAt: r.expires_at,
|
|
136
|
+
recoveredCount: r.recovered_count,
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease.js","sourceRoot":"","sources":["../../../src/fiscal/sync/lease.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import type { Tx } from '../../db/client.js';
|
|
2
|
+
import type { FiscalDocumentType } from '../ingestion/provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* O que aconteceu, contado a partir do banco — e nunca a partir de estimativa.
|
|
5
|
+
*
|
|
6
|
+
* ## Toda métrica aqui é FACTUAL
|
|
7
|
+
*
|
|
8
|
+
* Cada número sai de linhas gravadas por execuções que de fato ocorreram. Não há
|
|
9
|
+
* contador em memória (que zera a cada deploy e mente sobre o histórico), nem
|
|
10
|
+
* valor derivado de suposição sobre comportamento humano.
|
|
11
|
+
*
|
|
12
|
+
* Essa disciplina custa: a métrica que o produto mais gostaria de mostrar —
|
|
13
|
+
* "minutos de trabalho economizados" — não existe aqui, porque ela exige um
|
|
14
|
+
* baseline humano que ninguém mediu. Inventar um multiplicador ("cada nota
|
|
15
|
+
* baixada à mão leva 4 minutos") produziria um número bonito, citável e falso, e
|
|
16
|
+
* a primeira pessoa a cronometrar o próprio trabalho descobriria a fraude.
|
|
17
|
+
*
|
|
18
|
+
* O que existe é a MEDIÇÃO PRONTA: o denominador e o numerador estão
|
|
19
|
+
* registrados, e no dia em que alguém cronometrar o trabalho manual real, a
|
|
20
|
+
* conta fecha sem precisar de schema novo.
|
|
21
|
+
*/
|
|
22
|
+
export interface FiscalOperationalMetrics {
|
|
23
|
+
/** Execuções registradas, por desfecho. */
|
|
24
|
+
runsTotal: number;
|
|
25
|
+
runsSuccess: number;
|
|
26
|
+
runsFailure: number;
|
|
27
|
+
runsBlocked: number;
|
|
28
|
+
documentsFetched: number;
|
|
29
|
+
documentsNew: number;
|
|
30
|
+
documentsDuplicate: number;
|
|
31
|
+
documentsFailed: number;
|
|
32
|
+
eventsPending: number;
|
|
33
|
+
eventsApplied: number;
|
|
34
|
+
eventsReconciled: number;
|
|
35
|
+
providerErrors: number;
|
|
36
|
+
/** Milissegundos. `null` quando nenhuma execução mediu duração. */
|
|
37
|
+
syncDurationMsP50: number | null;
|
|
38
|
+
syncDurationMsMax: number | null;
|
|
39
|
+
lastSuccessfulSyncAt: string | null;
|
|
40
|
+
/** Vezes tomadas de titulares que não as devolveram. Worker morrendo. */
|
|
41
|
+
leaseRecoveries: number;
|
|
42
|
+
staleLeases: number;
|
|
43
|
+
openInterventions: number;
|
|
44
|
+
openCircuits: number;
|
|
45
|
+
}
|
|
46
|
+
export declare function fiscalOperationalMetrics(tx: Tx, now?: Date): Promise<FiscalOperationalMetrics>;
|
|
47
|
+
/**
|
|
48
|
+
* As métricas de VALOR — e a honestidade sobre o que cada uma prova.
|
|
49
|
+
*
|
|
50
|
+
* Cada campo vem com o que ele significa exatamente, porque a diferença entre
|
|
51
|
+
* "documento coletado" e "download evitado" é onde um painel de produto começa a
|
|
52
|
+
* mentir sem que ninguém tenha mentido de propósito.
|
|
53
|
+
*/
|
|
54
|
+
export interface FiscalValueMetrics {
|
|
55
|
+
/**
|
|
56
|
+
* Documentos que chegaram por automação. Fato direto: linhas de
|
|
57
|
+
* `fiscal_document` cuja origem não é entrega manual.
|
|
58
|
+
*/
|
|
59
|
+
documentsAutomaticallyCollected: number;
|
|
60
|
+
/**
|
|
61
|
+
* Downloads de portal evitados.
|
|
62
|
+
*
|
|
63
|
+
* DEFINIÇÃO: um documento coletado automaticamente COM o XML original
|
|
64
|
+
* preservado é um arquivo que ninguém precisou baixar. É medição de arquivo,
|
|
65
|
+
* não de tempo — e a distinção importa: um resumo (`summary`) coletado ainda
|
|
66
|
+
* exigiria alguém buscar o documento completo, então ele não conta.
|
|
67
|
+
*/
|
|
68
|
+
manualDownloadsAvoided: number;
|
|
69
|
+
/**
|
|
70
|
+
* Pedidos ao cliente evitados — PARCIAL, e por um motivo que não some.
|
|
71
|
+
*
|
|
72
|
+
* O numerador é medível: competências de `docs_fiscais_mes` cuja coleta
|
|
73
|
+
* automática trouxe documento. O que NÃO é medível é se o escritório de fato
|
|
74
|
+
* teria pedido ao cliente naquela competência — isso depende de uma rotina
|
|
75
|
+
* humana que ninguém registrou. O número abaixo é um limite SUPERIOR honesto,
|
|
76
|
+
* e o campo `basis` diz isso em voz alta.
|
|
77
|
+
*/
|
|
78
|
+
clientRequestsAvoided: number;
|
|
79
|
+
clientRequestsAvoidedBasis: 'upper_bound_no_human_baseline';
|
|
80
|
+
/**
|
|
81
|
+
* Intervenções humanas exigidas. Fato direto, e o contrapeso das outras três:
|
|
82
|
+
* automação que gera tarefa não economizou nada.
|
|
83
|
+
*/
|
|
84
|
+
humanInterventionsRequired: number;
|
|
85
|
+
humanInterventionsResolved: number;
|
|
86
|
+
/**
|
|
87
|
+
* O que NÃO está aqui, e por quê.
|
|
88
|
+
*
|
|
89
|
+
* `estimatedMinutesSaved` exigiria cronometrar o trabalho manual real. Sem
|
|
90
|
+
* esse baseline, qualquer número seria um multiplicador inventado — e o campo
|
|
91
|
+
* declara a ausência em vez de deixar quem lê supor que esquecemos.
|
|
92
|
+
*/
|
|
93
|
+
estimatedMinutesSaved: null;
|
|
94
|
+
minutesSavedBlockedBy: 'human_baseline_not_measured';
|
|
95
|
+
}
|
|
96
|
+
export declare function fiscalValueMetrics(tx: Tx): Promise<FiscalValueMetrics>;
|
|
97
|
+
/**
|
|
98
|
+
* O estado operacional de UM cliente.
|
|
99
|
+
*
|
|
100
|
+
* ## Nenhum destes é um semáforo inventado
|
|
101
|
+
*
|
|
102
|
+
* Cada valor sai de um fato do banco, e a ordem de avaliação vai do mais
|
|
103
|
+
* específico ao mais genérico — dizer "erro" quando na verdade ninguém ligou a
|
|
104
|
+
* automação seria culpar o sistema pela ausência de decisão de uma pessoa.
|
|
105
|
+
*
|
|
106
|
+
* `DISABLED` sem política de cadência. Escolha legítima.
|
|
107
|
+
* `UNSUPPORTED` não há caminho de coleta conhecido para este cliente.
|
|
108
|
+
* `AUTH_REQUIRED` credencial vencida, inválida ou recusada.
|
|
109
|
+
* `SYNCING` há uma vez tomada e viva neste instante.
|
|
110
|
+
* `ERROR` a última execução falhou e ninguém resolveu.
|
|
111
|
+
* `DEGRADED` há execução recente boa E fila humana aberta.
|
|
112
|
+
* `HEALTHY` sincronizou com sucesso na última vez.
|
|
113
|
+
* `READY` tudo em ordem e nenhuma execução ainda.
|
|
114
|
+
*/
|
|
115
|
+
export type FiscalClientOperationalStatus = 'DISABLED' | 'READY' | 'SYNCING' | 'HEALTHY' | 'DEGRADED' | 'AUTH_REQUIRED' | 'ERROR' | 'UNSUPPORTED';
|
|
116
|
+
export interface FiscalClientSyncRow {
|
|
117
|
+
clientId: string;
|
|
118
|
+
clientName: string | null;
|
|
119
|
+
documentType: FiscalDocumentType;
|
|
120
|
+
source: string | null;
|
|
121
|
+
environment: string | null;
|
|
122
|
+
status: FiscalClientOperationalStatus;
|
|
123
|
+
frequency: string;
|
|
124
|
+
lastSuccessAt: string | null;
|
|
125
|
+
lastStartedAt: string | null;
|
|
126
|
+
nextRunAt: string | null;
|
|
127
|
+
lastErrorClass: string | null;
|
|
128
|
+
consecutiveFailures: number;
|
|
129
|
+
cursor: string | null;
|
|
130
|
+
documentsCollected: number;
|
|
131
|
+
openInterventions: number;
|
|
132
|
+
coverageStatus: string;
|
|
133
|
+
leaseHolder: string | null;
|
|
134
|
+
detail: string;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* O painel por cliente.
|
|
138
|
+
*
|
|
139
|
+
* Uma consulta só, e não N+1: a tela lista a carteira inteira, e um `for` com
|
|
140
|
+
* quatro consultas por cliente transformaria trinta clientes em cento e vinte
|
|
141
|
+
* viagens ao banco. A cobertura entra por junção lateral com a MESMA regra do
|
|
142
|
+
* módulo de cobertura — pergunta municipal só é respondida por linha municipal.
|
|
143
|
+
*/
|
|
144
|
+
export declare function listFiscalClientSyncStatus(tx: Tx, input?: {
|
|
145
|
+
documentType?: FiscalDocumentType;
|
|
146
|
+
now?: Date;
|
|
147
|
+
}): Promise<FiscalClientSyncRow[]>;
|
|
148
|
+
//# sourceMappingURL=observability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../../src/fiscal/sync/observability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
export async function fiscalOperationalMetrics(tx, now = new Date()) {
|
|
2
|
+
const [runs] = await tx `
|
|
3
|
+
SELECT count(*)::int AS total,
|
|
4
|
+
count(*) FILTER (WHERE outcome IN ('completed','no_documents'))::int AS success,
|
|
5
|
+
count(*) FILTER (WHERE outcome IN ('failed','provider_error'))::int AS failure,
|
|
6
|
+
count(*) FILTER (WHERE outcome LIKE 'blocked%' OR outcome = 'throttled')::int
|
|
7
|
+
AS blocked,
|
|
8
|
+
coalesce(sum(documents_fetched), 0)::int AS fetched,
|
|
9
|
+
coalesce(sum(documents_new), 0)::int AS novos,
|
|
10
|
+
coalesce(sum(documents_duplicate), 0)::int AS dup,
|
|
11
|
+
coalesce(sum(documents_failed), 0)::int AS falhos,
|
|
12
|
+
coalesce(sum(events_pending), 0)::int AS pend,
|
|
13
|
+
coalesce(sum(events_applied), 0)::int AS apl,
|
|
14
|
+
coalesce(sum(events_reconciled), 0)::int AS rec,
|
|
15
|
+
count(*) FILTER (WHERE outcome = 'provider_error')::int AS prov,
|
|
16
|
+
-- Percentil, e não média: uma execução de dez minutos entre mil de um
|
|
17
|
+
-- segundo move a média e não move a mediana — e é a mediana que
|
|
18
|
+
-- descreve o que acontece na maioria das vezes.
|
|
19
|
+
(percentile_disc(0.5) WITHIN GROUP (ORDER BY duration_ms)
|
|
20
|
+
FILTER (WHERE duration_ms IS NOT NULL))::int AS p50,
|
|
21
|
+
max(duration_ms)::int AS max,
|
|
22
|
+
max(finished_at) FILTER (WHERE outcome IN ('completed','no_documents')) AS ultimo
|
|
23
|
+
FROM fiscal_sync_run
|
|
24
|
+
`;
|
|
25
|
+
const [leases] = await tx `
|
|
26
|
+
SELECT coalesce(sum(recovered_count), 0)::int AS recuperacoes,
|
|
27
|
+
count(*) FILTER (WHERE released_at IS NULL AND expires_at <= ${now})::int AS vencidos
|
|
28
|
+
FROM fiscal_sync_lease
|
|
29
|
+
`;
|
|
30
|
+
const [fila] = await tx `
|
|
31
|
+
SELECT count(*)::int AS abertas FROM fiscal_intervention WHERE state <> 'resolved'
|
|
32
|
+
`;
|
|
33
|
+
const [circuitos] = await tx `
|
|
34
|
+
SELECT count(*)::int AS abertos
|
|
35
|
+
FROM fiscal_provider_circuit
|
|
36
|
+
WHERE state = 'open' AND (open_until IS NULL OR open_until > ${now})
|
|
37
|
+
`;
|
|
38
|
+
return {
|
|
39
|
+
runsTotal: runs?.total ?? 0,
|
|
40
|
+
runsSuccess: runs?.success ?? 0,
|
|
41
|
+
runsFailure: runs?.failure ?? 0,
|
|
42
|
+
runsBlocked: runs?.blocked ?? 0,
|
|
43
|
+
documentsFetched: runs?.fetched ?? 0,
|
|
44
|
+
documentsNew: runs?.novos ?? 0,
|
|
45
|
+
documentsDuplicate: runs?.dup ?? 0,
|
|
46
|
+
documentsFailed: runs?.falhos ?? 0,
|
|
47
|
+
eventsPending: runs?.pend ?? 0,
|
|
48
|
+
eventsApplied: runs?.apl ?? 0,
|
|
49
|
+
eventsReconciled: runs?.rec ?? 0,
|
|
50
|
+
providerErrors: runs?.prov ?? 0,
|
|
51
|
+
syncDurationMsP50: runs?.p50 ?? null,
|
|
52
|
+
syncDurationMsMax: runs?.max ?? null,
|
|
53
|
+
lastSuccessfulSyncAt: runs?.ultimo?.toISOString() ?? null,
|
|
54
|
+
leaseRecoveries: leases?.recuperacoes ?? 0,
|
|
55
|
+
staleLeases: leases?.vencidos ?? 0,
|
|
56
|
+
openInterventions: fila?.abertas ?? 0,
|
|
57
|
+
openCircuits: circuitos?.abertos ?? 0,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export async function fiscalValueMetrics(tx) {
|
|
61
|
+
const [docs] = await tx `
|
|
62
|
+
SELECT count(*) FILTER (WHERE source <> 'manual')::int AS automaticos,
|
|
63
|
+
count(*) FILTER (WHERE source <> 'manual' AND raw_blob_id IS NOT NULL
|
|
64
|
+
AND content_kind = 'full')::int AS "comRaw"
|
|
65
|
+
FROM fiscal_document
|
|
66
|
+
`;
|
|
67
|
+
const [pedidos] = await tx `
|
|
68
|
+
-- Competências de "Documentos fiscais do mês" em que a automação trouxe ao
|
|
69
|
+
-- menos um documento daquele cliente. A junção é pela COMPETÊNCIA, não pela
|
|
70
|
+
-- data de emissão: são conceitos independentes, e confundi-los erraria o
|
|
71
|
+
-- fechamento (a mesma distinção que a 0056 registra em competence_label).
|
|
72
|
+
SELECT count(DISTINCT (ri.client_id, c.label))::int AS n
|
|
73
|
+
FROM recurring_instance ri
|
|
74
|
+
JOIN recurring_item_type rit ON rit.id = ri.item_type_id
|
|
75
|
+
JOIN competence c ON c.id = ri.competence_id
|
|
76
|
+
WHERE rit.key = 'docs_fiscais_mes'
|
|
77
|
+
AND ri.deleted_at IS NULL
|
|
78
|
+
AND EXISTS (
|
|
79
|
+
SELECT 1 FROM fiscal_document fd
|
|
80
|
+
WHERE fd.client_id = ri.client_id
|
|
81
|
+
AND fd.competence_label = c.label
|
|
82
|
+
AND fd.source <> 'manual'
|
|
83
|
+
)
|
|
84
|
+
`;
|
|
85
|
+
const [fila] = await tx `
|
|
86
|
+
SELECT count(*) FILTER (WHERE state <> 'resolved')::int AS abertas,
|
|
87
|
+
count(*) FILTER (WHERE state = 'resolved')::int AS resolvidas
|
|
88
|
+
FROM fiscal_intervention
|
|
89
|
+
`;
|
|
90
|
+
return {
|
|
91
|
+
documentsAutomaticallyCollected: docs?.automaticos ?? 0,
|
|
92
|
+
manualDownloadsAvoided: docs?.comRaw ?? 0,
|
|
93
|
+
clientRequestsAvoided: pedidos?.n ?? 0,
|
|
94
|
+
clientRequestsAvoidedBasis: 'upper_bound_no_human_baseline',
|
|
95
|
+
humanInterventionsRequired: fila?.abertas ?? 0,
|
|
96
|
+
humanInterventionsResolved: fila?.resolvidas ?? 0,
|
|
97
|
+
estimatedMinutesSaved: null,
|
|
98
|
+
minutesSavedBlockedBy: 'human_baseline_not_measured',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* O painel por cliente.
|
|
103
|
+
*
|
|
104
|
+
* Uma consulta só, e não N+1: a tela lista a carteira inteira, e um `for` com
|
|
105
|
+
* quatro consultas por cliente transformaria trinta clientes em cento e vinte
|
|
106
|
+
* viagens ao banco. A cobertura entra por junção lateral com a MESMA regra do
|
|
107
|
+
* módulo de cobertura — pergunta municipal só é respondida por linha municipal.
|
|
108
|
+
*/
|
|
109
|
+
export async function listFiscalClientSyncStatus(tx, input = {}) {
|
|
110
|
+
const documentType = input.documentType ?? 'nfse';
|
|
111
|
+
const now = input.now ?? new Date();
|
|
112
|
+
const rows = await tx `
|
|
113
|
+
SELECT c.id AS client_id,
|
|
114
|
+
c.display_name AS client_name,
|
|
115
|
+
c.municipality_ibge_code,
|
|
116
|
+
cur.source,
|
|
117
|
+
cur.environment,
|
|
118
|
+
pol.frequency,
|
|
119
|
+
cur.last_success_at,
|
|
120
|
+
cur.last_started_at,
|
|
121
|
+
cur.next_attempt_after,
|
|
122
|
+
cur.next_eligible_run_at,
|
|
123
|
+
cur.last_error_class,
|
|
124
|
+
cur.consecutive_failures,
|
|
125
|
+
cur.last_nsu,
|
|
126
|
+
(SELECT count(*)::int FROM fiscal_document d
|
|
127
|
+
WHERE d.client_id = c.id AND d.document_type = ${documentType}) AS documentos,
|
|
128
|
+
(SELECT count(*)::int FROM fiscal_intervention i
|
|
129
|
+
WHERE i.client_id = c.id AND i.state <> 'resolved') AS intervencoes,
|
|
130
|
+
(SELECT bool_or(i.kind IN ('certificate_expired','certificate_invalid','auth_required'))
|
|
131
|
+
FROM fiscal_intervention i
|
|
132
|
+
WHERE i.client_id = c.id AND i.state <> 'resolved') AS cred_expirada,
|
|
133
|
+
(SELECT l.holder FROM fiscal_sync_lease l
|
|
134
|
+
WHERE l.client_id = c.id AND l.document_type = ${documentType}
|
|
135
|
+
AND l.released_at IS NULL AND l.expires_at > ${now}
|
|
136
|
+
LIMIT 1) AS lease_holder,
|
|
137
|
+
cov.coverage_status
|
|
138
|
+
FROM client c
|
|
139
|
+
JOIN client_fiscal_enrollment e
|
|
140
|
+
ON e.client_id = c.id AND e.document_type = ${documentType} AND e.revoked_at IS NULL
|
|
141
|
+
LEFT JOIN fiscal_sync_cursor cur
|
|
142
|
+
ON cur.client_id = c.id AND cur.environment = (
|
|
143
|
+
SELECT mode FROM tenant_fiscal_automation LIMIT 1
|
|
144
|
+
)
|
|
145
|
+
LEFT JOIN LATERAL (
|
|
146
|
+
SELECT frequency FROM fiscal_sync_policy p
|
|
147
|
+
WHERE p.document_type = ${documentType}
|
|
148
|
+
AND (p.client_id = c.id OR p.client_id IS NULL)
|
|
149
|
+
ORDER BY p.client_id NULLS LAST
|
|
150
|
+
LIMIT 1
|
|
151
|
+
) pol ON true
|
|
152
|
+
LEFT JOIN LATERAL (
|
|
153
|
+
-- A MESMA regra do módulo de cobertura, e a razão de ela estar repetida
|
|
154
|
+
-- aqui é performance de listagem: uma pergunta municipal só encontra
|
|
155
|
+
-- linha municipal (a exata do IBGE, senão a padrão). Nunca sobe para a
|
|
156
|
+
-- nacional — é assim que "o ADN cobre o Brasil inteiro" entraria.
|
|
157
|
+
SELECT fc.coverage_status
|
|
158
|
+
FROM fiscal_coverage fc
|
|
159
|
+
WHERE fc.document_type = ${documentType}
|
|
160
|
+
AND fc.jurisdiction_scope = ${documentType === 'nfse' ? 'municipal' : 'national'}
|
|
161
|
+
AND (fc.jurisdiction_code = c.municipality_ibge_code OR fc.jurisdiction_code IS NULL)
|
|
162
|
+
ORDER BY fc.jurisdiction_code NULLS LAST
|
|
163
|
+
LIMIT 1
|
|
164
|
+
) cov ON true
|
|
165
|
+
WHERE c.deleted_at IS NULL
|
|
166
|
+
ORDER BY c.display_name
|
|
167
|
+
`;
|
|
168
|
+
return rows.map((r) => {
|
|
169
|
+
const cobertura = r.coverage_status ?? 'UNKNOWN';
|
|
170
|
+
const frequency = r.frequency ?? 'disabled';
|
|
171
|
+
const gate = maior(r.next_eligible_run_at, r.next_attempt_after);
|
|
172
|
+
const status = (() => {
|
|
173
|
+
if (r.cred_expirada)
|
|
174
|
+
return 'AUTH_REQUIRED';
|
|
175
|
+
if (cobertura === 'UNSUPPORTED')
|
|
176
|
+
return 'UNSUPPORTED';
|
|
177
|
+
if (frequency === 'disabled')
|
|
178
|
+
return 'DISABLED';
|
|
179
|
+
if (r.lease_holder)
|
|
180
|
+
return 'SYNCING';
|
|
181
|
+
if (r.last_error_class)
|
|
182
|
+
return 'ERROR';
|
|
183
|
+
if (r.last_success_at)
|
|
184
|
+
return (r.intervencoes ?? 0) > 0 ? 'DEGRADED' : 'HEALTHY';
|
|
185
|
+
return 'READY';
|
|
186
|
+
})();
|
|
187
|
+
return {
|
|
188
|
+
clientId: r.client_id,
|
|
189
|
+
clientName: r.client_name,
|
|
190
|
+
documentType,
|
|
191
|
+
source: r.source,
|
|
192
|
+
environment: r.environment,
|
|
193
|
+
status,
|
|
194
|
+
frequency,
|
|
195
|
+
lastSuccessAt: r.last_success_at?.toISOString() ?? null,
|
|
196
|
+
lastStartedAt: r.last_started_at?.toISOString() ?? null,
|
|
197
|
+
nextRunAt: gate?.toISOString() ?? null,
|
|
198
|
+
lastErrorClass: r.last_error_class,
|
|
199
|
+
consecutiveFailures: r.consecutive_failures ?? 0,
|
|
200
|
+
cursor: r.last_nsu,
|
|
201
|
+
documentsCollected: r.documentos,
|
|
202
|
+
openInterventions: r.intervencoes,
|
|
203
|
+
coverageStatus: cobertura,
|
|
204
|
+
leaseHolder: r.lease_holder,
|
|
205
|
+
detail: describe(status, cobertura, frequency),
|
|
206
|
+
};
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
function maior(a, b) {
|
|
210
|
+
if (!a)
|
|
211
|
+
return b;
|
|
212
|
+
if (!b)
|
|
213
|
+
return a;
|
|
214
|
+
return a > b ? a : b;
|
|
215
|
+
}
|
|
216
|
+
/** A frase que explica o estado. Fato, nunca conselho genérico. */
|
|
217
|
+
function describe(status, coverage, frequency) {
|
|
218
|
+
switch (status) {
|
|
219
|
+
case 'DISABLED':
|
|
220
|
+
return 'Cadência desligada. Inscrever o cliente não liga a busca automática.';
|
|
221
|
+
case 'UNSUPPORTED':
|
|
222
|
+
return 'Não há caminho de coleta automática conhecido para esta jurisdição.';
|
|
223
|
+
case 'AUTH_REQUIRED':
|
|
224
|
+
return 'Certificado vencido, inválido ou recusado. Só uma pessoa resolve.';
|
|
225
|
+
case 'SYNCING':
|
|
226
|
+
return 'Uma execução está com a vez deste fluxo agora.';
|
|
227
|
+
case 'ERROR':
|
|
228
|
+
return 'A última execução falhou. O cursor não avançou — nada foi perdido.';
|
|
229
|
+
case 'DEGRADED':
|
|
230
|
+
return 'A última execução deu certo, mas há pendência humana aberta.';
|
|
231
|
+
case 'HEALTHY':
|
|
232
|
+
return `Sincronizando em cadência ${frequency}.`;
|
|
233
|
+
case 'READY':
|
|
234
|
+
return coverage === 'UNKNOWN'
|
|
235
|
+
? 'Habilitado, mas a cobertura desta jurisdição é desconhecida.'
|
|
236
|
+
: 'Habilitado e ainda sem execução concluída.';
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# 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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"}
|