@baruk/core 0.3.1 → 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 +85 -0
- 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 +406 -39
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +125 -3
- package/dist/cjs/legal/documents.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/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 +109 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -8
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +125 -3
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +1 -1
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/types.d.ts +32 -1
- 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/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 +13 -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,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderCopy = renderCopy;
|
|
4
|
+
const format_js_1 = require("./format.js");
|
|
5
|
+
/** Frase que identifica a dívida sem inventar dado que não existe. */
|
|
6
|
+
function referenceSentence(ctx) {
|
|
7
|
+
const ref = (0, format_js_1.describeReference)({ competence: ctx.competence, description: ctx.description });
|
|
8
|
+
return ref ? `Referente a ${ref}.` : null;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Quando houve pagamento parcial, o texto precisa dizer isso.
|
|
12
|
+
*
|
|
13
|
+
* Mandar "o valor de X está em aberto" para quem já pagou metade soa como se o
|
|
14
|
+
* pagamento não tivesse sido registrado — e é a mensagem que mais gera ligação
|
|
15
|
+
* irritada para o escritório.
|
|
16
|
+
*/
|
|
17
|
+
function partialSentence(ctx) {
|
|
18
|
+
if (!ctx.hasPartialPayment)
|
|
19
|
+
return null;
|
|
20
|
+
return (`Registramos o pagamento parcial de ${(0, format_js_1.formatBRL)(ctx.originalAmount - ctx.outstandingAmount)}. ` +
|
|
21
|
+
`O saldo restante é de ${(0, format_js_1.formatBRL)(ctx.outstandingAmount)}.`);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Anexa o pagamento a qualquer etapa da régua.
|
|
25
|
+
*
|
|
26
|
+
* Fica fora do `switch` de propósito: o bloco de pagamento é o mesmo em D-3, D0
|
|
27
|
+
* e D+3, e cada etapa tendo a própria cópia da regra é a forma garantida de uma
|
|
28
|
+
* delas ficar para trás — foi assim que a etapa de atraso ficaria sem botão.
|
|
29
|
+
*/
|
|
30
|
+
function renderCopy(tone, ctx) {
|
|
31
|
+
const rendered = renderCopyBody(tone, ctx);
|
|
32
|
+
if (!ctx.payment)
|
|
33
|
+
return rendered;
|
|
34
|
+
return { ...rendered, block: { ...rendered.block, payment: ctx.payment } };
|
|
35
|
+
}
|
|
36
|
+
function renderCopyBody(tone, ctx) {
|
|
37
|
+
const office = ctx.branding.officeName;
|
|
38
|
+
const amount = (0, format_js_1.formatBRL)(ctx.outstandingAmount);
|
|
39
|
+
const due = (0, format_js_1.formatDateBR)(ctx.dueDate);
|
|
40
|
+
// Razão social brasileira termina em ponto com frequência ("Ltda.", "S.A.",
|
|
41
|
+
// "ME."). Somar o nosso produziria "Olá, Padaria Exemplo Ltda.." — pequeno,
|
|
42
|
+
// mas é a primeira linha que o cliente lê.
|
|
43
|
+
const greeting = `Olá, ${ctx.clientName}${/[.!?…]$/.test(ctx.clientName.trim()) ? '' : '.'}`;
|
|
44
|
+
const ref = referenceSentence(ctx);
|
|
45
|
+
const partial = partialSentence(ctx);
|
|
46
|
+
const highlight = {
|
|
47
|
+
label: ctx.hasPartialPayment ? 'Saldo em aberto' : 'Valor',
|
|
48
|
+
amount,
|
|
49
|
+
dueLabel: tone === 'reminder' ? 'Vencimento em' : 'Vencimento:',
|
|
50
|
+
dueValue: due,
|
|
51
|
+
};
|
|
52
|
+
switch (tone) {
|
|
53
|
+
case 'reminder':
|
|
54
|
+
return {
|
|
55
|
+
subject: `Lembrete de vencimento — ${office}`,
|
|
56
|
+
block: {
|
|
57
|
+
greeting,
|
|
58
|
+
paragraphs: [
|
|
59
|
+
`Passando para lembrar que você tem um valor a vencer em ${due}.`,
|
|
60
|
+
...(ref ? [ref] : []),
|
|
61
|
+
...(partial ? [partial] : []),
|
|
62
|
+
],
|
|
63
|
+
highlight,
|
|
64
|
+
closing: 'Se o pagamento já foi feito, é só desconsiderar.',
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
case 'due_notice':
|
|
68
|
+
return {
|
|
69
|
+
subject: `Seu honorário vence hoje — ${office}`,
|
|
70
|
+
block: {
|
|
71
|
+
greeting,
|
|
72
|
+
paragraphs: [
|
|
73
|
+
'O valor abaixo vence hoje.',
|
|
74
|
+
...(ref ? [ref] : []),
|
|
75
|
+
...(partial ? [partial] : []),
|
|
76
|
+
],
|
|
77
|
+
highlight: { ...highlight, dueLabel: 'Vence hoje,' },
|
|
78
|
+
closing: 'Se o pagamento já foi feito, é só desconsiderar.',
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
case 'friendly_collection':
|
|
82
|
+
return {
|
|
83
|
+
subject: `Pendência em aberto — ${office}`,
|
|
84
|
+
block: {
|
|
85
|
+
greeting,
|
|
86
|
+
paragraphs: [
|
|
87
|
+
`Identificamos um valor em aberto, com vencimento em ${due}${ctx.daysOverdue > 0 ? ` — ${(0, format_js_1.formatOverdue)(ctx.daysOverdue)}` : ''}.`,
|
|
88
|
+
...(ref ? [ref] : []),
|
|
89
|
+
...(partial ? [partial] : []),
|
|
90
|
+
'Se já tiver pago, avise-nos para darmos baixa. Se preferir, estamos à disposição para combinar a melhor forma.',
|
|
91
|
+
],
|
|
92
|
+
highlight,
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
case 'overdue_collection':
|
|
96
|
+
return {
|
|
97
|
+
subject: `Regularização de pendência — ${office}`,
|
|
98
|
+
block: {
|
|
99
|
+
greeting,
|
|
100
|
+
paragraphs: [
|
|
101
|
+
`O valor abaixo segue em aberto desde ${due}${ctx.daysOverdue > 0 ? ` (${(0, format_js_1.formatOverdue)(ctx.daysOverdue)})` : ''}.`,
|
|
102
|
+
...(ref ? [ref] : []),
|
|
103
|
+
...(partial ? [partial] : []),
|
|
104
|
+
'Pedimos que entre em contato para regularizarmos. Se houver qualquer dificuldade, fale conosco — encontramos a melhor alternativa juntos.',
|
|
105
|
+
],
|
|
106
|
+
highlight,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
// Interno: nunca chega ao cliente. Ver a nota em `policy.ts`.
|
|
110
|
+
case 'human_escalation':
|
|
111
|
+
default:
|
|
112
|
+
return {
|
|
113
|
+
subject: `Cobrança para acompanhamento manual — ${ctx.clientName}`,
|
|
114
|
+
block: {
|
|
115
|
+
greeting: 'Aviso interno.',
|
|
116
|
+
paragraphs: [
|
|
117
|
+
`A régua automática chegou ao fim para ${ctx.clientName}, com ${amount} em aberto desde ${due}.`,
|
|
118
|
+
'A condução a partir daqui é humana.',
|
|
119
|
+
],
|
|
120
|
+
highlight,
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/collection/copy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Aplicação dos callbacks de entrega ao estado do produto.
|
|
4
|
+
*
|
|
5
|
+
* `communication/webhook.ts` traduz o vocabulário do provider e decide se o
|
|
6
|
+
* evento avança o estado; este arquivo é o que ESCREVE. A separação é a mesma de
|
|
7
|
+
* sempre: o motor não conhece `dunning_event`, e a régua não conhece a Meta.
|
|
8
|
+
*
|
|
9
|
+
* Três escritas, e a ordem entre elas importa menos que o fato de estarem na
|
|
10
|
+
* MESMA transação: um callback que atualiza a etapa e falha ao gravar a trilha
|
|
11
|
+
* deixaria a tela dizendo "entregue" sem nada que explique quando nem por qual
|
|
12
|
+
* caminho.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.applyDeliveryCallback = applyDeliveryCallback;
|
|
16
|
+
exports.applyInboundOptOut = applyInboundOptOut;
|
|
17
|
+
const node_crypto_1 = require("node:crypto");
|
|
18
|
+
const index_js_1 = require("../communication/index.js");
|
|
19
|
+
const consent_repository_js_1 = require("./consent-repository.js");
|
|
20
|
+
const communication_bridge_js_1 = require("./communication-bridge.js");
|
|
21
|
+
/** Estados de `dunning_event` que descrevem uma mensagem já entregue ao provider. */
|
|
22
|
+
const DELIVERABLE = ['sent', 'delivered', 'read', 'failed'];
|
|
23
|
+
/**
|
|
24
|
+
* Aplica um callback de entrega.
|
|
25
|
+
*
|
|
26
|
+
* A via de acesso é o `provider_ref` — é a ÚNICA coisa que o webhook traz. Sem
|
|
27
|
+
* a coluna indexada da 0038 isso exigiria varrer a tabela, e a régua de um
|
|
28
|
+
* escritório grande tornaria cada callback caro o bastante para o provider
|
|
29
|
+
* desistir de reentregar.
|
|
30
|
+
*/
|
|
31
|
+
async function applyDeliveryCallback(tx, tenantId, event) {
|
|
32
|
+
const rows = await tx `
|
|
33
|
+
SELECT id, receivable_id, status, idempotency_key
|
|
34
|
+
FROM dunning_event
|
|
35
|
+
WHERE provider_ref = ${event.providerRef}
|
|
36
|
+
LIMIT 1
|
|
37
|
+
`;
|
|
38
|
+
const action = rows[0];
|
|
39
|
+
// Sem ação correspondente não há o que atualizar. NÃO é erro: o mesmo número
|
|
40
|
+
// pode ter mandado mensagem por outro sistema, e um 4xx aqui faria o provider
|
|
41
|
+
// reentregar para sempre um evento que nunca vai ser reconhecido.
|
|
42
|
+
if (!action) {
|
|
43
|
+
await recordCallbackEvent(tx, tenantId, event, null, null, 'unknown_message');
|
|
44
|
+
return { outcome: 'unknown_message', receivableId: null, status: null };
|
|
45
|
+
}
|
|
46
|
+
// `advanceStatus` opera sobre estados de ENTREGA. Uma ação `scheduled`,
|
|
47
|
+
// `canceled` ou `escalated` não descreve mensagem entregue, e forçá-la para
|
|
48
|
+
// `delivered` inventaria uma entrega que a régua não fez.
|
|
49
|
+
const current = (DELIVERABLE.includes(action.status) ? action.status : 'sent');
|
|
50
|
+
const decision = (0, index_js_1.applyDeliveryEvent)(current, event);
|
|
51
|
+
if (!decision.apply) {
|
|
52
|
+
await recordCallbackEvent(tx, tenantId, event, action.receivable_id, action.idempotency_key, decision.reason);
|
|
53
|
+
return { outcome: decision.reason, receivableId: action.receivable_id, status: null };
|
|
54
|
+
}
|
|
55
|
+
await tx `
|
|
56
|
+
UPDATE dunning_event
|
|
57
|
+
SET status = ${decision.status},
|
|
58
|
+
delivered_at = CASE
|
|
59
|
+
WHEN ${decision.status} IN ('delivered', 'read') THEN COALESCE(delivered_at, ${event.occurredAt}::timestamptz)
|
|
60
|
+
ELSE delivered_at END,
|
|
61
|
+
read_at = CASE
|
|
62
|
+
WHEN ${decision.status} = 'read' THEN COALESCE(read_at, ${event.occurredAt}::timestamptz)
|
|
63
|
+
ELSE read_at END,
|
|
64
|
+
last_error = CASE
|
|
65
|
+
WHEN ${decision.status} = 'failed' THEN ${(event.detail ?? event.code ?? 'falha reportada pelo provider').slice(0, 300)}
|
|
66
|
+
ELSE last_error END
|
|
67
|
+
WHERE id = ${action.id}
|
|
68
|
+
`;
|
|
69
|
+
await recordCallbackEvent(tx, tenantId, event, action.receivable_id, action.idempotency_key, null, decision.status);
|
|
70
|
+
return {
|
|
71
|
+
outcome: 'applied',
|
|
72
|
+
receivableId: action.receivable_id,
|
|
73
|
+
status: decision.status,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const CALLBACK_KIND = {
|
|
77
|
+
delivered: 'callback_delivered',
|
|
78
|
+
read: 'callback_read',
|
|
79
|
+
failed: 'callback_failed',
|
|
80
|
+
opted_out: 'opt_out',
|
|
81
|
+
};
|
|
82
|
+
async function recordCallbackEvent(tx, tenantId, event, subjectRef, idempotencyKey, refusal, applied) {
|
|
83
|
+
// Evento recusado também vira linha. É a diferença entre "o provider nunca
|
|
84
|
+
// avisou" e "avisou e nós descartamos" — e só a segunda tem explicação.
|
|
85
|
+
const kind = refusal ? 'dispatch_skipped' : (CALLBACK_KIND[event.status] ?? 'dispatch_skipped');
|
|
86
|
+
await tx `
|
|
87
|
+
INSERT INTO communication_event (
|
|
88
|
+
id, tenant_id, product, brand, kind, channel, event_type, subject_ref,
|
|
89
|
+
recipient_ref, idempotency_key, provider_ref, skip_reason, status, code,
|
|
90
|
+
detail, occurred_at
|
|
91
|
+
) VALUES (
|
|
92
|
+
${(0, node_crypto_1.randomUUID)()}, ${tenantId}, ${communication_bridge_js_1.SC_PRODUCT},
|
|
93
|
+
-- A marca vem da RESERVA que produziu a mensagem. Quando não há reserva
|
|
94
|
+
-- correspondente, o evento fica sem marca — é o caso do callback sobre um
|
|
95
|
+
-- identificador que não é nosso, e inventar um valor aqui faria a trilha
|
|
96
|
+
-- atribuir a um escritório algo que ele não enviou.
|
|
97
|
+
(SELECT brand FROM communication_dispatch
|
|
98
|
+
WHERE provider_ref = ${event.providerRef} LIMIT 1),
|
|
99
|
+
${kind}, ${event.channel}, 'billing.dunning.callback', ${subjectRef},
|
|
100
|
+
NULL, ${idempotencyKey}, ${event.providerRef}, ${refusal},
|
|
101
|
+
${applied ?? event.status}, ${event.code ?? null},
|
|
102
|
+
${event.detail ? event.detail.slice(0, 300) : null}, ${event.occurredAt}::timestamptz
|
|
103
|
+
)
|
|
104
|
+
`;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Registra o opt-out que o cliente pediu respondendo no canal.
|
|
108
|
+
*
|
|
109
|
+
* `customer_reply` é a origem mais forte que existe: `recordConsent` impede que
|
|
110
|
+
* um operador a reverta pela tela. Por isso a resolução do telefone para cliente
|
|
111
|
+
* é feita pelo `phone_e164` canônico e nunca pelo campo digitado — casar por
|
|
112
|
+
* texto livre acertaria o cliente errado quando dois cadastros diferem só na
|
|
113
|
+
* pontuação, e bloquearia o canal de quem não pediu nada.
|
|
114
|
+
*/
|
|
115
|
+
async function applyInboundOptOut(tx, tenantId, optOut) {
|
|
116
|
+
const e164 = optOut.from.startsWith('+') ? optOut.from : `+${optOut.from}`;
|
|
117
|
+
const rows = await tx `
|
|
118
|
+
SELECT id FROM client
|
|
119
|
+
WHERE phone_e164 = ${e164} AND deleted_at IS NULL
|
|
120
|
+
ORDER BY created_at
|
|
121
|
+
LIMIT 2
|
|
122
|
+
`;
|
|
123
|
+
// Dois clientes com o mesmo telefone é cadastro legítimo (marido e mulher,
|
|
124
|
+
// matriz e filial). Bloquear "o primeiro" seria escolher por sorte quem
|
|
125
|
+
// deixa de ser cobrado. Sem resolução única, nada é registrado — e o evento
|
|
126
|
+
// fica na trilha para um humano decidir.
|
|
127
|
+
if (rows.length !== 1)
|
|
128
|
+
return 'unknown_recipient';
|
|
129
|
+
await (0, consent_repository_js_1.recordConsent)(tx, {
|
|
130
|
+
tenantId,
|
|
131
|
+
clientId: rows[0].id,
|
|
132
|
+
channel: optOut.channel,
|
|
133
|
+
state: 'denied',
|
|
134
|
+
source: 'customer_reply',
|
|
135
|
+
note: 'opt-out recebido no canal',
|
|
136
|
+
});
|
|
137
|
+
await tx `
|
|
138
|
+
INSERT INTO communication_event (
|
|
139
|
+
id, tenant_id, product, brand, kind, channel, event_type, recipient_ref,
|
|
140
|
+
code, occurred_at
|
|
141
|
+
) VALUES (
|
|
142
|
+
-- Opt-out é do CLIENTE, e vale para todas as marcas do escritório: o
|
|
143
|
+
-- pedido de silêncio não é por linha de produto. Sem marca, portanto.
|
|
144
|
+
${(0, node_crypto_1.randomUUID)()}, ${tenantId}, ${communication_bridge_js_1.SC_PRODUCT}, NULL, 'opt_out',
|
|
145
|
+
${optOut.channel}, 'communication.opt_out', ${rows[0].id},
|
|
146
|
+
'customer_reply', ${optOut.occurredAt}::timestamptz
|
|
147
|
+
)
|
|
148
|
+
`;
|
|
149
|
+
return 'registered';
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=delivery-callback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-callback.js","sourceRoot":"","sources":["../../../src/collection/delivery-callback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.escapeHtml = escapeHtml;
|
|
4
|
+
exports.renderCollectionEmail = renderCollectionEmail;
|
|
5
|
+
exports.renderCollectionText = renderCollectionText;
|
|
6
|
+
/**
|
|
7
|
+
* A cor é revalidada AQUI, e não só em `getTenantBranding`.
|
|
8
|
+
*
|
|
9
|
+
* Ela é interpolada dentro de um atributo `style`; confiar que o chamador já
|
|
10
|
+
* sanitizou é o tipo de suposição que se perde na primeira refatoração — basta
|
|
11
|
+
* alguém montar o branding à mão para injetar CSS (ou fechar o atributo e
|
|
12
|
+
* injetar markup) na mensagem que sai em nome do escritório.
|
|
13
|
+
*/
|
|
14
|
+
function safeColorForRender(v) {
|
|
15
|
+
return /^#[0-9a-fA-F]{6}$/.test(v) ? v : '#1f3a5f';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* URL só entra no `href`/`src` se for https.
|
|
19
|
+
*
|
|
20
|
+
* O escape de HTML já impediria a fuga do atributo, mas ele não impede um
|
|
21
|
+
* `javascript:` de continuar sendo `javascript:`. E esta URL vem do metadata da
|
|
22
|
+
* cobrança, que passou por um gateway externo — validar aqui é o mesmo
|
|
23
|
+
* princípio já aplicado à cor: não confiar em quem chama.
|
|
24
|
+
*/
|
|
25
|
+
function safeUrlForRender(v) {
|
|
26
|
+
if (!v)
|
|
27
|
+
return null;
|
|
28
|
+
return /^https:\/\/[^\s"'<>]+$/i.test(v) ? v : null;
|
|
29
|
+
}
|
|
30
|
+
/** Mesma razão da cor: a stack de fontes também é interpolada num `style`. */
|
|
31
|
+
function safeFontForRender(v) {
|
|
32
|
+
return /^[A-Za-z0-9 ,.'-]+$/.test(v) ? v : `-apple-system,'Segoe UI',Helvetica,Arial,sans-serif`;
|
|
33
|
+
}
|
|
34
|
+
function escapeHtml(s) {
|
|
35
|
+
return s
|
|
36
|
+
.replace(/&/g, '&')
|
|
37
|
+
.replace(/</g, '<')
|
|
38
|
+
.replace(/>/g, '>')
|
|
39
|
+
.replace(/"/g, '"')
|
|
40
|
+
.replace(/'/g, ''');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Cabeçalho — a assinatura visual institucional da mensagem.
|
|
44
|
+
*
|
|
45
|
+
* Três formas, conforme o que o tenant tem:
|
|
46
|
+
*
|
|
47
|
+
* | `logoUrl` | `logoKind` | Cabeçalho |
|
|
48
|
+
* |---|---|---|
|
|
49
|
+
* | ausente | — | nome + tagline em tipografia |
|
|
50
|
+
* | presente | `symbol` | símbolo à esquerda, nome + tagline à direita |
|
|
51
|
+
* | presente | `lockup` | só a imagem (o nome já está desenhada nela) + tagline |
|
|
52
|
+
*
|
|
53
|
+
* O par símbolo+texto é montado com tabela, não com flex: o Outlook desktop
|
|
54
|
+
* renderiza com o motor do Word e empilharia as duas colunas.
|
|
55
|
+
*/
|
|
56
|
+
function header(b) {
|
|
57
|
+
const name = escapeHtml(b.officeName);
|
|
58
|
+
const font = safeFontForRender(b.fontFamily);
|
|
59
|
+
const tagline = b.tagline
|
|
60
|
+
? `<div style="margin-top:6px;font-family:${font};font-size:12px;line-height:1.4;color:#ffffff;opacity:.72">${escapeHtml(b.tagline)}</div>`
|
|
61
|
+
: '';
|
|
62
|
+
const wordmark = `<span style="font-family:${font};font-size:19px;font-weight:700;color:#ffffff;letter-spacing:-.01em">${name}</span>${tagline}`;
|
|
63
|
+
if (!b.logoUrl)
|
|
64
|
+
return wordmark;
|
|
65
|
+
const src = escapeHtml(b.logoUrl);
|
|
66
|
+
if (b.logoKind === 'lockup') {
|
|
67
|
+
// O lockup já traz o nome desenhado — repetir em texto duplicaria a marca.
|
|
68
|
+
// Por isso o `alt` carrega o nome aqui: com imagens bloqueadas, é a única
|
|
69
|
+
// coisa que sobra no cabeçalho.
|
|
70
|
+
return `<img src="${src}" alt="${name}" height="36"
|
|
71
|
+
style="display:block;border:0;outline:none;text-decoration:none;height:36px;width:auto;max-width:260px" />${tagline}`;
|
|
72
|
+
}
|
|
73
|
+
// Símbolo: 40px, tamanho mínimo do manual de marca com folga, e discreto o
|
|
74
|
+
// bastante para o nome continuar sendo a primeira leitura. `alt` vazio de
|
|
75
|
+
// propósito — o nome está ao lado, e um `alt` repetido faria o leitor de tela
|
|
76
|
+
// (e o cliente com imagens bloqueadas) anunciar o escritório duas vezes.
|
|
77
|
+
return `<table role="presentation" cellpadding="0" cellspacing="0" border="0" style="border-collapse:collapse">
|
|
78
|
+
<tr>
|
|
79
|
+
<td valign="middle" style="padding-right:14px">
|
|
80
|
+
<img src="${src}" alt="" width="40" height="40"
|
|
81
|
+
style="display:block;border:0;outline:none;text-decoration:none;width:40px;height:40px" />
|
|
82
|
+
</td>
|
|
83
|
+
<td valign="middle">${wordmark}</td>
|
|
84
|
+
</tr>
|
|
85
|
+
</table>`;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Bloco de pagamento.
|
|
89
|
+
*
|
|
90
|
+
* Hierarquia deliberada: **um** botão, e o resto discreto abaixo. Dar o mesmo
|
|
91
|
+
* peso visual a PIX, boleto e link transforma a decisão de pagar numa escolha
|
|
92
|
+
* de meio — e quem hesita, adia. O botão é um `<a>` com padding, não um
|
|
93
|
+
* `<button>`: cliente de e-mail não executa formulário, e o Outlook desenha o
|
|
94
|
+
* fundo da tabela mesmo quando ignora o `border-radius`.
|
|
95
|
+
*
|
|
96
|
+
* O copia-e-cola do PIX vai em texto selecionável, sem botão de copiar — não há
|
|
97
|
+
* JavaScript em e-mail, e um botão que não copia nada é uma promessa quebrada.
|
|
98
|
+
*/
|
|
99
|
+
function renderPayment(b, t) {
|
|
100
|
+
if (!b)
|
|
101
|
+
return '';
|
|
102
|
+
const target = safeUrlForRender(b.url) ?? safeUrlForRender(b.boletoUrl);
|
|
103
|
+
const cta = target
|
|
104
|
+
? `<table role="presentation" cellpadding="0" cellspacing="0" border="0" style="border-collapse:collapse;margin:0 0 18px">
|
|
105
|
+
<tr><td align="center" bgcolor="${t.primary}" style="border-radius:6px">
|
|
106
|
+
<a href="${escapeHtml(target)}"
|
|
107
|
+
style="display:inline-block;padding:14px 34px;font-family:${t.font};font-size:15px;font-weight:700;color:#ffffff;text-decoration:none;border-radius:6px">Pagar agora</a>
|
|
108
|
+
</td></tr>
|
|
109
|
+
</table>`
|
|
110
|
+
: '';
|
|
111
|
+
const alternativas = [];
|
|
112
|
+
// O QR precisa ser uma URL **https**.
|
|
113
|
+
//
|
|
114
|
+
// Um `data:` URI parece funcionar no navegador e **não funciona no Gmail**:
|
|
115
|
+
// ele serve toda imagem pelo próprio proxy, que só busca http(s). O resultado
|
|
116
|
+
// é o pior possível — um ícone quebrado onde deveria estar o meio de
|
|
117
|
+
// pagamento, exatamente como apareceu no QA.
|
|
118
|
+
//
|
|
119
|
+
// Sem URL válida, nenhuma `<img>` é emitida: o copia-e-cola abaixo continua
|
|
120
|
+
// pagando a conta, e uma imagem quebrada só faria o e-mail parecer defeituoso.
|
|
121
|
+
const qr = safeUrlForRender(b.pixQrCodeImage);
|
|
122
|
+
if (qr) {
|
|
123
|
+
alternativas.push(`<tr><td align="center" style="padding:4px 0 10px">
|
|
124
|
+
<img src="${escapeHtml(qr)}" alt="QR Code do PIX" width="150" height="150"
|
|
125
|
+
style="display:block;border:0;width:150px;height:150px" />
|
|
126
|
+
</td></tr>`);
|
|
127
|
+
}
|
|
128
|
+
if (b.pixPayload) {
|
|
129
|
+
alternativas.push(`<tr><td style="padding:0 0 10px">
|
|
130
|
+
<div style="font-family:${t.font};font-size:12px;color:${t.muted};margin-bottom:4px">PIX copia e cola</div>
|
|
131
|
+
<div style="font-family:Consolas,'Courier New',monospace;font-size:11px;line-height:1.5;color:#2b3440;word-break:break-all;background:#ffffff;border:1px solid #e3e8ee;border-radius:4px;padding:10px">${escapeHtml(b.pixPayload)}</div>
|
|
132
|
+
</td></tr>`);
|
|
133
|
+
}
|
|
134
|
+
if (b.identificationField) {
|
|
135
|
+
alternativas.push(`<tr><td style="padding:0 0 10px">
|
|
136
|
+
<div style="font-family:${t.font};font-size:12px;color:${t.muted};margin-bottom:4px">Linha digitável do boleto</div>
|
|
137
|
+
<div style="font-family:Consolas,'Courier New',monospace;font-size:12px;line-height:1.5;color:#2b3440;word-break:break-all">${escapeHtml(b.identificationField)}</div>
|
|
138
|
+
</td></tr>`);
|
|
139
|
+
}
|
|
140
|
+
if (!cta && !alternativas.length)
|
|
141
|
+
return '';
|
|
142
|
+
const alt = alternativas.length
|
|
143
|
+
? `<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%"
|
|
144
|
+
style="border-collapse:collapse;margin:0 0 20px;background:#f6f8fa;border-radius:6px">
|
|
145
|
+
<tr><td style="padding:16px 18px">
|
|
146
|
+
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="border-collapse:collapse">
|
|
147
|
+
${alternativas.join('')}
|
|
148
|
+
</table>
|
|
149
|
+
</td></tr>
|
|
150
|
+
</table>`
|
|
151
|
+
: '';
|
|
152
|
+
return `${cta}${alt}`;
|
|
153
|
+
}
|
|
154
|
+
function renderCollectionEmail(b, block) {
|
|
155
|
+
const name = escapeHtml(b.officeName);
|
|
156
|
+
const primary = safeColorForRender(b.primaryColor);
|
|
157
|
+
const accent = safeColorForRender(b.accentColor);
|
|
158
|
+
const bg = safeColorForRender(b.backgroundColor);
|
|
159
|
+
const text = safeColorForRender(b.textColor);
|
|
160
|
+
const muted = safeColorForRender(b.mutedColor);
|
|
161
|
+
const font = safeFontForRender(b.fontFamily);
|
|
162
|
+
const p = (t) => `<p style="margin:0 0 16px;font-family:${font};font-size:15px;line-height:1.65;color:${text}">${escapeHtml(t)}</p>`;
|
|
163
|
+
const highlight = block.highlight
|
|
164
|
+
? `<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%"
|
|
165
|
+
style="margin:0 0 24px;border-collapse:collapse;background:#f6f8fa;border-left:3px solid ${accent};border-radius:4px">
|
|
166
|
+
<tr>
|
|
167
|
+
<td style="padding:18px 20px">
|
|
168
|
+
<div style="font-family:${font};font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:${muted};margin-bottom:6px">${escapeHtml(block.highlight.label)}</div>
|
|
169
|
+
<div style="font-family:${font};font-size:26px;font-weight:700;color:#1a2029;line-height:1.2">${escapeHtml(block.highlight.amount)}</div>
|
|
170
|
+
<div style="font-family:${font};font-size:14px;color:#4a5563;margin-top:8px">${escapeHtml(block.highlight.dueLabel)} <strong style="color:#1a2029">${escapeHtml(block.highlight.dueValue)}</strong></div>
|
|
171
|
+
</td>
|
|
172
|
+
</tr>
|
|
173
|
+
</table>`
|
|
174
|
+
: '';
|
|
175
|
+
const payment = renderPayment(block.payment, { primary, accent, muted, font });
|
|
176
|
+
const support = [
|
|
177
|
+
b.supportEmail ? escapeHtml(b.supportEmail) : null,
|
|
178
|
+
b.supportPhone ? escapeHtml(b.supportPhone) : null,
|
|
179
|
+
b.website ? escapeHtml(b.website.replace(/^https:\/\//, '')) : null,
|
|
180
|
+
].filter(Boolean);
|
|
181
|
+
return `<!doctype html>
|
|
182
|
+
<html lang="pt-BR"><head><meta charset="utf-8" />
|
|
183
|
+
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
184
|
+
<meta name="color-scheme" content="light" />
|
|
185
|
+
<title>${name}</title></head>
|
|
186
|
+
<body style="margin:0;padding:0;background:${bg};-webkit-text-size-adjust:100%">
|
|
187
|
+
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="background:${bg};border-collapse:collapse">
|
|
188
|
+
<tr><td align="center" style="padding:32px 12px">
|
|
189
|
+
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="600"
|
|
190
|
+
style="width:600px;max-width:100%;border-collapse:collapse;background:#ffffff;border-radius:8px;overflow:hidden;box-shadow:0 1px 3px rgba(16,24,40,.08)">
|
|
191
|
+
|
|
192
|
+
<tr><td style="background:${primary};padding:24px 32px">${header(b)}</td></tr>
|
|
193
|
+
|
|
194
|
+
<tr><td style="padding:32px">
|
|
195
|
+
${p(block.greeting)}
|
|
196
|
+
${block.paragraphs.map(p).join('')}
|
|
197
|
+
${highlight}
|
|
198
|
+
${payment}
|
|
199
|
+
${block.closing ? p(block.closing) : ''}
|
|
200
|
+
<p style="margin:24px 0 0;font-family:${font};font-size:15px;line-height:1.6;color:${text}">
|
|
201
|
+
Atenciosamente,<br /><strong>${escapeHtml(b.signatureName)}</strong>
|
|
202
|
+
</p>
|
|
203
|
+
</td></tr>
|
|
204
|
+
|
|
205
|
+
<tr><td style="padding:20px 32px;background:#f6f8fa;border-top:1px solid #e3e8ee">
|
|
206
|
+
<p style="margin:0;font-family:${font};font-size:12px;line-height:1.6;color:${muted}">
|
|
207
|
+
Mensagem automática enviada por ${name}.${support.length ? ` Para falar conosco: ${support.join(' · ')}.` : ''}<br />
|
|
208
|
+
Se o pagamento já foi realizado, desconsidere este aviso.
|
|
209
|
+
</p>
|
|
210
|
+
</td></tr>
|
|
211
|
+
|
|
212
|
+
</table>
|
|
213
|
+
</td></tr>
|
|
214
|
+
</table>
|
|
215
|
+
</body></html>`;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Versão texto puro.
|
|
219
|
+
*
|
|
220
|
+
* Não é decoração: parte dos leitores prefere `text/plain`, filtros de spam
|
|
221
|
+
* penalizam mensagem só-HTML, e leitores de tela lidam melhor com o texto. O
|
|
222
|
+
* conteúdo tem de ser o MESMO — um plain text resumido faria dois clientes
|
|
223
|
+
* receberem informações diferentes.
|
|
224
|
+
*/
|
|
225
|
+
function renderCollectionText(b, block) {
|
|
226
|
+
const parts = [block.greeting, '', ...block.paragraphs];
|
|
227
|
+
if (block.highlight) {
|
|
228
|
+
parts.push('', `${block.highlight.label}: ${block.highlight.amount}`, `${block.highlight.dueLabel} ${block.highlight.dueValue}`);
|
|
229
|
+
}
|
|
230
|
+
if (block.payment) {
|
|
231
|
+
const pay = block.payment;
|
|
232
|
+
const linhas = [];
|
|
233
|
+
const alvo = pay.url ?? pay.boletoUrl;
|
|
234
|
+
if (alvo)
|
|
235
|
+
linhas.push(`Pague aqui: ${alvo}`);
|
|
236
|
+
if (pay.pixPayload)
|
|
237
|
+
linhas.push('', 'PIX copia e cola:', pay.pixPayload);
|
|
238
|
+
if (pay.identificationField)
|
|
239
|
+
linhas.push('', 'Linha digitável:', pay.identificationField);
|
|
240
|
+
if (linhas.length)
|
|
241
|
+
parts.push('', ...linhas);
|
|
242
|
+
}
|
|
243
|
+
if (block.closing)
|
|
244
|
+
parts.push('', block.closing);
|
|
245
|
+
parts.push('', 'Atenciosamente,', b.signatureName);
|
|
246
|
+
const support = [b.supportEmail, b.supportPhone, b.website?.replace(/^https:\/\//, '')]
|
|
247
|
+
.filter(Boolean)
|
|
248
|
+
.join(' · ');
|
|
249
|
+
parts.push('', '---', `Mensagem automática enviada por ${b.officeName}.${support ? ` Para falar conosco: ${support}.` : ''}`, 'Se o pagamento já foi realizado, desconsidere este aviso.');
|
|
250
|
+
return parts.join('\n');
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=email-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-layout.js","sourceRoot":"","sources":["../../../src/collection/email-layout.ts"],"names":[],"mappings":"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"}
|