@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,50 @@
|
|
|
1
|
+
import type { TenantBranding } from './branding.js';
|
|
2
|
+
import type { EmailBlock } from './email-layout.js';
|
|
3
|
+
import type { PaymentBlock } from './payment-block.js';
|
|
4
|
+
import type { StepTone } from './policy.js';
|
|
5
|
+
/**
|
|
6
|
+
* Textos da régua.
|
|
7
|
+
*
|
|
8
|
+
* A progressão vai de lembrete cordial a pedido claro de regularização — e para
|
|
9
|
+
* por aí. Nenhum texto menciona medida judicial, negativação, protesto ou
|
|
10
|
+
* suspensão de serviço: o escritório é quem decide se e quando falar disso, com
|
|
11
|
+
* o cliente dele, e uma automação que escala sozinha para ameaça é onde cobrança
|
|
12
|
+
* automatizada vira problema jurídico e de relacionamento.
|
|
13
|
+
*
|
|
14
|
+
* O assunto também mudou de registro. "Lembrete: vencimento em 2026-08-15" é
|
|
15
|
+
* saída de sistema; quem recebe quer reconhecer o remetente e o assunto de
|
|
16
|
+
* imediato.
|
|
17
|
+
*/
|
|
18
|
+
export interface CopyContext {
|
|
19
|
+
clientName: string;
|
|
20
|
+
branding: TenantBranding;
|
|
21
|
+
outstandingAmount: number;
|
|
22
|
+
dueDate: string | null;
|
|
23
|
+
competence: string | null;
|
|
24
|
+
description: string | null;
|
|
25
|
+
daysOverdue: number;
|
|
26
|
+
/** Já entrou parte do valor? Muda o texto — e evita cobrar o que já foi pago. */
|
|
27
|
+
hasPartialPayment: boolean;
|
|
28
|
+
originalAmount: number;
|
|
29
|
+
/**
|
|
30
|
+
* Como pagar, quando já existe cobrança emitida.
|
|
31
|
+
*
|
|
32
|
+
* Opcional porque a régua roda com ou sem provider conectado: um escritório
|
|
33
|
+
* sem conta de pagamento continua recebendo a comunicação completa, só sem o
|
|
34
|
+
* botão. O e-mail nunca promete um caminho de pagamento que não existe.
|
|
35
|
+
*/
|
|
36
|
+
payment?: PaymentBlock;
|
|
37
|
+
}
|
|
38
|
+
export interface RenderedCopy {
|
|
39
|
+
subject: string;
|
|
40
|
+
block: EmailBlock;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Anexa o pagamento a qualquer etapa da régua.
|
|
44
|
+
*
|
|
45
|
+
* Fica fora do `switch` de propósito: o bloco de pagamento é o mesmo em D-3, D0
|
|
46
|
+
* e D+3, e cada etapa tendo a própria cópia da regra é a forma garantida de uma
|
|
47
|
+
* delas ficar para trás — foi assim que a etapa de atraso ficaria sem botão.
|
|
48
|
+
*/
|
|
49
|
+
export declare function renderCopy(tone: StepTone, ctx: CopyContext): RenderedCopy;
|
|
50
|
+
//# sourceMappingURL=copy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/collection/copy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;CACnB;AAuBD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,GAAG,YAAY,CAIzE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { formatBRL, formatDateBR, formatOverdue, describeReference } from './format.js';
|
|
2
|
+
/** Frase que identifica a dívida sem inventar dado que não existe. */
|
|
3
|
+
function referenceSentence(ctx) {
|
|
4
|
+
const ref = describeReference({ competence: ctx.competence, description: ctx.description });
|
|
5
|
+
return ref ? `Referente a ${ref}.` : null;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Quando houve pagamento parcial, o texto precisa dizer isso.
|
|
9
|
+
*
|
|
10
|
+
* Mandar "o valor de X está em aberto" para quem já pagou metade soa como se o
|
|
11
|
+
* pagamento não tivesse sido registrado — e é a mensagem que mais gera ligação
|
|
12
|
+
* irritada para o escritório.
|
|
13
|
+
*/
|
|
14
|
+
function partialSentence(ctx) {
|
|
15
|
+
if (!ctx.hasPartialPayment)
|
|
16
|
+
return null;
|
|
17
|
+
return (`Registramos o pagamento parcial de ${formatBRL(ctx.originalAmount - ctx.outstandingAmount)}. ` +
|
|
18
|
+
`O saldo restante é de ${formatBRL(ctx.outstandingAmount)}.`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Anexa o pagamento a qualquer etapa da régua.
|
|
22
|
+
*
|
|
23
|
+
* Fica fora do `switch` de propósito: o bloco de pagamento é o mesmo em D-3, D0
|
|
24
|
+
* e D+3, e cada etapa tendo a própria cópia da regra é a forma garantida de uma
|
|
25
|
+
* delas ficar para trás — foi assim que a etapa de atraso ficaria sem botão.
|
|
26
|
+
*/
|
|
27
|
+
export function renderCopy(tone, ctx) {
|
|
28
|
+
const rendered = renderCopyBody(tone, ctx);
|
|
29
|
+
if (!ctx.payment)
|
|
30
|
+
return rendered;
|
|
31
|
+
return { ...rendered, block: { ...rendered.block, payment: ctx.payment } };
|
|
32
|
+
}
|
|
33
|
+
function renderCopyBody(tone, ctx) {
|
|
34
|
+
const office = ctx.branding.officeName;
|
|
35
|
+
const amount = formatBRL(ctx.outstandingAmount);
|
|
36
|
+
const due = formatDateBR(ctx.dueDate);
|
|
37
|
+
// Razão social brasileira termina em ponto com frequência ("Ltda.", "S.A.",
|
|
38
|
+
// "ME."). Somar o nosso produziria "Olá, Padaria Exemplo Ltda.." — pequeno,
|
|
39
|
+
// mas é a primeira linha que o cliente lê.
|
|
40
|
+
const greeting = `Olá, ${ctx.clientName}${/[.!?…]$/.test(ctx.clientName.trim()) ? '' : '.'}`;
|
|
41
|
+
const ref = referenceSentence(ctx);
|
|
42
|
+
const partial = partialSentence(ctx);
|
|
43
|
+
const highlight = {
|
|
44
|
+
label: ctx.hasPartialPayment ? 'Saldo em aberto' : 'Valor',
|
|
45
|
+
amount,
|
|
46
|
+
dueLabel: tone === 'reminder' ? 'Vencimento em' : 'Vencimento:',
|
|
47
|
+
dueValue: due,
|
|
48
|
+
};
|
|
49
|
+
switch (tone) {
|
|
50
|
+
case 'reminder':
|
|
51
|
+
return {
|
|
52
|
+
subject: `Lembrete de vencimento — ${office}`,
|
|
53
|
+
block: {
|
|
54
|
+
greeting,
|
|
55
|
+
paragraphs: [
|
|
56
|
+
`Passando para lembrar que você tem um valor a vencer em ${due}.`,
|
|
57
|
+
...(ref ? [ref] : []),
|
|
58
|
+
...(partial ? [partial] : []),
|
|
59
|
+
],
|
|
60
|
+
highlight,
|
|
61
|
+
closing: 'Se o pagamento já foi feito, é só desconsiderar.',
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
case 'due_notice':
|
|
65
|
+
return {
|
|
66
|
+
subject: `Seu honorário vence hoje — ${office}`,
|
|
67
|
+
block: {
|
|
68
|
+
greeting,
|
|
69
|
+
paragraphs: [
|
|
70
|
+
'O valor abaixo vence hoje.',
|
|
71
|
+
...(ref ? [ref] : []),
|
|
72
|
+
...(partial ? [partial] : []),
|
|
73
|
+
],
|
|
74
|
+
highlight: { ...highlight, dueLabel: 'Vence hoje,' },
|
|
75
|
+
closing: 'Se o pagamento já foi feito, é só desconsiderar.',
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
case 'friendly_collection':
|
|
79
|
+
return {
|
|
80
|
+
subject: `Pendência em aberto — ${office}`,
|
|
81
|
+
block: {
|
|
82
|
+
greeting,
|
|
83
|
+
paragraphs: [
|
|
84
|
+
`Identificamos um valor em aberto, com vencimento em ${due}${ctx.daysOverdue > 0 ? ` — ${formatOverdue(ctx.daysOverdue)}` : ''}.`,
|
|
85
|
+
...(ref ? [ref] : []),
|
|
86
|
+
...(partial ? [partial] : []),
|
|
87
|
+
'Se já tiver pago, avise-nos para darmos baixa. Se preferir, estamos à disposição para combinar a melhor forma.',
|
|
88
|
+
],
|
|
89
|
+
highlight,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
case 'overdue_collection':
|
|
93
|
+
return {
|
|
94
|
+
subject: `Regularização de pendência — ${office}`,
|
|
95
|
+
block: {
|
|
96
|
+
greeting,
|
|
97
|
+
paragraphs: [
|
|
98
|
+
`O valor abaixo segue em aberto desde ${due}${ctx.daysOverdue > 0 ? ` (${formatOverdue(ctx.daysOverdue)})` : ''}.`,
|
|
99
|
+
...(ref ? [ref] : []),
|
|
100
|
+
...(partial ? [partial] : []),
|
|
101
|
+
'Pedimos que entre em contato para regularizarmos. Se houver qualquer dificuldade, fale conosco — encontramos a melhor alternativa juntos.',
|
|
102
|
+
],
|
|
103
|
+
highlight,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
// Interno: nunca chega ao cliente. Ver a nota em `policy.ts`.
|
|
107
|
+
case 'human_escalation':
|
|
108
|
+
default:
|
|
109
|
+
return {
|
|
110
|
+
subject: `Cobrança para acompanhamento manual — ${ctx.clientName}`,
|
|
111
|
+
block: {
|
|
112
|
+
greeting: 'Aviso interno.',
|
|
113
|
+
paragraphs: [
|
|
114
|
+
`A régua automática chegou ao fim para ${ctx.clientName}, com ${amount} em aberto desde ${due}.`,
|
|
115
|
+
'A condução a partir daqui é humana.',
|
|
116
|
+
],
|
|
117
|
+
highlight,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/collection/copy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aplicação dos callbacks de entrega ao estado do produto.
|
|
3
|
+
*
|
|
4
|
+
* `communication/webhook.ts` traduz o vocabulário do provider e decide se o
|
|
5
|
+
* evento avança o estado; este arquivo é o que ESCREVE. A separação é a mesma de
|
|
6
|
+
* sempre: o motor não conhece `dunning_event`, e a régua não conhece a Meta.
|
|
7
|
+
*
|
|
8
|
+
* Três escritas, e a ordem entre elas importa menos que o fato de estarem na
|
|
9
|
+
* MESMA transação: um callback que atualiza a etapa e falha ao gravar a trilha
|
|
10
|
+
* deixaria a tela dizendo "entregue" sem nada que explique quando nem por qual
|
|
11
|
+
* caminho.
|
|
12
|
+
*/
|
|
13
|
+
import type { Tx } from '../db/client.js';
|
|
14
|
+
import { type DeliveryEvent, type DeliveryStatus, type InboundOptOut } from '../communication/index.js';
|
|
15
|
+
export type CallbackOutcome =
|
|
16
|
+
/** Estado avançado e gravado. */
|
|
17
|
+
'applied'
|
|
18
|
+
/** O provider mandou algo que este canal não reporta — dado inventado, recusado. */
|
|
19
|
+
| 'not_reported_by_channel'
|
|
20
|
+
/** Chegou fora de ordem, ou repetido: o estado já está igual ou adiante. */
|
|
21
|
+
| 'no_progress'
|
|
22
|
+
/** Nenhuma mensagem deste tenant tem esse identificador de provider. */
|
|
23
|
+
| 'unknown_message';
|
|
24
|
+
export interface CallbackResult {
|
|
25
|
+
outcome: CallbackOutcome;
|
|
26
|
+
receivableId: string | null;
|
|
27
|
+
status: DeliveryStatus | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Aplica um callback de entrega.
|
|
31
|
+
*
|
|
32
|
+
* A via de acesso é o `provider_ref` — é a ÚNICA coisa que o webhook traz. Sem
|
|
33
|
+
* a coluna indexada da 0038 isso exigiria varrer a tabela, e a régua de um
|
|
34
|
+
* escritório grande tornaria cada callback caro o bastante para o provider
|
|
35
|
+
* desistir de reentregar.
|
|
36
|
+
*/
|
|
37
|
+
export declare function applyDeliveryCallback(tx: Tx, tenantId: string, event: DeliveryEvent): Promise<CallbackResult>;
|
|
38
|
+
export type OptOutOutcome = 'registered' | 'unknown_recipient';
|
|
39
|
+
/**
|
|
40
|
+
* Registra o opt-out que o cliente pediu respondendo no canal.
|
|
41
|
+
*
|
|
42
|
+
* `customer_reply` é a origem mais forte que existe: `recordConsent` impede que
|
|
43
|
+
* um operador a reverta pela tela. Por isso a resolução do telefone para cliente
|
|
44
|
+
* é feita pelo `phone_e164` canônico e nunca pelo campo digitado — casar por
|
|
45
|
+
* texto livre acertaria o cliente errado quando dois cadastros diferem só na
|
|
46
|
+
* pontuação, e bloquearia o canal de quem não pediu nada.
|
|
47
|
+
*/
|
|
48
|
+
export declare function applyInboundOptOut(tx: Tx, tenantId: string, optOut: InboundOptOut): Promise<OptOutOutcome>;
|
|
49
|
+
//# sourceMappingURL=delivery-callback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-callback.d.ts","sourceRoot":"","sources":["../../src/collection/delivery-callback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,2BAA2B,CAAC;AAInC,MAAM,MAAM,eAAe;AACzB,iCAAiC;AAC/B,SAAS;AACX,oFAAoF;GAClF,yBAAyB;AAC3B,4EAA4E;GAC1E,aAAa;AACf,wEAAwE;GACtE,iBAAiB,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,eAAe,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;CAC/B;AAKD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,cAAc,CAAC,CAmEzB;AA0CD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,mBAAmB,CAAC;AAE/D;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,CAAC,CAsCxB"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aplicação dos callbacks de entrega ao estado do produto.
|
|
3
|
+
*
|
|
4
|
+
* `communication/webhook.ts` traduz o vocabulário do provider e decide se o
|
|
5
|
+
* evento avança o estado; este arquivo é o que ESCREVE. A separação é a mesma de
|
|
6
|
+
* sempre: o motor não conhece `dunning_event`, e a régua não conhece a Meta.
|
|
7
|
+
*
|
|
8
|
+
* Três escritas, e a ordem entre elas importa menos que o fato de estarem na
|
|
9
|
+
* MESMA transação: um callback que atualiza a etapa e falha ao gravar a trilha
|
|
10
|
+
* deixaria a tela dizendo "entregue" sem nada que explique quando nem por qual
|
|
11
|
+
* caminho.
|
|
12
|
+
*/
|
|
13
|
+
import { randomUUID } from 'node:crypto';
|
|
14
|
+
import { applyDeliveryEvent, } from '../communication/index.js';
|
|
15
|
+
import { recordConsent } from './consent-repository.js';
|
|
16
|
+
import { SC_PRODUCT } from './communication-bridge.js';
|
|
17
|
+
/** Estados de `dunning_event` que descrevem uma mensagem já entregue ao provider. */
|
|
18
|
+
const DELIVERABLE = ['sent', 'delivered', 'read', 'failed'];
|
|
19
|
+
/**
|
|
20
|
+
* Aplica um callback de entrega.
|
|
21
|
+
*
|
|
22
|
+
* A via de acesso é o `provider_ref` — é a ÚNICA coisa que o webhook traz. Sem
|
|
23
|
+
* a coluna indexada da 0038 isso exigiria varrer a tabela, e a régua de um
|
|
24
|
+
* escritório grande tornaria cada callback caro o bastante para o provider
|
|
25
|
+
* desistir de reentregar.
|
|
26
|
+
*/
|
|
27
|
+
export async function applyDeliveryCallback(tx, tenantId, event) {
|
|
28
|
+
const rows = await tx `
|
|
29
|
+
SELECT id, receivable_id, status, idempotency_key
|
|
30
|
+
FROM dunning_event
|
|
31
|
+
WHERE provider_ref = ${event.providerRef}
|
|
32
|
+
LIMIT 1
|
|
33
|
+
`;
|
|
34
|
+
const action = rows[0];
|
|
35
|
+
// Sem ação correspondente não há o que atualizar. NÃO é erro: o mesmo número
|
|
36
|
+
// pode ter mandado mensagem por outro sistema, e um 4xx aqui faria o provider
|
|
37
|
+
// reentregar para sempre um evento que nunca vai ser reconhecido.
|
|
38
|
+
if (!action) {
|
|
39
|
+
await recordCallbackEvent(tx, tenantId, event, null, null, 'unknown_message');
|
|
40
|
+
return { outcome: 'unknown_message', receivableId: null, status: null };
|
|
41
|
+
}
|
|
42
|
+
// `advanceStatus` opera sobre estados de ENTREGA. Uma ação `scheduled`,
|
|
43
|
+
// `canceled` ou `escalated` não descreve mensagem entregue, e forçá-la para
|
|
44
|
+
// `delivered` inventaria uma entrega que a régua não fez.
|
|
45
|
+
const current = (DELIVERABLE.includes(action.status) ? action.status : 'sent');
|
|
46
|
+
const decision = applyDeliveryEvent(current, event);
|
|
47
|
+
if (!decision.apply) {
|
|
48
|
+
await recordCallbackEvent(tx, tenantId, event, action.receivable_id, action.idempotency_key, decision.reason);
|
|
49
|
+
return { outcome: decision.reason, receivableId: action.receivable_id, status: null };
|
|
50
|
+
}
|
|
51
|
+
await tx `
|
|
52
|
+
UPDATE dunning_event
|
|
53
|
+
SET status = ${decision.status},
|
|
54
|
+
delivered_at = CASE
|
|
55
|
+
WHEN ${decision.status} IN ('delivered', 'read') THEN COALESCE(delivered_at, ${event.occurredAt}::timestamptz)
|
|
56
|
+
ELSE delivered_at END,
|
|
57
|
+
read_at = CASE
|
|
58
|
+
WHEN ${decision.status} = 'read' THEN COALESCE(read_at, ${event.occurredAt}::timestamptz)
|
|
59
|
+
ELSE read_at END,
|
|
60
|
+
last_error = CASE
|
|
61
|
+
WHEN ${decision.status} = 'failed' THEN ${(event.detail ?? event.code ?? 'falha reportada pelo provider').slice(0, 300)}
|
|
62
|
+
ELSE last_error END
|
|
63
|
+
WHERE id = ${action.id}
|
|
64
|
+
`;
|
|
65
|
+
await recordCallbackEvent(tx, tenantId, event, action.receivable_id, action.idempotency_key, null, decision.status);
|
|
66
|
+
return {
|
|
67
|
+
outcome: 'applied',
|
|
68
|
+
receivableId: action.receivable_id,
|
|
69
|
+
status: decision.status,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const CALLBACK_KIND = {
|
|
73
|
+
delivered: 'callback_delivered',
|
|
74
|
+
read: 'callback_read',
|
|
75
|
+
failed: 'callback_failed',
|
|
76
|
+
opted_out: 'opt_out',
|
|
77
|
+
};
|
|
78
|
+
async function recordCallbackEvent(tx, tenantId, event, subjectRef, idempotencyKey, refusal, applied) {
|
|
79
|
+
// Evento recusado também vira linha. É a diferença entre "o provider nunca
|
|
80
|
+
// avisou" e "avisou e nós descartamos" — e só a segunda tem explicação.
|
|
81
|
+
const kind = refusal ? 'dispatch_skipped' : (CALLBACK_KIND[event.status] ?? 'dispatch_skipped');
|
|
82
|
+
await tx `
|
|
83
|
+
INSERT INTO communication_event (
|
|
84
|
+
id, tenant_id, product, brand, kind, channel, event_type, subject_ref,
|
|
85
|
+
recipient_ref, idempotency_key, provider_ref, skip_reason, status, code,
|
|
86
|
+
detail, occurred_at
|
|
87
|
+
) VALUES (
|
|
88
|
+
${randomUUID()}, ${tenantId}, ${SC_PRODUCT},
|
|
89
|
+
-- A marca vem da RESERVA que produziu a mensagem. Quando não há reserva
|
|
90
|
+
-- correspondente, o evento fica sem marca — é o caso do callback sobre um
|
|
91
|
+
-- identificador que não é nosso, e inventar um valor aqui faria a trilha
|
|
92
|
+
-- atribuir a um escritório algo que ele não enviou.
|
|
93
|
+
(SELECT brand FROM communication_dispatch
|
|
94
|
+
WHERE provider_ref = ${event.providerRef} LIMIT 1),
|
|
95
|
+
${kind}, ${event.channel}, 'billing.dunning.callback', ${subjectRef},
|
|
96
|
+
NULL, ${idempotencyKey}, ${event.providerRef}, ${refusal},
|
|
97
|
+
${applied ?? event.status}, ${event.code ?? null},
|
|
98
|
+
${event.detail ? event.detail.slice(0, 300) : null}, ${event.occurredAt}::timestamptz
|
|
99
|
+
)
|
|
100
|
+
`;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Registra o opt-out que o cliente pediu respondendo no canal.
|
|
104
|
+
*
|
|
105
|
+
* `customer_reply` é a origem mais forte que existe: `recordConsent` impede que
|
|
106
|
+
* um operador a reverta pela tela. Por isso a resolução do telefone para cliente
|
|
107
|
+
* é feita pelo `phone_e164` canônico e nunca pelo campo digitado — casar por
|
|
108
|
+
* texto livre acertaria o cliente errado quando dois cadastros diferem só na
|
|
109
|
+
* pontuação, e bloquearia o canal de quem não pediu nada.
|
|
110
|
+
*/
|
|
111
|
+
export async function applyInboundOptOut(tx, tenantId, optOut) {
|
|
112
|
+
const e164 = optOut.from.startsWith('+') ? optOut.from : `+${optOut.from}`;
|
|
113
|
+
const rows = await tx `
|
|
114
|
+
SELECT id FROM client
|
|
115
|
+
WHERE phone_e164 = ${e164} AND deleted_at IS NULL
|
|
116
|
+
ORDER BY created_at
|
|
117
|
+
LIMIT 2
|
|
118
|
+
`;
|
|
119
|
+
// Dois clientes com o mesmo telefone é cadastro legítimo (marido e mulher,
|
|
120
|
+
// matriz e filial). Bloquear "o primeiro" seria escolher por sorte quem
|
|
121
|
+
// deixa de ser cobrado. Sem resolução única, nada é registrado — e o evento
|
|
122
|
+
// fica na trilha para um humano decidir.
|
|
123
|
+
if (rows.length !== 1)
|
|
124
|
+
return 'unknown_recipient';
|
|
125
|
+
await recordConsent(tx, {
|
|
126
|
+
tenantId,
|
|
127
|
+
clientId: rows[0].id,
|
|
128
|
+
channel: optOut.channel,
|
|
129
|
+
state: 'denied',
|
|
130
|
+
source: 'customer_reply',
|
|
131
|
+
note: 'opt-out recebido no canal',
|
|
132
|
+
});
|
|
133
|
+
await tx `
|
|
134
|
+
INSERT INTO communication_event (
|
|
135
|
+
id, tenant_id, product, brand, kind, channel, event_type, recipient_ref,
|
|
136
|
+
code, occurred_at
|
|
137
|
+
) VALUES (
|
|
138
|
+
-- Opt-out é do CLIENTE, e vale para todas as marcas do escritório: o
|
|
139
|
+
-- pedido de silêncio não é por linha de produto. Sem marca, portanto.
|
|
140
|
+
${randomUUID()}, ${tenantId}, ${SC_PRODUCT}, NULL, 'opt_out',
|
|
141
|
+
${optOut.channel}, 'communication.opt_out', ${rows[0].id},
|
|
142
|
+
'customer_reply', ${optOut.occurredAt}::timestamptz
|
|
143
|
+
)
|
|
144
|
+
`;
|
|
145
|
+
return 'registered';
|
|
146
|
+
}
|
|
147
|
+
//# 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,45 @@
|
|
|
1
|
+
import type { TenantBranding } from './branding.js';
|
|
2
|
+
import type { PaymentBlock } from './payment-block.js';
|
|
3
|
+
/**
|
|
4
|
+
* Shell transacional do e-mail de cobrança.
|
|
5
|
+
*
|
|
6
|
+
* Escrito com tabelas e estilo inline de propósito: Gmail remove `<style>` em
|
|
7
|
+
* boa parte dos contextos e o Outlook desktop renderiza com o motor do Word, que
|
|
8
|
+
* ignora flexbox, grid e boa parte de CSS moderno. O layout que "fica bonito no
|
|
9
|
+
* navegador" é justamente o que quebra na caixa de entrada.
|
|
10
|
+
*
|
|
11
|
+
* A única imagem é a logomarca, e o cabeçalho é construído para sobreviver ao
|
|
12
|
+
* bloqueio de imagens — padrão em muitos leitores. Nenhuma informação mora só
|
|
13
|
+
* dentro do arquivo: com as imagens desligadas, o nome do escritório continua
|
|
14
|
+
* escrito no cabeçalho.
|
|
15
|
+
*
|
|
16
|
+
* Cores e tipografia vêm do tenant (`TenantBranding`), não de constantes daqui.
|
|
17
|
+
* Nenhum escritório está no código.
|
|
18
|
+
*/
|
|
19
|
+
export interface EmailBlock {
|
|
20
|
+
greeting: string;
|
|
21
|
+
/** Parágrafos do corpo, na ordem. */
|
|
22
|
+
paragraphs: string[];
|
|
23
|
+
/** Destaque do valor/vencimento. Omitido quando não há dívida a exibir. */
|
|
24
|
+
highlight?: {
|
|
25
|
+
label: string;
|
|
26
|
+
amount: string;
|
|
27
|
+
dueLabel: string;
|
|
28
|
+
dueValue: string;
|
|
29
|
+
};
|
|
30
|
+
closing?: string;
|
|
31
|
+
/** Como pagar. Ausente quando o recebível ainda não tem cobrança emitida. */
|
|
32
|
+
payment?: PaymentBlock;
|
|
33
|
+
}
|
|
34
|
+
export declare function escapeHtml(s: string): string;
|
|
35
|
+
export declare function renderCollectionEmail(b: TenantBranding, block: EmailBlock): string;
|
|
36
|
+
/**
|
|
37
|
+
* Versão texto puro.
|
|
38
|
+
*
|
|
39
|
+
* Não é decoração: parte dos leitores prefere `text/plain`, filtros de spam
|
|
40
|
+
* penalizam mensagem só-HTML, e leitores de tela lidam melhor com o texto. O
|
|
41
|
+
* conteúdo tem de ser o MESMO — um plain text resumido faria dois clientes
|
|
42
|
+
* receberem informações diferentes.
|
|
43
|
+
*/
|
|
44
|
+
export declare function renderCollectionText(b: TenantBranding, block: EmailBlock): string;
|
|
45
|
+
//# sourceMappingURL=email-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-layout.d.ts","sourceRoot":"","sources":["../../src/collection/email-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAgCD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAO5C;AAsID,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAqElF;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAmCjF"}
|