@baruk/core 0.3.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.baruk-provenance.json +10 -0
- package/CHANGELOG.md +97 -0
- package/README.md +9 -2
- package/dist/auth/password-reset.d.ts +30 -1
- package/dist/auth/password-reset.d.ts.map +1 -1
- package/dist/auth/password-reset.js +139 -11
- package/dist/auth/password-reset.js.map +1 -1
- package/dist/auth/service.d.ts +39 -2
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +75 -10
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +334 -0
- package/dist/billing/ar-repository.d.ts.map +1 -0
- package/dist/billing/ar-repository.js +707 -0
- package/dist/billing/ar-repository.js.map +1 -0
- package/dist/billing/auto-generation.d.ts +87 -0
- package/dist/billing/auto-generation.d.ts.map +1 -0
- package/dist/billing/auto-generation.js +181 -0
- package/dist/billing/auto-generation.js.map +1 -0
- package/dist/billing/live-guard.d.ts +64 -0
- package/dist/billing/live-guard.d.ts.map +1 -0
- package/dist/billing/live-guard.js +68 -0
- package/dist/billing/live-guard.js.map +1 -0
- package/dist/billing/payment-means-catalog.d.ts +17 -0
- package/dist/billing/payment-means-catalog.d.ts.map +1 -0
- package/dist/billing/payment-means-catalog.js +21 -0
- package/dist/billing/payment-means-catalog.js.map +1 -0
- package/dist/billing/payment-means.d.ts +38 -0
- package/dist/billing/payment-means.d.ts.map +1 -0
- package/dist/billing/payment-means.js +29 -0
- package/dist/billing/payment-means.js.map +1 -0
- package/dist/billing/payment-rail.d.ts +118 -0
- package/dist/billing/payment-rail.d.ts.map +1 -0
- package/dist/billing/payment-rail.js +295 -0
- package/dist/billing/payment-rail.js.map +1 -0
- package/dist/billing/provider/asaas.d.ts +46 -1
- package/dist/billing/provider/asaas.d.ts.map +1 -1
- package/dist/billing/provider/asaas.js +194 -14
- package/dist/billing/provider/asaas.js.map +1 -1
- package/dist/billing/provider/manual.js +1 -1
- package/dist/billing/provider/manual.js.map +1 -1
- package/dist/billing/provider/types.d.ts +115 -8
- package/dist/billing/provider/types.d.ts.map +1 -1
- package/dist/billing/provider-account.d.ts +89 -0
- package/dist/billing/provider-account.d.ts.map +1 -0
- package/dist/billing/provider-account.js +161 -0
- package/dist/billing/provider-account.js.map +1 -0
- package/dist/billing/provider-onboarding.d.ts +67 -0
- package/dist/billing/provider-onboarding.d.ts.map +1 -0
- package/dist/billing/provider-onboarding.js +234 -0
- package/dist/billing/provider-onboarding.js.map +1 -0
- package/dist/billing/receivable.d.ts +5 -1
- package/dist/billing/receivable.d.ts.map +1 -1
- package/dist/billing/reconcile.d.ts +58 -0
- package/dist/billing/reconcile.d.ts.map +1 -0
- package/dist/billing/reconcile.js +138 -0
- package/dist/billing/reconcile.js.map +1 -0
- package/dist/billing/repository.d.ts +90 -1
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +148 -19
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/auth/password-reset.js +141 -11
- package/dist/cjs/auth/password-reset.js.map +1 -1
- package/dist/cjs/auth/service.js +75 -9
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +728 -0
- package/dist/cjs/billing/ar-repository.js.map +1 -0
- package/dist/cjs/billing/auto-generation.js +186 -0
- package/dist/cjs/billing/auto-generation.js.map +1 -0
- package/dist/cjs/billing/live-guard.js +72 -0
- package/dist/cjs/billing/live-guard.js.map +1 -0
- package/dist/cjs/billing/payment-means-catalog.js +25 -0
- package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
- package/dist/cjs/billing/payment-means.js +33 -0
- package/dist/cjs/billing/payment-means.js.map +1 -0
- package/dist/cjs/billing/payment-rail.js +301 -0
- package/dist/cjs/billing/payment-rail.js.map +1 -0
- package/dist/cjs/billing/provider/asaas.js +194 -14
- package/dist/cjs/billing/provider/asaas.js.map +1 -1
- package/dist/cjs/billing/provider/manual.js +1 -1
- package/dist/cjs/billing/provider/manual.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +170 -0
- package/dist/cjs/billing/provider-account.js.map +1 -0
- package/dist/cjs/billing/provider-onboarding.js +239 -0
- package/dist/cjs/billing/provider-onboarding.js.map +1 -0
- package/dist/cjs/billing/reconcile.js +143 -0
- package/dist/cjs/billing/reconcile.js.map +1 -0
- package/dist/cjs/billing/repository.js +150 -18
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/repository.js +96 -20
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +140 -0
- package/dist/cjs/collection/branding.js.map +1 -0
- package/dist/cjs/collection/channel-accounts.js +137 -0
- package/dist/cjs/collection/channel-accounts.js.map +1 -0
- package/dist/cjs/collection/channel.js +17 -0
- package/dist/cjs/collection/channel.js.map +1 -0
- package/dist/cjs/collection/communication-bridge.js +140 -0
- package/dist/cjs/collection/communication-bridge.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +193 -0
- package/dist/cjs/collection/communication-runtime.js.map +1 -0
- package/dist/cjs/collection/consent-repository.js +84 -0
- package/dist/cjs/collection/consent-repository.js.map +1 -0
- package/dist/cjs/collection/copy.js +125 -0
- package/dist/cjs/collection/copy.js.map +1 -0
- package/dist/cjs/collection/delivery-callback.js +151 -0
- package/dist/cjs/collection/delivery-callback.js.map +1 -0
- package/dist/cjs/collection/email-layout.js +252 -0
- package/dist/cjs/collection/email-layout.js.map +1 -0
- package/dist/cjs/collection/engine.js +414 -0
- package/dist/cjs/collection/engine.js.map +1 -0
- package/dist/cjs/collection/format.js +76 -0
- package/dist/cjs/collection/format.js.map +1 -0
- package/dist/cjs/collection/payment-block.js +3 -0
- package/dist/cjs/collection/payment-block.js.map +1 -0
- package/dist/cjs/collection/policy.js +147 -0
- package/dist/cjs/collection/policy.js.map +1 -0
- package/dist/cjs/collection/repository.js +260 -0
- package/dist/cjs/collection/repository.js.map +1 -0
- package/dist/cjs/collection/subject.js +104 -0
- package/dist/cjs/collection/subject.js.map +1 -0
- package/dist/cjs/collection/template-catalog.js +165 -0
- package/dist/cjs/collection/template-catalog.js.map +1 -0
- package/dist/cjs/collection/template.js +78 -0
- package/dist/cjs/collection/template.js.map +1 -0
- package/dist/cjs/communication/adapters/email.js +132 -0
- package/dist/cjs/communication/adapters/email.js.map +1 -0
- package/dist/cjs/communication/adapters/sms.js +127 -0
- package/dist/cjs/communication/adapters/sms.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp.js +213 -0
- package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
- package/dist/cjs/communication/audit.js +61 -0
- package/dist/cjs/communication/audit.js.map +1 -0
- package/dist/cjs/communication/capabilities.js +76 -0
- package/dist/cjs/communication/capabilities.js.map +1 -0
- package/dist/cjs/communication/channel.js +53 -0
- package/dist/cjs/communication/channel.js.map +1 -0
- package/dist/cjs/communication/claim.js +228 -0
- package/dist/cjs/communication/claim.js.map +1 -0
- package/dist/cjs/communication/consent.js +43 -0
- package/dist/cjs/communication/consent.js.map +1 -0
- package/dist/cjs/communication/context.js +45 -0
- package/dist/cjs/communication/context.js.map +1 -0
- package/dist/cjs/communication/credentials.js +121 -0
- package/dist/cjs/communication/credentials.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +161 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
- package/dist/cjs/communication/dry-run.js +97 -0
- package/dist/cjs/communication/dry-run.js.map +1 -0
- package/dist/cjs/communication/engine.js +483 -0
- package/dist/cjs/communication/engine.js.map +1 -0
- package/dist/cjs/communication/graph.js +50 -0
- package/dist/cjs/communication/graph.js.map +1 -0
- package/dist/cjs/communication/idempotency.js +26 -0
- package/dist/cjs/communication/idempotency.js.map +1 -0
- package/dist/cjs/communication/identity.js +110 -0
- package/dist/cjs/communication/identity.js.map +1 -0
- package/dist/cjs/communication/index.js +135 -0
- package/dist/cjs/communication/index.js.map +1 -0
- package/dist/cjs/communication/onboarding.js +297 -0
- package/dist/cjs/communication/onboarding.js.map +1 -0
- package/dist/cjs/communication/policy.js +16 -0
- package/dist/cjs/communication/policy.js.map +1 -0
- package/dist/cjs/communication/routing.js +77 -0
- package/dist/cjs/communication/routing.js.map +1 -0
- package/dist/cjs/communication/sender-profile.js +128 -0
- package/dist/cjs/communication/sender-profile.js.map +1 -0
- package/dist/cjs/communication/status.js +86 -0
- package/dist/cjs/communication/status.js.map +1 -0
- package/dist/cjs/communication/stores/onboarding.js +135 -0
- package/dist/cjs/communication/stores/onboarding.js.map +1 -0
- package/dist/cjs/communication/stores/postgres.js +458 -0
- package/dist/cjs/communication/stores/postgres.js.map +1 -0
- package/dist/cjs/communication/stores/routing.js +334 -0
- package/dist/cjs/communication/stores/routing.js.map +1 -0
- package/dist/cjs/communication/stores/secrets.js +126 -0
- package/dist/cjs/communication/stores/secrets.js.map +1 -0
- package/dist/cjs/communication/template-provider.js +22 -0
- package/dist/cjs/communication/template-provider.js.map +1 -0
- package/dist/cjs/communication/template.js +63 -0
- package/dist/cjs/communication/template.js.map +1 -0
- package/dist/cjs/communication/webhook-subscription.js +258 -0
- package/dist/cjs/communication/webhook-subscription.js.map +1 -0
- package/dist/cjs/communication/webhook.js +292 -0
- package/dist/cjs/communication/webhook.js.map +1 -0
- package/dist/cjs/competence/repository.js +309 -0
- package/dist/cjs/competence/repository.js.map +1 -0
- package/dist/cjs/contacts/phone.js +192 -0
- package/dist/cjs/contacts/phone.js.map +1 -0
- package/dist/cjs/db/seed-catalog.js +48 -0
- package/dist/cjs/db/seed-catalog.js.map +1 -0
- package/dist/cjs/db/seed.js +15 -7
- package/dist/cjs/db/seed.js.map +1 -1
- package/dist/cjs/documents/repository.js +244 -0
- package/dist/cjs/documents/repository.js.map +1 -0
- package/dist/cjs/documents/requests.js +136 -0
- package/dist/cjs/documents/requests.js.map +1 -0
- package/dist/cjs/index.js +427 -48
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/company.js +36 -0
- package/dist/cjs/legal/company.js.map +1 -0
- package/dist/cjs/legal/documents.js +671 -0
- package/dist/cjs/legal/documents.js.map +1 -0
- package/dist/cjs/legal/index.js +15 -0
- package/dist/cjs/legal/index.js.map +1 -0
- package/dist/cjs/legal/types.js +34 -0
- package/dist/cjs/legal/types.js.map +1 -0
- package/dist/cjs/mail/auth-templates.js +29 -0
- package/dist/cjs/mail/auth-templates.js.map +1 -0
- package/dist/cjs/mail/dedup-store.js +12 -51
- package/dist/cjs/mail/dedup-store.js.map +1 -1
- package/dist/cjs/mail/index.js +16 -4
- package/dist/cjs/mail/index.js.map +1 -1
- package/dist/cjs/mail/provider.js +12 -247
- package/dist/cjs/mail/provider.js.map +1 -1
- package/dist/cjs/mail/resend.js +14 -18
- package/dist/cjs/mail/resend.js.map +1 -1
- package/dist/cjs/mail/sender-resolver.js +12 -11
- package/dist/cjs/mail/sender-resolver.js.map +1 -1
- package/dist/cjs/mail/template-renderer.js +11 -16
- package/dist/cjs/mail/template-renderer.js.map +1 -1
- package/dist/cjs/mail/transactional-outbound.js +117 -0
- package/dist/cjs/mail/transactional-outbound.js.map +1 -0
- package/dist/cjs/mail/types.js +8 -35
- package/dist/cjs/mail/types.js.map +1 -1
- package/dist/cjs/portal/provisioning.js +144 -0
- package/dist/cjs/portal/provisioning.js.map +1 -0
- package/dist/cjs/pricing-engine/canonical.js +42 -0
- package/dist/cjs/pricing-engine/canonical.js.map +1 -0
- package/dist/cjs/pricing-engine/errors.js +6 -1
- package/dist/cjs/pricing-engine/errors.js.map +1 -1
- package/dist/cjs/pricing-engine/index.js +12 -1
- package/dist/cjs/pricing-engine/index.js.map +1 -1
- package/dist/cjs/pricing-engine/pipeline.js +200 -26
- package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
- package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
- package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
- package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
- package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/cjs/rbac/authorize.js +28 -0
- package/dist/cjs/rbac/authorize.js.map +1 -1
- package/dist/cjs/rbac/catalog.js +67 -1
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/rbac/workload-provisioning.js +160 -0
- package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
- package/dist/cjs/rbac/workload.js +191 -0
- package/dist/cjs/rbac/workload.js.map +1 -0
- package/dist/cjs/storage/checksum.js +15 -0
- package/dist/cjs/storage/checksum.js.map +1 -0
- package/dist/cjs/storage/key.js +72 -0
- package/dist/cjs/storage/key.js.map +1 -0
- package/dist/cjs/storage/local.js +100 -0
- package/dist/cjs/storage/local.js.map +1 -0
- package/dist/cjs/storage/r2.js +181 -0
- package/dist/cjs/storage/r2.js.map +1 -0
- package/dist/cjs/storage/registry.js +41 -0
- package/dist/cjs/storage/registry.js.map +1 -0
- package/dist/cjs/storage/types.js +50 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
- package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
- package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/registry.js +17 -0
- package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
- package/dist/cjs/subscription-billing/service.js +57 -8
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/subscription-billing/types.js.map +1 -1
- package/dist/cjs/tenancy/provisioning.js +32 -8
- package/dist/cjs/tenancy/provisioning.js.map +1 -1
- package/dist/cjs/users/repository.js +119 -2
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +81 -0
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/repository.d.ts +42 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +94 -21
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +72 -0
- package/dist/collection/branding.d.ts.map +1 -0
- package/dist/collection/branding.js +136 -0
- package/dist/collection/branding.js.map +1 -0
- package/dist/collection/channel-accounts.d.ts +57 -0
- package/dist/collection/channel-accounts.d.ts.map +1 -0
- package/dist/collection/channel-accounts.js +133 -0
- package/dist/collection/channel-accounts.js.map +1 -0
- package/dist/collection/channel.d.ts +24 -0
- package/dist/collection/channel.d.ts.map +1 -0
- package/dist/collection/channel.js +16 -0
- package/dist/collection/channel.js.map +1 -0
- package/dist/collection/communication-bridge.d.ts +66 -0
- package/dist/collection/communication-bridge.d.ts.map +1 -0
- package/dist/collection/communication-bridge.js +134 -0
- package/dist/collection/communication-bridge.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +95 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -0
- package/dist/collection/communication-runtime.js +187 -0
- package/dist/collection/communication-runtime.js.map +1 -0
- package/dist/collection/consent-repository.d.ts +32 -0
- package/dist/collection/consent-repository.d.ts.map +1 -0
- package/dist/collection/consent-repository.js +79 -0
- package/dist/collection/consent-repository.js.map +1 -0
- package/dist/collection/copy.d.ts +50 -0
- package/dist/collection/copy.d.ts.map +1 -0
- package/dist/collection/copy.js +122 -0
- package/dist/collection/copy.js.map +1 -0
- package/dist/collection/delivery-callback.d.ts +49 -0
- package/dist/collection/delivery-callback.d.ts.map +1 -0
- package/dist/collection/delivery-callback.js +147 -0
- package/dist/collection/delivery-callback.js.map +1 -0
- package/dist/collection/email-layout.d.ts +45 -0
- package/dist/collection/email-layout.d.ts.map +1 -0
- package/dist/collection/email-layout.js +247 -0
- package/dist/collection/email-layout.js.map +1 -0
- package/dist/collection/engine.d.ts +177 -0
- package/dist/collection/engine.d.ts.map +1 -0
- package/dist/collection/engine.js +407 -0
- package/dist/collection/engine.js.map +1 -0
- package/dist/collection/format.d.ts +32 -0
- package/dist/collection/format.d.ts.map +1 -0
- package/dist/collection/format.js +70 -0
- package/dist/collection/format.js.map +1 -0
- package/dist/collection/payment-block.d.ts +24 -0
- package/dist/collection/payment-block.d.ts.map +1 -0
- package/dist/collection/payment-block.js +2 -0
- package/dist/collection/payment-block.js.map +1 -0
- package/dist/collection/policy.d.ts +53 -0
- package/dist/collection/policy.d.ts.map +1 -0
- package/dist/collection/policy.js +141 -0
- package/dist/collection/policy.js.map +1 -0
- package/dist/collection/repository.d.ts +129 -0
- package/dist/collection/repository.d.ts.map +1 -0
- package/dist/collection/repository.js +246 -0
- package/dist/collection/repository.js.map +1 -0
- package/dist/collection/subject.d.ts +66 -0
- package/dist/collection/subject.d.ts.map +1 -0
- package/dist/collection/subject.js +99 -0
- package/dist/collection/subject.js.map +1 -0
- package/dist/collection/template-catalog.d.ts +16 -0
- package/dist/collection/template-catalog.d.ts.map +1 -0
- package/dist/collection/template-catalog.js +162 -0
- package/dist/collection/template-catalog.js.map +1 -0
- package/dist/collection/template.d.ts +37 -0
- package/dist/collection/template.d.ts.map +1 -0
- package/dist/collection/template.js +73 -0
- package/dist/collection/template.js.map +1 -0
- package/dist/communication/adapters/email.d.ts +28 -0
- package/dist/communication/adapters/email.d.ts.map +1 -0
- package/dist/communication/adapters/email.js +129 -0
- package/dist/communication/adapters/email.js.map +1 -0
- package/dist/communication/adapters/sms.d.ts +95 -0
- package/dist/communication/adapters/sms.d.ts.map +1 -0
- package/dist/communication/adapters/sms.js +121 -0
- package/dist/communication/adapters/sms.js.map +1 -0
- package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
- package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-language.js +36 -0
- package/dist/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.js +97 -0
- package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/communication/adapters/whatsapp.d.ts +29 -0
- package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp.js +210 -0
- package/dist/communication/adapters/whatsapp.js.map +1 -0
- package/dist/communication/audit.d.ts +105 -0
- package/dist/communication/audit.d.ts.map +1 -0
- package/dist/communication/audit.js +56 -0
- package/dist/communication/audit.js.map +1 -0
- package/dist/communication/capabilities.d.ts +88 -0
- package/dist/communication/capabilities.d.ts.map +1 -0
- package/dist/communication/capabilities.js +72 -0
- package/dist/communication/capabilities.js.map +1 -0
- package/dist/communication/channel.d.ts +125 -0
- package/dist/communication/channel.d.ts.map +1 -0
- package/dist/communication/channel.js +47 -0
- package/dist/communication/channel.js.map +1 -0
- package/dist/communication/claim.d.ts +368 -0
- package/dist/communication/claim.d.ts.map +1 -0
- package/dist/communication/claim.js +224 -0
- package/dist/communication/claim.js.map +1 -0
- package/dist/communication/consent.d.ts +65 -0
- package/dist/communication/consent.d.ts.map +1 -0
- package/dist/communication/consent.js +40 -0
- package/dist/communication/consent.js.map +1 -0
- package/dist/communication/context.d.ts +48 -0
- package/dist/communication/context.d.ts.map +1 -0
- package/dist/communication/context.js +41 -0
- package/dist/communication/context.js.map +1 -0
- package/dist/communication/credentials.d.ts +74 -0
- package/dist/communication/credentials.d.ts.map +1 -0
- package/dist/communication/credentials.js +115 -0
- package/dist/communication/credentials.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts +37 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -0
- package/dist/communication/dry-run-scenario.js +158 -0
- package/dist/communication/dry-run-scenario.js.map +1 -0
- package/dist/communication/dry-run.d.ts +40 -0
- package/dist/communication/dry-run.d.ts.map +1 -0
- package/dist/communication/dry-run.js +92 -0
- package/dist/communication/dry-run.js.map +1 -0
- package/dist/communication/engine.d.ts +153 -0
- package/dist/communication/engine.d.ts.map +1 -0
- package/dist/communication/engine.js +480 -0
- package/dist/communication/engine.js.map +1 -0
- package/dist/communication/graph.d.ts +38 -0
- package/dist/communication/graph.d.ts.map +1 -0
- package/dist/communication/graph.js +45 -0
- package/dist/communication/graph.js.map +1 -0
- package/dist/communication/idempotency.d.ts +33 -0
- package/dist/communication/idempotency.d.ts.map +1 -0
- package/dist/communication/idempotency.js +23 -0
- package/dist/communication/idempotency.js.map +1 -0
- package/dist/communication/identity.d.ts +127 -0
- package/dist/communication/identity.d.ts.map +1 -0
- package/dist/communication/identity.js +105 -0
- package/dist/communication/identity.js.map +1 -0
- package/dist/communication/index.d.ts +66 -0
- package/dist/communication/index.d.ts.map +1 -0
- package/dist/communication/index.js +42 -0
- package/dist/communication/index.js.map +1 -0
- package/dist/communication/onboarding.d.ts +223 -0
- package/dist/communication/onboarding.d.ts.map +1 -0
- package/dist/communication/onboarding.js +287 -0
- package/dist/communication/onboarding.js.map +1 -0
- package/dist/communication/policy.d.ts +99 -0
- package/dist/communication/policy.d.ts.map +1 -0
- package/dist/communication/policy.js +13 -0
- package/dist/communication/policy.js.map +1 -0
- package/dist/communication/routing.d.ts +99 -0
- package/dist/communication/routing.d.ts.map +1 -0
- package/dist/communication/routing.js +73 -0
- package/dist/communication/routing.js.map +1 -0
- package/dist/communication/sender-profile.d.ts +100 -0
- package/dist/communication/sender-profile.d.ts.map +1 -0
- package/dist/communication/sender-profile.js +123 -0
- package/dist/communication/sender-profile.js.map +1 -0
- package/dist/communication/status.d.ts +48 -0
- package/dist/communication/status.d.ts.map +1 -0
- package/dist/communication/status.js +79 -0
- package/dist/communication/status.js.map +1 -0
- package/dist/communication/stores/onboarding.d.ts +88 -0
- package/dist/communication/stores/onboarding.d.ts.map +1 -0
- package/dist/communication/stores/onboarding.js +127 -0
- package/dist/communication/stores/onboarding.js.map +1 -0
- package/dist/communication/stores/postgres.d.ts +81 -0
- package/dist/communication/stores/postgres.d.ts.map +1 -0
- package/dist/communication/stores/postgres.js +453 -0
- package/dist/communication/stores/postgres.js.map +1 -0
- package/dist/communication/stores/routing.d.ts +169 -0
- package/dist/communication/stores/routing.d.ts.map +1 -0
- package/dist/communication/stores/routing.js +324 -0
- package/dist/communication/stores/routing.js.map +1 -0
- package/dist/communication/stores/secrets.d.ts +89 -0
- package/dist/communication/stores/secrets.d.ts.map +1 -0
- package/dist/communication/stores/secrets.js +122 -0
- package/dist/communication/stores/secrets.js.map +1 -0
- package/dist/communication/template-provider.d.ts +85 -0
- package/dist/communication/template-provider.d.ts.map +1 -0
- package/dist/communication/template-provider.js +21 -0
- package/dist/communication/template-provider.js.map +1 -0
- package/dist/communication/template.d.ts +87 -0
- package/dist/communication/template.d.ts.map +1 -0
- package/dist/communication/template.js +59 -0
- package/dist/communication/template.js.map +1 -0
- package/dist/communication/webhook-subscription.d.ts +156 -0
- package/dist/communication/webhook-subscription.d.ts.map +1 -0
- package/dist/communication/webhook-subscription.js +252 -0
- package/dist/communication/webhook-subscription.js.map +1 -0
- package/dist/communication/webhook.d.ts +121 -0
- package/dist/communication/webhook.d.ts.map +1 -0
- package/dist/communication/webhook.js +283 -0
- package/dist/communication/webhook.js.map +1 -0
- package/dist/competence/repository.d.ts +147 -0
- package/dist/competence/repository.d.ts.map +1 -0
- package/dist/competence/repository.js +294 -0
- package/dist/competence/repository.js.map +1 -0
- package/dist/contacts/phone.d.ts +70 -0
- package/dist/contacts/phone.d.ts.map +1 -0
- package/dist/contacts/phone.js +186 -0
- package/dist/contacts/phone.js.map +1 -0
- package/dist/db/migrate.js +17 -11
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/seed-catalog.d.ts +18 -0
- package/dist/db/seed-catalog.d.ts.map +1 -0
- package/dist/db/seed-catalog.js +45 -0
- package/dist/db/seed-catalog.js.map +1 -0
- package/dist/db/seed.js +16 -8
- package/dist/db/seed.js.map +1 -1
- package/dist/documents/repository.d.ts +97 -0
- package/dist/documents/repository.d.ts.map +1 -0
- package/dist/documents/repository.js +236 -0
- package/dist/documents/repository.js.map +1 -0
- package/dist/documents/requests.d.ts +73 -0
- package/dist/documents/requests.d.ts.map +1 -0
- package/dist/documents/requests.js +127 -0
- package/dist/documents/requests.js.map +1 -0
- package/dist/index.d.ts +113 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +104 -8
- package/dist/index.js.map +1 -1
- package/dist/legal/company.d.ts +32 -0
- package/dist/legal/company.d.ts.map +1 -0
- package/dist/legal/company.js +33 -0
- package/dist/legal/company.js.map +1 -0
- package/dist/legal/documents.d.ts +30 -0
- package/dist/legal/documents.d.ts.map +1 -0
- package/dist/legal/documents.js +666 -0
- package/dist/legal/documents.js.map +1 -0
- package/dist/legal/index.d.ts +5 -0
- package/dist/legal/index.d.ts.map +1 -0
- package/dist/legal/index.js +4 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/legal/types.d.ts +145 -0
- package/dist/legal/types.d.ts.map +1 -0
- package/dist/legal/types.js +31 -0
- package/dist/legal/types.js.map +1 -0
- package/dist/mail/auth-templates.d.ts +15 -0
- package/dist/mail/auth-templates.d.ts.map +1 -0
- package/dist/mail/auth-templates.js +26 -0
- package/dist/mail/auth-templates.js.map +1 -0
- package/dist/mail/dedup-store.d.ts +1 -24
- package/dist/mail/dedup-store.d.ts.map +1 -1
- package/dist/mail/dedup-store.js +9 -48
- package/dist/mail/dedup-store.js.map +1 -1
- package/dist/mail/index.d.ts +2 -1
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +13 -2
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/provider.d.ts +2 -30
- package/dist/mail/provider.d.ts.map +1 -1
- package/dist/mail/provider.js +10 -246
- package/dist/mail/provider.js.map +1 -1
- package/dist/mail/resend.d.ts +2 -12
- package/dist/mail/resend.d.ts.map +1 -1
- package/dist/mail/resend.js +11 -17
- package/dist/mail/resend.js.map +1 -1
- package/dist/mail/sender-resolver.d.ts +1 -7
- package/dist/mail/sender-resolver.d.ts.map +1 -1
- package/dist/mail/sender-resolver.js +11 -10
- package/dist/mail/sender-resolver.js.map +1 -1
- package/dist/mail/template-renderer.d.ts +1 -9
- package/dist/mail/template-renderer.d.ts.map +1 -1
- package/dist/mail/template-renderer.js +10 -15
- package/dist/mail/template-renderer.js.map +1 -1
- package/dist/mail/transactional-outbound.d.ts +115 -0
- package/dist/mail/transactional-outbound.d.ts.map +1 -0
- package/dist/mail/transactional-outbound.js +113 -0
- package/dist/mail/transactional-outbound.js.map +1 -0
- package/dist/mail/types.d.ts +2 -142
- package/dist/mail/types.d.ts.map +1 -1
- package/dist/mail/types.js +1 -33
- package/dist/mail/types.js.map +1 -1
- package/dist/portal/provisioning.d.ts +58 -0
- package/dist/portal/provisioning.d.ts.map +1 -0
- package/dist/portal/provisioning.js +139 -0
- package/dist/portal/provisioning.js.map +1 -0
- package/dist/pricing-engine/canonical.d.ts +14 -0
- package/dist/pricing-engine/canonical.d.ts.map +1 -0
- package/dist/pricing-engine/canonical.js +39 -0
- package/dist/pricing-engine/canonical.js.map +1 -0
- package/dist/pricing-engine/errors.d.ts.map +1 -1
- package/dist/pricing-engine/errors.js +6 -1
- package/dist/pricing-engine/errors.js.map +1 -1
- package/dist/pricing-engine/index.d.ts +12 -2
- package/dist/pricing-engine/index.d.ts.map +1 -1
- package/dist/pricing-engine/index.js +6 -1
- package/dist/pricing-engine/index.js.map +1 -1
- package/dist/pricing-engine/pipeline.d.ts.map +1 -1
- package/dist/pricing-engine/pipeline.js +202 -28
- package/dist/pricing-engine/pipeline.js.map +1 -1
- package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
- package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-adapter.js +75 -0
- package/dist/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/pricing-engine/shadow-diff.d.ts +26 -0
- package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-diff.js +52 -0
- package/dist/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/pricing-engine/shadow-facade.d.ts +42 -0
- package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-facade.js +82 -0
- package/dist/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.js +18 -0
- package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
- package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-metrics.js +31 -0
- package/dist/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.js +39 -0
- package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/pricing-engine/types.d.ts +2 -0
- package/dist/pricing-engine/types.d.ts.map +1 -1
- package/dist/rbac/authorize.d.ts +12 -0
- package/dist/rbac/authorize.d.ts.map +1 -1
- package/dist/rbac/authorize.js +27 -0
- package/dist/rbac/authorize.js.map +1 -1
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +67 -1
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/rbac/workload-provisioning.d.ts +66 -0
- package/dist/rbac/workload-provisioning.d.ts.map +1 -0
- package/dist/rbac/workload-provisioning.js +153 -0
- package/dist/rbac/workload-provisioning.js.map +1 -0
- package/dist/rbac/workload.d.ts +124 -0
- package/dist/rbac/workload.d.ts.map +1 -0
- package/dist/rbac/workload.js +184 -0
- package/dist/rbac/workload.js.map +1 -0
- package/dist/storage/checksum.d.ts +9 -0
- package/dist/storage/checksum.d.ts.map +1 -0
- package/dist/storage/checksum.js +12 -0
- package/dist/storage/checksum.js.map +1 -0
- package/dist/storage/key.d.ts +37 -0
- package/dist/storage/key.d.ts.map +1 -0
- package/dist/storage/key.js +67 -0
- package/dist/storage/key.js.map +1 -0
- package/dist/storage/local.d.ts +40 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +96 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/r2.d.ts +43 -0
- package/dist/storage/r2.d.ts.map +1 -0
- package/dist/storage/r2.js +177 -0
- package/dist/storage/r2.js.map +1 -0
- package/dist/storage/registry.d.ts +23 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +37 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/types.d.ts +67 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +45 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/subscription-billing/provider/asaas.d.ts +14 -0
- package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
- package/dist/subscription-billing/provider/asaas.js +32 -7
- package/dist/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/subscription-billing/provider/disabled.d.ts +9 -0
- package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
- package/dist/subscription-billing/provider/disabled.js +8 -0
- package/dist/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/subscription-billing/provider/registry.d.ts +10 -0
- package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
- package/dist/subscription-billing/provider/registry.js +17 -0
- package/dist/subscription-billing/provider/registry.js.map +1 -1
- package/dist/subscription-billing/service.d.ts +17 -1
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +57 -8
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/subscription-billing/types.d.ts +13 -0
- package/dist/subscription-billing/types.d.ts.map +1 -1
- package/dist/subscription-billing/types.js.map +1 -1
- package/dist/tenancy/provisioning.d.ts.map +1 -1
- package/dist/tenancy/provisioning.js +32 -8
- package/dist/tenancy/provisioning.js.map +1 -1
- package/dist/users/repository.d.ts +38 -0
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +118 -3
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +67 -0
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +78 -0
- package/dist/vault/repository.js.map +1 -1
- package/package.json +19 -4
- package/src/db/migrations/0023_user_invite_activation.sql +15 -0
- package/src/db/migrations/0024_set_user_password_function.sql +32 -0
- package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
- package/src/db/migrations/0026_documents_and_competence.sql +353 -0
- package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
- package/src/db/migrations/0028_collection_engine.sql +94 -0
- package/src/db/migrations/0029_payment_rail.sql +107 -0
- package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
- package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
- package/src/db/migrations/0032_settlement_reversal.sql +76 -0
- package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
- package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
- package/src/db/migrations/0035_payment_account_environments.sql +61 -0
- package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
- package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
- package/src/db/migrations/0038_notification_channels.sql +175 -0
- package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
- package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
- package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
- package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
- package/src/db/migrations/0043_workload_identity.sql +105 -0
- package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
- package/dist/cjs/mail/resend-client.js +0 -103
- package/dist/cjs/mail/resend-client.js.map +0 -1
- package/dist/mail/resend-client.d.ts +0 -16
- package/dist/mail/resend-client.d.ts.map +0 -1
- package/dist/mail/resend-client.js +0 -100
- package/dist/mail/resend-client.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/collection/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCollectionPolicy = getCollectionPolicy;
|
|
4
|
+
exports.upsertCollectionPolicy = upsertCollectionPolicy;
|
|
5
|
+
exports.scheduleAction = scheduleAction;
|
|
6
|
+
exports.getAction = getAction;
|
|
7
|
+
exports.listActions = listActions;
|
|
8
|
+
exports.handledStepKeys = handledStepKeys;
|
|
9
|
+
exports.markSent = markSent;
|
|
10
|
+
exports.markFailed = markFailed;
|
|
11
|
+
exports.markEscalated = markEscalated;
|
|
12
|
+
exports.cancelPendingActions = cancelPendingActions;
|
|
13
|
+
exports.collectionMetrics = collectionMetrics;
|
|
14
|
+
exports.clientTimeline = clientTimeline;
|
|
15
|
+
const shared_1 = require("@baruk/shared");
|
|
16
|
+
const policy_js_1 = require("./policy.js");
|
|
17
|
+
const iso = (d) => (d ? d.toISOString().slice(0, 10) : null);
|
|
18
|
+
function mapAction(r) {
|
|
19
|
+
return {
|
|
20
|
+
id: r.id,
|
|
21
|
+
receivableId: r.receivable_id,
|
|
22
|
+
clientId: r.client_id,
|
|
23
|
+
clientName: r.client_name,
|
|
24
|
+
stepKey: r.step_key,
|
|
25
|
+
channel: r.channel,
|
|
26
|
+
template: r.template,
|
|
27
|
+
status: r.status,
|
|
28
|
+
scheduledFor: iso(r.scheduled_for),
|
|
29
|
+
attempts: r.attempts,
|
|
30
|
+
lastError: r.last_error,
|
|
31
|
+
sentAt: r.sent_at?.toISOString() ?? null,
|
|
32
|
+
closedAt: r.closed_at?.toISOString() ?? null,
|
|
33
|
+
closedReason: r.closed_reason,
|
|
34
|
+
recipientRef: r.recipient_ref,
|
|
35
|
+
amountAtSend: r.amount_at_send === null ? null : Number(r.amount_at_send),
|
|
36
|
+
createdAt: r.created_at.toISOString(),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const SELECT_ACTION = `
|
|
40
|
+
SELECT d.id, d.receivable_id, r.client_id, c.display_name AS client_name, d.step_key,
|
|
41
|
+
d.channel, d.template, d.status, d.scheduled_for, d.attempts, d.last_error,
|
|
42
|
+
d.sent_at, d.closed_at, d.closed_reason, d.recipient_ref, d.amount_at_send, d.created_at
|
|
43
|
+
FROM dunning_event d
|
|
44
|
+
LEFT JOIN receivable r ON r.id = d.receivable_id
|
|
45
|
+
LEFT JOIN client c ON c.id = r.client_id AND c.deleted_at IS NULL`;
|
|
46
|
+
// ── Política ────────────────────────────────────────────────────────────────
|
|
47
|
+
/** Política ativa do tenant; cai no padrão do produto quando não há nenhuma. */
|
|
48
|
+
async function getCollectionPolicy(tx) {
|
|
49
|
+
const rows = await tx `
|
|
50
|
+
SELECT id, name, steps, active FROM dunning_rule
|
|
51
|
+
WHERE active AND is_default
|
|
52
|
+
ORDER BY created_at LIMIT 1
|
|
53
|
+
`;
|
|
54
|
+
const row = rows[0];
|
|
55
|
+
if (!row)
|
|
56
|
+
return policy_js_1.DEFAULT_POLICY;
|
|
57
|
+
const steps = (0, policy_js_1.parsePolicySteps)(row.steps);
|
|
58
|
+
// Política cadastrada mas ilegível não pode virar "sem cobrança nenhuma"
|
|
59
|
+
// silenciosamente: melhor cair no padrão e deixar a régua rodando.
|
|
60
|
+
if (steps.length === 0)
|
|
61
|
+
return { ...policy_js_1.DEFAULT_POLICY, id: row.id, name: row.name };
|
|
62
|
+
return { id: row.id, name: row.name, steps, active: row.active };
|
|
63
|
+
}
|
|
64
|
+
async function upsertCollectionPolicy(tx, input) {
|
|
65
|
+
const steps = (0, policy_js_1.parsePolicySteps)(input.steps);
|
|
66
|
+
const existing = await tx `
|
|
67
|
+
SELECT id FROM dunning_rule WHERE is_default LIMIT 1
|
|
68
|
+
`;
|
|
69
|
+
if (existing[0]) {
|
|
70
|
+
await tx `
|
|
71
|
+
UPDATE dunning_rule
|
|
72
|
+
SET name = ${input.name}, steps = ${tx.json(steps)},
|
|
73
|
+
active = ${input.active ?? true}, updated_at = now()
|
|
74
|
+
WHERE id = ${existing[0].id}
|
|
75
|
+
`;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
await tx `
|
|
79
|
+
INSERT INTO dunning_rule (id, tenant_id, name, steps, active, is_default)
|
|
80
|
+
VALUES (${(0, shared_1.uuidv7)()},
|
|
81
|
+
(NULLIF(current_setting('app.current_tenant', true), ''))::uuid,
|
|
82
|
+
${input.name}, ${tx.json(steps)}, ${input.active ?? true}, true)
|
|
83
|
+
`;
|
|
84
|
+
}
|
|
85
|
+
return getCollectionPolicy(tx);
|
|
86
|
+
}
|
|
87
|
+
// ── Ações ───────────────────────────────────────────────────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* Agenda uma etapa. Idempotente pelo índice único parcial
|
|
90
|
+
* `(tenant, receivable, step_key)` — o `ON CONFLICT DO NOTHING` é o que
|
|
91
|
+
* transforma job repetido, retry, restart de worker e webhook duplicado em
|
|
92
|
+
* uma única ação lógica.
|
|
93
|
+
*/
|
|
94
|
+
async function scheduleAction(tx, input) {
|
|
95
|
+
const rows = await tx `
|
|
96
|
+
INSERT INTO dunning_event (id, tenant_id, receivable_id, step_key, channel, template,
|
|
97
|
+
status, scheduled_for)
|
|
98
|
+
VALUES (${(0, shared_1.uuidv7)()},
|
|
99
|
+
(NULLIF(current_setting('app.current_tenant', true), ''))::uuid,
|
|
100
|
+
${input.receivableId}, ${input.stepKey}, ${input.channel}, ${input.template},
|
|
101
|
+
'scheduled', ${input.scheduledFor})
|
|
102
|
+
ON CONFLICT (tenant_id, receivable_id, step_key) WHERE receivable_id IS NOT NULL
|
|
103
|
+
DO NOTHING
|
|
104
|
+
RETURNING id
|
|
105
|
+
`;
|
|
106
|
+
if (!rows[0])
|
|
107
|
+
return null;
|
|
108
|
+
return getAction(tx, rows[0].id);
|
|
109
|
+
}
|
|
110
|
+
async function getAction(tx, id) {
|
|
111
|
+
const rows = await tx `${tx.unsafe(SELECT_ACTION)} WHERE d.id = ${id}`;
|
|
112
|
+
const row = rows[0];
|
|
113
|
+
if (!row)
|
|
114
|
+
throw new Error('Ação de cobrança não encontrada');
|
|
115
|
+
return mapAction(row);
|
|
116
|
+
}
|
|
117
|
+
async function listActions(tx, filter = {}) {
|
|
118
|
+
const limit = Math.min(Math.max(filter.limit ?? 100, 1), 500);
|
|
119
|
+
const rows = await tx `
|
|
120
|
+
${tx.unsafe(SELECT_ACTION)}
|
|
121
|
+
WHERE d.receivable_id IS NOT NULL
|
|
122
|
+
${filter.status ? tx `AND d.status = ${filter.status}` : tx ``}
|
|
123
|
+
${filter.receivableId ? tx `AND d.receivable_id = ${filter.receivableId}` : tx ``}
|
|
124
|
+
${filter.clientId ? tx `AND r.client_id = ${filter.clientId}` : tx ``}
|
|
125
|
+
${filter.dueOnly
|
|
126
|
+
? tx `AND d.status = 'scheduled' AND d.scheduled_for <= ${filter.dueUntil ?? tx `CURRENT_DATE`}`
|
|
127
|
+
: tx ``}
|
|
128
|
+
ORDER BY d.scheduled_for NULLS LAST, d.created_at
|
|
129
|
+
LIMIT ${limit}
|
|
130
|
+
`;
|
|
131
|
+
return rows.map(mapAction);
|
|
132
|
+
}
|
|
133
|
+
/** Etapas já registradas para um recebível — alimenta a idempotência da régua. */
|
|
134
|
+
async function handledStepKeys(tx, receivableId) {
|
|
135
|
+
const rows = await tx `
|
|
136
|
+
SELECT step_key FROM dunning_event WHERE receivable_id = ${receivableId}
|
|
137
|
+
`;
|
|
138
|
+
return new Set(rows.map((r) => r.step_key));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Assenta o envio.
|
|
142
|
+
*
|
|
143
|
+
* O identificador do provider vai para `provider_ref` (migration 0038). Antes
|
|
144
|
+
* ele era espremido em `template` sob COALESCE: como `scheduleAction` sempre
|
|
145
|
+
* grava o template, o id do provider era descartado em silêncio — e, se o
|
|
146
|
+
* template estivesse nulo, ocupava o lugar do nome e corrompia o relatório.
|
|
147
|
+
*
|
|
148
|
+
* Nunca deu problema porque o adapter de e-mail não devolve identificador.
|
|
149
|
+
* WhatsApp e SMS devolvem sempre, e o webhook de entrega chega trazendo APENAS
|
|
150
|
+
* esse id: sem coluna própria e indexada, todo status de entrega se perderia.
|
|
151
|
+
*/
|
|
152
|
+
async function markSent(tx, id, input) {
|
|
153
|
+
await tx `
|
|
154
|
+
UPDATE dunning_event
|
|
155
|
+
SET status = 'sent', sent_at = now(), attempts = attempts + 1,
|
|
156
|
+
recipient_ref = ${input.recipientRef}, amount_at_send = ${input.amount},
|
|
157
|
+
last_error = NULL, closed_at = now(),
|
|
158
|
+
provider_ref = COALESCE(${input.providerRef ?? null}, provider_ref),
|
|
159
|
+
idempotency_key = COALESCE(${input.idempotencyKey ?? null}, idempotency_key)
|
|
160
|
+
WHERE id = ${id}
|
|
161
|
+
`;
|
|
162
|
+
}
|
|
163
|
+
async function markFailed(tx, id, input) {
|
|
164
|
+
await tx `
|
|
165
|
+
UPDATE dunning_event
|
|
166
|
+
SET status = ${input.permanent ? 'failed' : 'scheduled'},
|
|
167
|
+
attempts = attempts + 1,
|
|
168
|
+
last_error = ${input.error.slice(0, 300)},
|
|
169
|
+
closed_at = ${input.permanent ? tx `now()` : null},
|
|
170
|
+
closed_reason = ${input.permanent ? 'permanent_failure' : null}
|
|
171
|
+
WHERE id = ${id}
|
|
172
|
+
`;
|
|
173
|
+
}
|
|
174
|
+
async function markEscalated(tx, id, reason = 'escalated') {
|
|
175
|
+
await tx `
|
|
176
|
+
UPDATE dunning_event
|
|
177
|
+
SET status = 'escalated', closed_at = now(), closed_reason = ${reason}
|
|
178
|
+
WHERE id = ${id}
|
|
179
|
+
`;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Cancela ações ainda não enviadas de um recebível.
|
|
183
|
+
*
|
|
184
|
+
* Só toca `scheduled`: o que já saiu é histórico e não se apaga. Retorna quantas
|
|
185
|
+
* foram canceladas para o job poder relatar honestamente o que aconteceu.
|
|
186
|
+
*/
|
|
187
|
+
async function cancelPendingActions(tx, receivableId, reason) {
|
|
188
|
+
const rows = await tx `
|
|
189
|
+
UPDATE dunning_event
|
|
190
|
+
SET status = 'canceled', closed_at = now(), closed_reason = ${reason}
|
|
191
|
+
WHERE receivable_id = ${receivableId} AND status = 'scheduled'
|
|
192
|
+
RETURNING id
|
|
193
|
+
`;
|
|
194
|
+
return rows.length;
|
|
195
|
+
}
|
|
196
|
+
async function collectionMetrics(tx) {
|
|
197
|
+
const [m] = await tx `
|
|
198
|
+
SELECT
|
|
199
|
+
count(*) FILTER (WHERE status = 'scheduled')::int AS scheduled,
|
|
200
|
+
count(*) FILTER (WHERE status = 'sent')::int AS sent,
|
|
201
|
+
count(*) FILTER (WHERE status = 'failed')::int AS failed,
|
|
202
|
+
count(*) FILTER (WHERE status = 'canceled')::int AS canceled,
|
|
203
|
+
count(*) FILTER (WHERE status = 'canceled' AND closed_reason = 'paid')::int AS stopped_by_payment,
|
|
204
|
+
count(*) FILTER (WHERE status = 'escalated')::int AS escalated,
|
|
205
|
+
count(*) FILTER (WHERE closed_reason = 'no_contact_data')::int AS no_contact_data,
|
|
206
|
+
count(*) FILTER (WHERE status = 'scheduled' AND scheduled_for <= CURRENT_DATE)::int AS due_today
|
|
207
|
+
FROM dunning_event WHERE receivable_id IS NOT NULL
|
|
208
|
+
`;
|
|
209
|
+
const [p] = await tx `
|
|
210
|
+
SELECT COALESCE(sum(r.amount), 0) AS amount
|
|
211
|
+
FROM receivable r
|
|
212
|
+
WHERE r.status = 'paid'
|
|
213
|
+
AND EXISTS (SELECT 1 FROM dunning_event d
|
|
214
|
+
WHERE d.receivable_id = r.id AND d.status = 'sent')
|
|
215
|
+
`;
|
|
216
|
+
return {
|
|
217
|
+
scheduled: m.scheduled,
|
|
218
|
+
sent: m.sent,
|
|
219
|
+
failed: m.failed,
|
|
220
|
+
canceled: m.canceled,
|
|
221
|
+
stoppedByPayment: m.stopped_by_payment,
|
|
222
|
+
escalated: m.escalated,
|
|
223
|
+
noContactData: m.no_contact_data,
|
|
224
|
+
dueToday: m.due_today,
|
|
225
|
+
amountPaidAfterCollection: Number(p.amount),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
async function clientTimeline(tx, clientId, limit = 100) {
|
|
229
|
+
const rows = await tx `
|
|
230
|
+
SELECT created_at AS at, 'receivable_created' AS kind,
|
|
231
|
+
COALESCE(competence, 'avulso') AS detail, amount, id AS receivable_id
|
|
232
|
+
FROM receivable WHERE client_id = ${clientId} AND deleted_at IS NULL
|
|
233
|
+
UNION ALL
|
|
234
|
+
SELECT p.paid_at, 'payment', p.method, p.amount, p.receivable_id
|
|
235
|
+
FROM payment p JOIN receivable r ON r.id = p.receivable_id
|
|
236
|
+
WHERE r.client_id = ${clientId} AND p.status = 'confirmed'
|
|
237
|
+
UNION ALL
|
|
238
|
+
SELECT d.sent_at, 'collection_sent', d.step_key || ' · ' || d.channel, d.amount_at_send, d.receivable_id
|
|
239
|
+
FROM dunning_event d JOIN receivable r ON r.id = d.receivable_id
|
|
240
|
+
WHERE r.client_id = ${clientId} AND d.status = 'sent' AND d.sent_at IS NOT NULL
|
|
241
|
+
UNION ALL
|
|
242
|
+
SELECT d.closed_at, 'collection_canceled', d.step_key || ' · ' || COALESCE(d.closed_reason, '-'), NULL, d.receivable_id
|
|
243
|
+
FROM dunning_event d JOIN receivable r ON r.id = d.receivable_id
|
|
244
|
+
WHERE r.client_id = ${clientId} AND d.status = 'canceled' AND d.closed_at IS NOT NULL
|
|
245
|
+
UNION ALL
|
|
246
|
+
SELECT d.closed_at, 'collection_escalated', d.step_key, NULL, d.receivable_id
|
|
247
|
+
FROM dunning_event d JOIN receivable r ON r.id = d.receivable_id
|
|
248
|
+
WHERE r.client_id = ${clientId} AND d.status = 'escalated' AND d.closed_at IS NOT NULL
|
|
249
|
+
ORDER BY at DESC
|
|
250
|
+
LIMIT ${limit}
|
|
251
|
+
`;
|
|
252
|
+
return rows.map((r) => ({
|
|
253
|
+
at: r.at.toISOString(),
|
|
254
|
+
kind: r.kind,
|
|
255
|
+
detail: r.detail,
|
|
256
|
+
amount: r.amount === null ? null : Number(r.amount),
|
|
257
|
+
receivableId: r.receivable_id,
|
|
258
|
+
}));
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/collection/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Quem é o ASSUNTO de uma cobrança — e se existe um.
|
|
4
|
+
*
|
|
5
|
+
* ## O falso positivo que este módulo existe para matar
|
|
6
|
+
*
|
|
7
|
+
* O preflight de envio avulso respondia `eligible: true` medindo seis portas —
|
|
8
|
+
* identidade, credencial, destinatário, telefone, consentimento, template — e
|
|
9
|
+
* nenhuma delas pergunta **sobre o quê** a mensagem falaria. Um cliente sem
|
|
10
|
+
* recebível nenhum passava nas seis, e a rota de envio recusava logo depois por
|
|
11
|
+
* falta de valor e vencimento.
|
|
12
|
+
*
|
|
13
|
+
* Um preflight que aprova o que a execução recusa é pior que não ter preflight:
|
|
14
|
+
* ele desloca a descoberta do defeito para o momento do disparo, que é
|
|
15
|
+
* exatamente onde ninguém quer descobrir nada.
|
|
16
|
+
*
|
|
17
|
+
* ## Por que aqui, e não no handler
|
|
18
|
+
*
|
|
19
|
+
* "Este recebível está devido na etapa D+3 hoje?" é regra da RÉGUA. Ela já vive
|
|
20
|
+
* em `policy.ts` (`dueSteps`, `scheduledDateFor`) e em `engine.ts`
|
|
21
|
+
* (`isCollectible`), e é usada pelo ciclo automático. Reimplementar a mesma
|
|
22
|
+
* conta dentro de uma rota criaria a segunda derivação de sempre — as duas
|
|
23
|
+
* concordariam no dia da escrita e divergiriam na primeira mudança da régua,
|
|
24
|
+
* com o avulso mandando o que o ciclo não mandaria.
|
|
25
|
+
*
|
|
26
|
+
* Este módulo não decide política nova: ele **lê** a política vigente e responde
|
|
27
|
+
* quem ela alcança, sem escrever nada.
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.isCollectibleSubject = isCollectibleSubject;
|
|
31
|
+
exports.findEligibleSubjects = findEligibleSubjects;
|
|
32
|
+
exports.resolveSubjectForStep = resolveSubjectForStep;
|
|
33
|
+
const ar_repository_js_1 = require("../billing/ar-repository.js");
|
|
34
|
+
const policy_js_1 = require("./policy.js");
|
|
35
|
+
const repository_js_1 = require("./repository.js");
|
|
36
|
+
/**
|
|
37
|
+
* Um recebível ainda merece cobrança?
|
|
38
|
+
*
|
|
39
|
+
* Cópia deliberada da regra de `engine.ts`, que era privada. Exportar de lá e
|
|
40
|
+
* importar aqui criaria ciclo (`engine` já importa deste módulo o suficiente);
|
|
41
|
+
* a duplicação é de UMA função pequena e está coberta pelo teste de
|
|
42
|
+
* equivalência em `collection-subject.test.ts`, que exercita as duas contra os
|
|
43
|
+
* mesmos casos.
|
|
44
|
+
*/
|
|
45
|
+
function isCollectibleSubject(r) {
|
|
46
|
+
if (r.status === 'paid' || r.status === 'canceled')
|
|
47
|
+
return false;
|
|
48
|
+
if (r.status === 'renegotiated' || r.status === 'written_off')
|
|
49
|
+
return false;
|
|
50
|
+
// Saldo zero sem status `paid` é quem já pagou e o status não foi reavaliado.
|
|
51
|
+
// Cobrar aqui é o pior erro operacional deste motor.
|
|
52
|
+
if (r.outstandingAmount <= 0)
|
|
53
|
+
return false;
|
|
54
|
+
if (!r.dueDate)
|
|
55
|
+
return false;
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Os recebíveis do cliente que a etapa alcança HOJE.
|
|
60
|
+
*
|
|
61
|
+
* Vazio quer dizer "não há sobre o que cobrar nesta etapa", e é um desfecho
|
|
62
|
+
* legítimo — não um erro. Cabe a quem chama transformar isso em recusa.
|
|
63
|
+
*
|
|
64
|
+
* A ordem é a mesma da régua (vencimento mais antigo primeiro), para que o
|
|
65
|
+
* avulso e o ciclo escolham o mesmo quando houver mais de um.
|
|
66
|
+
*/
|
|
67
|
+
async function findEligibleSubjects(tx, q) {
|
|
68
|
+
const policy = q.policy ?? (await (0, repository_js_1.getCollectionPolicy)(tx));
|
|
69
|
+
/*
|
|
70
|
+
* Nenhuma checagem própria de política ou de etapa aqui.
|
|
71
|
+
*
|
|
72
|
+
* A primeira versão tinha duas — "a régua está ativa" e "a etapa existe e
|
|
73
|
+
* está ativa" — e o teste de mutação derrubou as duas: removê-las não quebrava
|
|
74
|
+
* caso nenhum, porque `dueSteps` já decide exatamente isso. Guard que nenhum
|
|
75
|
+
* teste consegue distinguir não é guard: é uma segunda codificação da mesma
|
|
76
|
+
* regra, esperando para divergir da primeira.
|
|
77
|
+
*
|
|
78
|
+
* O que sobra deste módulo é o que ele de fato acrescenta: recortar por
|
|
79
|
+
* cliente, aplicar `isCollectibleSubject` e perguntar à régua. `dueSteps`
|
|
80
|
+
* continua sendo a única autoridade sobre quando uma etapa vence.
|
|
81
|
+
*/
|
|
82
|
+
const { items } = await (0, ar_repository_js_1.listReceivables)(tx, { clientId: q.clientId, limit: 200 });
|
|
83
|
+
const elegiveis = [];
|
|
84
|
+
for (const r of items) {
|
|
85
|
+
if (!isCollectibleSubject(r))
|
|
86
|
+
continue;
|
|
87
|
+
const handled = await (0, repository_js_1.handledStepKeys)(tx, r.id);
|
|
88
|
+
const due = (0, policy_js_1.dueSteps)(policy, r.dueDate, q.today, handled);
|
|
89
|
+
if (due.some((d) => d.step.key === q.stepKey))
|
|
90
|
+
elegiveis.push(r);
|
|
91
|
+
}
|
|
92
|
+
return elegiveis;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* O assunto que o envio avulso usaria, ou `null`.
|
|
96
|
+
*
|
|
97
|
+
* Quando há mais de um, o mais antigo — mesma preferência da régua. Escolher o
|
|
98
|
+
* mais recente faria a dívida velha envelhecer sem cobrança.
|
|
99
|
+
*/
|
|
100
|
+
async function resolveSubjectForStep(tx, q) {
|
|
101
|
+
const todos = await findEligibleSubjects(tx, q);
|
|
102
|
+
return todos[0] ?? null;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=subject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject.js","sourceRoot":"","sources":["../../../src/collection/subject.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;;AAgBH,oDAQC;AAoBD,oDA8BC;AAQD,sDAMC;AArFD,kEAA0F;AAC1F,2CAA8D;AAC9D,mDAAuE;AAEvE;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAAC,CAAwB;IAC3D,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IACjE,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,CAAC,MAAM,KAAK,aAAa;QAAE,OAAO,KAAK,CAAC;IAC5E,8EAA8E;IAC9E,qDAAqD;IACrD,IAAI,CAAC,CAAC,iBAAiB,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC,CAAC,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAWD;;;;;;;;GAQG;AACI,KAAK,UAAU,oBAAoB,CACxC,EAAM,EACN,CAAuB;IAEvB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,IAAA,mCAAmB,EAAC,EAAE,CAAC,CAAC,CAAC;IAE3D;;;;;;;;;;;;OAYG;IAEH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,kCAAe,EAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAElF,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAAE,SAAS;QACvC,MAAM,OAAO,GAAG,MAAM,IAAA,+BAAe,EAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,IAAA,oBAAQ,EAAC,MAAM,EAAE,CAAC,CAAC,OAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3D,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,qBAAqB,CACzC,EAAM,EACN,CAAuB;IAEvB,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Catálogo de templates da COBRANÇA — do produto, não do motor.
|
|
4
|
+
*
|
|
5
|
+
* O motor sabe resolver template (escopo, versão, aprovação); ele não conhece
|
|
6
|
+
* nenhum. Os textos e os nomes registrados no provider vivem aqui, ao lado da
|
|
7
|
+
* régua que os usa.
|
|
8
|
+
*
|
|
9
|
+
* O corpo dos e-mails continua vindo de `copy.ts`/`email-layout.ts`: este
|
|
10
|
+
* catálogo declara QUAL template vale para cada etapa e canal, e as variáveis
|
|
11
|
+
* que ele consome. Duplicar o texto aqui criaria duas fontes para a mesma
|
|
12
|
+
* mensagem, e a segunda ficaria para trás na primeira correção.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.createCollectionTemplateStore = createCollectionTemplateStore;
|
|
16
|
+
const communication_bridge_js_1 = require("./communication-bridge.js");
|
|
17
|
+
const LOCALE = 'pt-BR';
|
|
18
|
+
/**
|
|
19
|
+
* Variáveis da cobrança, na ordem em que os templates de WhatsApp as declaram.
|
|
20
|
+
*
|
|
21
|
+
* A ordem é contrato com o template aprovado no provider: `{{1}}` é o nome,
|
|
22
|
+
* `{{2}}` o valor, `{{3}}` o vencimento. Trocar a ordem aqui sem re-aprovar o
|
|
23
|
+
* template lá manda o valor no lugar do nome — e a Meta aceita, porque para ela
|
|
24
|
+
* são três strings.
|
|
25
|
+
*/
|
|
26
|
+
const COLLECTION_VARS = ['clientName', 'amount', 'dueDate'];
|
|
27
|
+
/**
|
|
28
|
+
* Sufixo do nome REGISTRADO NO PROVIDER.
|
|
29
|
+
*
|
|
30
|
+
* Muda **somente** quando um template novo é submetido e aprovado do lado da
|
|
31
|
+
* Meta. Mexer aqui sem submeter faz o despacho pedir um nome que não existe — e
|
|
32
|
+
* a Meta responde `132001`, que fala de "translation" e manda quem investiga
|
|
33
|
+
* procurar no lugar errado.
|
|
34
|
+
*/
|
|
35
|
+
const PROVIDER_TEMPLATE_SUFFIX = 'v1';
|
|
36
|
+
/**
|
|
37
|
+
* Revisão INTERNA do catálogo de WhatsApp. **Nunca chega ao provider.**
|
|
38
|
+
*
|
|
39
|
+
* Entra na chave de idempotência (`buildIdempotencyKey` recebe
|
|
40
|
+
* `templateVersion`), e é o único jeito legítimo de dizer "esta é outra
|
|
41
|
+
* tentativa lógica" sem tocar no template aprovado.
|
|
42
|
+
*
|
|
43
|
+
* ## Por que os dois existem separados
|
|
44
|
+
*
|
|
45
|
+
* Eram dois literais `'v1'` — um em `version`, outro dentro da interpolação de
|
|
46
|
+
* `providerTemplateName` —, independentes de fato e idênticos na aparência. A
|
|
47
|
+
* primeira pessoa que precisasse de uma chave nova bumparia o que estivesse
|
|
48
|
+
* mais à mão, e havia 50% de chance de o despacho passar a pedir
|
|
49
|
+
* `billing_dunning_dplus3_v2` à Meta, que não tem esse template.
|
|
50
|
+
*
|
|
51
|
+
* `v2` aqui porque a revisão `v1` foi consumida: em 2026-09-01 a primeira
|
|
52
|
+
* tentativa real assentou a chave como `failed_permanent`, e o motor recusa
|
|
53
|
+
* repetição sobre chave assentada — corretamente. O template aprovado continua
|
|
54
|
+
* sendo `billing_dunning_dplus3_v1`.
|
|
55
|
+
*
|
|
56
|
+
* E-mail e SMS **não** bumpam: os dois têm despacho real em produção, e mudar a
|
|
57
|
+
* versão deles reabriria chaves já assentadas de 89 avisos que já saíram.
|
|
58
|
+
*/
|
|
59
|
+
const WHATSAPP_CATALOG_REVISION = 'v2';
|
|
60
|
+
/**
|
|
61
|
+
* E-mail: sempre disponível, porque o corpo é montado pelo produto.
|
|
62
|
+
*
|
|
63
|
+
* `approved` aqui não significa "aprovado por um provider" — e-mail não tem
|
|
64
|
+
* registro prévio. Significa "utilizável", que é o que o motor precisa saber.
|
|
65
|
+
*/
|
|
66
|
+
function emailTemplate(eventType) {
|
|
67
|
+
return {
|
|
68
|
+
tenantId: null,
|
|
69
|
+
product: communication_bridge_js_1.SC_PRODUCT,
|
|
70
|
+
brand: null,
|
|
71
|
+
channel: 'email',
|
|
72
|
+
eventType,
|
|
73
|
+
locale: LOCALE,
|
|
74
|
+
version: 'v1',
|
|
75
|
+
status: 'approved',
|
|
76
|
+
variables: [...COLLECTION_VARS],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* WhatsApp: só existe se o escritório tiver registrado o template no provider.
|
|
81
|
+
*
|
|
82
|
+
* O nome segue o evento (`billing.dunning.dplus3` → `billing_dunning_dplus3_v1`)
|
|
83
|
+
* porque é a única convenção que não exige uma segunda tabela de-para que
|
|
84
|
+
* alguém precisaria manter sincronizada com o painel da Meta.
|
|
85
|
+
*
|
|
86
|
+
* **Não é declarado aprovado por padrão.** Um template que este código afirma
|
|
87
|
+
* existir e que ninguém registrou vira recusa do provider a cada etapa da régua
|
|
88
|
+
* — e a recusa chega como falha de entrega, sugerindo problema no cliente.
|
|
89
|
+
*/
|
|
90
|
+
function whatsappTemplate(eventType, approved) {
|
|
91
|
+
return {
|
|
92
|
+
tenantId: null,
|
|
93
|
+
product: communication_bridge_js_1.SC_PRODUCT,
|
|
94
|
+
brand: null,
|
|
95
|
+
channel: 'whatsapp',
|
|
96
|
+
eventType,
|
|
97
|
+
locale: LOCALE,
|
|
98
|
+
// Revisão interna — some antes da fronteira do provider.
|
|
99
|
+
version: WHATSAPP_CATALOG_REVISION,
|
|
100
|
+
status: approved ? 'approved' : 'pending_approval',
|
|
101
|
+
// Nome no provider — o sufixo é o do TEMPLATE APROVADO, não o da revisão.
|
|
102
|
+
providerTemplateName: `${eventType.replace(/\./g, '_')}_${PROVIDER_TEMPLATE_SUFFIX}`,
|
|
103
|
+
variables: [...COLLECTION_VARS],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function smsTemplate(eventType, approved) {
|
|
107
|
+
return {
|
|
108
|
+
tenantId: null,
|
|
109
|
+
product: communication_bridge_js_1.SC_PRODUCT,
|
|
110
|
+
brand: null,
|
|
111
|
+
channel: 'sms',
|
|
112
|
+
eventType,
|
|
113
|
+
locale: LOCALE,
|
|
114
|
+
version: 'v1',
|
|
115
|
+
status: approved ? 'approved' : 'pending_approval',
|
|
116
|
+
variables: [...COLLECTION_VARS],
|
|
117
|
+
// Curto de propósito: cada segmento é cobrado, e o link é o que faz o
|
|
118
|
+
// cliente agir. Sem link, a mensagem só informa.
|
|
119
|
+
body: '{{clientName}}, consta {{amount}} com vencimento {{dueDate}}.',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Quais eventos o escritório tem registrados em cada canal.
|
|
124
|
+
*
|
|
125
|
+
* Vem de `tenant.settings.channels.<canal>.approvedEvents`. Ausente = nenhum, e
|
|
126
|
+
* o e-mail segue funcionando: ligar um canal novo nunca pode desligar o que já
|
|
127
|
+
* funcionava.
|
|
128
|
+
*/
|
|
129
|
+
// `tenant` não tem RLS — é a tabela raiz, define a fronteira em vez de ser
|
|
130
|
+
// protegida por ela. Toda leitura dela exige a amarra explícita na GUC da
|
|
131
|
+
// sessão; sem isso, o `tenantId` do parâmetro é a única coisa que separa um
|
|
132
|
+
// escritório do outro, e um parâmetro não é uma fronteira.
|
|
133
|
+
async function approvedEvents(tx, tenantId, channel) {
|
|
134
|
+
const rows = await tx `
|
|
135
|
+
SELECT settings FROM tenant
|
|
136
|
+
WHERE id = ${tenantId}
|
|
137
|
+
AND id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
|
|
138
|
+
LIMIT 1
|
|
139
|
+
`;
|
|
140
|
+
const channels = (rows[0]?.settings?.channels ?? {});
|
|
141
|
+
const list = channels[channel]?.approvedEvents;
|
|
142
|
+
return new Set(Array.isArray(list) ? list.filter((v) => typeof v === 'string') : []);
|
|
143
|
+
}
|
|
144
|
+
function createCollectionTemplateStore(tx) {
|
|
145
|
+
return {
|
|
146
|
+
async candidates(ctx, channel, eventType, locale) {
|
|
147
|
+
if (ctx.product !== communication_bridge_js_1.SC_PRODUCT || locale !== LOCALE)
|
|
148
|
+
return [];
|
|
149
|
+
if (channel === 'email')
|
|
150
|
+
return [emailTemplate(eventType)];
|
|
151
|
+
if (channel === 'whatsapp') {
|
|
152
|
+
const approved = await approvedEvents(tx, ctx.tenantId, 'whatsapp');
|
|
153
|
+
return [whatsappTemplate(eventType, approved.has(eventType))];
|
|
154
|
+
}
|
|
155
|
+
if (channel === 'sms') {
|
|
156
|
+
const approved = await approvedEvents(tx, ctx.tenantId, 'sms');
|
|
157
|
+
return [smsTemplate(eventType, approved.has(eventType))];
|
|
158
|
+
}
|
|
159
|
+
// `notification` é evento interno e não passa pelo motor: a régua o
|
|
160
|
+
// resolve antes, escalando para a fila humana sem mensagem ao cliente.
|
|
161
|
+
return [];
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=template-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-catalog.js","sourceRoot":"","sources":["../../../src/collection/template-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_TEMPLATES = exports.TEMPLATE_VARIABLES = void 0;
|
|
4
|
+
exports.resolveTemplate = resolveTemplate;
|
|
5
|
+
exports.renderTemplate = renderTemplate;
|
|
6
|
+
exports.TEMPLATE_VARIABLES = [
|
|
7
|
+
'clientName',
|
|
8
|
+
'officeName',
|
|
9
|
+
'dueDate',
|
|
10
|
+
'outstandingAmount',
|
|
11
|
+
'reference',
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Textos padrão por tom.
|
|
15
|
+
*
|
|
16
|
+
* Nenhum deles ameaça, cita medida judicial, negativação ou consequência legal.
|
|
17
|
+
* Cobrança automatizada que produz esse tipo de texto sem revisão humana é risco
|
|
18
|
+
* jurídico e de relacionamento — a etapa mais dura da régua padrão escala para
|
|
19
|
+
* uma pessoa em vez de escrever por conta própria.
|
|
20
|
+
*/
|
|
21
|
+
const DEFAULT_TEMPLATES = {
|
|
22
|
+
'collection.reminder': {
|
|
23
|
+
subject: 'Lembrete: vencimento em {{dueDate}}',
|
|
24
|
+
body: 'Olá, {{clientName}}.\n\n' +
|
|
25
|
+
'Passando para lembrar que o valor de {{outstandingAmount}} vence em {{dueDate}}.\n' +
|
|
26
|
+
'Referência: {{reference}}.\n\n' +
|
|
27
|
+
'Se já tiver pago, desconsidere esta mensagem.\n\n{{officeName}}',
|
|
28
|
+
},
|
|
29
|
+
'collection.due': {
|
|
30
|
+
subject: 'Vence hoje: {{outstandingAmount}}',
|
|
31
|
+
body: 'Olá, {{clientName}}.\n\n' +
|
|
32
|
+
'O valor de {{outstandingAmount}} vence hoje ({{dueDate}}).\n' +
|
|
33
|
+
'Referência: {{reference}}.\n\n' +
|
|
34
|
+
'Se já tiver pago, desconsidere esta mensagem.\n\n{{officeName}}',
|
|
35
|
+
},
|
|
36
|
+
'collection.overdue_soft': {
|
|
37
|
+
subject: 'Pendência em aberto — {{reference}}',
|
|
38
|
+
body: 'Olá, {{clientName}}.\n\n' +
|
|
39
|
+
'Consta em aberto o valor de {{outstandingAmount}}, com vencimento em {{dueDate}}.\n' +
|
|
40
|
+
'Se o pagamento já foi feito, por favor nos avise para darmos baixa.\n\n' +
|
|
41
|
+
'Qualquer dúvida, estamos à disposição.\n\n{{officeName}}',
|
|
42
|
+
},
|
|
43
|
+
'collection.overdue': {
|
|
44
|
+
subject: 'Pendência em aberto desde {{dueDate}}',
|
|
45
|
+
body: 'Olá, {{clientName}}.\n\n' +
|
|
46
|
+
'O valor de {{outstandingAmount}}, vencido em {{dueDate}}, segue em aberto.\n' +
|
|
47
|
+
'Referência: {{reference}}.\n\n' +
|
|
48
|
+
'Pedimos que entre em contato para regularizarmos ou combinarmos a melhor forma.\n\n' +
|
|
49
|
+
'{{officeName}}',
|
|
50
|
+
},
|
|
51
|
+
// Interno: nunca vai ao cliente. Ver a nota em `policy.ts`.
|
|
52
|
+
'collection.escalate': {
|
|
53
|
+
subject: 'Cobrança escalada para atendimento humano — {{clientName}}',
|
|
54
|
+
body: 'A régua automática chegou ao fim para {{clientName}} ({{reference}}), com ' +
|
|
55
|
+
'{{outstandingAmount}} em aberto desde {{dueDate}}. A partir daqui a condução é humana.',
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
exports.DEFAULT_TEMPLATES = DEFAULT_TEMPLATES;
|
|
59
|
+
const TONE_FALLBACK = {
|
|
60
|
+
reminder: 'collection.reminder',
|
|
61
|
+
due_notice: 'collection.due',
|
|
62
|
+
friendly_collection: 'collection.overdue_soft',
|
|
63
|
+
overdue_collection: 'collection.overdue',
|
|
64
|
+
human_escalation: 'collection.escalate',
|
|
65
|
+
};
|
|
66
|
+
/** Resolve o template; cai no padrão do tom quando o tenant não tem o seu. */
|
|
67
|
+
function resolveTemplate(templateKey, tone, overrides) {
|
|
68
|
+
return (overrides?.[templateKey] ??
|
|
69
|
+
DEFAULT_TEMPLATES[templateKey] ??
|
|
70
|
+
DEFAULT_TEMPLATES[TONE_FALLBACK[tone]]);
|
|
71
|
+
}
|
|
72
|
+
/** Substitui `{{var}}` pelas variáveis da allowlist. O resto fica literal. */
|
|
73
|
+
function renderTemplate(text, vars) {
|
|
74
|
+
return text.replace(/\{\{\s*([a-zA-Z]+)\s*\}\}/g, (whole, name) => exports.TEMPLATE_VARIABLES.includes(name)
|
|
75
|
+
? String(vars[name] ?? '')
|
|
76
|
+
: whole);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/collection/template.ts"],"names":[],"mappings":";;;AA6FA,0CAUC;AAGD,wCAMC;AA5FY,QAAA,kBAAkB,GAAoC;IACjE,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,mBAAmB;IACnB,WAAW;CACZ,CAAC;AAOF;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAuC;IAC5D,qBAAqB,EAAE;QACrB,OAAO,EAAE,qCAAqC;QAC9C,IAAI,EACF,0BAA0B;YAC1B,oFAAoF;YACpF,gCAAgC;YAChC,iEAAiE;KACpE;IACD,gBAAgB,EAAE;QAChB,OAAO,EAAE,mCAAmC;QAC5C,IAAI,EACF,0BAA0B;YAC1B,8DAA8D;YAC9D,gCAAgC;YAChC,iEAAiE;KACpE;IACD,yBAAyB,EAAE;QACzB,OAAO,EAAE,qCAAqC;QAC9C,IAAI,EACF,0BAA0B;YAC1B,qFAAqF;YACrF,yEAAyE;YACzE,0DAA0D;KAC7D;IACD,oBAAoB,EAAE;QACpB,OAAO,EAAE,uCAAuC;QAChD,IAAI,EACF,0BAA0B;YAC1B,8EAA8E;YAC9E,gCAAgC;YAChC,qFAAqF;YACrF,gBAAgB;KACnB;IACD,4DAA4D;IAC5D,qBAAqB,EAAE;QACrB,OAAO,EAAE,4DAA4D;QACrE,IAAI,EACF,4EAA4E;YAC5E,wFAAwF;KAC3F;CACF,CAAC;AAgCO,8CAAiB;AA9B1B,MAAM,aAAa,GAA6B;IAC9C,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE,gBAAgB;IAC5B,mBAAmB,EAAE,yBAAyB;IAC9C,kBAAkB,EAAE,oBAAoB;IACxC,gBAAgB,EAAE,qBAAqB;CACxC,CAAC;AAEF,8EAA8E;AAC9E,SAAgB,eAAe,CAC7B,WAAmB,EACnB,IAAc,EACd,SAA8C;IAE9C,OAAO,CACL,SAAS,EAAE,CAAC,WAAW,CAAC;QACxB,iBAAiB,CAAC,WAAW,CAAC;QAC9B,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAE,CACxC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAgB,cAAc,CAAC,IAAY,EAAE,IAAkB;IAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CACvE,0BAAwC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAA0B,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC,CAAC,KAAK,CACV,CAAC;AACJ,CAAC"}
|