@baruk/core 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.baruk-provenance.json +10 -0
- package/CHANGELOG.md +127 -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/password-reset.d.ts +30 -1
- package/dist/auth/password-reset.d.ts.map +1 -1
- package/dist/auth/password-reset.js +139 -11
- package/dist/auth/password-reset.js.map +1 -1
- package/dist/auth/service.d.ts +60 -2
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +121 -11
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +374 -0
- package/dist/billing/ar-repository.d.ts.map +1 -0
- package/dist/billing/ar-repository.js +783 -0
- package/dist/billing/ar-repository.js.map +1 -0
- package/dist/billing/auto-generation.d.ts +87 -0
- package/dist/billing/auto-generation.d.ts.map +1 -0
- package/dist/billing/auto-generation.js +181 -0
- package/dist/billing/auto-generation.js.map +1 -0
- package/dist/billing/live-guard.d.ts +64 -0
- package/dist/billing/live-guard.d.ts.map +1 -0
- package/dist/billing/live-guard.js +68 -0
- package/dist/billing/live-guard.js.map +1 -0
- package/dist/billing/payment-means-catalog.d.ts +17 -0
- package/dist/billing/payment-means-catalog.d.ts.map +1 -0
- package/dist/billing/payment-means-catalog.js +21 -0
- package/dist/billing/payment-means-catalog.js.map +1 -0
- package/dist/billing/payment-means.d.ts +38 -0
- package/dist/billing/payment-means.d.ts.map +1 -0
- package/dist/billing/payment-means.js +29 -0
- package/dist/billing/payment-means.js.map +1 -0
- package/dist/billing/payment-rail.d.ts +118 -0
- package/dist/billing/payment-rail.d.ts.map +1 -0
- package/dist/billing/payment-rail.js +295 -0
- package/dist/billing/payment-rail.js.map +1 -0
- package/dist/billing/provider/asaas.d.ts +46 -1
- package/dist/billing/provider/asaas.d.ts.map +1 -1
- package/dist/billing/provider/asaas.js +194 -14
- package/dist/billing/provider/asaas.js.map +1 -1
- package/dist/billing/provider/manual.js +1 -1
- package/dist/billing/provider/manual.js.map +1 -1
- package/dist/billing/provider/types.d.ts +115 -8
- package/dist/billing/provider/types.d.ts.map +1 -1
- package/dist/billing/provider-account.d.ts +127 -0
- package/dist/billing/provider-account.d.ts.map +1 -0
- package/dist/billing/provider-account.js +217 -0
- package/dist/billing/provider-account.js.map +1 -0
- package/dist/billing/provider-onboarding.d.ts +67 -0
- package/dist/billing/provider-onboarding.d.ts.map +1 -0
- package/dist/billing/provider-onboarding.js +234 -0
- package/dist/billing/provider-onboarding.js.map +1 -0
- package/dist/billing/receivable.d.ts +5 -1
- package/dist/billing/receivable.d.ts.map +1 -1
- package/dist/billing/reconcile.d.ts +58 -0
- package/dist/billing/reconcile.d.ts.map +1 -0
- package/dist/billing/reconcile.js +138 -0
- package/dist/billing/reconcile.js.map +1 -0
- package/dist/billing/repository.d.ts +134 -1
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +193 -20
- 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/password-reset.js +141 -11
- package/dist/cjs/auth/password-reset.js.map +1 -1
- package/dist/cjs/auth/service.js +121 -10
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +804 -0
- package/dist/cjs/billing/ar-repository.js.map +1 -0
- package/dist/cjs/billing/auto-generation.js +186 -0
- package/dist/cjs/billing/auto-generation.js.map +1 -0
- package/dist/cjs/billing/live-guard.js +72 -0
- package/dist/cjs/billing/live-guard.js.map +1 -0
- package/dist/cjs/billing/payment-means-catalog.js +25 -0
- package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
- package/dist/cjs/billing/payment-means.js +33 -0
- package/dist/cjs/billing/payment-means.js.map +1 -0
- package/dist/cjs/billing/payment-rail.js +301 -0
- package/dist/cjs/billing/payment-rail.js.map +1 -0
- package/dist/cjs/billing/provider/asaas.js +194 -14
- package/dist/cjs/billing/provider/asaas.js.map +1 -1
- package/dist/cjs/billing/provider/manual.js +1 -1
- package/dist/cjs/billing/provider/manual.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +229 -0
- package/dist/cjs/billing/provider-account.js.map +1 -0
- package/dist/cjs/billing/provider-onboarding.js +239 -0
- package/dist/cjs/billing/provider-onboarding.js.map +1 -0
- package/dist/cjs/billing/reconcile.js +143 -0
- package/dist/cjs/billing/reconcile.js.map +1 -0
- package/dist/cjs/billing/repository.js +197 -19
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/ibge.js +103 -0
- package/dist/cjs/clients/ibge.js.map +1 -0
- package/dist/cjs/clients/repository.js +276 -23
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +330 -0
- package/dist/cjs/collection/branding.js.map +1 -0
- package/dist/cjs/collection/channel-accounts.js +137 -0
- package/dist/cjs/collection/channel-accounts.js.map +1 -0
- package/dist/cjs/collection/channel.js +17 -0
- package/dist/cjs/collection/channel.js.map +1 -0
- package/dist/cjs/collection/clearance-store.js +74 -0
- package/dist/cjs/collection/clearance-store.js.map +1 -0
- package/dist/cjs/collection/communication-bridge.js +140 -0
- package/dist/cjs/collection/communication-bridge.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +256 -0
- package/dist/cjs/collection/communication-runtime.js.map +1 -0
- package/dist/cjs/collection/consent-repository.js +84 -0
- package/dist/cjs/collection/consent-repository.js.map +1 -0
- package/dist/cjs/collection/copy.js +125 -0
- package/dist/cjs/collection/copy.js.map +1 -0
- package/dist/cjs/collection/delivery-callback.js +151 -0
- package/dist/cjs/collection/delivery-callback.js.map +1 -0
- package/dist/cjs/collection/email-layout.js +252 -0
- package/dist/cjs/collection/email-layout.js.map +1 -0
- package/dist/cjs/collection/engine.js +434 -0
- package/dist/cjs/collection/engine.js.map +1 -0
- package/dist/cjs/collection/format.js +76 -0
- package/dist/cjs/collection/format.js.map +1 -0
- package/dist/cjs/collection/payment-block.js +3 -0
- package/dist/cjs/collection/payment-block.js.map +1 -0
- package/dist/cjs/collection/policy.js +175 -0
- package/dist/cjs/collection/policy.js.map +1 -0
- package/dist/cjs/collection/repository.js +260 -0
- package/dist/cjs/collection/repository.js.map +1 -0
- package/dist/cjs/collection/subject.js +104 -0
- package/dist/cjs/collection/subject.js.map +1 -0
- package/dist/cjs/collection/template-catalog.js +165 -0
- package/dist/cjs/collection/template-catalog.js.map +1 -0
- package/dist/cjs/collection/template.js +78 -0
- package/dist/cjs/collection/template.js.map +1 -0
- package/dist/cjs/communication/adapters/email.js +132 -0
- package/dist/cjs/communication/adapters/email.js.map +1 -0
- package/dist/cjs/communication/adapters/sms.js +127 -0
- package/dist/cjs/communication/adapters/sms.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp.js +213 -0
- package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
- package/dist/cjs/communication/audit.js +61 -0
- package/dist/cjs/communication/audit.js.map +1 -0
- package/dist/cjs/communication/capabilities.js +76 -0
- package/dist/cjs/communication/capabilities.js.map +1 -0
- package/dist/cjs/communication/channel.js +53 -0
- package/dist/cjs/communication/channel.js.map +1 -0
- package/dist/cjs/communication/claim.js +228 -0
- package/dist/cjs/communication/claim.js.map +1 -0
- package/dist/cjs/communication/clearance.js +18 -0
- package/dist/cjs/communication/clearance.js.map +1 -0
- package/dist/cjs/communication/consent.js +43 -0
- package/dist/cjs/communication/consent.js.map +1 -0
- package/dist/cjs/communication/context.js +45 -0
- package/dist/cjs/communication/context.js.map +1 -0
- package/dist/cjs/communication/credentials.js +121 -0
- package/dist/cjs/communication/credentials.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +166 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
- package/dist/cjs/communication/dry-run.js +97 -0
- package/dist/cjs/communication/dry-run.js.map +1 -0
- package/dist/cjs/communication/engine.js +495 -0
- package/dist/cjs/communication/engine.js.map +1 -0
- package/dist/cjs/communication/graph.js +50 -0
- package/dist/cjs/communication/graph.js.map +1 -0
- package/dist/cjs/communication/idempotency.js +26 -0
- package/dist/cjs/communication/idempotency.js.map +1 -0
- package/dist/cjs/communication/identity.js +110 -0
- package/dist/cjs/communication/identity.js.map +1 -0
- package/dist/cjs/communication/index.js +135 -0
- package/dist/cjs/communication/index.js.map +1 -0
- package/dist/cjs/communication/onboarding.js +297 -0
- package/dist/cjs/communication/onboarding.js.map +1 -0
- package/dist/cjs/communication/policy.js +16 -0
- package/dist/cjs/communication/policy.js.map +1 -0
- package/dist/cjs/communication/routing.js +77 -0
- package/dist/cjs/communication/routing.js.map +1 -0
- package/dist/cjs/communication/sender-profile.js +128 -0
- package/dist/cjs/communication/sender-profile.js.map +1 -0
- package/dist/cjs/communication/status.js +86 -0
- package/dist/cjs/communication/status.js.map +1 -0
- package/dist/cjs/communication/stores/onboarding.js +135 -0
- package/dist/cjs/communication/stores/onboarding.js.map +1 -0
- package/dist/cjs/communication/stores/postgres.js +458 -0
- package/dist/cjs/communication/stores/postgres.js.map +1 -0
- package/dist/cjs/communication/stores/routing.js +334 -0
- package/dist/cjs/communication/stores/routing.js.map +1 -0
- package/dist/cjs/communication/stores/secrets.js +126 -0
- package/dist/cjs/communication/stores/secrets.js.map +1 -0
- package/dist/cjs/communication/template-provider.js +22 -0
- package/dist/cjs/communication/template-provider.js.map +1 -0
- package/dist/cjs/communication/template.js +63 -0
- package/dist/cjs/communication/template.js.map +1 -0
- package/dist/cjs/communication/webhook-subscription.js +258 -0
- package/dist/cjs/communication/webhook-subscription.js.map +1 -0
- package/dist/cjs/communication/webhook.js +292 -0
- package/dist/cjs/communication/webhook.js.map +1 -0
- 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 +622 -0
- package/dist/cjs/competence/repository.js.map +1 -0
- package/dist/cjs/contacts/phone.js +192 -0
- package/dist/cjs/contacts/phone.js.map +1 -0
- package/dist/cjs/dashboard/pilot-panel.js +90 -0
- package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
- package/dist/cjs/dashboard/repository.js +11 -1
- package/dist/cjs/dashboard/repository.js.map +1 -1
- package/dist/cjs/db/client.js +17 -11
- package/dist/cjs/db/client.js.map +1 -1
- package/dist/cjs/db/provision-e2e-identity.js +111 -0
- package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
- package/dist/cjs/db/seed-catalog.js +48 -0
- package/dist/cjs/db/seed-catalog.js.map +1 -0
- package/dist/cjs/db/seed.js +15 -7
- package/dist/cjs/db/seed.js.map +1 -1
- package/dist/cjs/documents/repository.js +244 -0
- package/dist/cjs/documents/repository.js.map +1 -0
- package/dist/cjs/documents/requests.js +136 -0
- package/dist/cjs/documents/requests.js.map +1 -0
- package/dist/cjs/fiscal/applicability.js +164 -0
- package/dist/cjs/fiscal/applicability.js.map +1 -0
- package/dist/cjs/fiscal/conditions.js +198 -0
- package/dist/cjs/fiscal/conditions.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/cjs/fiscal/coverage/model.js +127 -0
- package/dist/cjs/fiscal/coverage/model.js.map +1 -0
- package/dist/cjs/fiscal/coverage/requests.js +99 -0
- package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
- package/dist/cjs/fiscal/credentials/material.js +168 -0
- package/dist/cjs/fiscal/credentials/material.js.map +1 -0
- package/dist/cjs/fiscal/credentials/readiness.js +163 -0
- package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
- package/dist/cjs/fiscal/eligibility.js +199 -0
- package/dist/cjs/fiscal/eligibility.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/direction.js +36 -0
- package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/provider.js +51 -0
- package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/repository.js +132 -0
- package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/cjs/fiscal/repository.js +470 -0
- package/dist/cjs/fiscal/repository.js.map +1 -0
- package/dist/cjs/fiscal/sync/circuit.js +124 -0
- package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
- package/dist/cjs/fiscal/sync/intervention.js +140 -0
- package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
- package/dist/cjs/fiscal/sync/lease.js +146 -0
- package/dist/cjs/fiscal/sync/lease.js.map +1 -0
- package/dist/cjs/fiscal/sync/observability.js +244 -0
- package/dist/cjs/fiscal/sync/observability.js.map +1 -0
- package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
- package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/cjs/fiscal/sync/policy.js +143 -0
- package/dist/cjs/fiscal/sync/policy.js.map +1 -0
- package/dist/cjs/fiscal/sync/reprocess.js +241 -0
- package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
- package/dist/cjs/fiscal/sync/retry.js +183 -0
- package/dist/cjs/fiscal/sync/retry.js.map +1 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/cjs/fiscal/transport/https.js +309 -0
- package/dist/cjs/fiscal/transport/https.js.map +1 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js +328 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/cjs/fiscal/transport/types.js +93 -0
- package/dist/cjs/fiscal/transport/types.js.map +1 -0
- package/dist/cjs/import/br-documents.js +85 -0
- package/dist/cjs/import/br-documents.js.map +1 -0
- package/dist/cjs/import/clients-import.js +347 -40
- package/dist/cjs/import/clients-import.js.map +1 -1
- package/dist/cjs/index.js +711 -39
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +224 -17
- 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 +1 -0
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/mail/auth-templates.js +29 -0
- package/dist/cjs/mail/auth-templates.js.map +1 -0
- package/dist/cjs/mail/dedup-store.js +12 -51
- package/dist/cjs/mail/dedup-store.js.map +1 -1
- package/dist/cjs/mail/index.js +16 -4
- package/dist/cjs/mail/index.js.map +1 -1
- package/dist/cjs/mail/provider.js +12 -247
- package/dist/cjs/mail/provider.js.map +1 -1
- package/dist/cjs/mail/resend.js +14 -18
- package/dist/cjs/mail/resend.js.map +1 -1
- package/dist/cjs/mail/sender-resolver.js +12 -11
- package/dist/cjs/mail/sender-resolver.js.map +1 -1
- package/dist/cjs/mail/template-renderer.js +11 -16
- package/dist/cjs/mail/template-renderer.js.map +1 -1
- package/dist/cjs/mail/transactional-outbound.js +117 -0
- package/dist/cjs/mail/transactional-outbound.js.map +1 -0
- package/dist/cjs/mail/types.js +8 -35
- package/dist/cjs/mail/types.js.map +1 -1
- package/dist/cjs/onboarding/persistence.js +4 -4
- package/dist/cjs/onboarding/persistence.js.map +1 -1
- package/dist/cjs/pilot/go-live-checklist.js +212 -0
- package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
- package/dist/cjs/pilot/milestone.js +79 -0
- package/dist/cjs/pilot/milestone.js.map +1 -0
- package/dist/cjs/platform/capabilities.js +144 -0
- package/dist/cjs/platform/capabilities.js.map +1 -0
- package/dist/cjs/platform/job-contract.js +411 -0
- package/dist/cjs/platform/job-contract.js.map +1 -0
- package/dist/cjs/portal/provisioning.js +144 -0
- package/dist/cjs/portal/provisioning.js.map +1 -0
- package/dist/cjs/pricing-engine/canonical.js +42 -0
- package/dist/cjs/pricing-engine/canonical.js.map +1 -0
- package/dist/cjs/pricing-engine/errors.js +6 -1
- package/dist/cjs/pricing-engine/errors.js.map +1 -1
- package/dist/cjs/pricing-engine/index.js +12 -1
- package/dist/cjs/pricing-engine/index.js.map +1 -1
- package/dist/cjs/pricing-engine/pipeline.js +200 -26
- package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
- package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
- package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
- package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
- package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/cjs/rbac/authorize.js +28 -0
- package/dist/cjs/rbac/authorize.js.map +1 -1
- package/dist/cjs/rbac/catalog.js +101 -1
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/rbac/workload-provisioning.js +160 -0
- package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
- package/dist/cjs/rbac/workload.js +191 -0
- package/dist/cjs/rbac/workload.js.map +1 -0
- package/dist/cjs/storage/checksum.js +15 -0
- package/dist/cjs/storage/checksum.js.map +1 -0
- package/dist/cjs/storage/key.js +72 -0
- package/dist/cjs/storage/key.js.map +1 -0
- package/dist/cjs/storage/local.js +100 -0
- package/dist/cjs/storage/local.js.map +1 -0
- package/dist/cjs/storage/r2.js +181 -0
- package/dist/cjs/storage/r2.js.map +1 -0
- package/dist/cjs/storage/registry.js +41 -0
- package/dist/cjs/storage/registry.js.map +1 -0
- package/dist/cjs/storage/types.js +50 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/subscription-billing/index.js +2 -1
- package/dist/cjs/subscription-billing/index.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
- package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
- package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/registry.js +17 -0
- package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
- package/dist/cjs/subscription-billing/service.js +208 -83
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/subscription-billing/types.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/provisioning.js +32 -8
- package/dist/cjs/tenancy/provisioning.js.map +1 -1
- package/dist/cjs/tenancy/settings.js +224 -0
- package/dist/cjs/tenancy/settings.js.map +1 -0
- package/dist/cjs/users/repository.js +143 -3
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +81 -0
- 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 +98 -0
- package/dist/clients/ibge.js.map +1 -0
- package/dist/clients/repository.d.ts +196 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +270 -24
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +137 -0
- package/dist/collection/branding.d.ts.map +1 -0
- package/dist/collection/branding.js +322 -0
- package/dist/collection/branding.js.map +1 -0
- package/dist/collection/channel-accounts.d.ts +57 -0
- package/dist/collection/channel-accounts.d.ts.map +1 -0
- package/dist/collection/channel-accounts.js +133 -0
- package/dist/collection/channel-accounts.js.map +1 -0
- package/dist/collection/channel.d.ts +24 -0
- package/dist/collection/channel.d.ts.map +1 -0
- package/dist/collection/channel.js +16 -0
- package/dist/collection/channel.js.map +1 -0
- 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-bridge.d.ts +66 -0
- package/dist/collection/communication-bridge.d.ts.map +1 -0
- package/dist/collection/communication-bridge.js +134 -0
- package/dist/collection/communication-bridge.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +132 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -0
- package/dist/collection/communication-runtime.js +249 -0
- package/dist/collection/communication-runtime.js.map +1 -0
- package/dist/collection/consent-repository.d.ts +32 -0
- package/dist/collection/consent-repository.d.ts.map +1 -0
- package/dist/collection/consent-repository.js +79 -0
- package/dist/collection/consent-repository.js.map +1 -0
- package/dist/collection/copy.d.ts +50 -0
- package/dist/collection/copy.d.ts.map +1 -0
- package/dist/collection/copy.js +122 -0
- package/dist/collection/copy.js.map +1 -0
- package/dist/collection/delivery-callback.d.ts +49 -0
- package/dist/collection/delivery-callback.d.ts.map +1 -0
- package/dist/collection/delivery-callback.js +147 -0
- package/dist/collection/delivery-callback.js.map +1 -0
- package/dist/collection/email-layout.d.ts +45 -0
- package/dist/collection/email-layout.d.ts.map +1 -0
- package/dist/collection/email-layout.js +247 -0
- package/dist/collection/email-layout.js.map +1 -0
- package/dist/collection/engine.d.ts +200 -0
- package/dist/collection/engine.d.ts.map +1 -0
- package/dist/collection/engine.js +427 -0
- package/dist/collection/engine.js.map +1 -0
- package/dist/collection/format.d.ts +32 -0
- package/dist/collection/format.d.ts.map +1 -0
- package/dist/collection/format.js +70 -0
- package/dist/collection/format.js.map +1 -0
- package/dist/collection/payment-block.d.ts +24 -0
- package/dist/collection/payment-block.d.ts.map +1 -0
- package/dist/collection/payment-block.js +2 -0
- package/dist/collection/payment-block.js.map +1 -0
- package/dist/collection/policy.d.ts +78 -0
- package/dist/collection/policy.d.ts.map +1 -0
- package/dist/collection/policy.js +168 -0
- package/dist/collection/policy.js.map +1 -0
- package/dist/collection/repository.d.ts +129 -0
- package/dist/collection/repository.d.ts.map +1 -0
- package/dist/collection/repository.js +246 -0
- package/dist/collection/repository.js.map +1 -0
- package/dist/collection/subject.d.ts +66 -0
- package/dist/collection/subject.d.ts.map +1 -0
- package/dist/collection/subject.js +99 -0
- package/dist/collection/subject.js.map +1 -0
- package/dist/collection/template-catalog.d.ts +16 -0
- package/dist/collection/template-catalog.d.ts.map +1 -0
- package/dist/collection/template-catalog.js +162 -0
- package/dist/collection/template-catalog.js.map +1 -0
- package/dist/collection/template.d.ts +37 -0
- package/dist/collection/template.d.ts.map +1 -0
- package/dist/collection/template.js +73 -0
- package/dist/collection/template.js.map +1 -0
- package/dist/communication/adapters/email.d.ts +28 -0
- package/dist/communication/adapters/email.d.ts.map +1 -0
- package/dist/communication/adapters/email.js +129 -0
- package/dist/communication/adapters/email.js.map +1 -0
- package/dist/communication/adapters/sms.d.ts +95 -0
- package/dist/communication/adapters/sms.d.ts.map +1 -0
- package/dist/communication/adapters/sms.js +121 -0
- package/dist/communication/adapters/sms.js.map +1 -0
- package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
- package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-language.js +36 -0
- package/dist/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.js +97 -0
- package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/communication/adapters/whatsapp.d.ts +29 -0
- package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp.js +210 -0
- package/dist/communication/adapters/whatsapp.js.map +1 -0
- package/dist/communication/audit.d.ts +105 -0
- package/dist/communication/audit.d.ts.map +1 -0
- package/dist/communication/audit.js +56 -0
- package/dist/communication/audit.js.map +1 -0
- package/dist/communication/capabilities.d.ts +88 -0
- package/dist/communication/capabilities.d.ts.map +1 -0
- package/dist/communication/capabilities.js +72 -0
- package/dist/communication/capabilities.js.map +1 -0
- package/dist/communication/channel.d.ts +125 -0
- package/dist/communication/channel.d.ts.map +1 -0
- package/dist/communication/channel.js +47 -0
- package/dist/communication/channel.js.map +1 -0
- package/dist/communication/claim.d.ts +368 -0
- package/dist/communication/claim.d.ts.map +1 -0
- package/dist/communication/claim.js +224 -0
- package/dist/communication/claim.js.map +1 -0
- 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/consent.d.ts +65 -0
- package/dist/communication/consent.d.ts.map +1 -0
- package/dist/communication/consent.js +40 -0
- package/dist/communication/consent.js.map +1 -0
- package/dist/communication/context.d.ts +48 -0
- package/dist/communication/context.d.ts.map +1 -0
- package/dist/communication/context.js +41 -0
- package/dist/communication/context.js.map +1 -0
- package/dist/communication/credentials.d.ts +74 -0
- package/dist/communication/credentials.d.ts.map +1 -0
- package/dist/communication/credentials.js +115 -0
- package/dist/communication/credentials.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts +37 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -0
- package/dist/communication/dry-run-scenario.js +163 -0
- package/dist/communication/dry-run-scenario.js.map +1 -0
- package/dist/communication/dry-run.d.ts +40 -0
- package/dist/communication/dry-run.d.ts.map +1 -0
- package/dist/communication/dry-run.js +92 -0
- package/dist/communication/dry-run.js.map +1 -0
- package/dist/communication/engine.d.ts +163 -0
- package/dist/communication/engine.d.ts.map +1 -0
- package/dist/communication/engine.js +492 -0
- package/dist/communication/engine.js.map +1 -0
- package/dist/communication/graph.d.ts +38 -0
- package/dist/communication/graph.d.ts.map +1 -0
- package/dist/communication/graph.js +45 -0
- package/dist/communication/graph.js.map +1 -0
- package/dist/communication/idempotency.d.ts +33 -0
- package/dist/communication/idempotency.d.ts.map +1 -0
- package/dist/communication/idempotency.js +23 -0
- package/dist/communication/idempotency.js.map +1 -0
- package/dist/communication/identity.d.ts +127 -0
- package/dist/communication/identity.d.ts.map +1 -0
- package/dist/communication/identity.js +105 -0
- package/dist/communication/identity.js.map +1 -0
- package/dist/communication/index.d.ts +66 -0
- package/dist/communication/index.d.ts.map +1 -0
- package/dist/communication/index.js +42 -0
- package/dist/communication/index.js.map +1 -0
- package/dist/communication/onboarding.d.ts +223 -0
- package/dist/communication/onboarding.d.ts.map +1 -0
- package/dist/communication/onboarding.js +287 -0
- package/dist/communication/onboarding.js.map +1 -0
- package/dist/communication/policy.d.ts +115 -0
- package/dist/communication/policy.d.ts.map +1 -0
- package/dist/communication/policy.js +13 -0
- package/dist/communication/policy.js.map +1 -0
- package/dist/communication/routing.d.ts +99 -0
- package/dist/communication/routing.d.ts.map +1 -0
- package/dist/communication/routing.js +73 -0
- package/dist/communication/routing.js.map +1 -0
- package/dist/communication/sender-profile.d.ts +100 -0
- package/dist/communication/sender-profile.d.ts.map +1 -0
- package/dist/communication/sender-profile.js +123 -0
- package/dist/communication/sender-profile.js.map +1 -0
- package/dist/communication/status.d.ts +48 -0
- package/dist/communication/status.d.ts.map +1 -0
- package/dist/communication/status.js +79 -0
- package/dist/communication/status.js.map +1 -0
- package/dist/communication/stores/onboarding.d.ts +88 -0
- package/dist/communication/stores/onboarding.d.ts.map +1 -0
- package/dist/communication/stores/onboarding.js +127 -0
- package/dist/communication/stores/onboarding.js.map +1 -0
- package/dist/communication/stores/postgres.d.ts +81 -0
- package/dist/communication/stores/postgres.d.ts.map +1 -0
- package/dist/communication/stores/postgres.js +453 -0
- package/dist/communication/stores/postgres.js.map +1 -0
- package/dist/communication/stores/routing.d.ts +169 -0
- package/dist/communication/stores/routing.d.ts.map +1 -0
- package/dist/communication/stores/routing.js +324 -0
- package/dist/communication/stores/routing.js.map +1 -0
- package/dist/communication/stores/secrets.d.ts +89 -0
- package/dist/communication/stores/secrets.d.ts.map +1 -0
- package/dist/communication/stores/secrets.js +122 -0
- package/dist/communication/stores/secrets.js.map +1 -0
- package/dist/communication/template-provider.d.ts +85 -0
- package/dist/communication/template-provider.d.ts.map +1 -0
- package/dist/communication/template-provider.js +21 -0
- package/dist/communication/template-provider.js.map +1 -0
- package/dist/communication/template.d.ts +87 -0
- package/dist/communication/template.d.ts.map +1 -0
- package/dist/communication/template.js +59 -0
- package/dist/communication/template.js.map +1 -0
- package/dist/communication/webhook-subscription.d.ts +156 -0
- package/dist/communication/webhook-subscription.d.ts.map +1 -0
- package/dist/communication/webhook-subscription.js +252 -0
- package/dist/communication/webhook-subscription.js.map +1 -0
- package/dist/communication/webhook.d.ts +121 -0
- package/dist/communication/webhook.d.ts.map +1 -0
- package/dist/communication/webhook.js +283 -0
- package/dist/communication/webhook.js.map +1 -0
- 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 +285 -0
- package/dist/competence/repository.d.ts.map +1 -0
- package/dist/competence/repository.js +602 -0
- package/dist/competence/repository.js.map +1 -0
- package/dist/contacts/phone.d.ts +70 -0
- package/dist/contacts/phone.d.ts.map +1 -0
- package/dist/contacts/phone.js +186 -0
- package/dist/contacts/phone.js.map +1 -0
- 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 +208 -35
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/provision-e2e-identity.d.ts +2 -0
- package/dist/db/provision-e2e-identity.d.ts.map +1 -0
- package/dist/db/provision-e2e-identity.js +109 -0
- package/dist/db/provision-e2e-identity.js.map +1 -0
- package/dist/db/seed-catalog.d.ts +18 -0
- package/dist/db/seed-catalog.d.ts.map +1 -0
- package/dist/db/seed-catalog.js +45 -0
- package/dist/db/seed-catalog.js.map +1 -0
- package/dist/db/seed.js +16 -8
- package/dist/db/seed.js.map +1 -1
- package/dist/documents/repository.d.ts +97 -0
- package/dist/documents/repository.d.ts.map +1 -0
- package/dist/documents/repository.js +236 -0
- package/dist/documents/repository.js.map +1 -0
- package/dist/documents/requests.d.ts +73 -0
- package/dist/documents/requests.d.ts.map +1 -0
- package/dist/documents/requests.js +127 -0
- package/dist/documents/requests.js.map +1 -0
- package/dist/fiscal/applicability.d.ts +73 -0
- package/dist/fiscal/applicability.d.ts.map +1 -0
- package/dist/fiscal/applicability.js +160 -0
- package/dist/fiscal/applicability.js.map +1 -0
- package/dist/fiscal/conditions.d.ts +99 -0
- package/dist/fiscal/conditions.d.ts.map +1 -0
- package/dist/fiscal/conditions.js +190 -0
- package/dist/fiscal/conditions.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/fiscal/coverage/model.d.ts +86 -0
- package/dist/fiscal/coverage/model.d.ts.map +1 -0
- package/dist/fiscal/coverage/model.js +120 -0
- package/dist/fiscal/coverage/model.js.map +1 -0
- package/dist/fiscal/coverage/requests.d.ts +70 -0
- package/dist/fiscal/coverage/requests.d.ts.map +1 -0
- package/dist/fiscal/coverage/requests.js +95 -0
- package/dist/fiscal/coverage/requests.js.map +1 -0
- package/dist/fiscal/credentials/material.d.ts +81 -0
- package/dist/fiscal/credentials/material.d.ts.map +1 -0
- package/dist/fiscal/credentials/material.js +164 -0
- package/dist/fiscal/credentials/material.js.map +1 -0
- package/dist/fiscal/credentials/readiness.d.ts +92 -0
- package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
- package/dist/fiscal/credentials/readiness.js +159 -0
- package/dist/fiscal/credentials/readiness.js.map +1 -0
- package/dist/fiscal/eligibility.d.ts +106 -0
- package/dist/fiscal/eligibility.d.ts.map +1 -0
- package/dist/fiscal/eligibility.js +194 -0
- package/dist/fiscal/eligibility.js.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.js +220 -0
- package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/fiscal/ingestion/direction.d.ts +60 -0
- package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
- package/dist/fiscal/ingestion/direction.js +32 -0
- package/dist/fiscal/ingestion/direction.js.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.js +222 -0
- package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
- package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
- package/dist/fiscal/ingestion/pipeline.js +699 -0
- package/dist/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/fiscal/ingestion/provider.d.ts +206 -0
- package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/provider.js +47 -0
- package/dist/fiscal/ingestion/provider.js.map +1 -0
- package/dist/fiscal/ingestion/repository.d.ts +82 -0
- package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
- package/dist/fiscal/ingestion/repository.js +127 -0
- package/dist/fiscal/ingestion/repository.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
- package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
- package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.js +112 -0
- package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/fiscal/repository.d.ts +220 -0
- package/dist/fiscal/repository.d.ts.map +1 -0
- package/dist/fiscal/repository.js +449 -0
- package/dist/fiscal/repository.js.map +1 -0
- package/dist/fiscal/sync/circuit.d.ts +86 -0
- package/dist/fiscal/sync/circuit.d.ts.map +1 -0
- package/dist/fiscal/sync/circuit.js +118 -0
- package/dist/fiscal/sync/circuit.js.map +1 -0
- package/dist/fiscal/sync/intervention.d.ts +81 -0
- package/dist/fiscal/sync/intervention.d.ts.map +1 -0
- package/dist/fiscal/sync/intervention.js +135 -0
- package/dist/fiscal/sync/intervention.js.map +1 -0
- package/dist/fiscal/sync/lease.d.ts +118 -0
- package/dist/fiscal/sync/lease.d.ts.map +1 -0
- package/dist/fiscal/sync/lease.js +139 -0
- package/dist/fiscal/sync/lease.js.map +1 -0
- package/dist/fiscal/sync/observability.d.ts +148 -0
- package/dist/fiscal/sync/observability.d.ts.map +1 -0
- package/dist/fiscal/sync/observability.js +239 -0
- package/dist/fiscal/sync/observability.js.map +1 -0
- package/dist/fiscal/sync/orchestrator.d.ts +132 -0
- package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
- package/dist/fiscal/sync/orchestrator.js +487 -0
- package/dist/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/fiscal/sync/policy.d.ts +87 -0
- package/dist/fiscal/sync/policy.d.ts.map +1 -0
- package/dist/fiscal/sync/policy.js +136 -0
- package/dist/fiscal/sync/policy.js.map +1 -0
- package/dist/fiscal/sync/reprocess.d.ts +76 -0
- package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
- package/dist/fiscal/sync/reprocess.js +237 -0
- package/dist/fiscal/sync/reprocess.js.map +1 -0
- package/dist/fiscal/sync/retry.d.ts +82 -0
- package/dist/fiscal/sync/retry.d.ts.map +1 -0
- package/dist/fiscal/sync/retry.js +176 -0
- package/dist/fiscal/sync/retry.js.map +1 -0
- package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
- package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
- package/dist/fiscal/sync/secret-boundary.js +116 -0
- package/dist/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/fiscal/transport/https.d.ts +86 -0
- package/dist/fiscal/transport/https.d.ts.map +1 -0
- package/dist/fiscal/transport/https.js +303 -0
- package/dist/fiscal/transport/https.js.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts +80 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.js +323 -0
- package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/fiscal/transport/types.d.ts +134 -0
- package/dist/fiscal/transport/types.d.ts.map +1 -0
- package/dist/fiscal/transport/types.js +88 -0
- package/dist/fiscal/transport/types.js.map +1 -0
- package/dist/import/br-documents.d.ts +26 -0
- package/dist/import/br-documents.d.ts.map +1 -0
- package/dist/import/br-documents.js +78 -0
- package/dist/import/br-documents.js.map +1 -0
- package/dist/import/clients-import.d.ts +122 -4
- package/dist/import/clients-import.d.ts.map +1 -1
- package/dist/import/clients-import.js +341 -41
- package/dist/import/clients-import.js.map +1 -1
- package/dist/index.d.ts +217 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +196 -11
- 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 +222 -16
- 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 +69 -3
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js +1 -0
- package/dist/legal/types.js.map +1 -1
- package/dist/mail/auth-templates.d.ts +15 -0
- package/dist/mail/auth-templates.d.ts.map +1 -0
- package/dist/mail/auth-templates.js +26 -0
- package/dist/mail/auth-templates.js.map +1 -0
- package/dist/mail/dedup-store.d.ts +1 -24
- package/dist/mail/dedup-store.d.ts.map +1 -1
- package/dist/mail/dedup-store.js +9 -48
- package/dist/mail/dedup-store.js.map +1 -1
- package/dist/mail/index.d.ts +2 -1
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +13 -2
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/provider.d.ts +2 -30
- package/dist/mail/provider.d.ts.map +1 -1
- package/dist/mail/provider.js +10 -246
- package/dist/mail/provider.js.map +1 -1
- package/dist/mail/resend.d.ts +2 -12
- package/dist/mail/resend.d.ts.map +1 -1
- package/dist/mail/resend.js +11 -17
- package/dist/mail/resend.js.map +1 -1
- package/dist/mail/sender-resolver.d.ts +1 -7
- package/dist/mail/sender-resolver.d.ts.map +1 -1
- package/dist/mail/sender-resolver.js +11 -10
- package/dist/mail/sender-resolver.js.map +1 -1
- package/dist/mail/template-renderer.d.ts +1 -9
- package/dist/mail/template-renderer.d.ts.map +1 -1
- package/dist/mail/template-renderer.js +10 -15
- package/dist/mail/template-renderer.js.map +1 -1
- package/dist/mail/transactional-outbound.d.ts +115 -0
- package/dist/mail/transactional-outbound.d.ts.map +1 -0
- package/dist/mail/transactional-outbound.js +113 -0
- package/dist/mail/transactional-outbound.js.map +1 -0
- package/dist/mail/types.d.ts +2 -142
- package/dist/mail/types.d.ts.map +1 -1
- package/dist/mail/types.js +1 -33
- package/dist/mail/types.js.map +1 -1
- package/dist/onboarding/persistence.d.ts +10 -1
- package/dist/onboarding/persistence.d.ts.map +1 -1
- package/dist/onboarding/persistence.js +4 -4
- package/dist/onboarding/persistence.js.map +1 -1
- package/dist/pilot/go-live-checklist.d.ts +41 -0
- package/dist/pilot/go-live-checklist.d.ts.map +1 -0
- package/dist/pilot/go-live-checklist.js +209 -0
- package/dist/pilot/go-live-checklist.js.map +1 -0
- package/dist/pilot/milestone.d.ts +56 -0
- package/dist/pilot/milestone.d.ts.map +1 -0
- package/dist/pilot/milestone.js +74 -0
- package/dist/pilot/milestone.js.map +1 -0
- package/dist/platform/capabilities.d.ts +88 -0
- package/dist/platform/capabilities.d.ts.map +1 -0
- package/dist/platform/capabilities.js +140 -0
- package/dist/platform/capabilities.js.map +1 -0
- package/dist/platform/job-contract.d.ts +232 -0
- package/dist/platform/job-contract.d.ts.map +1 -0
- package/dist/platform/job-contract.js +403 -0
- package/dist/platform/job-contract.js.map +1 -0
- package/dist/portal/provisioning.d.ts +58 -0
- package/dist/portal/provisioning.d.ts.map +1 -0
- package/dist/portal/provisioning.js +139 -0
- package/dist/portal/provisioning.js.map +1 -0
- package/dist/pricing-engine/canonical.d.ts +14 -0
- package/dist/pricing-engine/canonical.d.ts.map +1 -0
- package/dist/pricing-engine/canonical.js +39 -0
- package/dist/pricing-engine/canonical.js.map +1 -0
- package/dist/pricing-engine/errors.d.ts.map +1 -1
- package/dist/pricing-engine/errors.js +6 -1
- package/dist/pricing-engine/errors.js.map +1 -1
- package/dist/pricing-engine/index.d.ts +12 -2
- package/dist/pricing-engine/index.d.ts.map +1 -1
- package/dist/pricing-engine/index.js +6 -1
- package/dist/pricing-engine/index.js.map +1 -1
- package/dist/pricing-engine/pipeline.d.ts.map +1 -1
- package/dist/pricing-engine/pipeline.js +202 -28
- package/dist/pricing-engine/pipeline.js.map +1 -1
- package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
- package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-adapter.js +75 -0
- package/dist/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/pricing-engine/shadow-diff.d.ts +26 -0
- package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-diff.js +52 -0
- package/dist/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/pricing-engine/shadow-facade.d.ts +42 -0
- package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-facade.js +82 -0
- package/dist/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.js +18 -0
- package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
- package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-metrics.js +31 -0
- package/dist/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.js +39 -0
- package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/pricing-engine/types.d.ts +2 -0
- package/dist/pricing-engine/types.d.ts.map +1 -1
- package/dist/rbac/authorize.d.ts +12 -0
- package/dist/rbac/authorize.d.ts.map +1 -1
- package/dist/rbac/authorize.js +27 -0
- package/dist/rbac/authorize.js.map +1 -1
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +101 -1
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/rbac/workload-provisioning.d.ts +66 -0
- package/dist/rbac/workload-provisioning.d.ts.map +1 -0
- package/dist/rbac/workload-provisioning.js +153 -0
- package/dist/rbac/workload-provisioning.js.map +1 -0
- package/dist/rbac/workload.d.ts +124 -0
- package/dist/rbac/workload.d.ts.map +1 -0
- package/dist/rbac/workload.js +184 -0
- package/dist/rbac/workload.js.map +1 -0
- package/dist/storage/checksum.d.ts +9 -0
- package/dist/storage/checksum.d.ts.map +1 -0
- package/dist/storage/checksum.js +12 -0
- package/dist/storage/checksum.js.map +1 -0
- package/dist/storage/key.d.ts +37 -0
- package/dist/storage/key.d.ts.map +1 -0
- package/dist/storage/key.js +67 -0
- package/dist/storage/key.js.map +1 -0
- package/dist/storage/local.d.ts +40 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +96 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/r2.d.ts +43 -0
- package/dist/storage/r2.d.ts.map +1 -0
- package/dist/storage/r2.js +177 -0
- package/dist/storage/r2.js.map +1 -0
- package/dist/storage/registry.d.ts +23 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +37 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/types.d.ts +67 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +45 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/subscription-billing/index.d.ts +6 -5
- package/dist/subscription-billing/index.d.ts.map +1 -1
- package/dist/subscription-billing/index.js +3 -3
- package/dist/subscription-billing/index.js.map +1 -1
- package/dist/subscription-billing/provider/asaas.d.ts +14 -0
- package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
- package/dist/subscription-billing/provider/asaas.js +32 -7
- package/dist/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/subscription-billing/provider/disabled.d.ts +9 -0
- package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
- package/dist/subscription-billing/provider/disabled.js +8 -0
- package/dist/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/subscription-billing/provider/registry.d.ts +10 -0
- package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
- package/dist/subscription-billing/provider/registry.js +17 -0
- package/dist/subscription-billing/provider/registry.js.map +1 -1
- package/dist/subscription-billing/service.d.ts +38 -1
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +147 -23
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/subscription-billing/types.d.ts +13 -0
- package/dist/subscription-billing/types.d.ts.map +1 -1
- package/dist/subscription-billing/types.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/provisioning.d.ts.map +1 -1
- package/dist/tenancy/provisioning.js +32 -8
- package/dist/tenancy/provisioning.js.map +1 -1
- 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 +54 -1
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +142 -4
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +67 -0
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +78 -0
- package/dist/vault/repository.js.map +1 -1
- package/package.json +20 -4
- package/src/db/migrations/0023_user_invite_activation.sql +15 -0
- package/src/db/migrations/0024_set_user_password_function.sql +32 -0
- package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
- package/src/db/migrations/0026_documents_and_competence.sql +353 -0
- package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
- package/src/db/migrations/0028_collection_engine.sql +94 -0
- package/src/db/migrations/0029_payment_rail.sql +107 -0
- package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
- package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
- package/src/db/migrations/0032_settlement_reversal.sql +76 -0
- package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
- package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
- package/src/db/migrations/0035_payment_account_environments.sql +61 -0
- package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
- package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
- package/src/db/migrations/0038_notification_channels.sql +175 -0
- package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
- package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
- package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
- package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
- package/src/db/migrations/0043_workload_identity.sql +105 -0
- package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
- 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/dist/cjs/mail/resend-client.js +0 -103
- package/dist/cjs/mail/resend-client.js.map +0 -1
- package/dist/mail/resend-client.d.ts +0 -16
- package/dist/mail/resend-client.d.ts.map +0 -1
- package/dist/mail/resend-client.js +0 -100
- package/dist/mail/resend-client.js.map +0 -1
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Montagem ÚNICA do consumo do motor compartilhado pela cobrança da SC.
|
|
3
|
+
*
|
|
4
|
+
* Este arquivo existe por causa de um defeito de arquitetura, não de código: até
|
|
5
|
+
* aqui havia dois caminhos capazes de mandar mensagem ao cliente.
|
|
6
|
+
*
|
|
7
|
+
* `collection-cron.ts` montava o motor compartilhado — mas SÓ quando o
|
|
8
|
+
* escritório tinha conta de WhatsApp ou SMS. Sem
|
|
9
|
+
* elas, caía no adapter legado.
|
|
10
|
+
* `routes/collections.ts` montava o adapter legado SEMPRE. A rota manual
|
|
11
|
+
* nunca passou pelo motor compartilhado.
|
|
12
|
+
*
|
|
13
|
+
* Dois caminhos com duas idempotências diferentes: o legado usava
|
|
14
|
+
* `receivableId:stepKey` e não gravava nada, o compartilhado usava a chave
|
|
15
|
+
* composta pelo motor. Um cron e um clique no botão "rodar agora", no mesmo
|
|
16
|
+
* minuto, não se enxergavam — e a proteção de cada um era invisível para o
|
|
17
|
+
* outro. É o `LEGACY_SHARED_COEXISTENCE=BLOCKING` do certificador.
|
|
18
|
+
*
|
|
19
|
+
* A correção é ter UM lugar que monta o consumo, e ambos chamarem este. Não é
|
|
20
|
+
* organização de código: é o que faz "existe uma única autoridade de envio" ser
|
|
21
|
+
* uma propriedade verificável em vez de uma intenção.
|
|
22
|
+
*/
|
|
23
|
+
import { createClientClearanceStore } from './clearance-store.js';
|
|
24
|
+
import { createEmailChannel, createPostgresAuditSink, createPostgresChannelBindingStore, createPostgresDispatchClaimStore, createSmsChannel, createWhatsAppChannel, credentialResolverFor, resolveSenderProfile, routeAccountsByChannel, withSenderFallback, } from '../communication/index.js';
|
|
25
|
+
import { collectionSenderFallback, createTenantChannelAccountStore } from './channel-accounts.js';
|
|
26
|
+
import { collectionContext, SC_PRODUCT } from './communication-bridge.js';
|
|
27
|
+
import { createConsentStore } from './consent-repository.js';
|
|
28
|
+
import { createCollectionTemplateStore } from './template-catalog.js';
|
|
29
|
+
/**
|
|
30
|
+
* Slug estável da marca do escritório, para o contexto do motor.
|
|
31
|
+
*
|
|
32
|
+
* Vive aqui, e não no cron, porque entra na chave de idempotência: duas
|
|
33
|
+
* derivações do mesmo nome produziriam duas chaves para o mesmo aviso, e a
|
|
34
|
+
* proteção contra envio duplo evaporaria entre o cron e a rota manual sem que
|
|
35
|
+
* nada parecesse errado.
|
|
36
|
+
*/
|
|
37
|
+
export function brandKeyFor(branding) {
|
|
38
|
+
const slug = branding.officeName
|
|
39
|
+
.toLowerCase()
|
|
40
|
+
.normalize('NFD')
|
|
41
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
42
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
43
|
+
.replace(/^-+|-+$/g, '')
|
|
44
|
+
.slice(0, 60);
|
|
45
|
+
// Nome que não produz slug válido cai num valor fixo do produto, em vez de
|
|
46
|
+
// fazer o motor recusar o contexto e a régua inteira parar por causa de um
|
|
47
|
+
// nome de escritório com caracteres incomuns.
|
|
48
|
+
return /^[a-z][a-z0-9-]*[a-z0-9]$/.test(slug) ? slug : 'baruk-office';
|
|
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
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Monta o consumo do motor para UM tenant.
|
|
100
|
+
*
|
|
101
|
+
* Devolve sempre — nunca `undefined`. O desenho anterior devolvia `undefined`
|
|
102
|
+
* quando não havia canal de telefone configurado, e era isso que empurrava o
|
|
103
|
+
* e-mail de volta para o caminho legado. O e-mail é UM canal entre outros; se
|
|
104
|
+
* ele fosse o caso especial, todo canal novo teria de imitá-lo.
|
|
105
|
+
*/
|
|
106
|
+
export async function buildCollectionCommunication(options) {
|
|
107
|
+
const { db, tx, tenantId, branding } = options;
|
|
108
|
+
const brand = brandKeyFor(branding);
|
|
109
|
+
const ctx = collectionContext(tenantId, brand);
|
|
110
|
+
const tenantAccounts = createTenantChannelAccountStore(tx);
|
|
111
|
+
/*
|
|
112
|
+
* Telefone tem registro CANÔNICO próprio: `channel_binding` (0041), escrito
|
|
113
|
+
* pelo onboarding do Embedded Signup.
|
|
114
|
+
*
|
|
115
|
+
* Antes desta composição, TODO canal era resolvido por
|
|
116
|
+
* `createTenantChannelAccountStore` — o jsonb `tenant.settings.channels`. O
|
|
117
|
+
* onboarding gravava numa tabela que ninguém lia: a tela dizia "ativo",
|
|
118
|
+
* `GET /v1/communication/channels` dizia `not_configured`, e o motor teria
|
|
119
|
+
* respondido `no_account` no primeiro envio. Canal pronto na Meta e invisível
|
|
120
|
+
* para quem despacha.
|
|
121
|
+
*
|
|
122
|
+
* É o mesmo defeito que `registerChannelBinding` teve na outra ponta — existir
|
|
123
|
+
* e não ser chamado —, agora do lado do consumo.
|
|
124
|
+
*/
|
|
125
|
+
const bindingAccounts = createPostgresChannelBindingStore(tx);
|
|
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
|
+
});
|
|
133
|
+
/*
|
|
134
|
+
* Precedência POR CANAL, explícita — e não um `??` entre dois stores.
|
|
135
|
+
*
|
|
136
|
+
* Um fallback genérico resolveria o sintoma e esconderia a política: ninguém
|
|
137
|
+
* conseguiria dizer, lendo o código, de onde vem a conta de WhatsApp de um
|
|
138
|
+
* escritório. Aqui a resposta é uma linha do mapa.
|
|
139
|
+
*
|
|
140
|
+
* email → configuração do tenant + remetente de plataforma (contrato
|
|
141
|
+
* certificado, intocado)
|
|
142
|
+
* whatsapp → SOMENTE `channel_binding`. Sem fallback para o jsonb: aceitar
|
|
143
|
+
* as duas fontes criaria a segunda verdade que a 0041 existe
|
|
144
|
+
* para eliminar, e o legado sequer satisfaz
|
|
145
|
+
* `channel_binding_phone_credential_ref_chk` (telefone exige
|
|
146
|
+
* `vault://`).
|
|
147
|
+
* sms → mesma regra do WhatsApp.
|
|
148
|
+
*
|
|
149
|
+
* Canal sem rota resolve para ausente. Um canal novo entra fechado.
|
|
150
|
+
*/
|
|
151
|
+
const accounts = routeAccountsByChannel({
|
|
152
|
+
email: withSenderFallback(tenantAccounts, fallback),
|
|
153
|
+
whatsapp: bindingAccounts,
|
|
154
|
+
sms: bindingAccounts,
|
|
155
|
+
});
|
|
156
|
+
const channels = {};
|
|
157
|
+
const email = await resolveSenderProfile(tenantAccounts, ctx, 'email', fallback);
|
|
158
|
+
if (email.ok) {
|
|
159
|
+
channels.email = createEmailChannel({
|
|
160
|
+
account: email.profile.account,
|
|
161
|
+
// Resolvedor preso à conta: nenhuma outra referência de credencial passa
|
|
162
|
+
// por aqui, nem por engano de código.
|
|
163
|
+
resolveCredential: credentialResolverFor(email.profile.account, options.resolveCredential),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
// Telefone NUNCA tem fallback de plataforma — o motor recusa por construção,
|
|
167
|
+
// e aqui nem se oferece a opção. Sem conta própria do tenant, o canal
|
|
168
|
+
// simplesmente não existe, e o motor devolve `no_identity`, que é a verdade.
|
|
169
|
+
// Telefone consulta o store do TENANT, sem decoração: o fallback de plataforma
|
|
170
|
+
// é proibido nesses canais, e passar pelo decorado só faria o motor recusar
|
|
171
|
+
// duas vezes.
|
|
172
|
+
const whatsapp = await bindingAccounts.find(ctx, 'whatsapp');
|
|
173
|
+
if (whatsapp) {
|
|
174
|
+
channels.whatsapp = createWhatsAppChannel({
|
|
175
|
+
account: whatsapp,
|
|
176
|
+
resolveCredential: credentialResolverFor(whatsapp, options.resolveCredential),
|
|
177
|
+
liveSend: options.whatsappLiveSend === true,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
const sms = await bindingAccounts.find(ctx, 'sms');
|
|
181
|
+
if (sms && options.smsTransport) {
|
|
182
|
+
// O SMS resolve a própria credencial DENTRO do transporte, e por isso o
|
|
183
|
+
// adapter não a recebe: o contrato de transporte é provider-agnostic e
|
|
184
|
+
// nenhum provider está contratado. Quando houver, a trava de credencial por
|
|
185
|
+
// conta entra na construção do transporte, não aqui.
|
|
186
|
+
channels.sms = createSmsChannel({ account: sms, transport: options.smsTransport });
|
|
187
|
+
}
|
|
188
|
+
// Sem transporte contratado, o canal fica FORA do registry. O motor devolve
|
|
189
|
+
// `channel_not_registered`, que diz a verdade — registrar um adapter sem
|
|
190
|
+
// transporte trocaria esse motivo por uma falha de entrega inexplicável.
|
|
191
|
+
return {
|
|
192
|
+
tenantId,
|
|
193
|
+
brand,
|
|
194
|
+
channels,
|
|
195
|
+
accounts,
|
|
196
|
+
templates: createCollectionTemplateStore(tx),
|
|
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),
|
|
201
|
+
// Fail-safe em todo canal de telefone: sem permissão registrada, não sai.
|
|
202
|
+
// O e-mail transacional de cobrança se apoia na relação contratual, e por
|
|
203
|
+
// isso é o único cujo indefinido é tratado como permitido.
|
|
204
|
+
consentPolicy: { onUnknown: { email: 'allow', whatsapp: 'fail_safe', sms: 'fail_safe' } },
|
|
205
|
+
claims: createPostgresDispatchClaimStore(db, tenantId),
|
|
206
|
+
audit: createPostgresAuditSink(tx, tenantId),
|
|
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,
|
|
212
|
+
dryRun: options.dryRun,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Referência lógica → segredo, a partir do ambiente do processo.
|
|
217
|
+
*
|
|
218
|
+
* O que o tenant configura é o NOME (`RESEND_API_KEY`, `vault://.../whatsapp`);
|
|
219
|
+
* o valor vem daqui e não atravessa o domínio. A allowlist por FORMA do nome
|
|
220
|
+
* (maiúsculas, dígitos e `_`) impede que um `credentialRef` colado no jsonb de
|
|
221
|
+
* configuração de tenant leia qualquer coisa do ambiente do processo — o jsonb é
|
|
222
|
+
* editável por quem administra o escritório, e `PATH` ou `DATABASE_URL` também
|
|
223
|
+
* são variáveis de ambiente.
|
|
224
|
+
*/
|
|
225
|
+
export function environmentCredentialResolver() {
|
|
226
|
+
// `WHATSAPP_ACCESS_TOKEN` e `SMS_API_KEY` SAÍRAM desta lista na Fase L.
|
|
227
|
+
//
|
|
228
|
+
// Nenhum tenant os usava — não há canal de telefone configurado em lugar
|
|
229
|
+
// nenhum do ecossistema —, então a remoção não interrompe nada. O que ela
|
|
230
|
+
// impede é o desfecho que a lista tornava inevitável no dia em que o SEGUNDO
|
|
231
|
+
// tenant ligasse WhatsApp: ou os dois apontam para o mesmo nome e compartilham
|
|
232
|
+
// o token, ou apontam para nomes distintos e nenhum resolve. Num canal em que
|
|
233
|
+
// o bloqueio se propaga de uma marca para as outras, a primeira opção é a pior
|
|
234
|
+
// das duas — e era a que "funcionava".
|
|
235
|
+
//
|
|
236
|
+
// `RESEND_API_KEY` fica porque a SC entrega e-mail em produção por ela hoje.
|
|
237
|
+
const ALLOWED = new Set(['RESEND_API_KEY']);
|
|
238
|
+
return async (ref) => {
|
|
239
|
+
const name = ref.split('/').pop() ?? '';
|
|
240
|
+
// Allowlist de NOMES, não de forma. Filtrar por padrão deixaria `DATABASE_URL`
|
|
241
|
+
// passar inteiro — o defeito que a política de segredos deste repositório
|
|
242
|
+
// descreve explicitamente.
|
|
243
|
+
return ALLOWED.has(name) ? process.env[name] : undefined;
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/** Canais que este produto sabe operar. Consultado por tela e por teste. */
|
|
247
|
+
export const SC_SUPPORTED_CHANNELS = ['email', 'whatsapp', 'sms'];
|
|
248
|
+
export { SC_PRODUCT };
|
|
249
|
+
//# sourceMappingURL=communication-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communication-runtime.js","sourceRoot":"","sources":["../../src/collection/communication-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permissão de contato do cliente — leitura e escrita.
|
|
3
|
+
*
|
|
4
|
+
* Sobre `client_channel_consent` (migration 0038). A ausência de linha NÃO é
|
|
5
|
+
* permissão: é ausência de decisão, e quem decide o que fazer com ela é a
|
|
6
|
+
* política do tenant, não esta camada.
|
|
7
|
+
*/
|
|
8
|
+
import type { Tx } from '../db/client.js';
|
|
9
|
+
import type { ChannelKey, ConsentRecord, ConsentSource, ConsentState, ConsentStore } from '../communication/index.js';
|
|
10
|
+
export declare function createConsentStore(tx: Tx): ConsentStore;
|
|
11
|
+
/** Todas as decisões de um cliente — para a ficha dele na tela. */
|
|
12
|
+
export declare function listClientConsent(tx: Tx, clientId: string): Promise<ConsentRecord[]>;
|
|
13
|
+
export interface RecordConsentInput {
|
|
14
|
+
tenantId: string;
|
|
15
|
+
clientId: string;
|
|
16
|
+
channel: ChannelKey;
|
|
17
|
+
state: ConsentState;
|
|
18
|
+
source: ConsentSource;
|
|
19
|
+
note?: string;
|
|
20
|
+
decidedBy?: string | null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Registra a decisão. Uma linha viva por (cliente, canal).
|
|
24
|
+
*
|
|
25
|
+
* **Um opt-out do próprio cliente não é revertido por operador.** Quando a linha
|
|
26
|
+
* existente veio de `customer_reply` com `denied`, só outra manifestação do
|
|
27
|
+
* cliente a muda: alguém no escritório desmarcando isso na tela — por engano, ou
|
|
28
|
+
* porque "o cliente disse que pode" — é exatamente o caminho pelo qual uma
|
|
29
|
+
* régua automática passa por cima de um pedido de silêncio.
|
|
30
|
+
*/
|
|
31
|
+
export declare function recordConsent(tx: Tx, input: RecordConsentInput): Promise<ConsentRecord>;
|
|
32
|
+
//# sourceMappingURL=consent-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-repository.d.ts","sourceRoot":"","sources":["../../src/collection/consent-repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACZ,YAAY,EACb,MAAM,2BAA2B,CAAC;AAoBnC,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,EAAE,GAAG,YAAY,CAavD;AAED,mEAAmE;AACnE,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAQ1F;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAgC7F"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permissão de contato do cliente — leitura e escrita.
|
|
3
|
+
*
|
|
4
|
+
* Sobre `client_channel_consent` (migration 0038). A ausência de linha NÃO é
|
|
5
|
+
* permissão: é ausência de decisão, e quem decide o que fazer com ela é a
|
|
6
|
+
* política do tenant, não esta camada.
|
|
7
|
+
*/
|
|
8
|
+
import { uuidv7 } from '@baruk/shared';
|
|
9
|
+
function toRecord(row) {
|
|
10
|
+
return {
|
|
11
|
+
channel: row.channel,
|
|
12
|
+
state: row.state,
|
|
13
|
+
source: row.source,
|
|
14
|
+
decidedAt: row.decided_at instanceof Date ? row.decided_at.toISOString() : String(row.decided_at),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function createConsentStore(tx) {
|
|
18
|
+
return {
|
|
19
|
+
async find(recipientRef, channel) {
|
|
20
|
+
const rows = await tx `
|
|
21
|
+
SELECT channel, state, source, decided_at
|
|
22
|
+
FROM client_channel_consent
|
|
23
|
+
WHERE client_id = ${recipientRef} AND channel = ${channel}
|
|
24
|
+
LIMIT 1
|
|
25
|
+
`;
|
|
26
|
+
const row = rows[0];
|
|
27
|
+
return row ? toRecord(row) : null;
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Todas as decisões de um cliente — para a ficha dele na tela. */
|
|
32
|
+
export async function listClientConsent(tx, clientId) {
|
|
33
|
+
const rows = await tx `
|
|
34
|
+
SELECT channel, state, source, decided_at
|
|
35
|
+
FROM client_channel_consent
|
|
36
|
+
WHERE client_id = ${clientId}
|
|
37
|
+
ORDER BY channel
|
|
38
|
+
`;
|
|
39
|
+
return rows.map(toRecord);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Registra a decisão. Uma linha viva por (cliente, canal).
|
|
43
|
+
*
|
|
44
|
+
* **Um opt-out do próprio cliente não é revertido por operador.** Quando a linha
|
|
45
|
+
* existente veio de `customer_reply` com `denied`, só outra manifestação do
|
|
46
|
+
* cliente a muda: alguém no escritório desmarcando isso na tela — por engano, ou
|
|
47
|
+
* porque "o cliente disse que pode" — é exatamente o caminho pelo qual uma
|
|
48
|
+
* régua automática passa por cima de um pedido de silêncio.
|
|
49
|
+
*/
|
|
50
|
+
export async function recordConsent(tx, input) {
|
|
51
|
+
const existing = await tx `
|
|
52
|
+
SELECT channel, state, source, decided_at
|
|
53
|
+
FROM client_channel_consent
|
|
54
|
+
WHERE client_id = ${input.clientId} AND channel = ${input.channel}
|
|
55
|
+
LIMIT 1
|
|
56
|
+
`;
|
|
57
|
+
const current = existing[0];
|
|
58
|
+
const lockedByCustomer = current?.state === 'denied' && current.source === 'customer_reply';
|
|
59
|
+
if (lockedByCustomer && input.source !== 'customer_reply') {
|
|
60
|
+
return toRecord(current);
|
|
61
|
+
}
|
|
62
|
+
const rows = await tx `
|
|
63
|
+
INSERT INTO client_channel_consent
|
|
64
|
+
(id, tenant_id, client_id, channel, state, source, note, decided_at, decided_by)
|
|
65
|
+
VALUES
|
|
66
|
+
(${uuidv7()}, ${input.tenantId}, ${input.clientId}, ${input.channel},
|
|
67
|
+
${input.state}, ${input.source}, ${input.note ?? null}, now(), ${input.decidedBy ?? null})
|
|
68
|
+
ON CONFLICT (tenant_id, client_id, channel) DO UPDATE
|
|
69
|
+
SET state = EXCLUDED.state,
|
|
70
|
+
source = EXCLUDED.source,
|
|
71
|
+
note = EXCLUDED.note,
|
|
72
|
+
decided_at = now(),
|
|
73
|
+
decided_by = EXCLUDED.decided_by,
|
|
74
|
+
updated_at = now()
|
|
75
|
+
RETURNING channel, state, source, decided_at
|
|
76
|
+
`;
|
|
77
|
+
return toRecord(rows[0]);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=consent-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-repository.js","sourceRoot":"","sources":["../../src/collection/consent-repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AASvC,SAAS,QAAQ,CAAC,GAAQ;IACxB,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAqB;QAClC,KAAK,EAAE,GAAG,CAAC,KAAqB;QAChC,MAAM,EAAE,GAAG,CAAC,MAAuB;QACnC,SAAS,EACP,GAAG,CAAC,UAAU,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;KACzF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAM;IACvC,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,YAAoB,EAAE,OAAmB;YAClD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAO;;;6BAGL,YAAY,kBAAkB,OAAO;;OAE3D,CAAC;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAM,EAAE,QAAgB;IAC9D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAO;;;yBAGL,QAAQ;;GAE9B,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAYD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAM,EAAE,KAAyB;IACnE,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAO;;;yBAGT,KAAK,CAAC,QAAQ,kBAAkB,KAAK,CAAC,OAAO;;GAEnE,CAAC;IAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,gBAAgB,GAAG,OAAO,EAAE,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB,CAAC;IAE5F,IAAI,gBAAgB,IAAI,KAAK,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAC1D,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAO;;;;SAIrB,MAAM,EAAE,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,OAAO;SAChE,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,IAAI,IAAI,YAAY,KAAK,CAAC,SAAS,IAAI,IAAI;;;;;;;;;GAS5F,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { TenantBranding } from './branding.js';
|
|
2
|
+
import type { EmailBlock } from './email-layout.js';
|
|
3
|
+
import type { PaymentBlock } from './payment-block.js';
|
|
4
|
+
import type { StepTone } from './policy.js';
|
|
5
|
+
/**
|
|
6
|
+
* Textos da régua.
|
|
7
|
+
*
|
|
8
|
+
* A progressão vai de lembrete cordial a pedido claro de regularização — e para
|
|
9
|
+
* por aí. Nenhum texto menciona medida judicial, negativação, protesto ou
|
|
10
|
+
* suspensão de serviço: o escritório é quem decide se e quando falar disso, com
|
|
11
|
+
* o cliente dele, e uma automação que escala sozinha para ameaça é onde cobrança
|
|
12
|
+
* automatizada vira problema jurídico e de relacionamento.
|
|
13
|
+
*
|
|
14
|
+
* O assunto também mudou de registro. "Lembrete: vencimento em 2026-08-15" é
|
|
15
|
+
* saída de sistema; quem recebe quer reconhecer o remetente e o assunto de
|
|
16
|
+
* imediato.
|
|
17
|
+
*/
|
|
18
|
+
export interface CopyContext {
|
|
19
|
+
clientName: string;
|
|
20
|
+
branding: TenantBranding;
|
|
21
|
+
outstandingAmount: number;
|
|
22
|
+
dueDate: string | null;
|
|
23
|
+
competence: string | null;
|
|
24
|
+
description: string | null;
|
|
25
|
+
daysOverdue: number;
|
|
26
|
+
/** Já entrou parte do valor? Muda o texto — e evita cobrar o que já foi pago. */
|
|
27
|
+
hasPartialPayment: boolean;
|
|
28
|
+
originalAmount: number;
|
|
29
|
+
/**
|
|
30
|
+
* Como pagar, quando já existe cobrança emitida.
|
|
31
|
+
*
|
|
32
|
+
* Opcional porque a régua roda com ou sem provider conectado: um escritório
|
|
33
|
+
* sem conta de pagamento continua recebendo a comunicação completa, só sem o
|
|
34
|
+
* botão. O e-mail nunca promete um caminho de pagamento que não existe.
|
|
35
|
+
*/
|
|
36
|
+
payment?: PaymentBlock;
|
|
37
|
+
}
|
|
38
|
+
export interface RenderedCopy {
|
|
39
|
+
subject: string;
|
|
40
|
+
block: EmailBlock;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Anexa o pagamento a qualquer etapa da régua.
|
|
44
|
+
*
|
|
45
|
+
* Fica fora do `switch` de propósito: o bloco de pagamento é o mesmo em D-3, D0
|
|
46
|
+
* e D+3, e cada etapa tendo a própria cópia da regra é a forma garantida de uma
|
|
47
|
+
* delas ficar para trás — foi assim que a etapa de atraso ficaria sem botão.
|
|
48
|
+
*/
|
|
49
|
+
export declare function renderCopy(tone: StepTone, ctx: CopyContext): RenderedCopy;
|
|
50
|
+
//# sourceMappingURL=copy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/collection/copy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;CACnB;AAuBD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,GAAG,YAAY,CAIzE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { formatBRL, formatDateBR, formatOverdue, describeReference } from './format.js';
|
|
2
|
+
/** Frase que identifica a dívida sem inventar dado que não existe. */
|
|
3
|
+
function referenceSentence(ctx) {
|
|
4
|
+
const ref = describeReference({ competence: ctx.competence, description: ctx.description });
|
|
5
|
+
return ref ? `Referente a ${ref}.` : null;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Quando houve pagamento parcial, o texto precisa dizer isso.
|
|
9
|
+
*
|
|
10
|
+
* Mandar "o valor de X está em aberto" para quem já pagou metade soa como se o
|
|
11
|
+
* pagamento não tivesse sido registrado — e é a mensagem que mais gera ligação
|
|
12
|
+
* irritada para o escritório.
|
|
13
|
+
*/
|
|
14
|
+
function partialSentence(ctx) {
|
|
15
|
+
if (!ctx.hasPartialPayment)
|
|
16
|
+
return null;
|
|
17
|
+
return (`Registramos o pagamento parcial de ${formatBRL(ctx.originalAmount - ctx.outstandingAmount)}. ` +
|
|
18
|
+
`O saldo restante é de ${formatBRL(ctx.outstandingAmount)}.`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Anexa o pagamento a qualquer etapa da régua.
|
|
22
|
+
*
|
|
23
|
+
* Fica fora do `switch` de propósito: o bloco de pagamento é o mesmo em D-3, D0
|
|
24
|
+
* e D+3, e cada etapa tendo a própria cópia da regra é a forma garantida de uma
|
|
25
|
+
* delas ficar para trás — foi assim que a etapa de atraso ficaria sem botão.
|
|
26
|
+
*/
|
|
27
|
+
export function renderCopy(tone, ctx) {
|
|
28
|
+
const rendered = renderCopyBody(tone, ctx);
|
|
29
|
+
if (!ctx.payment)
|
|
30
|
+
return rendered;
|
|
31
|
+
return { ...rendered, block: { ...rendered.block, payment: ctx.payment } };
|
|
32
|
+
}
|
|
33
|
+
function renderCopyBody(tone, ctx) {
|
|
34
|
+
const office = ctx.branding.officeName;
|
|
35
|
+
const amount = formatBRL(ctx.outstandingAmount);
|
|
36
|
+
const due = formatDateBR(ctx.dueDate);
|
|
37
|
+
// Razão social brasileira termina em ponto com frequência ("Ltda.", "S.A.",
|
|
38
|
+
// "ME."). Somar o nosso produziria "Olá, Padaria Exemplo Ltda.." — pequeno,
|
|
39
|
+
// mas é a primeira linha que o cliente lê.
|
|
40
|
+
const greeting = `Olá, ${ctx.clientName}${/[.!?…]$/.test(ctx.clientName.trim()) ? '' : '.'}`;
|
|
41
|
+
const ref = referenceSentence(ctx);
|
|
42
|
+
const partial = partialSentence(ctx);
|
|
43
|
+
const highlight = {
|
|
44
|
+
label: ctx.hasPartialPayment ? 'Saldo em aberto' : 'Valor',
|
|
45
|
+
amount,
|
|
46
|
+
dueLabel: tone === 'reminder' ? 'Vencimento em' : 'Vencimento:',
|
|
47
|
+
dueValue: due,
|
|
48
|
+
};
|
|
49
|
+
switch (tone) {
|
|
50
|
+
case 'reminder':
|
|
51
|
+
return {
|
|
52
|
+
subject: `Lembrete de vencimento — ${office}`,
|
|
53
|
+
block: {
|
|
54
|
+
greeting,
|
|
55
|
+
paragraphs: [
|
|
56
|
+
`Passando para lembrar que você tem um valor a vencer em ${due}.`,
|
|
57
|
+
...(ref ? [ref] : []),
|
|
58
|
+
...(partial ? [partial] : []),
|
|
59
|
+
],
|
|
60
|
+
highlight,
|
|
61
|
+
closing: 'Se o pagamento já foi feito, é só desconsiderar.',
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
case 'due_notice':
|
|
65
|
+
return {
|
|
66
|
+
subject: `Seu honorário vence hoje — ${office}`,
|
|
67
|
+
block: {
|
|
68
|
+
greeting,
|
|
69
|
+
paragraphs: [
|
|
70
|
+
'O valor abaixo vence hoje.',
|
|
71
|
+
...(ref ? [ref] : []),
|
|
72
|
+
...(partial ? [partial] : []),
|
|
73
|
+
],
|
|
74
|
+
highlight: { ...highlight, dueLabel: 'Vence hoje,' },
|
|
75
|
+
closing: 'Se o pagamento já foi feito, é só desconsiderar.',
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
case 'friendly_collection':
|
|
79
|
+
return {
|
|
80
|
+
subject: `Pendência em aberto — ${office}`,
|
|
81
|
+
block: {
|
|
82
|
+
greeting,
|
|
83
|
+
paragraphs: [
|
|
84
|
+
`Identificamos um valor em aberto, com vencimento em ${due}${ctx.daysOverdue > 0 ? ` — ${formatOverdue(ctx.daysOverdue)}` : ''}.`,
|
|
85
|
+
...(ref ? [ref] : []),
|
|
86
|
+
...(partial ? [partial] : []),
|
|
87
|
+
'Se já tiver pago, avise-nos para darmos baixa. Se preferir, estamos à disposição para combinar a melhor forma.',
|
|
88
|
+
],
|
|
89
|
+
highlight,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
case 'overdue_collection':
|
|
93
|
+
return {
|
|
94
|
+
subject: `Regularização de pendência — ${office}`,
|
|
95
|
+
block: {
|
|
96
|
+
greeting,
|
|
97
|
+
paragraphs: [
|
|
98
|
+
`O valor abaixo segue em aberto desde ${due}${ctx.daysOverdue > 0 ? ` (${formatOverdue(ctx.daysOverdue)})` : ''}.`,
|
|
99
|
+
...(ref ? [ref] : []),
|
|
100
|
+
...(partial ? [partial] : []),
|
|
101
|
+
'Pedimos que entre em contato para regularizarmos. Se houver qualquer dificuldade, fale conosco — encontramos a melhor alternativa juntos.',
|
|
102
|
+
],
|
|
103
|
+
highlight,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
// Interno: nunca chega ao cliente. Ver a nota em `policy.ts`.
|
|
107
|
+
case 'human_escalation':
|
|
108
|
+
default:
|
|
109
|
+
return {
|
|
110
|
+
subject: `Cobrança para acompanhamento manual — ${ctx.clientName}`,
|
|
111
|
+
block: {
|
|
112
|
+
greeting: 'Aviso interno.',
|
|
113
|
+
paragraphs: [
|
|
114
|
+
`A régua automática chegou ao fim para ${ctx.clientName}, com ${amount} em aberto desde ${due}.`,
|
|
115
|
+
'A condução a partir daqui é humana.',
|
|
116
|
+
],
|
|
117
|
+
highlight,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/collection/copy.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA2CxF,sEAAsE;AACtE,SAAS,iBAAiB,CAAC,GAAgB;IACzC,MAAM,GAAG,GAAG,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5F,OAAO,GAAG,CAAC,CAAC,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,GAAgB;IACvC,IAAI,CAAC,GAAG,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,CACL,sCAAsC,SAAS,CAAC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,iBAAiB,CAAC,IAAI;QAC/F,yBAAyB,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAC7D,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,IAAc,EAAE,GAAgB;IACzD,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,QAAQ,CAAC;IAClC,OAAO,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,cAAc,CAAC,IAAc,EAAE,GAAgB;IACtD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;IACvC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,4EAA4E;IAC5E,4EAA4E;IAC5E,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC7F,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAErC,MAAM,SAAS,GAAG;QAChB,KAAK,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO;QAC1D,MAAM;QACN,QAAQ,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa;QAC/D,QAAQ,EAAE,GAAG;KACd,CAAC;IAEF,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO;gBACL,OAAO,EAAE,4BAA4B,MAAM,EAAE;gBAC7C,KAAK,EAAE;oBACL,QAAQ;oBACR,UAAU,EAAE;wBACV,2DAA2D,GAAG,GAAG;wBACjE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC9B;oBACD,SAAS;oBACT,OAAO,EAAE,kDAAkD;iBAC5D;aACF,CAAC;QAEJ,KAAK,YAAY;YACf,OAAO;gBACL,OAAO,EAAE,8BAA8B,MAAM,EAAE;gBAC/C,KAAK,EAAE;oBACL,QAAQ;oBACR,UAAU,EAAE;wBACV,4BAA4B;wBAC5B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC9B;oBACD,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE;oBACpD,OAAO,EAAE,kDAAkD;iBAC5D;aACF,CAAC;QAEJ,KAAK,qBAAqB;YACxB,OAAO;gBACL,OAAO,EAAE,yBAAyB,MAAM,EAAE;gBAC1C,KAAK,EAAE;oBACL,QAAQ;oBACR,UAAU,EAAE;wBACV,uDAAuD,GAAG,GACxD,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EACjE,GAAG;wBACH,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC7B,gHAAgH;qBACjH;oBACD,SAAS;iBACV;aACF,CAAC;QAEJ,KAAK,oBAAoB;YACvB,OAAO;gBACL,OAAO,EAAE,gCAAgC,MAAM,EAAE;gBACjD,KAAK,EAAE;oBACL,QAAQ;oBACR,UAAU,EAAE;wBACV,wCAAwC,GAAG,GACzC,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EACjE,GAAG;wBACH,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC7B,2IAA2I;qBAC5I;oBACD,SAAS;iBACV;aACF,CAAC;QAEJ,8DAA8D;QAC9D,KAAK,kBAAkB,CAAC;QACxB;YACE,OAAO;gBACL,OAAO,EAAE,yCAAyC,GAAG,CAAC,UAAU,EAAE;gBAClE,KAAK,EAAE;oBACL,QAAQ,EAAE,gBAAgB;oBAC1B,UAAU,EAAE;wBACV,yCAAyC,GAAG,CAAC,UAAU,SAAS,MAAM,oBAAoB,GAAG,GAAG;wBAChG,qCAAqC;qBACtC;oBACD,SAAS;iBACV;aACF,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aplicação dos callbacks de entrega ao estado do produto.
|
|
3
|
+
*
|
|
4
|
+
* `communication/webhook.ts` traduz o vocabulário do provider e decide se o
|
|
5
|
+
* evento avança o estado; este arquivo é o que ESCREVE. A separação é a mesma de
|
|
6
|
+
* sempre: o motor não conhece `dunning_event`, e a régua não conhece a Meta.
|
|
7
|
+
*
|
|
8
|
+
* Três escritas, e a ordem entre elas importa menos que o fato de estarem na
|
|
9
|
+
* MESMA transação: um callback que atualiza a etapa e falha ao gravar a trilha
|
|
10
|
+
* deixaria a tela dizendo "entregue" sem nada que explique quando nem por qual
|
|
11
|
+
* caminho.
|
|
12
|
+
*/
|
|
13
|
+
import type { Tx } from '../db/client.js';
|
|
14
|
+
import { type DeliveryEvent, type DeliveryStatus, type InboundOptOut } from '../communication/index.js';
|
|
15
|
+
export type CallbackOutcome =
|
|
16
|
+
/** Estado avançado e gravado. */
|
|
17
|
+
'applied'
|
|
18
|
+
/** O provider mandou algo que este canal não reporta — dado inventado, recusado. */
|
|
19
|
+
| 'not_reported_by_channel'
|
|
20
|
+
/** Chegou fora de ordem, ou repetido: o estado já está igual ou adiante. */
|
|
21
|
+
| 'no_progress'
|
|
22
|
+
/** Nenhuma mensagem deste tenant tem esse identificador de provider. */
|
|
23
|
+
| 'unknown_message';
|
|
24
|
+
export interface CallbackResult {
|
|
25
|
+
outcome: CallbackOutcome;
|
|
26
|
+
receivableId: string | null;
|
|
27
|
+
status: DeliveryStatus | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Aplica um callback de entrega.
|
|
31
|
+
*
|
|
32
|
+
* A via de acesso é o `provider_ref` — é a ÚNICA coisa que o webhook traz. Sem
|
|
33
|
+
* a coluna indexada da 0038 isso exigiria varrer a tabela, e a régua de um
|
|
34
|
+
* escritório grande tornaria cada callback caro o bastante para o provider
|
|
35
|
+
* desistir de reentregar.
|
|
36
|
+
*/
|
|
37
|
+
export declare function applyDeliveryCallback(tx: Tx, tenantId: string, event: DeliveryEvent): Promise<CallbackResult>;
|
|
38
|
+
export type OptOutOutcome = 'registered' | 'unknown_recipient';
|
|
39
|
+
/**
|
|
40
|
+
* Registra o opt-out que o cliente pediu respondendo no canal.
|
|
41
|
+
*
|
|
42
|
+
* `customer_reply` é a origem mais forte que existe: `recordConsent` impede que
|
|
43
|
+
* um operador a reverta pela tela. Por isso a resolução do telefone para cliente
|
|
44
|
+
* é feita pelo `phone_e164` canônico e nunca pelo campo digitado — casar por
|
|
45
|
+
* texto livre acertaria o cliente errado quando dois cadastros diferem só na
|
|
46
|
+
* pontuação, e bloquearia o canal de quem não pediu nada.
|
|
47
|
+
*/
|
|
48
|
+
export declare function applyInboundOptOut(tx: Tx, tenantId: string, optOut: InboundOptOut): Promise<OptOutOutcome>;
|
|
49
|
+
//# sourceMappingURL=delivery-callback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-callback.d.ts","sourceRoot":"","sources":["../../src/collection/delivery-callback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,2BAA2B,CAAC;AAInC,MAAM,MAAM,eAAe;AACzB,iCAAiC;AAC/B,SAAS;AACX,oFAAoF;GAClF,yBAAyB;AAC3B,4EAA4E;GAC1E,aAAa;AACf,wEAAwE;GACtE,iBAAiB,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,eAAe,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;CAC/B;AAKD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,cAAc,CAAC,CAmEzB;AA0CD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,mBAAmB,CAAC;AAE/D;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,CAAC,CAsCxB"}
|