@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
|
@@ -15,6 +15,23 @@ export interface ClientRecord {
|
|
|
15
15
|
phone: string | null;
|
|
16
16
|
status: string;
|
|
17
17
|
createdAt: string;
|
|
18
|
+
/** Quem, no escritório, responde por este cliente. `null` = carteira sem dono. */
|
|
19
|
+
responsibleUserId: string | null;
|
|
20
|
+
municipality: string | null;
|
|
21
|
+
stateUf: string | null;
|
|
22
|
+
legalName: string | null;
|
|
23
|
+
/** Nome fantasia. É por ele que a equipe chama o cliente no telefone. */
|
|
24
|
+
tradeName: string | null;
|
|
25
|
+
addressLine: string | null;
|
|
26
|
+
postalCode: string | null;
|
|
27
|
+
notes: string | null;
|
|
28
|
+
/** Sete dígitos do IBGE. Sem ele, nenhuma regra municipal alcança o cliente. */
|
|
29
|
+
municipalityIbgeCode: string | null;
|
|
30
|
+
/**
|
|
31
|
+
* Quando alguém do escritório conferiu o contato e liberou a comunicação
|
|
32
|
+
* externa. `null` = a régua não alcança este cliente.
|
|
33
|
+
*/
|
|
34
|
+
communicationClearedAt: string | null;
|
|
18
35
|
/**
|
|
19
36
|
* Por quais canais dá para falar com este cliente.
|
|
20
37
|
*
|
|
@@ -31,10 +48,46 @@ export interface Contactability {
|
|
|
31
48
|
phone: ContactChannelState;
|
|
32
49
|
/** Nenhum canal utilizável — o caso que exige atualização cadastral. */
|
|
33
50
|
reachable: boolean;
|
|
51
|
+
/** Situação em uma palavra, para a tela e para o relatório de carga. */
|
|
52
|
+
status: ContactabilityStatus;
|
|
53
|
+
/**
|
|
54
|
+
* A automação alcança este cliente?
|
|
55
|
+
*
|
|
56
|
+
* Distinto de `reachable`: um cliente com telefone e sem e-mail tem contato
|
|
57
|
+
* cadastrado (`reachable`) e mesmo assim não recebe nada, enquanto o canal de
|
|
58
|
+
* telefone do escritório não estiver ligado.
|
|
59
|
+
*/
|
|
60
|
+
automated: boolean;
|
|
34
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Situação de contato do cliente, em uma palavra.
|
|
64
|
+
*
|
|
65
|
+
* `reachable` responde "tem algum contato?", que não é a mesma pergunta que o
|
|
66
|
+
* escritório faz. A pergunta dele é **"a régua de cobrança e o pedido de
|
|
67
|
+
* documento vão alcançar este cliente?"** — e a resposta depende também de quais
|
|
68
|
+
* canais o escritório tem LIGADOS.
|
|
69
|
+
*
|
|
70
|
+
* Um cliente com telefone e sem e-mail parece contactável e não é, enquanto o
|
|
71
|
+
* WhatsApp do escritório não estiver operacional. Foi exatamente o caso que a
|
|
72
|
+
* Fase 3 identificou como silencioso: o cliente entra na carteira e fica
|
|
73
|
+
* invisível para os dois motores, sem ninguém ser avisado.
|
|
74
|
+
*
|
|
75
|
+
* `phone_only` e `phone_no_channel` são separados de propósito. O primeiro é uma
|
|
76
|
+
* situação normal — o escritório fala com esse cliente por WhatsApp. O segundo é
|
|
77
|
+
* uma pendência operacional, e confundi-los faria a tela mostrar tranquilidade
|
|
78
|
+
* onde há trabalho a fazer.
|
|
79
|
+
*/
|
|
80
|
+
export type ContactabilityStatus = 'email_ready' | 'phone_only' | 'phone_no_channel' | 'no_channel';
|
|
35
81
|
export declare function contactabilityOf(input: {
|
|
36
82
|
email?: string | null;
|
|
37
83
|
phone?: string | null;
|
|
84
|
+
},
|
|
85
|
+
/**
|
|
86
|
+
* Canais que o ESCRITÓRIO tem operacionais. Omitido = só e-mail, que é o
|
|
87
|
+
* estado de quem ainda não conectou telefone — e é o padrão hoje.
|
|
88
|
+
*/
|
|
89
|
+
channels?: {
|
|
90
|
+
phone?: boolean;
|
|
38
91
|
}): Contactability;
|
|
39
92
|
/**
|
|
40
93
|
* Normalização de contato.
|
|
@@ -54,7 +107,29 @@ export interface CreateClientInput {
|
|
|
54
107
|
email?: string | null;
|
|
55
108
|
phone?: string | null;
|
|
56
109
|
createdBy?: string | null;
|
|
110
|
+
/** Razão social, quando difere do nome pelo qual o escritório chama o cliente. */
|
|
111
|
+
legalName?: string | null;
|
|
112
|
+
tradeName?: string | null;
|
|
113
|
+
addressLine?: string | null;
|
|
114
|
+
municipality?: string | null;
|
|
115
|
+
/** UF em duas maiúsculas — o CHECK do banco recusa qualquer outra forma. */
|
|
116
|
+
stateUf?: string | null;
|
|
117
|
+
/**
|
|
118
|
+
* Código IBGE de sete dígitos do município.
|
|
119
|
+
*
|
|
120
|
+
* A coluna nasceu na 0049 e nenhum caminho de escrita a alcançava — só um
|
|
121
|
+
* `UPDATE` cru dentro de um teste. Sem ela, regra municipal nenhuma casa.
|
|
122
|
+
*/
|
|
123
|
+
municipalityIbgeCode?: string | null;
|
|
124
|
+
postalCode?: string | null;
|
|
125
|
+
notes?: string | null;
|
|
126
|
+
responsibleUserId?: string | null;
|
|
127
|
+
contractStartedOn?: string | null;
|
|
128
|
+
/** Lote de importação que originou a linha. Só o importador preenche. */
|
|
129
|
+
importBatchId?: string | null;
|
|
57
130
|
}
|
|
131
|
+
/** UF só entra em caixa alta; o banco recusa o resto, e recusar cedo dá erro melhor. */
|
|
132
|
+
export declare function normalizeUf(v: string | null | undefined): string | null;
|
|
58
133
|
export declare function createClient(tx: Tx, input: CreateClientInput): Promise<ClientRecord>;
|
|
59
134
|
export declare function listClients(tx: Tx): Promise<ClientRecord[]>;
|
|
60
135
|
export declare function getClient(tx: Tx, id: string): Promise<ClientRecord>;
|
|
@@ -68,17 +143,64 @@ export interface ListClientsFilter {
|
|
|
68
143
|
status?: string;
|
|
69
144
|
limit?: number;
|
|
70
145
|
offset?: number;
|
|
146
|
+
/**
|
|
147
|
+
* Filtra a carteira por responsável.
|
|
148
|
+
*
|
|
149
|
+
* `'unassigned'` é um valor de primeira classe e não um acaso: "quem não tem
|
|
150
|
+
* dono" é a pergunta que o escritório mais precisa fazer numa importação
|
|
151
|
+
* recém-concluída, e ela não é expressável passando um id.
|
|
152
|
+
*/
|
|
153
|
+
responsibleUserId?: string | 'unassigned';
|
|
71
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* O escritório tem canal de telefone operacional?
|
|
157
|
+
*
|
|
158
|
+
* Decide se um cliente que só tem telefone é `phone_only` (situação normal) ou
|
|
159
|
+
* `phone_no_channel` (pendência). A consulta roda sob RLS, então enxerga só o
|
|
160
|
+
* `channel_binding` do tenant do contexto.
|
|
161
|
+
*
|
|
162
|
+
* Uma consulta por listagem, não uma por linha: a resposta é a mesma para todos
|
|
163
|
+
* os clientes do escritório.
|
|
164
|
+
*/
|
|
165
|
+
export declare function tenantHasPhoneChannel(tx: Tx): Promise<boolean>;
|
|
72
166
|
export declare function listClientsPaged(tx: Tx, filter?: ListClientsFilter): Promise<{
|
|
73
167
|
items: ClientRecord[];
|
|
74
168
|
total: number;
|
|
75
169
|
}>;
|
|
170
|
+
/**
|
|
171
|
+
* Campo cuja AUSÊNCIA e cujo `null` significam coisas diferentes.
|
|
172
|
+
*
|
|
173
|
+
* `undefined` preserva o que está gravado; `null` apaga. A distinção existe
|
|
174
|
+
* porque endereço e jurisdição são corrigíveis: quem digitou a UF errada
|
|
175
|
+
* precisa conseguir voltar ao desconhecido, e não só sobrescrever com outro
|
|
176
|
+
* palpite. O padrão `COALESCE` dos campos antigos não sabe fazer isso — nele,
|
|
177
|
+
* `null` é indistinguível de "não mandei".
|
|
178
|
+
*/
|
|
179
|
+
type Erasable<T> = T | null | undefined;
|
|
76
180
|
export interface UpdateClientInput {
|
|
77
181
|
displayName?: string;
|
|
78
182
|
legalName?: string | null;
|
|
183
|
+
tradeName?: string | null;
|
|
79
184
|
email?: string | null;
|
|
80
185
|
phone?: string | null;
|
|
81
186
|
status?: string;
|
|
187
|
+
/**
|
|
188
|
+
* Endereço e jurisdição.
|
|
189
|
+
*
|
|
190
|
+
* Chegaram tarde de propósito? Não: chegaram tarde por omissão. O importador
|
|
191
|
+
* de CSV gravava `state_uf` desde a Fase 5, mas nem a criação avulsa nem a
|
|
192
|
+
* edição tinham onde recebê-lo — um cliente cadastrado pela tela nascia sem
|
|
193
|
+
* jurisdição e NÃO HAVIA COMO CORRIGIR sem SQL. Toda regra estadual ou
|
|
194
|
+
* municipal respondia `INSUFFICIENT_DATA` para sempre.
|
|
195
|
+
*/
|
|
196
|
+
addressLine?: Erasable<string>;
|
|
197
|
+
municipality?: Erasable<string>;
|
|
198
|
+
/** Sete dígitos do IBGE. É o que casa o cliente com uma regra municipal. */
|
|
199
|
+
municipalityIbgeCode?: Erasable<string>;
|
|
200
|
+
/** UF em duas maiúsculas. Casa o cliente com uma regra estadual. */
|
|
201
|
+
stateUf?: Erasable<string>;
|
|
202
|
+
postalCode?: Erasable<string>;
|
|
203
|
+
notes?: Erasable<string>;
|
|
82
204
|
/**
|
|
83
205
|
* CPF/CNPJ. Faltava aqui: o cliente nascia com documento e nunca podia
|
|
84
206
|
* corrigi-lo — e é justamente o campo que todo gateway de pagamento exige
|
|
@@ -92,4 +214,40 @@ export declare function updateClient(tx: Tx, id: string, input: UpdateClientInpu
|
|
|
92
214
|
export declare function softDeleteClient(tx: Tx, id: string, deletedBy?: string | null): Promise<number>;
|
|
93
215
|
/** Busca por documento normalizado (dedup de importação). Retorna id ou null. */
|
|
94
216
|
export declare function findClientIdByDocument(tx: Tx, documentNumber: string): Promise<string | null>;
|
|
217
|
+
/**
|
|
218
|
+
* Troca o responsável pela carteira de um cliente.
|
|
219
|
+
*
|
|
220
|
+
* Devolve quem era e quem passou a ser, para que a auditoria registre a
|
|
221
|
+
* TRANSIÇÃO e não apenas o destino. "Passou a ser da Ana" não responde a
|
|
222
|
+
* pergunta que se faz meses depois — "saiu de quem?" — e é essa que importa
|
|
223
|
+
* quando um cliente deixa de ser atendido.
|
|
224
|
+
*
|
|
225
|
+
* O usuário precisa ser membro ativo do escritório. Sem essa checagem, a FK
|
|
226
|
+
* aceitaria qualquer `user.id` do banco inteiro, inclusive de outro tenant:
|
|
227
|
+
* FKs ignoram RLS, então a barreira tem de ser explícita aqui.
|
|
228
|
+
*/
|
|
229
|
+
export declare function assignClientResponsible(tx: Tx, input: {
|
|
230
|
+
clientId: string;
|
|
231
|
+
responsibleUserId: string | null;
|
|
232
|
+
}): Promise<{
|
|
233
|
+
clientId: string;
|
|
234
|
+
from: string | null;
|
|
235
|
+
to: string | null;
|
|
236
|
+
}>;
|
|
237
|
+
export interface PortfolioBucket {
|
|
238
|
+
responsibleUserId: string | null;
|
|
239
|
+
responsibleName: string | null;
|
|
240
|
+
clients: number;
|
|
241
|
+
semCanalAutomatico: number;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* A carteira dividida por responsável.
|
|
245
|
+
*
|
|
246
|
+
* O balde `null` — clientes sem dono — vem junto, e vem por último, em vez de
|
|
247
|
+
* ser omitido. Uma carteira recém-importada é inteiramente desse balde, e uma
|
|
248
|
+
* tela que só lista responsáveis existentes mostraria zero clientes num
|
|
249
|
+
* escritório com trezentos.
|
|
250
|
+
*/
|
|
251
|
+
export declare function portfolioByResponsible(tx: Tx): Promise<PortfolioBucket[]>;
|
|
252
|
+
export {};
|
|
95
253
|
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,32 @@
|
|
|
1
1
|
import { ConflictError, NotFoundError, uuidv7 } from '@baruk/shared';
|
|
2
2
|
import { toE164OrNull } from '../contacts/phone.js';
|
|
3
|
-
|
|
3
|
+
import { assertIbgeCoherent } from './ibge.js';
|
|
4
|
+
export function contactabilityOf(input,
|
|
5
|
+
/**
|
|
6
|
+
* Canais que o ESCRITÓRIO tem operacionais. Omitido = só e-mail, que é o
|
|
7
|
+
* estado de quem ainda não conectou telefone — e é o padrão hoje.
|
|
8
|
+
*/
|
|
9
|
+
channels = {}) {
|
|
4
10
|
const email = input.email?.trim() ? 'ready' : 'missing';
|
|
5
11
|
const phone = input.phone?.trim() ? 'ready' : 'missing';
|
|
6
|
-
|
|
12
|
+
const phoneChannelLigado = channels.phone === true;
|
|
13
|
+
const status = email === 'ready'
|
|
14
|
+
? 'email_ready'
|
|
15
|
+
: phone === 'ready'
|
|
16
|
+
? phoneChannelLigado
|
|
17
|
+
? 'phone_only'
|
|
18
|
+
: 'phone_no_channel'
|
|
19
|
+
: 'no_channel';
|
|
20
|
+
return {
|
|
21
|
+
email,
|
|
22
|
+
phone,
|
|
23
|
+
// `reachable` mantém o significado antigo — "tem contato cadastrado" — para
|
|
24
|
+
// não mudar o comportamento de quem já o consulta. Quem quer saber se a
|
|
25
|
+
// automação alcança usa `automated`.
|
|
26
|
+
reachable: email === 'ready' || phone === 'ready',
|
|
27
|
+
status,
|
|
28
|
+
automated: status === 'email_ready' || status === 'phone_only',
|
|
29
|
+
};
|
|
7
30
|
}
|
|
8
31
|
/**
|
|
9
32
|
* Normalização de contato.
|
|
@@ -28,7 +51,12 @@ export function normalizePhone(v) {
|
|
|
28
51
|
return null;
|
|
29
52
|
return plus ? `+${digits}` : digits;
|
|
30
53
|
}
|
|
31
|
-
|
|
54
|
+
/** UF só entra em caixa alta; o banco recusa o resto, e recusar cedo dá erro melhor. */
|
|
55
|
+
export function normalizeUf(v) {
|
|
56
|
+
const t = v?.trim().toUpperCase();
|
|
57
|
+
return t && /^[A-Z]{2}$/.test(t) ? t : null;
|
|
58
|
+
}
|
|
59
|
+
function mapRow(r, channels = {}) {
|
|
32
60
|
return {
|
|
33
61
|
id: r.id,
|
|
34
62
|
tenantId: r.tenant_id,
|
|
@@ -39,7 +67,17 @@ function mapRow(r) {
|
|
|
39
67
|
phone: r.phone ?? null,
|
|
40
68
|
status: r.status,
|
|
41
69
|
createdAt: r.created_at.toISOString(),
|
|
42
|
-
|
|
70
|
+
responsibleUserId: r.responsible_user_id ?? null,
|
|
71
|
+
municipality: r.municipality ?? null,
|
|
72
|
+
stateUf: r.state_uf ?? null,
|
|
73
|
+
legalName: r.legal_name ?? null,
|
|
74
|
+
tradeName: r.trade_name ?? null,
|
|
75
|
+
addressLine: r.address_line ?? null,
|
|
76
|
+
postalCode: r.postal_code ?? null,
|
|
77
|
+
notes: r.notes ?? null,
|
|
78
|
+
municipalityIbgeCode: r.municipality_ibge_code ?? null,
|
|
79
|
+
communicationClearedAt: r.communication_cleared_at?.toISOString() ?? null,
|
|
80
|
+
contactability: contactabilityOf({ email: r.email, phone: r.phone }, channels),
|
|
43
81
|
};
|
|
44
82
|
}
|
|
45
83
|
/**
|
|
@@ -57,21 +95,39 @@ function asDuplicateDocument(err) {
|
|
|
57
95
|
}
|
|
58
96
|
}
|
|
59
97
|
export async function createClient(tx, input) {
|
|
98
|
+
// Antes de gravar: o código IBGE não pode contradizer a UF. Aqui o estado
|
|
99
|
+
// resultante é o próprio input — não há linha anterior com que se misturar.
|
|
100
|
+
assertIbgeCoherent(input.municipalityIbgeCode?.trim() || null, normalizeUf(input.stateUf));
|
|
60
101
|
// tenant_id vem da GUC — nunca do input. A WITH CHECK da RLS recusa qualquer
|
|
61
102
|
// tentativa de gravar fora do tenant corrente.
|
|
62
103
|
try {
|
|
63
104
|
const rows = await tx `
|
|
64
|
-
INSERT INTO client (id, tenant_id, client_type, display_name,
|
|
65
|
-
|
|
105
|
+
INSERT INTO client (id, tenant_id, client_type, display_name, legal_name, trade_name,
|
|
106
|
+
document_number,
|
|
107
|
+
email, phone, phone_e164, address_line, municipality, state_uf,
|
|
108
|
+
municipality_ibge_code,
|
|
109
|
+
postal_code, notes, responsible_user_id, contract_started_on,
|
|
110
|
+
import_batch_id, created_by)
|
|
66
111
|
VALUES (
|
|
67
112
|
${uuidv7()},
|
|
68
113
|
current_setting('app.current_tenant')::uuid,
|
|
69
114
|
${input.clientType ?? 'pj'},
|
|
70
115
|
${input.displayName},
|
|
116
|
+
${input.legalName?.trim() || null},
|
|
117
|
+
${input.tradeName?.trim() || null},
|
|
71
118
|
${input.documentNumber ?? null},
|
|
72
119
|
${normalizeEmail(input.email)},
|
|
73
120
|
${normalizePhone(input.phone)},
|
|
74
121
|
${toE164OrNull(input.phone)},
|
|
122
|
+
${input.addressLine?.trim() || null},
|
|
123
|
+
${input.municipality?.trim() || null},
|
|
124
|
+
${normalizeUf(input.stateUf)},
|
|
125
|
+
${input.municipalityIbgeCode?.trim() || null},
|
|
126
|
+
${input.postalCode?.trim() || null},
|
|
127
|
+
${input.notes?.trim() || null},
|
|
128
|
+
${input.responsibleUserId ?? null},
|
|
129
|
+
${input.contractStartedOn ?? null},
|
|
130
|
+
${input.importBatchId ?? null},
|
|
75
131
|
${input.createdBy ?? null}
|
|
76
132
|
)
|
|
77
133
|
RETURNING id, tenant_id, client_type, display_name, document_number, email, phone,
|
|
@@ -95,7 +151,9 @@ export async function listClients(tx) {
|
|
|
95
151
|
}
|
|
96
152
|
export async function getClient(tx, id) {
|
|
97
153
|
const rows = await tx `
|
|
98
|
-
SELECT id, tenant_id, client_type, display_name, document_number, email, phone,
|
|
154
|
+
SELECT id, tenant_id, client_type, display_name, legal_name, trade_name, document_number, email, phone,
|
|
155
|
+
status, created_at, responsible_user_id, address_line, municipality, state_uf,
|
|
156
|
+
municipality_ibge_code, postal_code, notes
|
|
99
157
|
FROM client
|
|
100
158
|
WHERE id = ${id} AND deleted_at IS NULL
|
|
101
159
|
`;
|
|
@@ -116,24 +174,68 @@ export async function renameClient(tx, id, displayName) {
|
|
|
116
174
|
`;
|
|
117
175
|
return rows.count;
|
|
118
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* O escritório tem canal de telefone operacional?
|
|
179
|
+
*
|
|
180
|
+
* Decide se um cliente que só tem telefone é `phone_only` (situação normal) ou
|
|
181
|
+
* `phone_no_channel` (pendência). A consulta roda sob RLS, então enxerga só o
|
|
182
|
+
* `channel_binding` do tenant do contexto.
|
|
183
|
+
*
|
|
184
|
+
* Uma consulta por listagem, não uma por linha: a resposta é a mesma para todos
|
|
185
|
+
* os clientes do escritório.
|
|
186
|
+
*/
|
|
187
|
+
export async function tenantHasPhoneChannel(tx) {
|
|
188
|
+
const rows = await tx `
|
|
189
|
+
SELECT count(*)::int AS n FROM channel_binding
|
|
190
|
+
WHERE channel IN ('whatsapp', 'sms') AND revoked_at IS NULL
|
|
191
|
+
`;
|
|
192
|
+
return (rows[0]?.n ?? 0) > 0;
|
|
193
|
+
}
|
|
119
194
|
export async function listClientsPaged(tx, filter = {}) {
|
|
120
195
|
const limit = Math.min(filter.limit ?? 20, 100);
|
|
121
196
|
const offset = filter.offset ?? 0;
|
|
122
197
|
const like = filter.search ? `%${filter.search}%` : null;
|
|
123
198
|
const rows = await tx `
|
|
124
199
|
SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at,
|
|
200
|
+
responsible_user_id, municipality, state_uf, communication_cleared_at,
|
|
125
201
|
count(*) OVER() AS total
|
|
126
202
|
FROM client
|
|
127
203
|
WHERE deleted_at IS NULL
|
|
128
204
|
AND (${filter.status ?? null}::text IS NULL OR status = ${filter.status ?? null})
|
|
129
205
|
AND (${like}::text IS NULL OR display_name ILIKE ${like} OR document_number ILIKE ${like})
|
|
206
|
+
AND (${filter.responsibleUserId ?? null}::text IS NULL
|
|
207
|
+
OR (${filter.responsibleUserId ?? null} = 'unassigned' AND responsible_user_id IS NULL)
|
|
208
|
+
OR responsible_user_id::text = ${filter.responsibleUserId ?? null})
|
|
130
209
|
ORDER BY created_at DESC
|
|
131
210
|
LIMIT ${limit} OFFSET ${offset}
|
|
132
211
|
`;
|
|
133
212
|
const total = rows[0] ? Number(rows[0].total) : 0;
|
|
134
|
-
|
|
213
|
+
const phone = await tenantHasPhoneChannel(tx);
|
|
214
|
+
return { items: rows.map((r) => mapRow(r, { phone })), total };
|
|
135
215
|
}
|
|
136
216
|
export async function updateClient(tx, id, input) {
|
|
217
|
+
// Coerência IBGE↔UF do ESTADO RESULTANTE, não do corpo da requisição.
|
|
218
|
+
//
|
|
219
|
+
// Um PATCH que manda só `stateUf` deixa no banco o código IBGE de antes;
|
|
220
|
+
// validar apenas o payload aprovaria trocar a UF de GO para SP mantendo o
|
|
221
|
+
// município goiano gravado. Por isso lemos a linha e mesclamos antes.
|
|
222
|
+
//
|
|
223
|
+
// O SELECT só acontece quando um dos dois campos está no corpo: o PATCH
|
|
224
|
+
// comum (nome, telefone, status) continua sendo uma única query.
|
|
225
|
+
if ('municipalityIbgeCode' in input || 'stateUf' in input) {
|
|
226
|
+
const [atual] = await tx `
|
|
227
|
+
SELECT state_uf, municipality_ibge_code FROM client WHERE id = ${id} AND deleted_at IS NULL
|
|
228
|
+
`;
|
|
229
|
+
// Sem linha, quem responde é o UPDATE abaixo com 0 afetadas (404). Recusar
|
|
230
|
+
// aqui por validação transformaria "cliente não existe" em "dado inválido".
|
|
231
|
+
if (atual) {
|
|
232
|
+
const code = 'municipalityIbgeCode' in input
|
|
233
|
+
? input.municipalityIbgeCode?.trim() || null
|
|
234
|
+
: atual.municipality_ibge_code;
|
|
235
|
+
const uf = 'stateUf' in input ? normalizeUf(input.stateUf) : atual.state_uf;
|
|
236
|
+
assertIbgeCoherent(code, uf);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
137
239
|
// Corrigir um documento para um que já existe cai na mesma violação — e o
|
|
138
240
|
// escritório precisa da mesma explicação, não de um 500.
|
|
139
241
|
// Casts explícitos: parâmetros NULL sem tipo quebram COALESCE ("could not
|
|
@@ -142,7 +244,8 @@ export async function updateClient(tx, id, input) {
|
|
|
142
244
|
const rows = await tx `
|
|
143
245
|
UPDATE client SET
|
|
144
246
|
display_name = COALESCE(${input.displayName ?? null}::text, display_name),
|
|
145
|
-
legal_name =
|
|
247
|
+
legal_name = CASE WHEN ${'legalName' in input} THEN ${input.legalName?.trim() || null}::text ELSE legal_name END,
|
|
248
|
+
trade_name = CASE WHEN ${'tradeName' in input} THEN ${input.tradeName?.trim() || null}::text ELSE trade_name END,
|
|
146
249
|
document_number = COALESCE(${input.documentNumber ?? null}::text, document_number),
|
|
147
250
|
email = COALESCE(${normalizeEmail(input.email)}::citext, email),
|
|
148
251
|
phone = COALESCE(${normalizePhone(input.phone)}::text, phone),
|
|
@@ -154,6 +257,14 @@ export async function updateClient(tx, id, input) {
|
|
|
154
257
|
phone_e164 = CASE WHEN ${input.phone ?? null}::text IS NULL THEN phone_e164
|
|
155
258
|
ELSE ${toE164OrNull(input.phone)}::text END,
|
|
156
259
|
status = COALESCE(${input.status ?? null}::text, status),
|
|
260
|
+
-- Presença, nao valor: ausente preserva, null apaga. Um COALESCE aqui
|
|
261
|
+
-- tornaria a UF errada permanente -- so daria para troca-la por outra.
|
|
262
|
+
address_line = CASE WHEN ${'addressLine' in input} THEN ${input.addressLine?.trim() || null}::text ELSE address_line END,
|
|
263
|
+
municipality = CASE WHEN ${'municipality' in input} THEN ${input.municipality?.trim() || null}::text ELSE municipality END,
|
|
264
|
+
municipality_ibge_code = CASE WHEN ${'municipalityIbgeCode' in input} THEN ${input.municipalityIbgeCode?.trim() || null}::text ELSE municipality_ibge_code END,
|
|
265
|
+
state_uf = CASE WHEN ${'stateUf' in input} THEN ${normalizeUf(input.stateUf)}::text ELSE state_uf END,
|
|
266
|
+
postal_code = CASE WHEN ${'postalCode' in input} THEN ${input.postalCode?.trim() || null}::text ELSE postal_code END,
|
|
267
|
+
notes = CASE WHEN ${'notes' in input} THEN ${input.notes?.trim() || null}::text ELSE notes END,
|
|
157
268
|
updated_by = ${input.updatedBy ?? null}::uuid,
|
|
158
269
|
updated_at = now(),
|
|
159
270
|
version = version + 1
|
|
@@ -183,4 +294,70 @@ export async function findClientIdByDocument(tx, documentNumber) {
|
|
|
183
294
|
`;
|
|
184
295
|
return rows[0]?.id ?? null;
|
|
185
296
|
}
|
|
297
|
+
/**
|
|
298
|
+
* Troca o responsável pela carteira de um cliente.
|
|
299
|
+
*
|
|
300
|
+
* Devolve quem era e quem passou a ser, para que a auditoria registre a
|
|
301
|
+
* TRANSIÇÃO e não apenas o destino. "Passou a ser da Ana" não responde a
|
|
302
|
+
* pergunta que se faz meses depois — "saiu de quem?" — e é essa que importa
|
|
303
|
+
* quando um cliente deixa de ser atendido.
|
|
304
|
+
*
|
|
305
|
+
* O usuário precisa ser membro ativo do escritório. Sem essa checagem, a FK
|
|
306
|
+
* aceitaria qualquer `user.id` do banco inteiro, inclusive de outro tenant:
|
|
307
|
+
* FKs ignoram RLS, então a barreira tem de ser explícita aqui.
|
|
308
|
+
*/
|
|
309
|
+
export async function assignClientResponsible(tx, input) {
|
|
310
|
+
if (input.responsibleUserId) {
|
|
311
|
+
const [m] = await tx `
|
|
312
|
+
SELECT count(*)::int AS n FROM membership
|
|
313
|
+
WHERE user_id = ${input.responsibleUserId}
|
|
314
|
+
AND status = 'active' AND deleted_at IS NULL
|
|
315
|
+
`;
|
|
316
|
+
if ((m?.n ?? 0) === 0) {
|
|
317
|
+
throw new NotFoundError('Usuário não é membro ativo deste escritório.');
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
const [before] = await tx `
|
|
321
|
+
SELECT responsible_user_id FROM client WHERE id = ${input.clientId} AND deleted_at IS NULL
|
|
322
|
+
`;
|
|
323
|
+
if (!before)
|
|
324
|
+
throw new NotFoundError('Cliente não encontrado.');
|
|
325
|
+
await tx `
|
|
326
|
+
UPDATE client
|
|
327
|
+
SET responsible_user_id = ${input.responsibleUserId}, updated_at = now()
|
|
328
|
+
WHERE id = ${input.clientId} AND deleted_at IS NULL
|
|
329
|
+
`;
|
|
330
|
+
return {
|
|
331
|
+
clientId: input.clientId,
|
|
332
|
+
from: before.responsible_user_id,
|
|
333
|
+
to: input.responsibleUserId,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* A carteira dividida por responsável.
|
|
338
|
+
*
|
|
339
|
+
* O balde `null` — clientes sem dono — vem junto, e vem por último, em vez de
|
|
340
|
+
* ser omitido. Uma carteira recém-importada é inteiramente desse balde, e uma
|
|
341
|
+
* tela que só lista responsáveis existentes mostraria zero clientes num
|
|
342
|
+
* escritório com trezentos.
|
|
343
|
+
*/
|
|
344
|
+
export async function portfolioByResponsible(tx) {
|
|
345
|
+
const rows = await tx `
|
|
346
|
+
SELECT c.responsible_user_id,
|
|
347
|
+
u.full_name,
|
|
348
|
+
count(*)::int AS clients,
|
|
349
|
+
count(*) FILTER (WHERE c.email IS NULL)::int AS sem_canal
|
|
350
|
+
FROM client c
|
|
351
|
+
LEFT JOIN "user" u ON u.id = c.responsible_user_id
|
|
352
|
+
WHERE c.deleted_at IS NULL
|
|
353
|
+
GROUP BY c.responsible_user_id, u.full_name
|
|
354
|
+
ORDER BY (c.responsible_user_id IS NULL), u.full_name NULLS LAST
|
|
355
|
+
`;
|
|
356
|
+
return rows.map((r) => ({
|
|
357
|
+
responsibleUserId: r.responsible_user_id,
|
|
358
|
+
responsibleName: r.full_name,
|
|
359
|
+
clients: r.clients,
|
|
360
|
+
semCanalAutomatico: r.sem_canal,
|
|
361
|
+
}));
|
|
362
|
+
}
|
|
186
363
|
//# sourceMappingURL=repository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ValidationError } from '@baruk/shared';
|
|
1
2
|
import type { Tx } from '../db/client.js';
|
|
2
3
|
/**
|
|
3
4
|
* Identidade do escritório para a comunicação transacional.
|
|
@@ -69,4 +70,68 @@ export declare function getTenantBranding(tx: Tx): Promise<TenantBranding>;
|
|
|
69
70
|
* duvidar de quem está cobrando.
|
|
70
71
|
*/
|
|
71
72
|
export declare function senderFor(branding: TenantBranding, fallbackFrom: string): string;
|
|
73
|
+
/**
|
|
74
|
+
* Entrada de configuração da marca. Todo campo é opcional; `null` LIMPA o campo
|
|
75
|
+
* e faz o leitor voltar ao padrão neutro — que é diferente de omitir, que
|
|
76
|
+
* preserva o que já estava.
|
|
77
|
+
*/
|
|
78
|
+
export interface BrandingInput {
|
|
79
|
+
officeName?: string | null;
|
|
80
|
+
signatureName?: string | null;
|
|
81
|
+
tagline?: string | null;
|
|
82
|
+
logoUrl?: string | null;
|
|
83
|
+
logoKind?: LogoKind | null;
|
|
84
|
+
primaryColor?: string | null;
|
|
85
|
+
secondaryColor?: string | null;
|
|
86
|
+
accentColor?: string | null;
|
|
87
|
+
backgroundColor?: string | null;
|
|
88
|
+
textColor?: string | null;
|
|
89
|
+
mutedColor?: string | null;
|
|
90
|
+
fontFamily?: string | null;
|
|
91
|
+
supportEmail?: string | null;
|
|
92
|
+
supportPhone?: string | null;
|
|
93
|
+
website?: string | null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Erro de validação de marca.
|
|
97
|
+
*
|
|
98
|
+
* Estende `ValidationError` de propósito, em vez de ser um `Error` próprio: a
|
|
99
|
+
* borda HTTP já mapeia todo `AppError` para o status certo, e um erro fora
|
|
100
|
+
* dessa hierarquia sairia como 500 — culpando o servidor por um campo mal
|
|
101
|
+
* preenchido, e escondendo do formulário qual campo foi. O `field` viaja em
|
|
102
|
+
* `details` para a tela poder apontar a linha errada.
|
|
103
|
+
*/
|
|
104
|
+
export declare class BrandingValidationError extends ValidationError {
|
|
105
|
+
readonly field: string;
|
|
106
|
+
constructor(field: string, message: string);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Valida a entrada e devolve o objeto a persistir em `tenant.settings.branding`.
|
|
110
|
+
*
|
|
111
|
+
* Só as chaves PRESENTES na entrada aparecem no resultado — quem manda três
|
|
112
|
+
* campos altera três campos. `null` vira ausência do campo no armazenado, que é
|
|
113
|
+
* como o leitor representa "não configurado".
|
|
114
|
+
*/
|
|
115
|
+
export declare function parseBrandingInput(input: BrandingInput): Record<string, unknown>;
|
|
116
|
+
/**
|
|
117
|
+
* Chaves que a marca ocupa dentro de `tenant.settings.branding`. Serve para o
|
|
118
|
+
* `null` REMOVER a chave em vez de gravar um nulo que o leitor teria de
|
|
119
|
+
* distinguir de ausente.
|
|
120
|
+
*/
|
|
121
|
+
export declare const BRANDING_KEYS: readonly string[];
|
|
122
|
+
/**
|
|
123
|
+
* Grava a marca do tenant CORRENTE.
|
|
124
|
+
*
|
|
125
|
+
* Dois pontos que a implementação não pode perder de vista:
|
|
126
|
+
*
|
|
127
|
+
* 1. **`tenant` não tem RLS.** É a tabela raiz — a fonte da fronteira, não uma
|
|
128
|
+
* linha protegida por ela. Por isso o `WHERE` amarra na GUC e a função NÃO
|
|
129
|
+
* aceita `tenantId` por parâmetro: parâmetro é pedido do chamador, e pedido
|
|
130
|
+
* do chamador não é fronteira. Sem contexto, zero linhas e erro.
|
|
131
|
+
*
|
|
132
|
+
* 2. **O merge acontece no banco, não na aplicação.** `settings` guarda mais
|
|
133
|
+
* que a marca. Ler-modificar-escrever perderia a escrita concorrente de
|
|
134
|
+
* outra chave; `jsonb ||` resolve dentro da própria instrução.
|
|
135
|
+
*/
|
|
136
|
+
export declare function updateTenantBranding(tx: Tx, input: BrandingInput): Promise<TenantBranding>;
|
|
72
137
|
//# sourceMappingURL=branding.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../../src/collection/branding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C;;;;;;;;;;GAUG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;;;OAQG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAC;IACxB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,+EAA+E;IAC/E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB;AA4ED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAmDvE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAKhF"}
|
|
1
|
+
{"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../../src/collection/branding.ts"],"names":[],"mappings":"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"}
|