@baruk/core 0.3.0 → 0.4.2
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 +97 -0
- package/README.md +9 -2
- 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 +39 -2
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +75 -10
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +334 -0
- package/dist/billing/ar-repository.d.ts.map +1 -0
- package/dist/billing/ar-repository.js +707 -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 +89 -0
- package/dist/billing/provider-account.d.ts.map +1 -0
- package/dist/billing/provider-account.js +161 -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 +90 -1
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +148 -19
- package/dist/billing/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 +75 -9
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +728 -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 +170 -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 +150 -18
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/repository.js +96 -20
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +140 -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/communication-bridge.js +140 -0
- package/dist/cjs/collection/communication-bridge.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +193 -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 +414 -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 +147 -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/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 +161 -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 +483 -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/repository.js +309 -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/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/index.js +427 -48
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/company.js +36 -0
- package/dist/cjs/legal/company.js.map +1 -0
- package/dist/cjs/legal/documents.js +671 -0
- package/dist/cjs/legal/documents.js.map +1 -0
- package/dist/cjs/legal/index.js +15 -0
- package/dist/cjs/legal/index.js.map +1 -0
- package/dist/cjs/legal/types.js +34 -0
- package/dist/cjs/legal/types.js.map +1 -0
- 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/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 +67 -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/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 +57 -8
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/subscription-billing/types.js.map +1 -1
- package/dist/cjs/tenancy/provisioning.js +32 -8
- package/dist/cjs/tenancy/provisioning.js.map +1 -1
- package/dist/cjs/users/repository.js +119 -2
- 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/repository.d.ts +42 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +94 -21
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +72 -0
- package/dist/collection/branding.d.ts.map +1 -0
- package/dist/collection/branding.js +136 -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/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 +95 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -0
- package/dist/collection/communication-runtime.js +187 -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 +177 -0
- package/dist/collection/engine.d.ts.map +1 -0
- package/dist/collection/engine.js +407 -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 +53 -0
- package/dist/collection/policy.d.ts.map +1 -0
- package/dist/collection/policy.js +141 -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/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 +158 -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 +153 -0
- package/dist/communication/engine.d.ts.map +1 -0
- package/dist/communication/engine.js +480 -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 +99 -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/repository.d.ts +147 -0
- package/dist/competence/repository.d.ts.map +1 -0
- package/dist/competence/repository.js +294 -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/db/migrate.js +17 -11
- package/dist/db/migrate.js.map +1 -1
- 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/index.d.ts +113 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +104 -8
- package/dist/index.js.map +1 -1
- package/dist/legal/company.d.ts +32 -0
- package/dist/legal/company.d.ts.map +1 -0
- package/dist/legal/company.js +33 -0
- package/dist/legal/company.js.map +1 -0
- package/dist/legal/documents.d.ts +30 -0
- package/dist/legal/documents.d.ts.map +1 -0
- package/dist/legal/documents.js +666 -0
- package/dist/legal/documents.js.map +1 -0
- package/dist/legal/index.d.ts +5 -0
- package/dist/legal/index.d.ts.map +1 -0
- package/dist/legal/index.js +4 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/legal/types.d.ts +145 -0
- package/dist/legal/types.d.ts.map +1 -0
- package/dist/legal/types.js +31 -0
- package/dist/legal/types.js.map +1 -0
- 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/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 +67 -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/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 +17 -1
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +57 -8
- 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/provisioning.d.ts.map +1 -1
- package/dist/tenancy/provisioning.js +32 -8
- package/dist/tenancy/provisioning.js.map +1 -1
- package/dist/users/repository.d.ts +38 -0
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +118 -3
- 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 +19 -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/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,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Padrão neutro do produto — deliberadamente SEM marca.
|
|
3
|
+
*
|
|
4
|
+
* Um tenant sem branding configurado não deve herdar a identidade de outro
|
|
5
|
+
* escritório nem a do Baruk: o cinza-azulado abaixo não pertence a marca
|
|
6
|
+
* nenhuma, e é o sinal visível de que falta configurar.
|
|
7
|
+
*/
|
|
8
|
+
const NEUTRAL_PRIMARY = '#2b3440';
|
|
9
|
+
const NEUTRAL_ACCENT = '#4a5563';
|
|
10
|
+
const NEUTRAL_BACKGROUND = '#eef1f4';
|
|
11
|
+
const NEUTRAL_TEXT = '#2b3440';
|
|
12
|
+
const NEUTRAL_MUTED = '#6b7684';
|
|
13
|
+
/** Famílias que existem em qualquer cliente de e-mail — o fim de toda stack. */
|
|
14
|
+
const UNIVERSAL_FALLBACK = `-apple-system,'Segoe UI',Helvetica,Arial,sans-serif`;
|
|
15
|
+
/**
|
|
16
|
+
* Cor só entra se for hex válido.
|
|
17
|
+
*
|
|
18
|
+
* O valor vem de configuração editável e é interpolado dentro de um atributo
|
|
19
|
+
* `style` — aceitar texto livre deixaria o tenant injetar CSS, ou fechar o
|
|
20
|
+
* atributo e injetar markup, na mensagem que sai em nome dele.
|
|
21
|
+
*/
|
|
22
|
+
function safeColor(v, fallback) {
|
|
23
|
+
return typeof v === 'string' && /^#[0-9a-fA-F]{6}$/.test(v) ? v : fallback;
|
|
24
|
+
}
|
|
25
|
+
/** URL só entra se for https — evita `javascript:` e `data:` no `src`/`href`. */
|
|
26
|
+
function safeUrl(v) {
|
|
27
|
+
if (typeof v !== 'string')
|
|
28
|
+
return null;
|
|
29
|
+
return /^https:\/\/[^\s"'<>]+$/i.test(v) ? v : null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Logo só entra se for uma imagem que cliente de e-mail sabe desenhar.
|
|
33
|
+
*
|
|
34
|
+
* SVG é o formato em que os kits de marca vivem — e é justamente o que Gmail e
|
|
35
|
+
* Outlook não renderizam em e-mail. Aceitar o SVG produziria o pior resultado
|
|
36
|
+
* possível: um cabeçalho vazio, sem imagem e sem o nome que o fallback teria
|
|
37
|
+
* escrito. Rasterize antes; aqui, entra PNG ou JPG.
|
|
38
|
+
*/
|
|
39
|
+
function safeLogoUrl(v) {
|
|
40
|
+
const url = safeUrl(v);
|
|
41
|
+
if (!url)
|
|
42
|
+
return null;
|
|
43
|
+
const path = url.split(/[?#]/)[0] ?? '';
|
|
44
|
+
return /\.(png|jpe?g)$/i.test(path) ? url : null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A stack de fontes vai para dentro de um atributo `style`.
|
|
48
|
+
*
|
|
49
|
+
* Aspas duplas, `;`, `{` e `}` deixariam o tenant fechar a declaração e escrever
|
|
50
|
+
* CSS próprio na mensagem que sai em nome dele. Sobram letras, dígitos, espaço,
|
|
51
|
+
* hífen, vírgula, ponto e aspa simples — o que um `font-family` legítimo usa.
|
|
52
|
+
*/
|
|
53
|
+
function safeFontFamily(v) {
|
|
54
|
+
if (typeof v !== 'string')
|
|
55
|
+
return UNIVERSAL_FALLBACK;
|
|
56
|
+
const t = v.trim().slice(0, 160);
|
|
57
|
+
if (!t || !/^[A-Za-z0-9 ,.'-]+$/.test(t))
|
|
58
|
+
return UNIVERSAL_FALLBACK;
|
|
59
|
+
// A queda universal é acrescentada sempre: uma stack que termina numa webfont
|
|
60
|
+
// vira Times New Roman no Outlook, e o e-mail perde a hierarquia inteira.
|
|
61
|
+
return `${t},${UNIVERSAL_FALLBACK}`;
|
|
62
|
+
}
|
|
63
|
+
function safeLogoKind(v) {
|
|
64
|
+
return v === 'lockup' ? 'lockup' : 'symbol';
|
|
65
|
+
}
|
|
66
|
+
function safeText(v, max = 160) {
|
|
67
|
+
if (typeof v !== 'string')
|
|
68
|
+
return null;
|
|
69
|
+
const t = v.trim().slice(0, max);
|
|
70
|
+
return t ? t : null;
|
|
71
|
+
}
|
|
72
|
+
export async function getTenantBranding(tx) {
|
|
73
|
+
/*
|
|
74
|
+
* O tenant CORRENTE, e não "o primeiro que aparecer".
|
|
75
|
+
*
|
|
76
|
+
* A consulta era `SELECT display_name, settings FROM tenant LIMIT 1`, sem
|
|
77
|
+
* `WHERE`. Parecia segura porque toda leitura tenant-scoped deste produto
|
|
78
|
+
* passa por `withContext` — mas `tenant` é a tabela RAIZ e **não tem RLS**:
|
|
79
|
+
* ela é a fonte da própria fronteira, não uma linha protegida por ela. Sem
|
|
80
|
+
* `WHERE`, a política que protege todas as outras tabelas não protege esta, e
|
|
81
|
+
* o `LIMIT 1` devolve um escritório arbitrário.
|
|
82
|
+
*
|
|
83
|
+
* A consequência é a pior possível para uma régua de cobrança: o e-mail sai
|
|
84
|
+
* com o nome, a logomarca e as cores de OUTRO escritório. Nunca apareceu
|
|
85
|
+
* porque a base de produção tem um tenant operando — ou seja, o defeito estava
|
|
86
|
+
* esperando o segundo cliente.
|
|
87
|
+
*
|
|
88
|
+
* Sem contexto de tenant a consulta devolve zero linhas de propósito, e o
|
|
89
|
+
* branding cai no padrão NEUTRO — que não pertence a marca nenhuma. Um default
|
|
90
|
+
* que herda a marca do vizinho é o defeito, não o conserto.
|
|
91
|
+
*/
|
|
92
|
+
const rows = await tx `
|
|
93
|
+
SELECT display_name, settings FROM tenant
|
|
94
|
+
WHERE id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
|
|
95
|
+
LIMIT 1
|
|
96
|
+
`;
|
|
97
|
+
const row = rows[0];
|
|
98
|
+
const raw = (row?.settings?.branding ?? {});
|
|
99
|
+
const officeName = safeText(raw.officeName) ?? row?.display_name ?? 'Seu escritório contábil';
|
|
100
|
+
const primary = safeColor(raw.primaryColor, NEUTRAL_PRIMARY);
|
|
101
|
+
return {
|
|
102
|
+
officeName,
|
|
103
|
+
signatureName: safeText(raw.signatureName) ?? officeName,
|
|
104
|
+
tagline: safeText(raw.tagline, 120),
|
|
105
|
+
logoUrl: safeLogoUrl(raw.logoUrl),
|
|
106
|
+
logoKind: safeLogoKind(raw.logoKind),
|
|
107
|
+
primaryColor: primary,
|
|
108
|
+
// Secundária cai na primária: um tenant que configurou só uma cor fica
|
|
109
|
+
// coerente, em vez de ganhar um segundo tom que ninguém escolheu.
|
|
110
|
+
secondaryColor: safeColor(raw.secondaryColor, primary),
|
|
111
|
+
accentColor: safeColor(raw.accentColor, NEUTRAL_ACCENT),
|
|
112
|
+
backgroundColor: safeColor(raw.backgroundColor, NEUTRAL_BACKGROUND),
|
|
113
|
+
textColor: safeColor(raw.textColor, NEUTRAL_TEXT),
|
|
114
|
+
mutedColor: safeColor(raw.mutedColor, NEUTRAL_MUTED),
|
|
115
|
+
fontFamily: safeFontFamily(raw.fontFamily),
|
|
116
|
+
supportEmail: safeText(raw.supportEmail, 120),
|
|
117
|
+
supportPhone: safeText(raw.supportPhone, 40),
|
|
118
|
+
website: safeUrl(raw.website),
|
|
119
|
+
locale: 'pt-BR',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Remetente no formato `Nome <endereço>`.
|
|
124
|
+
*
|
|
125
|
+
* O endereço continua sendo o do domínio verificado no provider — trocá-lo
|
|
126
|
+
* quebraria a entrega. O que muda é o NOME exibido: as mensagens saíam como
|
|
127
|
+
* "Baruk Contábil" e assinavam "SC Organização Contábil", o que faz o cliente
|
|
128
|
+
* duvidar de quem está cobrando.
|
|
129
|
+
*/
|
|
130
|
+
export function senderFor(branding, fallbackFrom) {
|
|
131
|
+
const address = /<([^>]+)>/.exec(fallbackFrom)?.[1] ?? fallbackFrom;
|
|
132
|
+
// Aspas e `<` no nome quebrariam o cabeçalho do e-mail.
|
|
133
|
+
const name = branding.officeName.replace(/["<>\\]/g, '').trim();
|
|
134
|
+
return name ? `${name} <${address}>` : fallbackFrom;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=branding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branding.js","sourceRoot":"","sources":["../../src/collection/branding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contas de canal do escritório, para o motor compartilhado.
|
|
3
|
+
*
|
|
4
|
+
* Moram em `tenant.settings.channels` (jsonb que já existia) — sem tabela nem
|
|
5
|
+
* migration, pela mesma razão que o branding mora lá: o Office resolve
|
|
6
|
+
* configuração de tenant por esse caminho, e um segundo mecanismo para a mesma
|
|
7
|
+
* coisa é uma divergência esperando acontecer.
|
|
8
|
+
*
|
|
9
|
+
* **Nenhum valor de credencial passa por aqui.** O que o tenant configura é o
|
|
10
|
+
* NOME lógico do segredo no cofre (`credentialRef`); quem resolve o valor é a
|
|
11
|
+
* borda do adapter, com o resolvedor que o processo injeta.
|
|
12
|
+
*/
|
|
13
|
+
import type { Tx } from '../db/client.js';
|
|
14
|
+
import type { ChannelAccountStore, SenderFallbackPolicy } from '../communication/index.js';
|
|
15
|
+
import type { TenantBranding } from './branding.js';
|
|
16
|
+
/**
|
|
17
|
+
* Store de contas do tenant corrente.
|
|
18
|
+
*
|
|
19
|
+
* **A amarra é a GUC da sessão, não o parâmetro.**
|
|
20
|
+
*
|
|
21
|
+
* A versão anterior consultava `WHERE id = ctx.tenantId` e depois comparava
|
|
22
|
+
* `row.id !== ctx.tenantId` — uma comparação que nunca pode falhar, porque o
|
|
23
|
+
* `WHERE` já usou o mesmo valor. Ela parecia ser a tranca contra "pedir o tenant
|
|
24
|
+
* errado dentro da transação certa" e não era nenhuma tranca: bastava um
|
|
25
|
+
* chamador passar um contexto alheio para ler a configuração de canal de outro
|
|
26
|
+
* escritório, `credentialRef` inclusive.
|
|
27
|
+
*
|
|
28
|
+
* `tenant` é a tabela RAIZ e não tem RLS — ela define a fronteira, não é
|
|
29
|
+
* protegida por ela —, então a política que cobre todas as outras tabelas não
|
|
30
|
+
* cobria esta consulta. A correção é exigir que o tenant PEDIDO seja o mesmo da
|
|
31
|
+
* sessão: quem quiser ler a configuração de outro escritório precisa abrir a
|
|
32
|
+
* transação dele, que é justamente o que a fronteira significa.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createTenantChannelAccountStore(tx: Tx): ChannelAccountStore;
|
|
35
|
+
/**
|
|
36
|
+
* Fallback de plataforma da cobrança — **e-mail apenas**.
|
|
37
|
+
*
|
|
38
|
+
* Existe porque a SC já entrega e-mail em produção hoje pela chave da
|
|
39
|
+
* plataforma, e desligar isso para exigir configuração por escritório pararia a
|
|
40
|
+
* régua de quem está cobrando agora. Removê-lo não é hardening, é interrupção de
|
|
41
|
+
* serviço.
|
|
42
|
+
*
|
|
43
|
+
* O que muda em relação ao que o Codex reprovou é o que sai na mensagem: o NOME
|
|
44
|
+
* exibido passa a ser o do escritório que está cobrando, sempre. O endereço
|
|
45
|
+
* continua sendo o do domínio verificado — trocá-lo quebraria a entrega —, mas
|
|
46
|
+
* quem lê vê "SC Organização Contábil", não uma marca alheia.
|
|
47
|
+
*
|
|
48
|
+
* Nada de WhatsApp nem SMS aqui, e a proibição não é por omissão: o motor recusa
|
|
49
|
+
* fallback nesses canais por construção (`sender-profile.ts`). Um número de
|
|
50
|
+
* telefone compartilhado entre marcas é o caminho para uma marca ser bloqueada
|
|
51
|
+
* pelo comportamento de outra.
|
|
52
|
+
*/
|
|
53
|
+
export declare function collectionSenderFallback(branding: TenantBranding, platformEmail: {
|
|
54
|
+
senderId: string;
|
|
55
|
+
credentialRef: string;
|
|
56
|
+
}): SenderFallbackPolicy;
|
|
57
|
+
//# sourceMappingURL=channel-accounts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-accounts.d.ts","sourceRoot":"","sources":["../../src/collection/channel-accounts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAEV,mBAAmB,EAEnB,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAuCpD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,+BAA+B,CAAC,EAAE,EAAE,EAAE,GAAG,mBAAmB,CA2C3E;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,cAAc,EACxB,aAAa,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACzD,oBAAoB,CAatB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contas de canal do escritório, para o motor compartilhado.
|
|
3
|
+
*
|
|
4
|
+
* Moram em `tenant.settings.channels` (jsonb que já existia) — sem tabela nem
|
|
5
|
+
* migration, pela mesma razão que o branding mora lá: o Office resolve
|
|
6
|
+
* configuração de tenant por esse caminho, e um segundo mecanismo para a mesma
|
|
7
|
+
* coisa é uma divergência esperando acontecer.
|
|
8
|
+
*
|
|
9
|
+
* **Nenhum valor de credencial passa por aqui.** O que o tenant configura é o
|
|
10
|
+
* NOME lógico do segredo no cofre (`credentialRef`); quem resolve o valor é a
|
|
11
|
+
* borda do adapter, com o resolvedor que o processo injeta.
|
|
12
|
+
*/
|
|
13
|
+
import { SC_PRODUCT } from './communication-bridge.js';
|
|
14
|
+
const STATUSES = new Set(['not_configured', 'pending_validation', 'active', 'paused', 'error']);
|
|
15
|
+
function text(v, max = 200) {
|
|
16
|
+
if (typeof v !== 'string')
|
|
17
|
+
return undefined;
|
|
18
|
+
const t = v.trim();
|
|
19
|
+
return t && t.length <= max ? t : undefined;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Metadados sem segredo, e a checagem é por ALLOWLIST de chave.
|
|
23
|
+
*
|
|
24
|
+
* Filtrar por "o que parece segredo" deixaria passar o que não parece — e o
|
|
25
|
+
* `meta` de um canal é jsonb editável por quem configura o tenant, então
|
|
26
|
+
* qualquer coisa pode ter sido colada ali. Só o que o adapter precisa entra.
|
|
27
|
+
*/
|
|
28
|
+
const META_ALLOWED = new Set(['phoneNumberId', 'wabaId', 'businessId', 'region']);
|
|
29
|
+
function meta(v) {
|
|
30
|
+
if (typeof v !== 'object' || v === null)
|
|
31
|
+
return undefined;
|
|
32
|
+
const out = {};
|
|
33
|
+
for (const [k, raw] of Object.entries(v)) {
|
|
34
|
+
if (!META_ALLOWED.has(k))
|
|
35
|
+
continue;
|
|
36
|
+
const value = text(raw, 120);
|
|
37
|
+
if (value)
|
|
38
|
+
out[k] = value;
|
|
39
|
+
}
|
|
40
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Store de contas do tenant corrente.
|
|
44
|
+
*
|
|
45
|
+
* **A amarra é a GUC da sessão, não o parâmetro.**
|
|
46
|
+
*
|
|
47
|
+
* A versão anterior consultava `WHERE id = ctx.tenantId` e depois comparava
|
|
48
|
+
* `row.id !== ctx.tenantId` — uma comparação que nunca pode falhar, porque o
|
|
49
|
+
* `WHERE` já usou o mesmo valor. Ela parecia ser a tranca contra "pedir o tenant
|
|
50
|
+
* errado dentro da transação certa" e não era nenhuma tranca: bastava um
|
|
51
|
+
* chamador passar um contexto alheio para ler a configuração de canal de outro
|
|
52
|
+
* escritório, `credentialRef` inclusive.
|
|
53
|
+
*
|
|
54
|
+
* `tenant` é a tabela RAIZ e não tem RLS — ela define a fronteira, não é
|
|
55
|
+
* protegida por ela —, então a política que cobre todas as outras tabelas não
|
|
56
|
+
* cobria esta consulta. A correção é exigir que o tenant PEDIDO seja o mesmo da
|
|
57
|
+
* sessão: quem quiser ler a configuração de outro escritório precisa abrir a
|
|
58
|
+
* transação dele, que é justamente o que a fronteira significa.
|
|
59
|
+
*/
|
|
60
|
+
export function createTenantChannelAccountStore(tx) {
|
|
61
|
+
return {
|
|
62
|
+
async find(ctx, channel) {
|
|
63
|
+
if (ctx.product !== SC_PRODUCT)
|
|
64
|
+
return null;
|
|
65
|
+
const rows = await tx `
|
|
66
|
+
SELECT id, settings FROM tenant
|
|
67
|
+
WHERE id = ${ctx.tenantId}
|
|
68
|
+
AND id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
|
|
69
|
+
LIMIT 1
|
|
70
|
+
`;
|
|
71
|
+
const row = rows[0];
|
|
72
|
+
if (!row)
|
|
73
|
+
return null;
|
|
74
|
+
const channels = (row.settings?.channels ?? {});
|
|
75
|
+
const raw = channels[channel];
|
|
76
|
+
if (!raw)
|
|
77
|
+
return null;
|
|
78
|
+
const senderId = text(raw.senderId);
|
|
79
|
+
const credentialRef = text(raw.credentialRef);
|
|
80
|
+
// Sem remetente ou sem referência de credencial não há conta utilizável.
|
|
81
|
+
// Devolver uma conta pela metade faria o motor tentar e o provider recusar,
|
|
82
|
+
// gastando uma tentativa da régua para descobrir o que já se sabia aqui.
|
|
83
|
+
if (!senderId || !credentialRef)
|
|
84
|
+
return null;
|
|
85
|
+
const status = text(raw.status);
|
|
86
|
+
return {
|
|
87
|
+
channel,
|
|
88
|
+
tenantId: ctx.tenantId,
|
|
89
|
+
product: ctx.product,
|
|
90
|
+
brand: ctx.brand,
|
|
91
|
+
senderId,
|
|
92
|
+
displayName: text(raw.displayName, 120),
|
|
93
|
+
credentialRef,
|
|
94
|
+
// Estado desconhecido nunca vira `active`: configuração que ninguém
|
|
95
|
+
// reconhece não autoriza envio.
|
|
96
|
+
status: status && STATUSES.has(status) ? status : 'not_configured',
|
|
97
|
+
meta: meta(raw.meta),
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Fallback de plataforma da cobrança — **e-mail apenas**.
|
|
104
|
+
*
|
|
105
|
+
* Existe porque a SC já entrega e-mail em produção hoje pela chave da
|
|
106
|
+
* plataforma, e desligar isso para exigir configuração por escritório pararia a
|
|
107
|
+
* régua de quem está cobrando agora. Removê-lo não é hardening, é interrupção de
|
|
108
|
+
* serviço.
|
|
109
|
+
*
|
|
110
|
+
* O que muda em relação ao que o Codex reprovou é o que sai na mensagem: o NOME
|
|
111
|
+
* exibido passa a ser o do escritório que está cobrando, sempre. O endereço
|
|
112
|
+
* continua sendo o do domínio verificado — trocá-lo quebraria a entrega —, mas
|
|
113
|
+
* quem lê vê "SC Organização Contábil", não uma marca alheia.
|
|
114
|
+
*
|
|
115
|
+
* Nada de WhatsApp nem SMS aqui, e a proibição não é por omissão: o motor recusa
|
|
116
|
+
* fallback nesses canais por construção (`sender-profile.ts`). Um número de
|
|
117
|
+
* telefone compartilhado entre marcas é o caminho para uma marca ser bloqueada
|
|
118
|
+
* pelo comportamento de outra.
|
|
119
|
+
*/
|
|
120
|
+
export function collectionSenderFallback(branding, platformEmail) {
|
|
121
|
+
// O endereço vem do remetente base configurado; `senderFor` já sabe extrair só
|
|
122
|
+
// o endereço de um `Nome <end@dominio>`.
|
|
123
|
+
const address = /<([^>]+)>/.exec(platformEmail.senderId)?.[1] ?? platformEmail.senderId;
|
|
124
|
+
const displayName = branding.officeName.replace(/["<>\\]/g, '').trim() || undefined;
|
|
125
|
+
return {
|
|
126
|
+
email: {
|
|
127
|
+
senderId: address,
|
|
128
|
+
credentialRef: platformEmail.credentialRef,
|
|
129
|
+
displayNameFor: () => displayName,
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=channel-accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-accounts.js","sourceRoot":"","sources":["../../src/collection/channel-accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vocabulário de canal da régua de cobrança.
|
|
3
|
+
*
|
|
4
|
+
* **Só o vocabulário.** Este arquivo já carregou uma abstração de canal inteira
|
|
5
|
+
* — `CollectionChannel`, `CollectionMessage`, `resolveChannel` e um adapter de
|
|
6
|
+
* e-mail — e foi por ela que a cobrança tinha um SEGUNDO caminho de envio,
|
|
7
|
+
* paralelo ao motor compartilhado, com idempotência própria que não era gravada
|
|
8
|
+
* em lugar nenhum. Cron e rota manual usavam vias diferentes e não se
|
|
9
|
+
* enxergavam.
|
|
10
|
+
*
|
|
11
|
+
* O caminho de entrega agora é um só: `communication/`. O que restou aqui é o
|
|
12
|
+
* nome do canal que a política do escritório declara por etapa, que é dado de
|
|
13
|
+
* régua e não tem nada a ver com provider.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Canal declarado por etapa da régua.
|
|
17
|
+
*
|
|
18
|
+
* Subconjunto de `ChannelKey` do motor. `sms` ainda não aparece porque a régua
|
|
19
|
+
* não tem como declará-lo hoje — está registrado como dívida não bloqueante, e
|
|
20
|
+
* alargar o tipo sem alargar a validação da política gravaria passo que o motor
|
|
21
|
+
* aceita e a tela não sabe exibir.
|
|
22
|
+
*/
|
|
23
|
+
export type CollectionChannelKey = 'email' | 'whatsapp' | 'notification';
|
|
24
|
+
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/collection/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vocabulário de canal da régua de cobrança.
|
|
3
|
+
*
|
|
4
|
+
* **Só o vocabulário.** Este arquivo já carregou uma abstração de canal inteira
|
|
5
|
+
* — `CollectionChannel`, `CollectionMessage`, `resolveChannel` e um adapter de
|
|
6
|
+
* e-mail — e foi por ela que a cobrança tinha um SEGUNDO caminho de envio,
|
|
7
|
+
* paralelo ao motor compartilhado, com idempotência própria que não era gravada
|
|
8
|
+
* em lugar nenhum. Cron e rota manual usavam vias diferentes e não se
|
|
9
|
+
* enxergavam.
|
|
10
|
+
*
|
|
11
|
+
* O caminho de entrega agora é um só: `communication/`. O que restou aqui é o
|
|
12
|
+
* nome do canal que a política do escritório declara por etapa, que é dado de
|
|
13
|
+
* régua e não tem nada a ver com provider.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/collection/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A régua da SC como CONSUMIDORA do motor compartilhado.
|
|
3
|
+
*
|
|
4
|
+
* Esta é a fronteira do adendo §14, e ela cai deste lado: tudo aqui é regra da
|
|
5
|
+
* SC — quais eventos existem, quais variáveis a cobrança expõe, como o texto do
|
|
6
|
+
* escritório vira conteúdo de cada canal. Nada disto entra em
|
|
7
|
+
* `communication/`, porque no dia em que a Dental for o segundo consumidor o
|
|
8
|
+
* motor não pode ter aprendido contabilidade.
|
|
9
|
+
*
|
|
10
|
+
* O caminho inverso também vale: nenhuma linha deste arquivo sabe o que é Meta,
|
|
11
|
+
* Resend ou Twilio.
|
|
12
|
+
*/
|
|
13
|
+
import { type ChannelKey, type CommunicationContext, type MessageContent } from '../communication/index.js';
|
|
14
|
+
import type { TenantBranding } from './branding.js';
|
|
15
|
+
import type { EmailBlock } from './email-layout.js';
|
|
16
|
+
/** Slug do produto no ecossistema. Estável — entra em toda chave de idempotência. */
|
|
17
|
+
export declare const SC_PRODUCT = "sc-organizacao-contabil";
|
|
18
|
+
/**
|
|
19
|
+
* Evento de negócio a partir da etapa da régua.
|
|
20
|
+
*
|
|
21
|
+
* Deriva de `stepKey` (`D-3`, `D0`, `D+7`), que é o identificador que o tenant
|
|
22
|
+
* configura e que já garante a idempotência do agendamento. Assim o vocabulário
|
|
23
|
+
* de evento acompanha a régua do escritório em vez de ser uma segunda lista que
|
|
24
|
+
* alguém precisa lembrar de atualizar junto.
|
|
25
|
+
*/
|
|
26
|
+
export declare function collectionEventType(stepKey: string): string;
|
|
27
|
+
/** Contexto da SC para um tenant. A marca é a do próprio escritório. */
|
|
28
|
+
export declare function collectionContext(tenantId: string, brand: string): CommunicationContext;
|
|
29
|
+
export interface CollectionVariablesInput {
|
|
30
|
+
clientName: string;
|
|
31
|
+
officeName: string;
|
|
32
|
+
outstandingAmount: number;
|
|
33
|
+
dueDate: string | null;
|
|
34
|
+
reference: string | null;
|
|
35
|
+
paymentUrl?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Variáveis expostas à camada de template, por NOME.
|
|
39
|
+
*
|
|
40
|
+
* O motor as reordena conforme o template declara — a ordem posicional que o
|
|
41
|
+
* WhatsApp exige é resolvida lá, não aqui. Amarrar a ordem neste ponto faria
|
|
42
|
+
* cada template novo do escritório exigir mudança de código.
|
|
43
|
+
*/
|
|
44
|
+
export declare function collectionVariables(input: CollectionVariablesInput): Record<string, string>;
|
|
45
|
+
export interface ContentBuilderInput {
|
|
46
|
+
branding: TenantBranding;
|
|
47
|
+
/** Conteúdo estruturado já produzido por `renderCopy`. */
|
|
48
|
+
subject: string;
|
|
49
|
+
block: EmailBlock;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Constrói o conteúdo do canal escolhido — **depois** de o canal ser escolhido.
|
|
53
|
+
*
|
|
54
|
+
* É aqui que o gap G1 da auditoria se fecha. A abstração anterior
|
|
55
|
+
* (`collection/channel.ts`) exigia `subject` + `html` no payload: um adapter de
|
|
56
|
+
* WhatsApp receberia HTML renderizado e teria de desmontá-lo em texto. Agora o
|
|
57
|
+
* e-mail é renderizado só quando o canal é e-mail, e o WhatsApp recebe o que o
|
|
58
|
+
* WhatsApp aceita — template aprovado com variáveis posicionais.
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildCollectionContent(input: ContentBuilderInput): (channel: ChannelKey, template: {
|
|
61
|
+
providerTemplateName?: string;
|
|
62
|
+
body?: string;
|
|
63
|
+
subject?: string;
|
|
64
|
+
locale: string;
|
|
65
|
+
}, ordered: string[], variables: Record<string, string>) => MessageContent | null;
|
|
66
|
+
//# sourceMappingURL=communication-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communication-bridge.d.ts","sourceRoot":"","sources":["../../src/collection/communication-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,qFAAqF;AACrF,eAAO,MAAM,UAAU,4BAA4B,CAAC;AAEpD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAEvF;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAa3F;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,cAAc,CAAC;IACzB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,mBAAmB,GACzB,CACD,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE;IAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC5F,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC9B,cAAc,GAAG,IAAI,CAkCzB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A régua da SC como CONSUMIDORA do motor compartilhado.
|
|
3
|
+
*
|
|
4
|
+
* Esta é a fronteira do adendo §14, e ela cai deste lado: tudo aqui é regra da
|
|
5
|
+
* SC — quais eventos existem, quais variáveis a cobrança expõe, como o texto do
|
|
6
|
+
* escritório vira conteúdo de cada canal. Nada disto entra em
|
|
7
|
+
* `communication/`, porque no dia em que a Dental for o segundo consumidor o
|
|
8
|
+
* motor não pode ter aprendido contabilidade.
|
|
9
|
+
*
|
|
10
|
+
* O caminho inverso também vale: nenhuma linha deste arquivo sabe o que é Meta,
|
|
11
|
+
* Resend ou Twilio.
|
|
12
|
+
*/
|
|
13
|
+
import {} from '../communication/index.js';
|
|
14
|
+
import { renderCollectionEmail, renderCollectionText } from './email-layout.js';
|
|
15
|
+
import { formatBRL, formatDateBR } from './format.js';
|
|
16
|
+
/** Slug do produto no ecossistema. Estável — entra em toda chave de idempotência. */
|
|
17
|
+
export const SC_PRODUCT = 'sc-organizacao-contabil';
|
|
18
|
+
/**
|
|
19
|
+
* Evento de negócio a partir da etapa da régua.
|
|
20
|
+
*
|
|
21
|
+
* Deriva de `stepKey` (`D-3`, `D0`, `D+7`), que é o identificador que o tenant
|
|
22
|
+
* configura e que já garante a idempotência do agendamento. Assim o vocabulário
|
|
23
|
+
* de evento acompanha a régua do escritório em vez de ser uma segunda lista que
|
|
24
|
+
* alguém precisa lembrar de atualizar junto.
|
|
25
|
+
*/
|
|
26
|
+
export function collectionEventType(stepKey) {
|
|
27
|
+
const slug = stepKey
|
|
28
|
+
.toLowerCase()
|
|
29
|
+
.replace(/\+/g, 'plus')
|
|
30
|
+
.replace(/-/g, 'minus')
|
|
31
|
+
.replace(/[^a-z0-9]+/g, '_')
|
|
32
|
+
.replace(/^_+|_+$/g, '');
|
|
33
|
+
return `billing.dunning.${slug || 'step'}`;
|
|
34
|
+
}
|
|
35
|
+
/** Contexto da SC para um tenant. A marca é a do próprio escritório. */
|
|
36
|
+
export function collectionContext(tenantId, brand) {
|
|
37
|
+
return { tenantId, product: SC_PRODUCT, brand };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Variáveis expostas à camada de template, por NOME.
|
|
41
|
+
*
|
|
42
|
+
* O motor as reordena conforme o template declara — a ordem posicional que o
|
|
43
|
+
* WhatsApp exige é resolvida lá, não aqui. Amarrar a ordem neste ponto faria
|
|
44
|
+
* cada template novo do escritório exigir mudança de código.
|
|
45
|
+
*/
|
|
46
|
+
export function collectionVariables(input) {
|
|
47
|
+
const vars = {
|
|
48
|
+
clientName: input.clientName,
|
|
49
|
+
officeName: input.officeName,
|
|
50
|
+
amount: formatBRL(input.outstandingAmount),
|
|
51
|
+
dueDate: formatDateBR(input.dueDate),
|
|
52
|
+
reference: input.reference ?? '',
|
|
53
|
+
};
|
|
54
|
+
// Só entra quando existe. Uma variável vazia num template de WhatsApp faz a
|
|
55
|
+
// Meta recusar a mensagem inteira — melhor o template não pedir o campo do que
|
|
56
|
+
// o campo chegar em branco.
|
|
57
|
+
if (input.paymentUrl)
|
|
58
|
+
vars.paymentUrl = input.paymentUrl;
|
|
59
|
+
return vars;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Constrói o conteúdo do canal escolhido — **depois** de o canal ser escolhido.
|
|
63
|
+
*
|
|
64
|
+
* É aqui que o gap G1 da auditoria se fecha. A abstração anterior
|
|
65
|
+
* (`collection/channel.ts`) exigia `subject` + `html` no payload: um adapter de
|
|
66
|
+
* WhatsApp receberia HTML renderizado e teria de desmontá-lo em texto. Agora o
|
|
67
|
+
* e-mail é renderizado só quando o canal é e-mail, e o WhatsApp recebe o que o
|
|
68
|
+
* WhatsApp aceita — template aprovado com variáveis posicionais.
|
|
69
|
+
*/
|
|
70
|
+
export function buildCollectionContent(input) {
|
|
71
|
+
return (channel, template, ordered, variables) => {
|
|
72
|
+
if (channel === 'email') {
|
|
73
|
+
return {
|
|
74
|
+
kind: 'email',
|
|
75
|
+
subject: template.subject ?? input.subject,
|
|
76
|
+
html: renderCollectionEmail(input.branding, input.block),
|
|
77
|
+
text: renderCollectionText(input.branding, input.block),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (channel === 'whatsapp') {
|
|
81
|
+
// Sem template registrado no provider não há envio ativo possível: fora da
|
|
82
|
+
// janela de 24h o WhatsApp só aceita template aprovado. Devolver texto
|
|
83
|
+
// livre aqui produziria uma recusa do provider que pareceria falha do
|
|
84
|
+
// destinatário.
|
|
85
|
+
if (!template.providerTemplateName)
|
|
86
|
+
return null;
|
|
87
|
+
return {
|
|
88
|
+
kind: 'whatsapp_template',
|
|
89
|
+
templateName: template.providerTemplateName,
|
|
90
|
+
language: template.locale,
|
|
91
|
+
variables: ordered,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (channel === 'sms' || channel === 'notification') {
|
|
95
|
+
const body = template.body
|
|
96
|
+
? renderPlain(template.body, variables)
|
|
97
|
+
: plainFromBlock(input.block);
|
|
98
|
+
return { kind: 'text', body };
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Substituição por ALLOWLIST das variáveis fornecidas — `{{x}}` só resolve se
|
|
105
|
+
* `x` existir. Qualquer outra coisa fica literal e visível.
|
|
106
|
+
*
|
|
107
|
+
* Mesma regra do `template.ts` da cobrança, e pela mesma razão: o texto vem de
|
|
108
|
+
* configuração de tenant, e interpolação livre sobre dado editável pelo usuário
|
|
109
|
+
* é execução arbitrária. Falha à vista é melhor que falha silenciosa.
|
|
110
|
+
*/
|
|
111
|
+
function renderPlain(text, vars) {
|
|
112
|
+
return text.replace(/\{\{\s*([a-zA-Z][a-zA-Z0-9]*)\s*\}\}/g, (whole, name) => Object.prototype.hasOwnProperty.call(vars, name) ? vars[name] : whole);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Texto curto a partir do conteúdo estruturado, quando o tenant não configurou
|
|
116
|
+
* corpo próprio.
|
|
117
|
+
*
|
|
118
|
+
* Deliberadamente enxuto: em SMS cada segmento é cobrado, e o corpo de um e-mail
|
|
119
|
+
* de cobrança inteiro custaria cinco. Leva a saudação, o essencial do valor e o
|
|
120
|
+
* link de pagamento quando existe — que é o que faz o cliente agir.
|
|
121
|
+
*/
|
|
122
|
+
function plainFromBlock(block) {
|
|
123
|
+
const parts = [block.greeting];
|
|
124
|
+
if (block.highlight) {
|
|
125
|
+
parts.push(`${block.highlight.label}: ${block.highlight.amount} (${block.highlight.dueValue}).`);
|
|
126
|
+
}
|
|
127
|
+
else if (block.paragraphs[0]) {
|
|
128
|
+
parts.push(block.paragraphs[0]);
|
|
129
|
+
}
|
|
130
|
+
if (block.payment?.url)
|
|
131
|
+
parts.push(block.payment.url);
|
|
132
|
+
return parts.join(' ');
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=communication-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communication-bridge.js","sourceRoot":"","sources":["../../src/collection/communication-bridge.ts"],"names":[],"mappings":"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"}
|