@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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ValidationError } from '@baruk/shared';
|
|
1
2
|
/**
|
|
2
3
|
* Padrão neutro do produto — deliberadamente SEM marca.
|
|
3
4
|
*
|
|
@@ -133,4 +134,189 @@ export function senderFor(branding, fallbackFrom) {
|
|
|
133
134
|
const name = branding.officeName.replace(/["<>\\]/g, '').trim();
|
|
134
135
|
return name ? `${name} <${address}>` : fallbackFrom;
|
|
135
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Erro de validação de marca.
|
|
139
|
+
*
|
|
140
|
+
* Estende `ValidationError` de propósito, em vez de ser um `Error` próprio: a
|
|
141
|
+
* borda HTTP já mapeia todo `AppError` para o status certo, e um erro fora
|
|
142
|
+
* dessa hierarquia sairia como 500 — culpando o servidor por um campo mal
|
|
143
|
+
* preenchido, e escondendo do formulário qual campo foi. O `field` viaja em
|
|
144
|
+
* `details` para a tela poder apontar a linha errada.
|
|
145
|
+
*/
|
|
146
|
+
export class BrandingValidationError extends ValidationError {
|
|
147
|
+
field;
|
|
148
|
+
constructor(field, message) {
|
|
149
|
+
super(message, { field });
|
|
150
|
+
this.field = field;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function strictColor(field, v) {
|
|
154
|
+
if (typeof v !== 'string' || !/^#[0-9a-fA-F]{6}$/.test(v)) {
|
|
155
|
+
throw new BrandingValidationError(field, `${field}: use uma cor no formato #RRGGBB.`);
|
|
156
|
+
}
|
|
157
|
+
return v;
|
|
158
|
+
}
|
|
159
|
+
function strictText(field, v, max) {
|
|
160
|
+
if (typeof v !== 'string') {
|
|
161
|
+
throw new BrandingValidationError(field, `${field}: texto inválido.`);
|
|
162
|
+
}
|
|
163
|
+
const t = v.trim();
|
|
164
|
+
if (!t)
|
|
165
|
+
throw new BrandingValidationError(field, `${field}: não pode ficar em branco.`);
|
|
166
|
+
if (t.length > max) {
|
|
167
|
+
throw new BrandingValidationError(field, `${field}: máximo de ${max} caracteres.`);
|
|
168
|
+
}
|
|
169
|
+
return t;
|
|
170
|
+
}
|
|
171
|
+
function strictHttpsUrl(field, v) {
|
|
172
|
+
const t = typeof v === 'string' ? v.trim() : '';
|
|
173
|
+
if (!/^https:\/\/[^\s"'<>]+$/i.test(t)) {
|
|
174
|
+
throw new BrandingValidationError(field, `${field}: informe uma URL https válida.`);
|
|
175
|
+
}
|
|
176
|
+
return t;
|
|
177
|
+
}
|
|
178
|
+
function strictLogoUrl(v) {
|
|
179
|
+
const url = strictHttpsUrl('logoUrl', v);
|
|
180
|
+
const path = url.split(/[?#]/)[0] ?? '';
|
|
181
|
+
if (!/\.(png|jpe?g)$/i.test(path)) {
|
|
182
|
+
// A recusa é específica de propósito: SVG é o formato em que os kits de
|
|
183
|
+
// marca vivem, e é exatamente o que Gmail e Outlook não desenham. Aceitar
|
|
184
|
+
// produziria um cabeçalho vazio — sem imagem e sem o nome que o fallback
|
|
185
|
+
// teria escrito.
|
|
186
|
+
throw new BrandingValidationError('logoUrl', 'logoUrl: a logomarca precisa ser .png, .jpg ou .jpeg. SVG não é renderizado por clientes de e-mail — rasterize antes.');
|
|
187
|
+
}
|
|
188
|
+
return url;
|
|
189
|
+
}
|
|
190
|
+
function strictFontFamily(v) {
|
|
191
|
+
const t = strictText('fontFamily', v, 160);
|
|
192
|
+
if (!/^[A-Za-z0-9 ,.'-]+$/.test(t)) {
|
|
193
|
+
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.');
|
|
194
|
+
}
|
|
195
|
+
return t;
|
|
196
|
+
}
|
|
197
|
+
/** Campos de cor, para não repetir a lista em dois lugares. */
|
|
198
|
+
const COLOR_FIELDS = [
|
|
199
|
+
'primaryColor',
|
|
200
|
+
'secondaryColor',
|
|
201
|
+
'accentColor',
|
|
202
|
+
'backgroundColor',
|
|
203
|
+
'textColor',
|
|
204
|
+
'mutedColor',
|
|
205
|
+
];
|
|
206
|
+
/**
|
|
207
|
+
* Valida a entrada e devolve o objeto a persistir em `tenant.settings.branding`.
|
|
208
|
+
*
|
|
209
|
+
* Só as chaves PRESENTES na entrada aparecem no resultado — quem manda três
|
|
210
|
+
* campos altera três campos. `null` vira ausência do campo no armazenado, que é
|
|
211
|
+
* como o leitor representa "não configurado".
|
|
212
|
+
*/
|
|
213
|
+
export function parseBrandingInput(input) {
|
|
214
|
+
const out = {};
|
|
215
|
+
const set = (k, v) => {
|
|
216
|
+
if (v !== null)
|
|
217
|
+
out[k] = v;
|
|
218
|
+
};
|
|
219
|
+
if ('officeName' in input) {
|
|
220
|
+
set('officeName', input.officeName === null ? null : strictText('officeName', input.officeName, 160));
|
|
221
|
+
}
|
|
222
|
+
if ('signatureName' in input) {
|
|
223
|
+
set('signatureName', input.signatureName === null ? null : strictText('signatureName', input.signatureName, 160));
|
|
224
|
+
}
|
|
225
|
+
if ('tagline' in input) {
|
|
226
|
+
set('tagline', input.tagline === null ? null : strictText('tagline', input.tagline, 120));
|
|
227
|
+
}
|
|
228
|
+
if ('logoUrl' in input) {
|
|
229
|
+
set('logoUrl', input.logoUrl === null ? null : strictLogoUrl(input.logoUrl));
|
|
230
|
+
}
|
|
231
|
+
if ('logoKind' in input) {
|
|
232
|
+
if (input.logoKind === null)
|
|
233
|
+
set('logoKind', null);
|
|
234
|
+
else if (input.logoKind === 'symbol' || input.logoKind === 'lockup')
|
|
235
|
+
out.logoKind = input.logoKind;
|
|
236
|
+
else
|
|
237
|
+
throw new BrandingValidationError('logoKind', "logoKind: use 'symbol' ou 'lockup'.");
|
|
238
|
+
}
|
|
239
|
+
for (const field of COLOR_FIELDS) {
|
|
240
|
+
if (field in input) {
|
|
241
|
+
const v = input[field];
|
|
242
|
+
set(field, v === null ? null : strictColor(field, v));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if ('fontFamily' in input) {
|
|
246
|
+
set('fontFamily', input.fontFamily === null ? null : strictFontFamily(input.fontFamily));
|
|
247
|
+
}
|
|
248
|
+
if ('supportEmail' in input) {
|
|
249
|
+
if (input.supportEmail === null)
|
|
250
|
+
set('supportEmail', null);
|
|
251
|
+
else {
|
|
252
|
+
const t = strictText('supportEmail', input.supportEmail, 120);
|
|
253
|
+
if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(t)) {
|
|
254
|
+
throw new BrandingValidationError('supportEmail', 'supportEmail: e-mail inválido.');
|
|
255
|
+
}
|
|
256
|
+
out.supportEmail = t;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if ('supportPhone' in input) {
|
|
260
|
+
set('supportPhone', input.supportPhone === null ? null : strictText('supportPhone', input.supportPhone, 40));
|
|
261
|
+
}
|
|
262
|
+
if ('website' in input) {
|
|
263
|
+
set('website', input.website === null ? null : strictHttpsUrl('website', input.website));
|
|
264
|
+
}
|
|
265
|
+
return out;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Chaves que a marca ocupa dentro de `tenant.settings.branding`. Serve para o
|
|
269
|
+
* `null` REMOVER a chave em vez de gravar um nulo que o leitor teria de
|
|
270
|
+
* distinguir de ausente.
|
|
271
|
+
*/
|
|
272
|
+
export const BRANDING_KEYS = [
|
|
273
|
+
'officeName',
|
|
274
|
+
'signatureName',
|
|
275
|
+
'tagline',
|
|
276
|
+
'logoUrl',
|
|
277
|
+
'logoKind',
|
|
278
|
+
...COLOR_FIELDS,
|
|
279
|
+
'fontFamily',
|
|
280
|
+
'supportEmail',
|
|
281
|
+
'supportPhone',
|
|
282
|
+
'website',
|
|
283
|
+
];
|
|
284
|
+
/**
|
|
285
|
+
* Grava a marca do tenant CORRENTE.
|
|
286
|
+
*
|
|
287
|
+
* Dois pontos que a implementação não pode perder de vista:
|
|
288
|
+
*
|
|
289
|
+
* 1. **`tenant` não tem RLS.** É a tabela raiz — a fonte da fronteira, não uma
|
|
290
|
+
* linha protegida por ela. Por isso o `WHERE` amarra na GUC e a função NÃO
|
|
291
|
+
* aceita `tenantId` por parâmetro: parâmetro é pedido do chamador, e pedido
|
|
292
|
+
* do chamador não é fronteira. Sem contexto, zero linhas e erro.
|
|
293
|
+
*
|
|
294
|
+
* 2. **O merge acontece no banco, não na aplicação.** `settings` guarda mais
|
|
295
|
+
* que a marca. Ler-modificar-escrever perderia a escrita concorrente de
|
|
296
|
+
* outra chave; `jsonb ||` resolve dentro da própria instrução.
|
|
297
|
+
*/
|
|
298
|
+
export async function updateTenantBranding(tx, input) {
|
|
299
|
+
const patch = parseBrandingInput(input);
|
|
300
|
+
const removals = Object.entries(input)
|
|
301
|
+
.filter(([k, v]) => v === null && BRANDING_KEYS.includes(k))
|
|
302
|
+
.map(([k]) => k);
|
|
303
|
+
const rows = await tx `
|
|
304
|
+
UPDATE tenant
|
|
305
|
+
SET settings = jsonb_set(
|
|
306
|
+
settings,
|
|
307
|
+
'{branding}',
|
|
308
|
+
(COALESCE(settings -> 'branding', '{}'::jsonb) - ${removals}::text[])
|
|
309
|
+
|| ${tx.json(patch)}::jsonb,
|
|
310
|
+
true
|
|
311
|
+
),
|
|
312
|
+
updated_at = now()
|
|
313
|
+
WHERE id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
|
|
314
|
+
AND deleted_at IS NULL
|
|
315
|
+
RETURNING id
|
|
316
|
+
`;
|
|
317
|
+
if (!rows[0]) {
|
|
318
|
+
throw new BrandingValidationError('tenant', 'Sem contexto de escritório: a marca não pode ser gravada.');
|
|
319
|
+
}
|
|
320
|
+
return getTenantBranding(tx);
|
|
321
|
+
}
|
|
136
322
|
//# 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,39 @@
|
|
|
1
|
+
import type { Tx } from '../db/client.js';
|
|
2
|
+
import type { RecipientClearanceStore } from '../communication/clearance.js';
|
|
3
|
+
/**
|
|
4
|
+
* Liberação lida da ficha do cliente.
|
|
5
|
+
*
|
|
6
|
+
* `recipientRef` é o id do cliente — a mesma referência que o consentimento e a
|
|
7
|
+
* idempotência usam. A liberação é do CLIENTE, não do canal: quem confere o
|
|
8
|
+
* cadastro confere a pessoa, e um escritório que liberou o e-mail e não o
|
|
9
|
+
* WhatsApp está descrevendo qual canal quer usar, não quem já foi conferido.
|
|
10
|
+
* Se um dia a distinção por canal for necessária, ela entra aqui sem mexer no
|
|
11
|
+
* motor.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createClientClearanceStore(tx: Tx): RecipientClearanceStore;
|
|
14
|
+
export interface ClearanceResult {
|
|
15
|
+
clientId: string;
|
|
16
|
+
cleared: boolean;
|
|
17
|
+
clearedAt: string | null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Libera (ou revoga) um cliente para comunicação externa.
|
|
21
|
+
*
|
|
22
|
+
* Revogar é possível e deliberado: um endereço que voltou errado precisa poder
|
|
23
|
+
* sair da régua sem que alguém tenha de apagar o e-mail do cadastro — apagar o
|
|
24
|
+
* dado para parar o envio destrói a informação de contato junto.
|
|
25
|
+
*/
|
|
26
|
+
export declare function setClientClearance(tx: Tx, input: {
|
|
27
|
+
clientId: string;
|
|
28
|
+
cleared: boolean;
|
|
29
|
+
actorId: string | null;
|
|
30
|
+
}): Promise<ClearanceResult>;
|
|
31
|
+
export interface ClearanceSummary {
|
|
32
|
+
total: number;
|
|
33
|
+
cleared: number;
|
|
34
|
+
pending: number;
|
|
35
|
+
/** Não liberados que TÊM e-mail — os que a régua alcançaria se fosse liberada. */
|
|
36
|
+
pendingWithEmail: number;
|
|
37
|
+
}
|
|
38
|
+
export declare function clearanceSummary(tx: Tx): Promise<ClearanceSummary>;
|
|
39
|
+
//# sourceMappingURL=clearance-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clearance-store.d.ts","sourceRoot":"","sources":["../../src/collection/clearance-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,KAAK,EAAsB,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAEjG;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,EAAE,GAAG,uBAAuB,CAc1E;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACpE,OAAO,CAAC,eAAe,CAAC,CAgB1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiBxE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Liberação lida da ficha do cliente.
|
|
3
|
+
*
|
|
4
|
+
* `recipientRef` é o id do cliente — a mesma referência que o consentimento e a
|
|
5
|
+
* idempotência usam. A liberação é do CLIENTE, não do canal: quem confere o
|
|
6
|
+
* cadastro confere a pessoa, e um escritório que liberou o e-mail e não o
|
|
7
|
+
* WhatsApp está descrevendo qual canal quer usar, não quem já foi conferido.
|
|
8
|
+
* Se um dia a distinção por canal for necessária, ela entra aqui sem mexer no
|
|
9
|
+
* motor.
|
|
10
|
+
*/
|
|
11
|
+
export function createClientClearanceStore(tx) {
|
|
12
|
+
return {
|
|
13
|
+
async find(recipientRef, _channel) {
|
|
14
|
+
const rows = await tx `
|
|
15
|
+
SELECT communication_cleared_at
|
|
16
|
+
FROM client
|
|
17
|
+
WHERE id = ${recipientRef} AND deleted_at IS NULL
|
|
18
|
+
`;
|
|
19
|
+
// Cliente inexistente ou apagado não é "liberado por omissão": é um
|
|
20
|
+
// destinatário que o sistema não conhece, e o motor deve pular.
|
|
21
|
+
const at = rows[0]?.communication_cleared_at ?? null;
|
|
22
|
+
return { cleared: at !== null, clearedAt: at?.toISOString() ?? null };
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Libera (ou revoga) um cliente para comunicação externa.
|
|
28
|
+
*
|
|
29
|
+
* Revogar é possível e deliberado: um endereço que voltou errado precisa poder
|
|
30
|
+
* sair da régua sem que alguém tenha de apagar o e-mail do cadastro — apagar o
|
|
31
|
+
* dado para parar o envio destrói a informação de contato junto.
|
|
32
|
+
*/
|
|
33
|
+
export async function setClientClearance(tx, input) {
|
|
34
|
+
const rows = await tx `
|
|
35
|
+
UPDATE client
|
|
36
|
+
SET communication_cleared_at = ${input.cleared ? new Date() : null},
|
|
37
|
+
communication_cleared_by = ${input.cleared ? input.actorId : null},
|
|
38
|
+
updated_at = now()
|
|
39
|
+
WHERE id = ${input.clientId} AND deleted_at IS NULL
|
|
40
|
+
RETURNING id, communication_cleared_at
|
|
41
|
+
`;
|
|
42
|
+
const row = rows[0];
|
|
43
|
+
if (!row)
|
|
44
|
+
throw new Error('Cliente não encontrado neste escritório.');
|
|
45
|
+
return {
|
|
46
|
+
clientId: row.id,
|
|
47
|
+
cleared: row.communication_cleared_at !== null,
|
|
48
|
+
clearedAt: row.communication_cleared_at?.toISOString() ?? null,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export async function clearanceSummary(tx) {
|
|
52
|
+
const [r] = await tx `
|
|
53
|
+
SELECT count(*)::int AS total,
|
|
54
|
+
count(*) FILTER (WHERE communication_cleared_at IS NOT NULL)::int AS cleared,
|
|
55
|
+
count(*) FILTER (WHERE communication_cleared_at IS NULL
|
|
56
|
+
AND email IS NOT NULL)::int AS pending_email
|
|
57
|
+
FROM client
|
|
58
|
+
WHERE deleted_at IS NULL AND status = 'active'
|
|
59
|
+
`;
|
|
60
|
+
const total = r?.total ?? 0;
|
|
61
|
+
const cleared = r?.cleared ?? 0;
|
|
62
|
+
return {
|
|
63
|
+
total,
|
|
64
|
+
cleared,
|
|
65
|
+
pending: total - cleared,
|
|
66
|
+
pendingWithEmail: r?.pending_email ?? 0,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=clearance-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clearance-store.js","sourceRoot":"","sources":["../../src/collection/clearance-store.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,MAAM,UAAU,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;AACH,MAAM,CAAC,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;AAUD,MAAM,CAAC,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"}
|
|
@@ -34,6 +34,43 @@ import type { CollectionCommunication } from './engine.js';
|
|
|
34
34
|
* nada parecesse errado.
|
|
35
35
|
*/
|
|
36
36
|
export declare function brandKeyFor(branding: TenantBranding): string;
|
|
37
|
+
/**
|
|
38
|
+
* Nome canônico da credencial de e-mail no cofre do escritório.
|
|
39
|
+
*
|
|
40
|
+
* Um nome só, igual para todos os tenants — o que muda é DE QUEM é o cofre. Um
|
|
41
|
+
* nome por tenant faria a resolução depender de convenção, e convenção é o que
|
|
42
|
+
* ninguém confere no dia do incidente.
|
|
43
|
+
*/
|
|
44
|
+
export declare const TENANT_EMAIL_CREDENTIAL_NAME = "resend-api-key";
|
|
45
|
+
/**
|
|
46
|
+
* Referência de credencial de e-mail: cofre do tenant quando existe, plataforma
|
|
47
|
+
* quando não.
|
|
48
|
+
*
|
|
49
|
+
* ## O problema que isto resolve (P0-C)
|
|
50
|
+
*
|
|
51
|
+
* Nenhum escritório tinha conta de e-mail própria configurada, então todos
|
|
52
|
+
* caíam no fallback de plataforma — cujo `credentialRef` é o nome de uma
|
|
53
|
+
* variável de ambiente do processo. Dois escritórios mandavam pela MESMA conta
|
|
54
|
+
* do provedor: bloqueio e reputação atingem os dois juntos, e o histórico de
|
|
55
|
+
* envio no provedor mistura clientes de escritórios diferentes.
|
|
56
|
+
*
|
|
57
|
+
* Não era vazamento de segredo — o cofre sempre foi isolado por RLS, e nenhum
|
|
58
|
+
* tenant lê a credencial do outro. Era ausência de isolamento de CONTA.
|
|
59
|
+
*
|
|
60
|
+
* ## Por que ler o cofre aqui, e não exigir configuração
|
|
61
|
+
*
|
|
62
|
+
* A SC já tem `resend-api-key` no cofre desde a rotação de agosto; o caminho de
|
|
63
|
+
* e-mail é que não a consumia. Preferir o cofre quando ele existe corrige a SC
|
|
64
|
+
* hoje, sem pedir nada a ninguém, e faz todo tenant novo nascer isolado assim
|
|
65
|
+
* que grava a própria chave.
|
|
66
|
+
*
|
|
67
|
+
* Só o NOME é consultado — `reveal` não é chamado aqui. O segredo continua
|
|
68
|
+
* sendo materializado uma única vez, na borda do adapter.
|
|
69
|
+
*/
|
|
70
|
+
export declare function resolveTenantEmailCredentialRef(tx: Tx, platformRef: string): Promise<{
|
|
71
|
+
ref: string;
|
|
72
|
+
origin: 'tenant-vault' | 'platform-fallback';
|
|
73
|
+
}>;
|
|
37
74
|
export interface CollectionCommunicationOptions {
|
|
38
75
|
/**
|
|
39
76
|
* Pool. Usado SÓ pela reserva de envio, que precisa de transação própria e
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication-runtime.d.ts","sourceRoot":"","sources":["../../src/collection/communication-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"communication-runtime.d.ts","sourceRoot":"","sources":["../../src/collection/communication-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAWL,KAAK,UAAU,EAEf,KAAK,YAAY,EAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAqB,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAG1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAY5D;AAED;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,mBAAmB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,+BAA+B,CACnD,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,GAAG,mBAAmB,CAAA;CAAE,CAAC,CAcxE;AAED,MAAM,WAAW,8BAA8B;IAC7C;;;OAGG;IACH,EAAE,EAAE,EAAE,CAAC;IACP,wEAAwE;IACxE,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB;;;;;OAKG;IACH,aAAa,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D;;;OAGG;IACH,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAChE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,+EAA+E;IAC/E,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,uBAAuB,CAAC,CAoHlC;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,IAAI,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB5F;AAED,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,EAAE,SAAS,UAAU,EAAiC,CAAC;AAEzF,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
* organização de código: é o que faz "existe uma única autoridade de envio" ser
|
|
21
21
|
* uma propriedade verificável em vez de uma intenção.
|
|
22
22
|
*/
|
|
23
|
+
import { createClientClearanceStore } from './clearance-store.js';
|
|
23
24
|
import { createEmailChannel, createPostgresAuditSink, createPostgresChannelBindingStore, createPostgresDispatchClaimStore, createSmsChannel, createWhatsAppChannel, credentialResolverFor, resolveSenderProfile, routeAccountsByChannel, withSenderFallback, } from '../communication/index.js';
|
|
24
25
|
import { collectionSenderFallback, createTenantChannelAccountStore } from './channel-accounts.js';
|
|
25
26
|
import { collectionContext, SC_PRODUCT } from './communication-bridge.js';
|
|
@@ -46,6 +47,54 @@ export function brandKeyFor(branding) {
|
|
|
46
47
|
// nome de escritório com caracteres incomuns.
|
|
47
48
|
return /^[a-z][a-z0-9-]*[a-z0-9]$/.test(slug) ? slug : 'baruk-office';
|
|
48
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Nome canônico da credencial de e-mail no cofre do escritório.
|
|
52
|
+
*
|
|
53
|
+
* Um nome só, igual para todos os tenants — o que muda é DE QUEM é o cofre. Um
|
|
54
|
+
* nome por tenant faria a resolução depender de convenção, e convenção é o que
|
|
55
|
+
* ninguém confere no dia do incidente.
|
|
56
|
+
*/
|
|
57
|
+
export const TENANT_EMAIL_CREDENTIAL_NAME = 'resend-api-key';
|
|
58
|
+
/**
|
|
59
|
+
* Referência de credencial de e-mail: cofre do tenant quando existe, plataforma
|
|
60
|
+
* quando não.
|
|
61
|
+
*
|
|
62
|
+
* ## O problema que isto resolve (P0-C)
|
|
63
|
+
*
|
|
64
|
+
* Nenhum escritório tinha conta de e-mail própria configurada, então todos
|
|
65
|
+
* caíam no fallback de plataforma — cujo `credentialRef` é o nome de uma
|
|
66
|
+
* variável de ambiente do processo. Dois escritórios mandavam pela MESMA conta
|
|
67
|
+
* do provedor: bloqueio e reputação atingem os dois juntos, e o histórico de
|
|
68
|
+
* envio no provedor mistura clientes de escritórios diferentes.
|
|
69
|
+
*
|
|
70
|
+
* Não era vazamento de segredo — o cofre sempre foi isolado por RLS, e nenhum
|
|
71
|
+
* tenant lê a credencial do outro. Era ausência de isolamento de CONTA.
|
|
72
|
+
*
|
|
73
|
+
* ## Por que ler o cofre aqui, e não exigir configuração
|
|
74
|
+
*
|
|
75
|
+
* A SC já tem `resend-api-key` no cofre desde a rotação de agosto; o caminho de
|
|
76
|
+
* e-mail é que não a consumia. Preferir o cofre quando ele existe corrige a SC
|
|
77
|
+
* hoje, sem pedir nada a ninguém, e faz todo tenant novo nascer isolado assim
|
|
78
|
+
* que grava a própria chave.
|
|
79
|
+
*
|
|
80
|
+
* Só o NOME é consultado — `reveal` não é chamado aqui. O segredo continua
|
|
81
|
+
* sendo materializado uma única vez, na borda do adapter.
|
|
82
|
+
*/
|
|
83
|
+
export async function resolveTenantEmailCredentialRef(tx, platformRef) {
|
|
84
|
+
const rows = await tx `
|
|
85
|
+
SELECT count(*)::int AS n
|
|
86
|
+
FROM vault_credential
|
|
87
|
+
WHERE lower(name) = ${TENANT_EMAIL_CREDENTIAL_NAME}
|
|
88
|
+
AND deleted_at IS NULL
|
|
89
|
+
AND (expires_at IS NULL OR expires_at > now())
|
|
90
|
+
`;
|
|
91
|
+
// A consulta roda sob RLS: só enxerga o cofre do tenant do contexto. Não é
|
|
92
|
+
// preciso filtrar por `tenant_id` aqui, e filtrar daria a impressão errada de
|
|
93
|
+
// que o isolamento vem do WHERE.
|
|
94
|
+
return (rows[0]?.n ?? 0) > 0
|
|
95
|
+
? { ref: `vault://${TENANT_EMAIL_CREDENTIAL_NAME}`, origin: 'tenant-vault' }
|
|
96
|
+
: { ref: platformRef, origin: 'platform-fallback' };
|
|
97
|
+
}
|
|
49
98
|
/**
|
|
50
99
|
* Monta o consumo do motor para UM tenant.
|
|
51
100
|
*
|
|
@@ -74,7 +123,13 @@ export async function buildCollectionCommunication(options) {
|
|
|
74
123
|
* e não ser chamado —, agora do lado do consumo.
|
|
75
124
|
*/
|
|
76
125
|
const bindingAccounts = createPostgresChannelBindingStore(tx);
|
|
77
|
-
|
|
126
|
+
// Credencial de e-mail: cofre do tenant quando existe (P0-C). Resolvido antes
|
|
127
|
+
// do fallback porque é ele que carrega o `credentialRef`.
|
|
128
|
+
const emailCredential = await resolveTenantEmailCredentialRef(tx, options.platformEmail.credentialRef);
|
|
129
|
+
const fallback = collectionSenderFallback(branding, {
|
|
130
|
+
...options.platformEmail,
|
|
131
|
+
credentialRef: emailCredential.ref,
|
|
132
|
+
});
|
|
78
133
|
/*
|
|
79
134
|
* Precedência POR CANAL, explícita — e não um `??` entre dois stores.
|
|
80
135
|
*
|
|
@@ -140,6 +195,9 @@ export async function buildCollectionCommunication(options) {
|
|
|
140
195
|
accounts,
|
|
141
196
|
templates: createCollectionTemplateStore(tx),
|
|
142
197
|
consent: createConsentStore(tx),
|
|
198
|
+
// A conferência do escritório, lida da ficha do cliente. Sem ela, importar
|
|
199
|
+
// a carteira ligaria a régua para todo mundo no primeiro cron.
|
|
200
|
+
clearance: createClientClearanceStore(tx),
|
|
143
201
|
// Fail-safe em todo canal de telefone: sem permissão registrada, não sai.
|
|
144
202
|
// O e-mail transacional de cobrança se apoia na relação contratual, e por
|
|
145
203
|
// isso é o único cujo indefinido é tratado como permitido.
|
|
@@ -147,6 +205,10 @@ export async function buildCollectionCommunication(options) {
|
|
|
147
205
|
claims: createPostgresDispatchClaimStore(db, tenantId),
|
|
148
206
|
audit: createPostgresAuditSink(tx, tenantId),
|
|
149
207
|
emailSenderOrigin: email.ok ? email.profile.origin : null,
|
|
208
|
+
// De onde veio a CREDENCIAL (não o remetente): `tenant-vault` significa
|
|
209
|
+
// conta própria do escritório; `platform-fallback` significa conta
|
|
210
|
+
// compartilhada — a dívida que o P0-C deixa medível em vez de silenciosa.
|
|
211
|
+
emailCredentialOrigin: emailCredential.origin,
|
|
150
212
|
dryRun: options.dryRun,
|
|
151
213
|
};
|
|
152
214
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication-runtime.js","sourceRoot":"","sources":["../../src/collection/communication-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,iCAAiC,EACjC,gCAAgC,EAChC,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,GAInB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,wBAAwB,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAGtE;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,QAAwB;IAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU;SAC7B,WAAW,EAAE;SACb,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,2EAA2E;IAC3E,2EAA2E;IAC3E,8CAA8C;IAC9C,OAAO,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;AACxE,CAAC;AAmCD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,OAAuC;IAEvC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,+BAA+B,CAAC,EAAE,CAAC,CAAC;IAC3D;;;;;;;;;;;;;OAaG;IACH,MAAM,eAAe,GAAG,iCAAiC,CAAC,EAAE,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"communication-runtime.js","sourceRoot":"","sources":["../../src/collection/communication-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,iCAAiC,EACjC,gCAAgC,EAChC,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,GAInB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,wBAAwB,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAGtE;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,QAAwB;IAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU;SAC7B,WAAW,EAAE;SACb,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,2EAA2E;IAC3E,2EAA2E;IAC3E,8CAA8C;IAC9C,OAAO,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;AACxE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,gBAAgB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,EAAM,EACN,WAAmB;IAEnB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAiB;;;2BAGb,4BAA4B;;;GAGpD,CAAC;IACF,2EAA2E;IAC3E,8EAA8E;IAC9E,iCAAiC;IACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;QAC1B,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,4BAA4B,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;QAC5E,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;AACxD,CAAC;AAmCD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,OAAuC;IAEvC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,+BAA+B,CAAC,EAAE,CAAC,CAAC;IAC3D;;;;;;;;;;;;;OAaG;IACH,MAAM,eAAe,GAAG,iCAAiC,CAAC,EAAE,CAAC,CAAC;IAC9D,8EAA8E;IAC9E,0DAA0D;IAC1D,MAAM,eAAe,GAAG,MAAM,+BAA+B,CAC3D,EAAE,EACF,OAAO,CAAC,aAAa,CAAC,aAAa,CACpC,CAAC;IACF,MAAM,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,EAAE;QAClD,GAAG,OAAO,CAAC,aAAa;QACxB,aAAa,EAAE,eAAe,CAAC,GAAG;KACnC,CAAC,CAAC;IACH;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,QAAQ,GAAG,sBAAsB,CAAC;QACtC,KAAK,EAAE,kBAAkB,CAAC,cAAc,EAAE,QAAQ,CAAC;QACnD,QAAQ,EAAE,eAAe;QACzB,GAAG,EAAE,eAAe;KACrB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,cAAc,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjF,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,GAAG,kBAAkB,CAAC;YAClC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO;YAC9B,yEAAyE;YACzE,sCAAsC;YACtC,iBAAiB,EAAE,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC;SAC3F,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,sEAAsE;IACtE,6EAA6E;IAC7E,+EAA+E;IAC/E,4EAA4E;IAC5E,cAAc;IACd,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC7D,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,QAAQ,GAAG,qBAAqB,CAAC;YACxC,OAAO,EAAE,QAAQ;YACjB,iBAAiB,EAAE,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC;YAC7E,QAAQ,EAAE,OAAO,CAAC,gBAAgB,KAAK,IAAI;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnD,IAAI,GAAG,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QAChC,wEAAwE;QACxE,uEAAuE;QACvE,4EAA4E;QAC5E,qDAAqD;QACrD,QAAQ,CAAC,GAAG,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,4EAA4E;IAC5E,yEAAyE;IACzE,yEAAyE;IAEzE,OAAO;QACL,QAAQ;QACR,KAAK;QACL,QAAQ;QACR,QAAQ;QACR,SAAS,EAAE,6BAA6B,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;QAC/B,2EAA2E;QAC3E,+DAA+D;QAC/D,SAAS,EAAE,0BAA0B,CAAC,EAAE,CAAC;QACzC,0EAA0E;QAC1E,0EAA0E;QAC1E,2DAA2D;QAC3D,aAAa,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE;QACzF,MAAM,EAAE,gCAAgC,CAAC,EAAE,EAAE,QAAQ,CAAC;QACtD,KAAK,EAAE,uBAAuB,CAAC,EAAE,EAAE,QAAQ,CAAC;QAC5C,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QACzD,wEAAwE;QACxE,mEAAmE;QACnE,0EAA0E;QAC1E,qBAAqB,EAAE,eAAe,CAAC,MAAM;QAC7C,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,6BAA6B;IAC3C,wEAAwE;IACxE,EAAE;IACF,yEAAyE;IACzE,0EAA0E;IAC1E,6EAA6E;IAC7E,+EAA+E;IAC/E,8EAA8E;IAC9E,+EAA+E;IAC/E,uCAAuC;IACvC,EAAE;IACF,6EAA6E;IAC7E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC5C,OAAO,KAAK,EAAE,GAAW,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACxC,+EAA+E;QAC/E,0EAA0E;QAC1E,2BAA2B;QAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,CAAC,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,qBAAqB,GAA0B,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;AAEzF,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Tx } from '../db/client.js';
|
|
2
|
+
import type { RecipientClearanceStore } from '../communication/clearance.js';
|
|
2
3
|
import { type CollectionPolicy, type CollectionStep } from './policy.js';
|
|
3
4
|
import type { TenantBranding } from './branding.js';
|
|
4
5
|
import type { PaymentBlock } from './payment-block.js';
|
|
@@ -75,6 +76,15 @@ export interface CollectionCommunication {
|
|
|
75
76
|
templates: TemplateStore;
|
|
76
77
|
consent: ConsentStore;
|
|
77
78
|
consentPolicy?: ConsentPolicy;
|
|
79
|
+
/**
|
|
80
|
+
* Liberação do destinatário pelo escritório. **Obrigatória.**
|
|
81
|
+
*
|
|
82
|
+
* Distinta de `consent`: aquilo é a vontade do cliente, isto é a conferência
|
|
83
|
+
* de quem envia. Sem `?` porque a régua é justamente o caminho automático
|
|
84
|
+
* que dispara sobre a carteira inteira — o consumidor que a esquecesse
|
|
85
|
+
* ganharia de volta o comportamento que esta barreira existe para impedir.
|
|
86
|
+
*/
|
|
87
|
+
clearance: RecipientClearanceStore;
|
|
78
88
|
/**
|
|
79
89
|
* Canais a tentar, por etapa. Política do ESCRITÓRIO — o motor só executa.
|
|
80
90
|
*
|
|
@@ -101,6 +111,19 @@ export interface CollectionCommunication {
|
|
|
101
111
|
* uma coisa que o escritório consegue ver, e não uma linha de código.
|
|
102
112
|
*/
|
|
103
113
|
emailSenderOrigin?: SenderOrigin | null;
|
|
114
|
+
/**
|
|
115
|
+
* De onde veio a CREDENCIAL de e-mail — distinto do remetente.
|
|
116
|
+
*
|
|
117
|
+
* `tenant-vault`: o escritório tem conta própria do provedor no cofre.
|
|
118
|
+
* `platform-fallback`: está mandando pela conta compartilhada da plataforma —
|
|
119
|
+
* um bloqueio ou uma queda de reputação ali atinge todos os escritórios que
|
|
120
|
+
* dependem dela ao mesmo tempo.
|
|
121
|
+
*
|
|
122
|
+
* A distinção existe para que essa dependência seja MEDÍVEL. Enquanto era só
|
|
123
|
+
* um `credentialRef` fixo no fallback, "quantos escritórios ainda dividem a
|
|
124
|
+
* mesma conta?" não tinha resposta sem ler código.
|
|
125
|
+
*/
|
|
126
|
+
emailCredentialOrigin?: 'tenant-vault' | 'platform-fallback' | null;
|
|
104
127
|
/** Percorre tudo e relata, sem chamar adapter nenhum e sem reservar chave. */
|
|
105
128
|
dryRun?: boolean;
|
|
106
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/collection/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/collection/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -152,6 +152,7 @@ async function sendViaSharedEngine(tx, ctx, comm, action, current, step) {
|
|
|
152
152
|
templates: comm.templates,
|
|
153
153
|
consent: comm.consent,
|
|
154
154
|
consentPolicy: comm.consentPolicy,
|
|
155
|
+
clearance: comm.clearance,
|
|
155
156
|
resolveRecipient: (ref, channel) => ctx.resolveRecipient(ref, channel),
|
|
156
157
|
buildContent: buildCollectionContent({
|
|
157
158
|
branding: ctx.branding,
|
|
@@ -221,6 +222,25 @@ async function sendViaSharedEngine(tx, ctx, comm, action, current, step) {
|
|
|
221
222
|
if (claimRefusedIn(result.attempts)) {
|
|
222
223
|
return { ...NO_ATTEMPT, notAttempted: true };
|
|
223
224
|
}
|
|
225
|
+
// Aguardando conferência do escritório: a etapa fica INTACTA e volta no
|
|
226
|
+
// próximo ciclo.
|
|
227
|
+
//
|
|
228
|
+
// Escalar aqui seria o defeito, e o teste que o encontrou é
|
|
229
|
+
// `collection-clearance-gate`: `markEscalated` fecha a etapa, e
|
|
230
|
+
// `planCollections` não reagenda um `step_key` que já existe. A cobrança
|
|
231
|
+
// daquele dia morreria, e liberar o cliente depois não a recuperaria — a
|
|
232
|
+
// barreira teria virado perda silenciosa em vez de espera.
|
|
233
|
+
//
|
|
234
|
+
// Tratado como a reserva negada, e pela mesma lógica: nada aconteceu de
|
|
235
|
+
// errado, só ainda não é hora. Também não gasta tentativa — três dias sem
|
|
236
|
+
// alguém clicar "conferir" matariam a etapa por decurso de prazo.
|
|
237
|
+
//
|
|
238
|
+
// O escritório não fica sem saber: o pulo tem nome na trilha
|
|
239
|
+
// (`recipient_not_confirmed`), o painel conta os clientes com e-mail
|
|
240
|
+
// aguardando liberação, e o checklist de go-live tem o gate.
|
|
241
|
+
if (result.attempts.some((a) => a.skipped === 'recipient_not_confirmed')) {
|
|
242
|
+
return { ...NO_ATTEMPT, notAttempted: true };
|
|
243
|
+
}
|
|
224
244
|
// Nada foi enviado e nenhum adapter falhou: todas as portas recusaram antes.
|
|
225
245
|
// O motivo é o que diz ao escritório o que fazer — e cada um exige uma ação
|
|
226
246
|
// diferente, então nenhum deles pode virar um "não enviado" genérico.
|