@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
|
@@ -3,20 +3,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.contactabilityOf = contactabilityOf;
|
|
4
4
|
exports.normalizeEmail = normalizeEmail;
|
|
5
5
|
exports.normalizePhone = normalizePhone;
|
|
6
|
+
exports.normalizeUf = normalizeUf;
|
|
6
7
|
exports.createClient = createClient;
|
|
7
8
|
exports.listClients = listClients;
|
|
8
9
|
exports.getClient = getClient;
|
|
9
10
|
exports.renameClient = renameClient;
|
|
11
|
+
exports.tenantHasPhoneChannel = tenantHasPhoneChannel;
|
|
10
12
|
exports.listClientsPaged = listClientsPaged;
|
|
11
13
|
exports.updateClient = updateClient;
|
|
12
14
|
exports.softDeleteClient = softDeleteClient;
|
|
13
15
|
exports.findClientIdByDocument = findClientIdByDocument;
|
|
16
|
+
exports.assignClientResponsible = assignClientResponsible;
|
|
17
|
+
exports.portfolioByResponsible = portfolioByResponsible;
|
|
14
18
|
const shared_1 = require("@baruk/shared");
|
|
15
19
|
const phone_js_1 = require("../contacts/phone.js");
|
|
16
|
-
|
|
20
|
+
const ibge_js_1 = require("./ibge.js");
|
|
21
|
+
function contactabilityOf(input,
|
|
22
|
+
/**
|
|
23
|
+
* Canais que o ESCRITÓRIO tem operacionais. Omitido = só e-mail, que é o
|
|
24
|
+
* estado de quem ainda não conectou telefone — e é o padrão hoje.
|
|
25
|
+
*/
|
|
26
|
+
channels = {}) {
|
|
17
27
|
const email = input.email?.trim() ? 'ready' : 'missing';
|
|
18
28
|
const phone = input.phone?.trim() ? 'ready' : 'missing';
|
|
19
|
-
|
|
29
|
+
const phoneChannelLigado = channels.phone === true;
|
|
30
|
+
const status = email === 'ready'
|
|
31
|
+
? 'email_ready'
|
|
32
|
+
: phone === 'ready'
|
|
33
|
+
? phoneChannelLigado
|
|
34
|
+
? 'phone_only'
|
|
35
|
+
: 'phone_no_channel'
|
|
36
|
+
: 'no_channel';
|
|
37
|
+
return {
|
|
38
|
+
email,
|
|
39
|
+
phone,
|
|
40
|
+
// `reachable` mantém o significado antigo — "tem contato cadastrado" — para
|
|
41
|
+
// não mudar o comportamento de quem já o consulta. Quem quer saber se a
|
|
42
|
+
// automação alcança usa `automated`.
|
|
43
|
+
reachable: email === 'ready' || phone === 'ready',
|
|
44
|
+
status,
|
|
45
|
+
automated: status === 'email_ready' || status === 'phone_only',
|
|
46
|
+
};
|
|
20
47
|
}
|
|
21
48
|
/**
|
|
22
49
|
* Normalização de contato.
|
|
@@ -41,7 +68,12 @@ function normalizePhone(v) {
|
|
|
41
68
|
return null;
|
|
42
69
|
return plus ? `+${digits}` : digits;
|
|
43
70
|
}
|
|
44
|
-
|
|
71
|
+
/** UF só entra em caixa alta; o banco recusa o resto, e recusar cedo dá erro melhor. */
|
|
72
|
+
function normalizeUf(v) {
|
|
73
|
+
const t = v?.trim().toUpperCase();
|
|
74
|
+
return t && /^[A-Z]{2}$/.test(t) ? t : null;
|
|
75
|
+
}
|
|
76
|
+
function mapRow(r, channels = {}) {
|
|
45
77
|
return {
|
|
46
78
|
id: r.id,
|
|
47
79
|
tenantId: r.tenant_id,
|
|
@@ -52,7 +84,17 @@ function mapRow(r) {
|
|
|
52
84
|
phone: r.phone ?? null,
|
|
53
85
|
status: r.status,
|
|
54
86
|
createdAt: r.created_at.toISOString(),
|
|
55
|
-
|
|
87
|
+
responsibleUserId: r.responsible_user_id ?? null,
|
|
88
|
+
municipality: r.municipality ?? null,
|
|
89
|
+
stateUf: r.state_uf ?? null,
|
|
90
|
+
legalName: r.legal_name ?? null,
|
|
91
|
+
tradeName: r.trade_name ?? null,
|
|
92
|
+
addressLine: r.address_line ?? null,
|
|
93
|
+
postalCode: r.postal_code ?? null,
|
|
94
|
+
notes: r.notes ?? null,
|
|
95
|
+
municipalityIbgeCode: r.municipality_ibge_code ?? null,
|
|
96
|
+
communicationClearedAt: r.communication_cleared_at?.toISOString() ?? null,
|
|
97
|
+
contactability: contactabilityOf({ email: r.email, phone: r.phone }, channels),
|
|
56
98
|
};
|
|
57
99
|
}
|
|
58
100
|
/**
|
|
@@ -70,21 +112,39 @@ function asDuplicateDocument(err) {
|
|
|
70
112
|
}
|
|
71
113
|
}
|
|
72
114
|
async function createClient(tx, input) {
|
|
115
|
+
// Antes de gravar: o código IBGE não pode contradizer a UF. Aqui o estado
|
|
116
|
+
// resultante é o próprio input — não há linha anterior com que se misturar.
|
|
117
|
+
(0, ibge_js_1.assertIbgeCoherent)(input.municipalityIbgeCode?.trim() || null, normalizeUf(input.stateUf));
|
|
73
118
|
// tenant_id vem da GUC — nunca do input. A WITH CHECK da RLS recusa qualquer
|
|
74
119
|
// tentativa de gravar fora do tenant corrente.
|
|
75
120
|
try {
|
|
76
121
|
const rows = await tx `
|
|
77
|
-
INSERT INTO client (id, tenant_id, client_type, display_name,
|
|
78
|
-
|
|
122
|
+
INSERT INTO client (id, tenant_id, client_type, display_name, legal_name, trade_name,
|
|
123
|
+
document_number,
|
|
124
|
+
email, phone, phone_e164, address_line, municipality, state_uf,
|
|
125
|
+
municipality_ibge_code,
|
|
126
|
+
postal_code, notes, responsible_user_id, contract_started_on,
|
|
127
|
+
import_batch_id, created_by)
|
|
79
128
|
VALUES (
|
|
80
129
|
${(0, shared_1.uuidv7)()},
|
|
81
130
|
current_setting('app.current_tenant')::uuid,
|
|
82
131
|
${input.clientType ?? 'pj'},
|
|
83
132
|
${input.displayName},
|
|
133
|
+
${input.legalName?.trim() || null},
|
|
134
|
+
${input.tradeName?.trim() || null},
|
|
84
135
|
${input.documentNumber ?? null},
|
|
85
136
|
${normalizeEmail(input.email)},
|
|
86
137
|
${normalizePhone(input.phone)},
|
|
87
138
|
${(0, phone_js_1.toE164OrNull)(input.phone)},
|
|
139
|
+
${input.addressLine?.trim() || null},
|
|
140
|
+
${input.municipality?.trim() || null},
|
|
141
|
+
${normalizeUf(input.stateUf)},
|
|
142
|
+
${input.municipalityIbgeCode?.trim() || null},
|
|
143
|
+
${input.postalCode?.trim() || null},
|
|
144
|
+
${input.notes?.trim() || null},
|
|
145
|
+
${input.responsibleUserId ?? null},
|
|
146
|
+
${input.contractStartedOn ?? null},
|
|
147
|
+
${input.importBatchId ?? null},
|
|
88
148
|
${input.createdBy ?? null}
|
|
89
149
|
)
|
|
90
150
|
RETURNING id, tenant_id, client_type, display_name, document_number, email, phone,
|
|
@@ -108,7 +168,9 @@ async function listClients(tx) {
|
|
|
108
168
|
}
|
|
109
169
|
async function getClient(tx, id) {
|
|
110
170
|
const rows = await tx `
|
|
111
|
-
SELECT id, tenant_id, client_type, display_name, document_number, email, phone,
|
|
171
|
+
SELECT id, tenant_id, client_type, display_name, legal_name, trade_name, document_number, email, phone,
|
|
172
|
+
status, created_at, responsible_user_id, address_line, municipality, state_uf,
|
|
173
|
+
municipality_ibge_code, postal_code, notes
|
|
112
174
|
FROM client
|
|
113
175
|
WHERE id = ${id} AND deleted_at IS NULL
|
|
114
176
|
`;
|
|
@@ -129,24 +191,68 @@ async function renameClient(tx, id, displayName) {
|
|
|
129
191
|
`;
|
|
130
192
|
return rows.count;
|
|
131
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* O escritório tem canal de telefone operacional?
|
|
196
|
+
*
|
|
197
|
+
* Decide se um cliente que só tem telefone é `phone_only` (situação normal) ou
|
|
198
|
+
* `phone_no_channel` (pendência). A consulta roda sob RLS, então enxerga só o
|
|
199
|
+
* `channel_binding` do tenant do contexto.
|
|
200
|
+
*
|
|
201
|
+
* Uma consulta por listagem, não uma por linha: a resposta é a mesma para todos
|
|
202
|
+
* os clientes do escritório.
|
|
203
|
+
*/
|
|
204
|
+
async function tenantHasPhoneChannel(tx) {
|
|
205
|
+
const rows = await tx `
|
|
206
|
+
SELECT count(*)::int AS n FROM channel_binding
|
|
207
|
+
WHERE channel IN ('whatsapp', 'sms') AND revoked_at IS NULL
|
|
208
|
+
`;
|
|
209
|
+
return (rows[0]?.n ?? 0) > 0;
|
|
210
|
+
}
|
|
132
211
|
async function listClientsPaged(tx, filter = {}) {
|
|
133
212
|
const limit = Math.min(filter.limit ?? 20, 100);
|
|
134
213
|
const offset = filter.offset ?? 0;
|
|
135
214
|
const like = filter.search ? `%${filter.search}%` : null;
|
|
136
215
|
const rows = await tx `
|
|
137
216
|
SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at,
|
|
217
|
+
responsible_user_id, municipality, state_uf, communication_cleared_at,
|
|
138
218
|
count(*) OVER() AS total
|
|
139
219
|
FROM client
|
|
140
220
|
WHERE deleted_at IS NULL
|
|
141
221
|
AND (${filter.status ?? null}::text IS NULL OR status = ${filter.status ?? null})
|
|
142
222
|
AND (${like}::text IS NULL OR display_name ILIKE ${like} OR document_number ILIKE ${like})
|
|
223
|
+
AND (${filter.responsibleUserId ?? null}::text IS NULL
|
|
224
|
+
OR (${filter.responsibleUserId ?? null} = 'unassigned' AND responsible_user_id IS NULL)
|
|
225
|
+
OR responsible_user_id::text = ${filter.responsibleUserId ?? null})
|
|
143
226
|
ORDER BY created_at DESC
|
|
144
227
|
LIMIT ${limit} OFFSET ${offset}
|
|
145
228
|
`;
|
|
146
229
|
const total = rows[0] ? Number(rows[0].total) : 0;
|
|
147
|
-
|
|
230
|
+
const phone = await tenantHasPhoneChannel(tx);
|
|
231
|
+
return { items: rows.map((r) => mapRow(r, { phone })), total };
|
|
148
232
|
}
|
|
149
233
|
async function updateClient(tx, id, input) {
|
|
234
|
+
// Coerência IBGE↔UF do ESTADO RESULTANTE, não do corpo da requisição.
|
|
235
|
+
//
|
|
236
|
+
// Um PATCH que manda só `stateUf` deixa no banco o código IBGE de antes;
|
|
237
|
+
// validar apenas o payload aprovaria trocar a UF de GO para SP mantendo o
|
|
238
|
+
// município goiano gravado. Por isso lemos a linha e mesclamos antes.
|
|
239
|
+
//
|
|
240
|
+
// O SELECT só acontece quando um dos dois campos está no corpo: o PATCH
|
|
241
|
+
// comum (nome, telefone, status) continua sendo uma única query.
|
|
242
|
+
if ('municipalityIbgeCode' in input || 'stateUf' in input) {
|
|
243
|
+
const [atual] = await tx `
|
|
244
|
+
SELECT state_uf, municipality_ibge_code FROM client WHERE id = ${id} AND deleted_at IS NULL
|
|
245
|
+
`;
|
|
246
|
+
// Sem linha, quem responde é o UPDATE abaixo com 0 afetadas (404). Recusar
|
|
247
|
+
// aqui por validação transformaria "cliente não existe" em "dado inválido".
|
|
248
|
+
if (atual) {
|
|
249
|
+
const code = 'municipalityIbgeCode' in input
|
|
250
|
+
? input.municipalityIbgeCode?.trim() || null
|
|
251
|
+
: atual.municipality_ibge_code;
|
|
252
|
+
const uf = 'stateUf' in input ? normalizeUf(input.stateUf) : atual.state_uf;
|
|
253
|
+
(0, ibge_js_1.assertIbgeCoherent)(code, uf);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
150
256
|
// Corrigir um documento para um que já existe cai na mesma violação — e o
|
|
151
257
|
// escritório precisa da mesma explicação, não de um 500.
|
|
152
258
|
// Casts explícitos: parâmetros NULL sem tipo quebram COALESCE ("could not
|
|
@@ -155,7 +261,8 @@ async function updateClient(tx, id, input) {
|
|
|
155
261
|
const rows = await tx `
|
|
156
262
|
UPDATE client SET
|
|
157
263
|
display_name = COALESCE(${input.displayName ?? null}::text, display_name),
|
|
158
|
-
legal_name =
|
|
264
|
+
legal_name = CASE WHEN ${'legalName' in input} THEN ${input.legalName?.trim() || null}::text ELSE legal_name END,
|
|
265
|
+
trade_name = CASE WHEN ${'tradeName' in input} THEN ${input.tradeName?.trim() || null}::text ELSE trade_name END,
|
|
159
266
|
document_number = COALESCE(${input.documentNumber ?? null}::text, document_number),
|
|
160
267
|
email = COALESCE(${normalizeEmail(input.email)}::citext, email),
|
|
161
268
|
phone = COALESCE(${normalizePhone(input.phone)}::text, phone),
|
|
@@ -167,6 +274,14 @@ async function updateClient(tx, id, input) {
|
|
|
167
274
|
phone_e164 = CASE WHEN ${input.phone ?? null}::text IS NULL THEN phone_e164
|
|
168
275
|
ELSE ${(0, phone_js_1.toE164OrNull)(input.phone)}::text END,
|
|
169
276
|
status = COALESCE(${input.status ?? null}::text, status),
|
|
277
|
+
-- Presença, nao valor: ausente preserva, null apaga. Um COALESCE aqui
|
|
278
|
+
-- tornaria a UF errada permanente -- so daria para troca-la por outra.
|
|
279
|
+
address_line = CASE WHEN ${'addressLine' in input} THEN ${input.addressLine?.trim() || null}::text ELSE address_line END,
|
|
280
|
+
municipality = CASE WHEN ${'municipality' in input} THEN ${input.municipality?.trim() || null}::text ELSE municipality END,
|
|
281
|
+
municipality_ibge_code = CASE WHEN ${'municipalityIbgeCode' in input} THEN ${input.municipalityIbgeCode?.trim() || null}::text ELSE municipality_ibge_code END,
|
|
282
|
+
state_uf = CASE WHEN ${'stateUf' in input} THEN ${normalizeUf(input.stateUf)}::text ELSE state_uf END,
|
|
283
|
+
postal_code = CASE WHEN ${'postalCode' in input} THEN ${input.postalCode?.trim() || null}::text ELSE postal_code END,
|
|
284
|
+
notes = CASE WHEN ${'notes' in input} THEN ${input.notes?.trim() || null}::text ELSE notes END,
|
|
170
285
|
updated_by = ${input.updatedBy ?? null}::uuid,
|
|
171
286
|
updated_at = now(),
|
|
172
287
|
version = version + 1
|
|
@@ -196,4 +311,70 @@ async function findClientIdByDocument(tx, documentNumber) {
|
|
|
196
311
|
`;
|
|
197
312
|
return rows[0]?.id ?? null;
|
|
198
313
|
}
|
|
314
|
+
/**
|
|
315
|
+
* Troca o responsável pela carteira de um cliente.
|
|
316
|
+
*
|
|
317
|
+
* Devolve quem era e quem passou a ser, para que a auditoria registre a
|
|
318
|
+
* TRANSIÇÃO e não apenas o destino. "Passou a ser da Ana" não responde a
|
|
319
|
+
* pergunta que se faz meses depois — "saiu de quem?" — e é essa que importa
|
|
320
|
+
* quando um cliente deixa de ser atendido.
|
|
321
|
+
*
|
|
322
|
+
* O usuário precisa ser membro ativo do escritório. Sem essa checagem, a FK
|
|
323
|
+
* aceitaria qualquer `user.id` do banco inteiro, inclusive de outro tenant:
|
|
324
|
+
* FKs ignoram RLS, então a barreira tem de ser explícita aqui.
|
|
325
|
+
*/
|
|
326
|
+
async function assignClientResponsible(tx, input) {
|
|
327
|
+
if (input.responsibleUserId) {
|
|
328
|
+
const [m] = await tx `
|
|
329
|
+
SELECT count(*)::int AS n FROM membership
|
|
330
|
+
WHERE user_id = ${input.responsibleUserId}
|
|
331
|
+
AND status = 'active' AND deleted_at IS NULL
|
|
332
|
+
`;
|
|
333
|
+
if ((m?.n ?? 0) === 0) {
|
|
334
|
+
throw new shared_1.NotFoundError('Usuário não é membro ativo deste escritório.');
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const [before] = await tx `
|
|
338
|
+
SELECT responsible_user_id FROM client WHERE id = ${input.clientId} AND deleted_at IS NULL
|
|
339
|
+
`;
|
|
340
|
+
if (!before)
|
|
341
|
+
throw new shared_1.NotFoundError('Cliente não encontrado.');
|
|
342
|
+
await tx `
|
|
343
|
+
UPDATE client
|
|
344
|
+
SET responsible_user_id = ${input.responsibleUserId}, updated_at = now()
|
|
345
|
+
WHERE id = ${input.clientId} AND deleted_at IS NULL
|
|
346
|
+
`;
|
|
347
|
+
return {
|
|
348
|
+
clientId: input.clientId,
|
|
349
|
+
from: before.responsible_user_id,
|
|
350
|
+
to: input.responsibleUserId,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* A carteira dividida por responsável.
|
|
355
|
+
*
|
|
356
|
+
* O balde `null` — clientes sem dono — vem junto, e vem por último, em vez de
|
|
357
|
+
* ser omitido. Uma carteira recém-importada é inteiramente desse balde, e uma
|
|
358
|
+
* tela que só lista responsáveis existentes mostraria zero clientes num
|
|
359
|
+
* escritório com trezentos.
|
|
360
|
+
*/
|
|
361
|
+
async function portfolioByResponsible(tx) {
|
|
362
|
+
const rows = await tx `
|
|
363
|
+
SELECT c.responsible_user_id,
|
|
364
|
+
u.full_name,
|
|
365
|
+
count(*)::int AS clients,
|
|
366
|
+
count(*) FILTER (WHERE c.email IS NULL)::int AS sem_canal
|
|
367
|
+
FROM client c
|
|
368
|
+
LEFT JOIN "user" u ON u.id = c.responsible_user_id
|
|
369
|
+
WHERE c.deleted_at IS NULL
|
|
370
|
+
GROUP BY c.responsible_user_id, u.full_name
|
|
371
|
+
ORDER BY (c.responsible_user_id IS NULL), u.full_name NULLS LAST
|
|
372
|
+
`;
|
|
373
|
+
return rows.map((r) => ({
|
|
374
|
+
responsibleUserId: r.responsible_user_id,
|
|
375
|
+
responsibleName: r.full_name,
|
|
376
|
+
clients: r.clients,
|
|
377
|
+
semCanalAutomatico: r.sem_canal,
|
|
378
|
+
}));
|
|
379
|
+
}
|
|
199
380
|
//# sourceMappingURL=repository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/clients/repository.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/clients/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BRANDING_KEYS = exports.BrandingValidationError = void 0;
|
|
3
4
|
exports.getTenantBranding = getTenantBranding;
|
|
4
5
|
exports.senderFor = senderFor;
|
|
6
|
+
exports.parseBrandingInput = parseBrandingInput;
|
|
7
|
+
exports.updateTenantBranding = updateTenantBranding;
|
|
8
|
+
const shared_1 = require("@baruk/shared");
|
|
5
9
|
/**
|
|
6
10
|
* Padrão neutro do produto — deliberadamente SEM marca.
|
|
7
11
|
*
|
|
@@ -137,4 +141,190 @@ function senderFor(branding, fallbackFrom) {
|
|
|
137
141
|
const name = branding.officeName.replace(/["<>\\]/g, '').trim();
|
|
138
142
|
return name ? `${name} <${address}>` : fallbackFrom;
|
|
139
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Erro de validação de marca.
|
|
146
|
+
*
|
|
147
|
+
* Estende `ValidationError` de propósito, em vez de ser um `Error` próprio: a
|
|
148
|
+
* borda HTTP já mapeia todo `AppError` para o status certo, e um erro fora
|
|
149
|
+
* dessa hierarquia sairia como 500 — culpando o servidor por um campo mal
|
|
150
|
+
* preenchido, e escondendo do formulário qual campo foi. O `field` viaja em
|
|
151
|
+
* `details` para a tela poder apontar a linha errada.
|
|
152
|
+
*/
|
|
153
|
+
class BrandingValidationError extends shared_1.ValidationError {
|
|
154
|
+
field;
|
|
155
|
+
constructor(field, message) {
|
|
156
|
+
super(message, { field });
|
|
157
|
+
this.field = field;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.BrandingValidationError = BrandingValidationError;
|
|
161
|
+
function strictColor(field, v) {
|
|
162
|
+
if (typeof v !== 'string' || !/^#[0-9a-fA-F]{6}$/.test(v)) {
|
|
163
|
+
throw new BrandingValidationError(field, `${field}: use uma cor no formato #RRGGBB.`);
|
|
164
|
+
}
|
|
165
|
+
return v;
|
|
166
|
+
}
|
|
167
|
+
function strictText(field, v, max) {
|
|
168
|
+
if (typeof v !== 'string') {
|
|
169
|
+
throw new BrandingValidationError(field, `${field}: texto inválido.`);
|
|
170
|
+
}
|
|
171
|
+
const t = v.trim();
|
|
172
|
+
if (!t)
|
|
173
|
+
throw new BrandingValidationError(field, `${field}: não pode ficar em branco.`);
|
|
174
|
+
if (t.length > max) {
|
|
175
|
+
throw new BrandingValidationError(field, `${field}: máximo de ${max} caracteres.`);
|
|
176
|
+
}
|
|
177
|
+
return t;
|
|
178
|
+
}
|
|
179
|
+
function strictHttpsUrl(field, v) {
|
|
180
|
+
const t = typeof v === 'string' ? v.trim() : '';
|
|
181
|
+
if (!/^https:\/\/[^\s"'<>]+$/i.test(t)) {
|
|
182
|
+
throw new BrandingValidationError(field, `${field}: informe uma URL https válida.`);
|
|
183
|
+
}
|
|
184
|
+
return t;
|
|
185
|
+
}
|
|
186
|
+
function strictLogoUrl(v) {
|
|
187
|
+
const url = strictHttpsUrl('logoUrl', v);
|
|
188
|
+
const path = url.split(/[?#]/)[0] ?? '';
|
|
189
|
+
if (!/\.(png|jpe?g)$/i.test(path)) {
|
|
190
|
+
// A recusa é específica de propósito: SVG é o formato em que os kits de
|
|
191
|
+
// marca vivem, e é exatamente o que Gmail e Outlook não desenham. Aceitar
|
|
192
|
+
// produziria um cabeçalho vazio — sem imagem e sem o nome que o fallback
|
|
193
|
+
// teria escrito.
|
|
194
|
+
throw new BrandingValidationError('logoUrl', 'logoUrl: a logomarca precisa ser .png, .jpg ou .jpeg. SVG não é renderizado por clientes de e-mail — rasterize antes.');
|
|
195
|
+
}
|
|
196
|
+
return url;
|
|
197
|
+
}
|
|
198
|
+
function strictFontFamily(v) {
|
|
199
|
+
const t = strictText('fontFamily', v, 160);
|
|
200
|
+
if (!/^[A-Za-z0-9 ,.'-]+$/.test(t)) {
|
|
201
|
+
throw new BrandingValidationError('fontFamily', 'fontFamily: use apenas letras, dígitos, espaço, vírgula, ponto, hífen e aspa simples. A stack vai para dentro de um atributo style, e os demais caracteres permitiriam escrever CSS na mensagem.');
|
|
202
|
+
}
|
|
203
|
+
return t;
|
|
204
|
+
}
|
|
205
|
+
/** Campos de cor, para não repetir a lista em dois lugares. */
|
|
206
|
+
const COLOR_FIELDS = [
|
|
207
|
+
'primaryColor',
|
|
208
|
+
'secondaryColor',
|
|
209
|
+
'accentColor',
|
|
210
|
+
'backgroundColor',
|
|
211
|
+
'textColor',
|
|
212
|
+
'mutedColor',
|
|
213
|
+
];
|
|
214
|
+
/**
|
|
215
|
+
* Valida a entrada e devolve o objeto a persistir em `tenant.settings.branding`.
|
|
216
|
+
*
|
|
217
|
+
* Só as chaves PRESENTES na entrada aparecem no resultado — quem manda três
|
|
218
|
+
* campos altera três campos. `null` vira ausência do campo no armazenado, que é
|
|
219
|
+
* como o leitor representa "não configurado".
|
|
220
|
+
*/
|
|
221
|
+
function parseBrandingInput(input) {
|
|
222
|
+
const out = {};
|
|
223
|
+
const set = (k, v) => {
|
|
224
|
+
if (v !== null)
|
|
225
|
+
out[k] = v;
|
|
226
|
+
};
|
|
227
|
+
if ('officeName' in input) {
|
|
228
|
+
set('officeName', input.officeName === null ? null : strictText('officeName', input.officeName, 160));
|
|
229
|
+
}
|
|
230
|
+
if ('signatureName' in input) {
|
|
231
|
+
set('signatureName', input.signatureName === null ? null : strictText('signatureName', input.signatureName, 160));
|
|
232
|
+
}
|
|
233
|
+
if ('tagline' in input) {
|
|
234
|
+
set('tagline', input.tagline === null ? null : strictText('tagline', input.tagline, 120));
|
|
235
|
+
}
|
|
236
|
+
if ('logoUrl' in input) {
|
|
237
|
+
set('logoUrl', input.logoUrl === null ? null : strictLogoUrl(input.logoUrl));
|
|
238
|
+
}
|
|
239
|
+
if ('logoKind' in input) {
|
|
240
|
+
if (input.logoKind === null)
|
|
241
|
+
set('logoKind', null);
|
|
242
|
+
else if (input.logoKind === 'symbol' || input.logoKind === 'lockup')
|
|
243
|
+
out.logoKind = input.logoKind;
|
|
244
|
+
else
|
|
245
|
+
throw new BrandingValidationError('logoKind', "logoKind: use 'symbol' ou 'lockup'.");
|
|
246
|
+
}
|
|
247
|
+
for (const field of COLOR_FIELDS) {
|
|
248
|
+
if (field in input) {
|
|
249
|
+
const v = input[field];
|
|
250
|
+
set(field, v === null ? null : strictColor(field, v));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if ('fontFamily' in input) {
|
|
254
|
+
set('fontFamily', input.fontFamily === null ? null : strictFontFamily(input.fontFamily));
|
|
255
|
+
}
|
|
256
|
+
if ('supportEmail' in input) {
|
|
257
|
+
if (input.supportEmail === null)
|
|
258
|
+
set('supportEmail', null);
|
|
259
|
+
else {
|
|
260
|
+
const t = strictText('supportEmail', input.supportEmail, 120);
|
|
261
|
+
if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(t)) {
|
|
262
|
+
throw new BrandingValidationError('supportEmail', 'supportEmail: e-mail inválido.');
|
|
263
|
+
}
|
|
264
|
+
out.supportEmail = t;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if ('supportPhone' in input) {
|
|
268
|
+
set('supportPhone', input.supportPhone === null ? null : strictText('supportPhone', input.supportPhone, 40));
|
|
269
|
+
}
|
|
270
|
+
if ('website' in input) {
|
|
271
|
+
set('website', input.website === null ? null : strictHttpsUrl('website', input.website));
|
|
272
|
+
}
|
|
273
|
+
return out;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Chaves que a marca ocupa dentro de `tenant.settings.branding`. Serve para o
|
|
277
|
+
* `null` REMOVER a chave em vez de gravar um nulo que o leitor teria de
|
|
278
|
+
* distinguir de ausente.
|
|
279
|
+
*/
|
|
280
|
+
exports.BRANDING_KEYS = [
|
|
281
|
+
'officeName',
|
|
282
|
+
'signatureName',
|
|
283
|
+
'tagline',
|
|
284
|
+
'logoUrl',
|
|
285
|
+
'logoKind',
|
|
286
|
+
...COLOR_FIELDS,
|
|
287
|
+
'fontFamily',
|
|
288
|
+
'supportEmail',
|
|
289
|
+
'supportPhone',
|
|
290
|
+
'website',
|
|
291
|
+
];
|
|
292
|
+
/**
|
|
293
|
+
* Grava a marca do tenant CORRENTE.
|
|
294
|
+
*
|
|
295
|
+
* Dois pontos que a implementação não pode perder de vista:
|
|
296
|
+
*
|
|
297
|
+
* 1. **`tenant` não tem RLS.** É a tabela raiz — a fonte da fronteira, não uma
|
|
298
|
+
* linha protegida por ela. Por isso o `WHERE` amarra na GUC e a função NÃO
|
|
299
|
+
* aceita `tenantId` por parâmetro: parâmetro é pedido do chamador, e pedido
|
|
300
|
+
* do chamador não é fronteira. Sem contexto, zero linhas e erro.
|
|
301
|
+
*
|
|
302
|
+
* 2. **O merge acontece no banco, não na aplicação.** `settings` guarda mais
|
|
303
|
+
* que a marca. Ler-modificar-escrever perderia a escrita concorrente de
|
|
304
|
+
* outra chave; `jsonb ||` resolve dentro da própria instrução.
|
|
305
|
+
*/
|
|
306
|
+
async function updateTenantBranding(tx, input) {
|
|
307
|
+
const patch = parseBrandingInput(input);
|
|
308
|
+
const removals = Object.entries(input)
|
|
309
|
+
.filter(([k, v]) => v === null && exports.BRANDING_KEYS.includes(k))
|
|
310
|
+
.map(([k]) => k);
|
|
311
|
+
const rows = await tx `
|
|
312
|
+
UPDATE tenant
|
|
313
|
+
SET settings = jsonb_set(
|
|
314
|
+
settings,
|
|
315
|
+
'{branding}',
|
|
316
|
+
(COALESCE(settings -> 'branding', '{}'::jsonb) - ${removals}::text[])
|
|
317
|
+
|| ${tx.json(patch)}::jsonb,
|
|
318
|
+
true
|
|
319
|
+
),
|
|
320
|
+
updated_at = now()
|
|
321
|
+
WHERE id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
|
|
322
|
+
AND deleted_at IS NULL
|
|
323
|
+
RETURNING id
|
|
324
|
+
`;
|
|
325
|
+
if (!rows[0]) {
|
|
326
|
+
throw new BrandingValidationError('tenant', 'Sem contexto de escritório: a marca não pode ser gravada.');
|
|
327
|
+
}
|
|
328
|
+
return getTenantBranding(tx);
|
|
329
|
+
}
|
|
140
330
|
//# sourceMappingURL=branding.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branding.js","sourceRoot":"","sources":["../../../src/collection/branding.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"branding.js","sourceRoot":"","sources":["../../../src/collection/branding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createClientClearanceStore = createClientClearanceStore;
|
|
4
|
+
exports.setClientClearance = setClientClearance;
|
|
5
|
+
exports.clearanceSummary = clearanceSummary;
|
|
6
|
+
/**
|
|
7
|
+
* Liberação lida da ficha do cliente.
|
|
8
|
+
*
|
|
9
|
+
* `recipientRef` é o id do cliente — a mesma referência que o consentimento e a
|
|
10
|
+
* idempotência usam. A liberação é do CLIENTE, não do canal: quem confere o
|
|
11
|
+
* cadastro confere a pessoa, e um escritório que liberou o e-mail e não o
|
|
12
|
+
* WhatsApp está descrevendo qual canal quer usar, não quem já foi conferido.
|
|
13
|
+
* Se um dia a distinção por canal for necessária, ela entra aqui sem mexer no
|
|
14
|
+
* motor.
|
|
15
|
+
*/
|
|
16
|
+
function createClientClearanceStore(tx) {
|
|
17
|
+
return {
|
|
18
|
+
async find(recipientRef, _channel) {
|
|
19
|
+
const rows = await tx `
|
|
20
|
+
SELECT communication_cleared_at
|
|
21
|
+
FROM client
|
|
22
|
+
WHERE id = ${recipientRef} AND deleted_at IS NULL
|
|
23
|
+
`;
|
|
24
|
+
// Cliente inexistente ou apagado não é "liberado por omissão": é um
|
|
25
|
+
// destinatário que o sistema não conhece, e o motor deve pular.
|
|
26
|
+
const at = rows[0]?.communication_cleared_at ?? null;
|
|
27
|
+
return { cleared: at !== null, clearedAt: at?.toISOString() ?? null };
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Libera (ou revoga) um cliente para comunicação externa.
|
|
33
|
+
*
|
|
34
|
+
* Revogar é possível e deliberado: um endereço que voltou errado precisa poder
|
|
35
|
+
* sair da régua sem que alguém tenha de apagar o e-mail do cadastro — apagar o
|
|
36
|
+
* dado para parar o envio destrói a informação de contato junto.
|
|
37
|
+
*/
|
|
38
|
+
async function setClientClearance(tx, input) {
|
|
39
|
+
const rows = await tx `
|
|
40
|
+
UPDATE client
|
|
41
|
+
SET communication_cleared_at = ${input.cleared ? new Date() : null},
|
|
42
|
+
communication_cleared_by = ${input.cleared ? input.actorId : null},
|
|
43
|
+
updated_at = now()
|
|
44
|
+
WHERE id = ${input.clientId} AND deleted_at IS NULL
|
|
45
|
+
RETURNING id, communication_cleared_at
|
|
46
|
+
`;
|
|
47
|
+
const row = rows[0];
|
|
48
|
+
if (!row)
|
|
49
|
+
throw new Error('Cliente não encontrado neste escritório.');
|
|
50
|
+
return {
|
|
51
|
+
clientId: row.id,
|
|
52
|
+
cleared: row.communication_cleared_at !== null,
|
|
53
|
+
clearedAt: row.communication_cleared_at?.toISOString() ?? null,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async function clearanceSummary(tx) {
|
|
57
|
+
const [r] = await tx `
|
|
58
|
+
SELECT count(*)::int AS total,
|
|
59
|
+
count(*) FILTER (WHERE communication_cleared_at IS NOT NULL)::int AS cleared,
|
|
60
|
+
count(*) FILTER (WHERE communication_cleared_at IS NULL
|
|
61
|
+
AND email IS NOT NULL)::int AS pending_email
|
|
62
|
+
FROM client
|
|
63
|
+
WHERE deleted_at IS NULL AND status = 'active'
|
|
64
|
+
`;
|
|
65
|
+
const total = r?.total ?? 0;
|
|
66
|
+
const cleared = r?.cleared ?? 0;
|
|
67
|
+
return {
|
|
68
|
+
total,
|
|
69
|
+
cleared,
|
|
70
|
+
pending: total - cleared,
|
|
71
|
+
pendingWithEmail: r?.pending_email ?? 0,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=clearance-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clearance-store.js","sourceRoot":"","sources":["../../../src/collection/clearance-store.ts"],"names":[],"mappings":";;AAcA,gEAcC;AAeD,gDAmBC;AAUD,4CAiBC;AArFD;;;;;;;;;GASG;AACH,SAAgB,0BAA0B,CAAC,EAAM;IAC/C,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,YAAoB,EAAE,QAAoB;YACnD,MAAM,IAAI,GAAG,MAAM,EAAE,CAA6C;;;sBAGlD,YAAY;OAC3B,CAAC;YACF,oEAAoE;YACpE,gEAAgE;YAChE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,wBAAwB,IAAI,IAAI,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;QACxE,CAAC;KACF,CAAC;AACJ,CAAC;AAQD;;;;;;GAMG;AACI,KAAK,UAAU,kBAAkB,CACtC,EAAM,EACN,KAAqE;IAErE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAyD;;wCAExC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;wCACjC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;;kBAE1D,KAAK,CAAC,QAAQ;;GAE7B,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACtE,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,EAAE;QAChB,OAAO,EAAE,GAAG,CAAC,wBAAwB,KAAK,IAAI;QAC9C,SAAS,EAAE,GAAG,CAAC,wBAAwB,EAAE,WAAW,EAAE,IAAI,IAAI;KAC/D,CAAC;AACJ,CAAC;AAUM,KAAK,UAAU,gBAAgB,CAAC,EAAM;IAC3C,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAA6D;;;;;;;GAOhF,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;IAChC,OAAO;QACL,KAAK;QACL,OAAO;QACP,OAAO,EAAE,KAAK,GAAG,OAAO;QACxB,gBAAgB,EAAE,CAAC,EAAE,aAAa,IAAI,CAAC;KACxC,CAAC;AACJ,CAAC"}
|