@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,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Régua padrão — sugestão, não regra do produto.
|
|
3
|
+
*
|
|
4
|
+
* Para a última etapa o canal é `notification`: escalar para humano é um evento
|
|
5
|
+
* INTERNO. Mandar ao cliente uma mensagem dizendo que o caso foi escalado seria
|
|
6
|
+
* transformar procedimento interno em pressão, e é exatamente onde cobrança
|
|
7
|
+
* automatizada vira problema jurídico e de relacionamento.
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_COLLECTION_STEPS = [
|
|
10
|
+
{
|
|
11
|
+
key: 'D-3',
|
|
12
|
+
timing: 'before_due',
|
|
13
|
+
offsetDays: 3,
|
|
14
|
+
channel: 'email',
|
|
15
|
+
tone: 'reminder',
|
|
16
|
+
templateKey: 'collection.reminder',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
key: 'D0',
|
|
20
|
+
timing: 'on_due_date',
|
|
21
|
+
offsetDays: 0,
|
|
22
|
+
channel: 'email',
|
|
23
|
+
tone: 'due_notice',
|
|
24
|
+
templateKey: 'collection.due',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
key: 'D+3',
|
|
28
|
+
timing: 'after_due',
|
|
29
|
+
offsetDays: 3,
|
|
30
|
+
channel: 'email',
|
|
31
|
+
tone: 'friendly_collection',
|
|
32
|
+
templateKey: 'collection.overdue_soft',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
key: 'D+7',
|
|
36
|
+
timing: 'after_due',
|
|
37
|
+
offsetDays: 7,
|
|
38
|
+
channel: 'email',
|
|
39
|
+
tone: 'friendly_collection',
|
|
40
|
+
templateKey: 'collection.overdue_soft',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
key: 'D+15',
|
|
44
|
+
timing: 'after_due',
|
|
45
|
+
offsetDays: 15,
|
|
46
|
+
channel: 'email',
|
|
47
|
+
tone: 'overdue_collection',
|
|
48
|
+
templateKey: 'collection.overdue',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
key: 'D+30',
|
|
52
|
+
timing: 'after_due',
|
|
53
|
+
offsetDays: 30,
|
|
54
|
+
channel: 'notification',
|
|
55
|
+
tone: 'human_escalation',
|
|
56
|
+
templateKey: 'collection.escalate',
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
export const DEFAULT_POLICY = {
|
|
60
|
+
id: null,
|
|
61
|
+
name: 'Régua padrão',
|
|
62
|
+
steps: [...DEFAULT_COLLECTION_STEPS],
|
|
63
|
+
active: true,
|
|
64
|
+
};
|
|
65
|
+
function addDays(isoDate, days) {
|
|
66
|
+
const d = new Date(`${isoDate}T00:00:00Z`);
|
|
67
|
+
d.setUTCDate(d.getUTCDate() + days);
|
|
68
|
+
return d.toISOString().slice(0, 10);
|
|
69
|
+
}
|
|
70
|
+
/** Data em que a etapa deve acontecer, dado o vencimento. */
|
|
71
|
+
export function scheduledDateFor(step, dueDate) {
|
|
72
|
+
const offset = step.timing === 'before_due'
|
|
73
|
+
? -Math.abs(step.offsetDays)
|
|
74
|
+
: step.timing === 'after_due'
|
|
75
|
+
? Math.abs(step.offsetDays)
|
|
76
|
+
: 0;
|
|
77
|
+
return addDays(dueDate, offset);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Etapas já devidas em `today` e ainda não registradas.
|
|
81
|
+
*
|
|
82
|
+
* Pura e determinística: recebe o que já foi executado e devolve o que falta.
|
|
83
|
+
* Nenhum I/O — é o que permite testar a régua inteira sem banco nem provider.
|
|
84
|
+
*/
|
|
85
|
+
export function dueSteps(policy, dueDate, today, alreadyHandled) {
|
|
86
|
+
if (!policy.active)
|
|
87
|
+
return [];
|
|
88
|
+
return policy.steps
|
|
89
|
+
.filter((s) => s.active !== false)
|
|
90
|
+
.filter((s) => !alreadyHandled.has(s.key))
|
|
91
|
+
.map((step) => ({ step, scheduledFor: scheduledDateFor(step, dueDate) }))
|
|
92
|
+
.filter((s) => s.scheduledFor <= today)
|
|
93
|
+
.sort((a, b) => a.scheduledFor.localeCompare(b.scheduledFor));
|
|
94
|
+
}
|
|
95
|
+
/** Validação de política vinda do banco — protege contra jsonb malformado. */
|
|
96
|
+
export function parsePolicySteps(raw) {
|
|
97
|
+
if (!Array.isArray(raw))
|
|
98
|
+
return [];
|
|
99
|
+
const timings = ['before_due', 'on_due_date', 'after_due'];
|
|
100
|
+
const channels = ['email', 'whatsapp', 'notification'];
|
|
101
|
+
const tones = [
|
|
102
|
+
'reminder',
|
|
103
|
+
'due_notice',
|
|
104
|
+
'friendly_collection',
|
|
105
|
+
'overdue_collection',
|
|
106
|
+
'human_escalation',
|
|
107
|
+
];
|
|
108
|
+
const seen = new Set();
|
|
109
|
+
const steps = [];
|
|
110
|
+
for (const item of raw) {
|
|
111
|
+
if (!item || typeof item !== 'object')
|
|
112
|
+
continue;
|
|
113
|
+
const s = item;
|
|
114
|
+
const key = typeof s.key === 'string' ? s.key : null;
|
|
115
|
+
// Chave duplicada arruinaria a idempotência: duas etapas com a mesma chave
|
|
116
|
+
// se anulam no `alreadyHandled` e uma delas nunca rodaria.
|
|
117
|
+
if (!key || seen.has(key))
|
|
118
|
+
continue;
|
|
119
|
+
if (!timings.includes(s.timing))
|
|
120
|
+
continue;
|
|
121
|
+
if (!channels.includes(s.channel))
|
|
122
|
+
continue;
|
|
123
|
+
if (!tones.includes(s.tone))
|
|
124
|
+
continue;
|
|
125
|
+
const offset = Number(s.offsetDays);
|
|
126
|
+
if (!Number.isInteger(offset) || offset < 0 || offset > 365)
|
|
127
|
+
continue;
|
|
128
|
+
seen.add(key);
|
|
129
|
+
steps.push({
|
|
130
|
+
key,
|
|
131
|
+
timing: s.timing,
|
|
132
|
+
offsetDays: offset,
|
|
133
|
+
channel: s.channel,
|
|
134
|
+
tone: s.tone,
|
|
135
|
+
templateKey: typeof s.templateKey === 'string' ? s.templateKey : 'collection.reminder',
|
|
136
|
+
active: s.active !== false,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return steps;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/collection/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { Tx } from '../db/client.js';
|
|
2
|
+
import type { CollectionChannelKey } from './channel.js';
|
|
3
|
+
import { type CollectionPolicy } from './policy.js';
|
|
4
|
+
/**
|
|
5
|
+
* Persistência do motor de cobrança sobre `dunning_event` (estendida na 0028
|
|
6
|
+
* para ancorar no Receivable) e `dunning_rule` (política por tenant).
|
|
7
|
+
*
|
|
8
|
+
* Tenant e cliente são cortados pela RLS; nenhuma query filtra na mão.
|
|
9
|
+
*/
|
|
10
|
+
export type CollectionStatus = 'scheduled' | 'sent' | 'failed' | 'canceled' | 'escalated';
|
|
11
|
+
export type CollectionCloseReason = 'paid' | 'canceled' | 'rule_disabled' | 'permanent_failure' | 'escalated' | 'no_contact_data' | 'opted_out' | 'consent_unknown';
|
|
12
|
+
export interface CollectionActionRecord {
|
|
13
|
+
id: string;
|
|
14
|
+
receivableId: string | null;
|
|
15
|
+
clientId: string | null;
|
|
16
|
+
clientName: string | null;
|
|
17
|
+
stepKey: string;
|
|
18
|
+
channel: CollectionChannelKey;
|
|
19
|
+
template: string | null;
|
|
20
|
+
status: CollectionStatus;
|
|
21
|
+
scheduledFor: string | null;
|
|
22
|
+
attempts: number;
|
|
23
|
+
lastError: string | null;
|
|
24
|
+
sentAt: string | null;
|
|
25
|
+
closedAt: string | null;
|
|
26
|
+
closedReason: CollectionCloseReason | null;
|
|
27
|
+
recipientRef: string | null;
|
|
28
|
+
amountAtSend: number | null;
|
|
29
|
+
createdAt: string;
|
|
30
|
+
}
|
|
31
|
+
/** Política ativa do tenant; cai no padrão do produto quando não há nenhuma. */
|
|
32
|
+
export declare function getCollectionPolicy(tx: Tx): Promise<CollectionPolicy>;
|
|
33
|
+
export declare function upsertCollectionPolicy(tx: Tx, input: {
|
|
34
|
+
name: string;
|
|
35
|
+
steps: unknown;
|
|
36
|
+
active?: boolean;
|
|
37
|
+
}): Promise<CollectionPolicy>;
|
|
38
|
+
/**
|
|
39
|
+
* Agenda uma etapa. Idempotente pelo índice único parcial
|
|
40
|
+
* `(tenant, receivable, step_key)` — o `ON CONFLICT DO NOTHING` é o que
|
|
41
|
+
* transforma job repetido, retry, restart de worker e webhook duplicado em
|
|
42
|
+
* uma única ação lógica.
|
|
43
|
+
*/
|
|
44
|
+
export declare function scheduleAction(tx: Tx, input: {
|
|
45
|
+
receivableId: string;
|
|
46
|
+
stepKey: string;
|
|
47
|
+
channel: CollectionChannelKey;
|
|
48
|
+
template: string;
|
|
49
|
+
scheduledFor: string;
|
|
50
|
+
}): Promise<CollectionActionRecord | null>;
|
|
51
|
+
export declare function getAction(tx: Tx, id: string): Promise<CollectionActionRecord>;
|
|
52
|
+
export interface ActionFilter {
|
|
53
|
+
status?: CollectionStatus;
|
|
54
|
+
receivableId?: string;
|
|
55
|
+
clientId?: string;
|
|
56
|
+
/** Só o que já deveria ter saído. */
|
|
57
|
+
dueOnly?: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Data de referência do "já deveria ter saído".
|
|
60
|
+
*
|
|
61
|
+
* Sem isto a consulta usava `CURRENT_DATE` do banco, e o `today` que o motor
|
|
62
|
+
* recebe valia só para o planejamento — a execução ignorava. O ciclo deixava
|
|
63
|
+
* de ser determinístico: reprocessar uma data passada agendava as etapas mas
|
|
64
|
+
* não executava nenhuma.
|
|
65
|
+
*/
|
|
66
|
+
dueUntil?: string;
|
|
67
|
+
limit?: number;
|
|
68
|
+
}
|
|
69
|
+
export declare function listActions(tx: Tx, filter?: ActionFilter): Promise<CollectionActionRecord[]>;
|
|
70
|
+
/** Etapas já registradas para um recebível — alimenta a idempotência da régua. */
|
|
71
|
+
export declare function handledStepKeys(tx: Tx, receivableId: string): Promise<Set<string>>;
|
|
72
|
+
/**
|
|
73
|
+
* Assenta o envio.
|
|
74
|
+
*
|
|
75
|
+
* O identificador do provider vai para `provider_ref` (migration 0038). Antes
|
|
76
|
+
* ele era espremido em `template` sob COALESCE: como `scheduleAction` sempre
|
|
77
|
+
* grava o template, o id do provider era descartado em silêncio — e, se o
|
|
78
|
+
* template estivesse nulo, ocupava o lugar do nome e corrompia o relatório.
|
|
79
|
+
*
|
|
80
|
+
* Nunca deu problema porque o adapter de e-mail não devolve identificador.
|
|
81
|
+
* WhatsApp e SMS devolvem sempre, e o webhook de entrega chega trazendo APENAS
|
|
82
|
+
* esse id: sem coluna própria e indexada, todo status de entrega se perderia.
|
|
83
|
+
*/
|
|
84
|
+
export declare function markSent(tx: Tx, id: string, input: {
|
|
85
|
+
recipientRef: string;
|
|
86
|
+
amount: number;
|
|
87
|
+
providerRef?: string;
|
|
88
|
+
/** Chave do motor compartilhado. Ausente no caminho legado. */
|
|
89
|
+
idempotencyKey?: string;
|
|
90
|
+
}): Promise<void>;
|
|
91
|
+
export declare function markFailed(tx: Tx, id: string, input: {
|
|
92
|
+
error: string;
|
|
93
|
+
permanent: boolean;
|
|
94
|
+
}): Promise<void>;
|
|
95
|
+
export declare function markEscalated(tx: Tx, id: string, reason?: CollectionCloseReason): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* Cancela ações ainda não enviadas de um recebível.
|
|
98
|
+
*
|
|
99
|
+
* Só toca `scheduled`: o que já saiu é histórico e não se apaga. Retorna quantas
|
|
100
|
+
* foram canceladas para o job poder relatar honestamente o que aconteceu.
|
|
101
|
+
*/
|
|
102
|
+
export declare function cancelPendingActions(tx: Tx, receivableId: string, reason: CollectionCloseReason): Promise<number>;
|
|
103
|
+
export interface CollectionMetrics {
|
|
104
|
+
scheduled: number;
|
|
105
|
+
sent: number;
|
|
106
|
+
failed: number;
|
|
107
|
+
canceled: number;
|
|
108
|
+
stoppedByPayment: number;
|
|
109
|
+
escalated: number;
|
|
110
|
+
/** Escalados por falta de canal — problema de cadastro, não de entrega. */
|
|
111
|
+
noContactData: number;
|
|
112
|
+
dueToday: number;
|
|
113
|
+
/**
|
|
114
|
+
* Valor de recebíveis que foram pagos DEPOIS de pelo menos uma cobrança ter
|
|
115
|
+
* saído. É correlação, não causa: o nome diz "após", nunca "por causa de".
|
|
116
|
+
*/
|
|
117
|
+
amountPaidAfterCollection: number;
|
|
118
|
+
}
|
|
119
|
+
export declare function collectionMetrics(tx: Tx): Promise<CollectionMetrics>;
|
|
120
|
+
/** Linha do tempo de um cliente: recebíveis, pagamentos e cobranças. */
|
|
121
|
+
export interface TimelineEntry {
|
|
122
|
+
at: string;
|
|
123
|
+
kind: 'receivable_created' | 'payment' | 'collection_sent' | 'collection_canceled' | 'collection_escalated';
|
|
124
|
+
detail: string;
|
|
125
|
+
amount: number | null;
|
|
126
|
+
receivableId: string | null;
|
|
127
|
+
}
|
|
128
|
+
export declare function clientTimeline(tx: Tx, clientId: string, limit?: number): Promise<TimelineEntry[]>;
|
|
129
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/collection/repository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAoC,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEtF;;;;;GAKG;AAEH,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;AAC1F,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN,UAAU,GACV,eAAe,GACf,mBAAmB,GACnB,WAAW,GAIX,iBAAiB,GAKjB,WAAW,GAGX,iBAAiB,CAAC;AAEtB,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,gBAAgB,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC3C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAwDD,gFAAgF;AAChF,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAa3E;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACxD,OAAO,CAAC,gBAAgB,CAAC,CAqB3B;AAID;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAcxC;AAED,wBAAsB,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAKnF;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAC/B,EAAE,EAAE,EAAE,EACN,MAAM,GAAE,YAAiB,GACxB,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAiBnC;AAED,kFAAkF;AAClF,wBAAsB,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAKxF;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;IACL,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GACA,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,MAAM,EACV,MAAM,GAAE,qBAAmC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,EAAE,EACN,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAQjB;AAID,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4C1E;AAED,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EACA,oBAAoB,GACpB,SAAS,GACT,iBAAiB,GACjB,qBAAqB,GACrB,sBAAsB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAM,GACV,OAAO,CAAC,aAAa,EAAE,CAAC,CAuC1B"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { uuidv7 } from '@baruk/shared';
|
|
2
|
+
import { DEFAULT_POLICY, parsePolicySteps } from './policy.js';
|
|
3
|
+
const iso = (d) => (d ? d.toISOString().slice(0, 10) : null);
|
|
4
|
+
function mapAction(r) {
|
|
5
|
+
return {
|
|
6
|
+
id: r.id,
|
|
7
|
+
receivableId: r.receivable_id,
|
|
8
|
+
clientId: r.client_id,
|
|
9
|
+
clientName: r.client_name,
|
|
10
|
+
stepKey: r.step_key,
|
|
11
|
+
channel: r.channel,
|
|
12
|
+
template: r.template,
|
|
13
|
+
status: r.status,
|
|
14
|
+
scheduledFor: iso(r.scheduled_for),
|
|
15
|
+
attempts: r.attempts,
|
|
16
|
+
lastError: r.last_error,
|
|
17
|
+
sentAt: r.sent_at?.toISOString() ?? null,
|
|
18
|
+
closedAt: r.closed_at?.toISOString() ?? null,
|
|
19
|
+
closedReason: r.closed_reason,
|
|
20
|
+
recipientRef: r.recipient_ref,
|
|
21
|
+
amountAtSend: r.amount_at_send === null ? null : Number(r.amount_at_send),
|
|
22
|
+
createdAt: r.created_at.toISOString(),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const SELECT_ACTION = `
|
|
26
|
+
SELECT d.id, d.receivable_id, r.client_id, c.display_name AS client_name, d.step_key,
|
|
27
|
+
d.channel, d.template, d.status, d.scheduled_for, d.attempts, d.last_error,
|
|
28
|
+
d.sent_at, d.closed_at, d.closed_reason, d.recipient_ref, d.amount_at_send, d.created_at
|
|
29
|
+
FROM dunning_event d
|
|
30
|
+
LEFT JOIN receivable r ON r.id = d.receivable_id
|
|
31
|
+
LEFT JOIN client c ON c.id = r.client_id AND c.deleted_at IS NULL`;
|
|
32
|
+
// ── Política ────────────────────────────────────────────────────────────────
|
|
33
|
+
/** Política ativa do tenant; cai no padrão do produto quando não há nenhuma. */
|
|
34
|
+
export async function getCollectionPolicy(tx) {
|
|
35
|
+
const rows = await tx `
|
|
36
|
+
SELECT id, name, steps, active FROM dunning_rule
|
|
37
|
+
WHERE active AND is_default
|
|
38
|
+
ORDER BY created_at LIMIT 1
|
|
39
|
+
`;
|
|
40
|
+
const row = rows[0];
|
|
41
|
+
if (!row)
|
|
42
|
+
return DEFAULT_POLICY;
|
|
43
|
+
const steps = parsePolicySteps(row.steps);
|
|
44
|
+
// Política cadastrada mas ilegível não pode virar "sem cobrança nenhuma"
|
|
45
|
+
// silenciosamente: melhor cair no padrão e deixar a régua rodando.
|
|
46
|
+
if (steps.length === 0)
|
|
47
|
+
return { ...DEFAULT_POLICY, id: row.id, name: row.name };
|
|
48
|
+
return { id: row.id, name: row.name, steps, active: row.active };
|
|
49
|
+
}
|
|
50
|
+
export async function upsertCollectionPolicy(tx, input) {
|
|
51
|
+
const steps = parsePolicySteps(input.steps);
|
|
52
|
+
const existing = await tx `
|
|
53
|
+
SELECT id FROM dunning_rule WHERE is_default LIMIT 1
|
|
54
|
+
`;
|
|
55
|
+
if (existing[0]) {
|
|
56
|
+
await tx `
|
|
57
|
+
UPDATE dunning_rule
|
|
58
|
+
SET name = ${input.name}, steps = ${tx.json(steps)},
|
|
59
|
+
active = ${input.active ?? true}, updated_at = now()
|
|
60
|
+
WHERE id = ${existing[0].id}
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
await tx `
|
|
65
|
+
INSERT INTO dunning_rule (id, tenant_id, name, steps, active, is_default)
|
|
66
|
+
VALUES (${uuidv7()},
|
|
67
|
+
(NULLIF(current_setting('app.current_tenant', true), ''))::uuid,
|
|
68
|
+
${input.name}, ${tx.json(steps)}, ${input.active ?? true}, true)
|
|
69
|
+
`;
|
|
70
|
+
}
|
|
71
|
+
return getCollectionPolicy(tx);
|
|
72
|
+
}
|
|
73
|
+
// ── Ações ───────────────────────────────────────────────────────────────────
|
|
74
|
+
/**
|
|
75
|
+
* Agenda uma etapa. Idempotente pelo índice único parcial
|
|
76
|
+
* `(tenant, receivable, step_key)` — o `ON CONFLICT DO NOTHING` é o que
|
|
77
|
+
* transforma job repetido, retry, restart de worker e webhook duplicado em
|
|
78
|
+
* uma única ação lógica.
|
|
79
|
+
*/
|
|
80
|
+
export async function scheduleAction(tx, input) {
|
|
81
|
+
const rows = await tx `
|
|
82
|
+
INSERT INTO dunning_event (id, tenant_id, receivable_id, step_key, channel, template,
|
|
83
|
+
status, scheduled_for)
|
|
84
|
+
VALUES (${uuidv7()},
|
|
85
|
+
(NULLIF(current_setting('app.current_tenant', true), ''))::uuid,
|
|
86
|
+
${input.receivableId}, ${input.stepKey}, ${input.channel}, ${input.template},
|
|
87
|
+
'scheduled', ${input.scheduledFor})
|
|
88
|
+
ON CONFLICT (tenant_id, receivable_id, step_key) WHERE receivable_id IS NOT NULL
|
|
89
|
+
DO NOTHING
|
|
90
|
+
RETURNING id
|
|
91
|
+
`;
|
|
92
|
+
if (!rows[0])
|
|
93
|
+
return null;
|
|
94
|
+
return getAction(tx, rows[0].id);
|
|
95
|
+
}
|
|
96
|
+
export async function getAction(tx, id) {
|
|
97
|
+
const rows = await tx `${tx.unsafe(SELECT_ACTION)} WHERE d.id = ${id}`;
|
|
98
|
+
const row = rows[0];
|
|
99
|
+
if (!row)
|
|
100
|
+
throw new Error('Ação de cobrança não encontrada');
|
|
101
|
+
return mapAction(row);
|
|
102
|
+
}
|
|
103
|
+
export async function listActions(tx, filter = {}) {
|
|
104
|
+
const limit = Math.min(Math.max(filter.limit ?? 100, 1), 500);
|
|
105
|
+
const rows = await tx `
|
|
106
|
+
${tx.unsafe(SELECT_ACTION)}
|
|
107
|
+
WHERE d.receivable_id IS NOT NULL
|
|
108
|
+
${filter.status ? tx `AND d.status = ${filter.status}` : tx ``}
|
|
109
|
+
${filter.receivableId ? tx `AND d.receivable_id = ${filter.receivableId}` : tx ``}
|
|
110
|
+
${filter.clientId ? tx `AND r.client_id = ${filter.clientId}` : tx ``}
|
|
111
|
+
${filter.dueOnly
|
|
112
|
+
? tx `AND d.status = 'scheduled' AND d.scheduled_for <= ${filter.dueUntil ?? tx `CURRENT_DATE`}`
|
|
113
|
+
: tx ``}
|
|
114
|
+
ORDER BY d.scheduled_for NULLS LAST, d.created_at
|
|
115
|
+
LIMIT ${limit}
|
|
116
|
+
`;
|
|
117
|
+
return rows.map(mapAction);
|
|
118
|
+
}
|
|
119
|
+
/** Etapas já registradas para um recebível — alimenta a idempotência da régua. */
|
|
120
|
+
export async function handledStepKeys(tx, receivableId) {
|
|
121
|
+
const rows = await tx `
|
|
122
|
+
SELECT step_key FROM dunning_event WHERE receivable_id = ${receivableId}
|
|
123
|
+
`;
|
|
124
|
+
return new Set(rows.map((r) => r.step_key));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Assenta o envio.
|
|
128
|
+
*
|
|
129
|
+
* O identificador do provider vai para `provider_ref` (migration 0038). Antes
|
|
130
|
+
* ele era espremido em `template` sob COALESCE: como `scheduleAction` sempre
|
|
131
|
+
* grava o template, o id do provider era descartado em silêncio — e, se o
|
|
132
|
+
* template estivesse nulo, ocupava o lugar do nome e corrompia o relatório.
|
|
133
|
+
*
|
|
134
|
+
* Nunca deu problema porque o adapter de e-mail não devolve identificador.
|
|
135
|
+
* WhatsApp e SMS devolvem sempre, e o webhook de entrega chega trazendo APENAS
|
|
136
|
+
* esse id: sem coluna própria e indexada, todo status de entrega se perderia.
|
|
137
|
+
*/
|
|
138
|
+
export async function markSent(tx, id, input) {
|
|
139
|
+
await tx `
|
|
140
|
+
UPDATE dunning_event
|
|
141
|
+
SET status = 'sent', sent_at = now(), attempts = attempts + 1,
|
|
142
|
+
recipient_ref = ${input.recipientRef}, amount_at_send = ${input.amount},
|
|
143
|
+
last_error = NULL, closed_at = now(),
|
|
144
|
+
provider_ref = COALESCE(${input.providerRef ?? null}, provider_ref),
|
|
145
|
+
idempotency_key = COALESCE(${input.idempotencyKey ?? null}, idempotency_key)
|
|
146
|
+
WHERE id = ${id}
|
|
147
|
+
`;
|
|
148
|
+
}
|
|
149
|
+
export async function markFailed(tx, id, input) {
|
|
150
|
+
await tx `
|
|
151
|
+
UPDATE dunning_event
|
|
152
|
+
SET status = ${input.permanent ? 'failed' : 'scheduled'},
|
|
153
|
+
attempts = attempts + 1,
|
|
154
|
+
last_error = ${input.error.slice(0, 300)},
|
|
155
|
+
closed_at = ${input.permanent ? tx `now()` : null},
|
|
156
|
+
closed_reason = ${input.permanent ? 'permanent_failure' : null}
|
|
157
|
+
WHERE id = ${id}
|
|
158
|
+
`;
|
|
159
|
+
}
|
|
160
|
+
export async function markEscalated(tx, id, reason = 'escalated') {
|
|
161
|
+
await tx `
|
|
162
|
+
UPDATE dunning_event
|
|
163
|
+
SET status = 'escalated', closed_at = now(), closed_reason = ${reason}
|
|
164
|
+
WHERE id = ${id}
|
|
165
|
+
`;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Cancela ações ainda não enviadas de um recebível.
|
|
169
|
+
*
|
|
170
|
+
* Só toca `scheduled`: o que já saiu é histórico e não se apaga. Retorna quantas
|
|
171
|
+
* foram canceladas para o job poder relatar honestamente o que aconteceu.
|
|
172
|
+
*/
|
|
173
|
+
export async function cancelPendingActions(tx, receivableId, reason) {
|
|
174
|
+
const rows = await tx `
|
|
175
|
+
UPDATE dunning_event
|
|
176
|
+
SET status = 'canceled', closed_at = now(), closed_reason = ${reason}
|
|
177
|
+
WHERE receivable_id = ${receivableId} AND status = 'scheduled'
|
|
178
|
+
RETURNING id
|
|
179
|
+
`;
|
|
180
|
+
return rows.length;
|
|
181
|
+
}
|
|
182
|
+
export async function collectionMetrics(tx) {
|
|
183
|
+
const [m] = await tx `
|
|
184
|
+
SELECT
|
|
185
|
+
count(*) FILTER (WHERE status = 'scheduled')::int AS scheduled,
|
|
186
|
+
count(*) FILTER (WHERE status = 'sent')::int AS sent,
|
|
187
|
+
count(*) FILTER (WHERE status = 'failed')::int AS failed,
|
|
188
|
+
count(*) FILTER (WHERE status = 'canceled')::int AS canceled,
|
|
189
|
+
count(*) FILTER (WHERE status = 'canceled' AND closed_reason = 'paid')::int AS stopped_by_payment,
|
|
190
|
+
count(*) FILTER (WHERE status = 'escalated')::int AS escalated,
|
|
191
|
+
count(*) FILTER (WHERE closed_reason = 'no_contact_data')::int AS no_contact_data,
|
|
192
|
+
count(*) FILTER (WHERE status = 'scheduled' AND scheduled_for <= CURRENT_DATE)::int AS due_today
|
|
193
|
+
FROM dunning_event WHERE receivable_id IS NOT NULL
|
|
194
|
+
`;
|
|
195
|
+
const [p] = await tx `
|
|
196
|
+
SELECT COALESCE(sum(r.amount), 0) AS amount
|
|
197
|
+
FROM receivable r
|
|
198
|
+
WHERE r.status = 'paid'
|
|
199
|
+
AND EXISTS (SELECT 1 FROM dunning_event d
|
|
200
|
+
WHERE d.receivable_id = r.id AND d.status = 'sent')
|
|
201
|
+
`;
|
|
202
|
+
return {
|
|
203
|
+
scheduled: m.scheduled,
|
|
204
|
+
sent: m.sent,
|
|
205
|
+
failed: m.failed,
|
|
206
|
+
canceled: m.canceled,
|
|
207
|
+
stoppedByPayment: m.stopped_by_payment,
|
|
208
|
+
escalated: m.escalated,
|
|
209
|
+
noContactData: m.no_contact_data,
|
|
210
|
+
dueToday: m.due_today,
|
|
211
|
+
amountPaidAfterCollection: Number(p.amount),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
export async function clientTimeline(tx, clientId, limit = 100) {
|
|
215
|
+
const rows = await tx `
|
|
216
|
+
SELECT created_at AS at, 'receivable_created' AS kind,
|
|
217
|
+
COALESCE(competence, 'avulso') AS detail, amount, id AS receivable_id
|
|
218
|
+
FROM receivable WHERE client_id = ${clientId} AND deleted_at IS NULL
|
|
219
|
+
UNION ALL
|
|
220
|
+
SELECT p.paid_at, 'payment', p.method, p.amount, p.receivable_id
|
|
221
|
+
FROM payment p JOIN receivable r ON r.id = p.receivable_id
|
|
222
|
+
WHERE r.client_id = ${clientId} AND p.status = 'confirmed'
|
|
223
|
+
UNION ALL
|
|
224
|
+
SELECT d.sent_at, 'collection_sent', d.step_key || ' · ' || d.channel, d.amount_at_send, d.receivable_id
|
|
225
|
+
FROM dunning_event d JOIN receivable r ON r.id = d.receivable_id
|
|
226
|
+
WHERE r.client_id = ${clientId} AND d.status = 'sent' AND d.sent_at IS NOT NULL
|
|
227
|
+
UNION ALL
|
|
228
|
+
SELECT d.closed_at, 'collection_canceled', d.step_key || ' · ' || COALESCE(d.closed_reason, '-'), NULL, d.receivable_id
|
|
229
|
+
FROM dunning_event d JOIN receivable r ON r.id = d.receivable_id
|
|
230
|
+
WHERE r.client_id = ${clientId} AND d.status = 'canceled' AND d.closed_at IS NOT NULL
|
|
231
|
+
UNION ALL
|
|
232
|
+
SELECT d.closed_at, 'collection_escalated', d.step_key, NULL, d.receivable_id
|
|
233
|
+
FROM dunning_event d JOIN receivable r ON r.id = d.receivable_id
|
|
234
|
+
WHERE r.client_id = ${clientId} AND d.status = 'escalated' AND d.closed_at IS NOT NULL
|
|
235
|
+
ORDER BY at DESC
|
|
236
|
+
LIMIT ${limit}
|
|
237
|
+
`;
|
|
238
|
+
return rows.map((r) => ({
|
|
239
|
+
at: r.at.toISOString(),
|
|
240
|
+
kind: r.kind,
|
|
241
|
+
detail: r.detail,
|
|
242
|
+
amount: r.amount === null ? null : Number(r.amount),
|
|
243
|
+
receivableId: r.receivable_id,
|
|
244
|
+
}));
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/collection/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAGvC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAyB,MAAM,aAAa,CAAC;AAqEtF,MAAM,GAAG,GAAG,CAAC,CAAc,EAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAEzF,SAAS,SAAS,CAAC,CAAY;IAC7B,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,aAAa;QAC7B,QAAQ,EAAE,CAAC,CAAC,SAAS;QACrB,UAAU,EAAE,CAAC,CAAC,WAAW;QACzB,OAAO,EAAE,CAAC,CAAC,QAAQ;QACnB,OAAO,EAAE,CAAC,CAAC,OAA+B;QAC1C,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC;QAClC,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,SAAS,EAAE,CAAC,CAAC,UAAU;QACvB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,IAAI;QACxC,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,IAAI;QAC5C,YAAY,EAAE,CAAC,CAAC,aAAa;QAC7B,YAAY,EAAE,CAAC,CAAC,aAAa;QAC7B,YAAY,EAAE,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;QACzE,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG;;;;;;sEAMgD,CAAC;AAEvE,+EAA+E;AAE/E,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAM;IAC9C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAiE;;;;GAIrF,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG;QAAE,OAAO,cAAc,CAAC;IAChC,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1C,yEAAyE;IACzE,mEAAmE;IACnE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,GAAG,cAAc,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IACjF,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAM,EACN,KAAyD;IAEzD,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAkB;;GAE1C,CAAC;IACF,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,MAAM,EAAE,CAAA;;sBAEU,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC,IAAI,CAAC,KAAc,CAAC;wBAC5C,KAAK,CAAC,MAAM,IAAI,IAAI;oBACxB,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;KAC7B,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,CAAA;;gBAEI,MAAM,EAAE;;gBAER,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,KAAc,CAAC,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI;KAC1E,CAAC;IACJ,CAAC;IACD,OAAO,mBAAmB,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAM,EACN,KAMC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAkB;;;cAG3B,MAAM,EAAE;;cAER,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,QAAQ;2BAC5D,KAAK,CAAC,YAAY;;;;GAI1C,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAM,EAAE,EAAU;IAChD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAa,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,iBAAiB,EAAE,EAAE,CAAC;IACnF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC7D,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAoBD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAM,EACN,SAAuB,EAAE;IAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAa;MAC9B,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC;;SAErB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA,kBAAkB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA,EAAE;SAC1D,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAA,yBAAyB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA,EAAE;SAC7E,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA,qBAAqB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA,EAAE;SAEjE,MAAM,CAAC,OAAO;QACZ,CAAC,CAAC,EAAE,CAAA,qDAAqD,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAA,cAAc,EAAE;QAC9F,CAAC,CAAC,EAAE,CAAA,EACR;;aAEM,KAAK;GACf,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAM,EAAE,YAAoB;IAChE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAwB;+DACgB,YAAY;GACxE,CAAC;IACF,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,EAAM,EACN,EAAU,EACV,KAMC;IAED,MAAM,EAAE,CAAA;;;6BAGmB,KAAK,CAAC,YAAY,sBAAsB,KAAK,CAAC,MAAM;;qCAE5C,KAAK,CAAC,WAAW,IAAI,IAAI;wCACtB,KAAK,CAAC,cAAc,IAAI,IAAI;kBAClD,EAAE;GACjB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAM,EACN,EAAU,EACV,KAA4C;IAE5C,MAAM,EAAE,CAAA;;sBAEY,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;;0BAEpC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;yBAC1B,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAA,OAAO,CAAC,CAAC,CAAC,IAAI;6BAC9B,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI;kBACvD,EAAE;GACjB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAM,EACN,EAAU,EACV,SAAgC,WAAW;IAE3C,MAAM,EAAE,CAAA;;sEAE4D,MAAM;kBAC1D,EAAE;GACjB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAM,EACN,YAAoB,EACpB,MAA6B;IAE7B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAkB;;qEAE4B,MAAM;6BAC9C,YAAY;;GAEtC,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAqBD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAM;IAC5C,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAWnB;;;;;;;;;;;GAWA,CAAC;IAEF,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAsB;;;;;;GAMzC,CAAC;IAEF,OAAO;QACL,SAAS,EAAE,CAAE,CAAC,SAAS;QACvB,IAAI,EAAE,CAAE,CAAC,IAAI;QACb,MAAM,EAAE,CAAE,CAAC,MAAM;QACjB,QAAQ,EAAE,CAAE,CAAC,QAAQ;QACrB,gBAAgB,EAAE,CAAE,CAAC,kBAAkB;QACvC,SAAS,EAAE,CAAE,CAAC,SAAS;QACvB,aAAa,EAAE,CAAE,CAAC,eAAe;QACjC,QAAQ,EAAE,CAAE,CAAC,SAAS;QACtB,yBAAyB,EAAE,MAAM,CAAC,CAAE,CAAC,MAAM,CAAC;KAC7C,CAAC;AACJ,CAAC;AAgBD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAM,EACN,QAAgB,EAChB,KAAK,GAAG,GAAG;IAEX,MAAM,IAAI,GAAG,MAAM,EAAE,CAQpB;;;0CAGuC,QAAQ;;;;2BAIvB,QAAQ;;;;2BAIR,QAAQ;;;;2BAIR,QAAQ;;;;2BAIR,QAAQ;;YAEvB,KAAK;GACd,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE;QACtB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACnD,YAAY,EAAE,CAAC,CAAC,aAAa;KAC9B,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quem é o ASSUNTO de uma cobrança — e se existe um.
|
|
3
|
+
*
|
|
4
|
+
* ## O falso positivo que este módulo existe para matar
|
|
5
|
+
*
|
|
6
|
+
* O preflight de envio avulso respondia `eligible: true` medindo seis portas —
|
|
7
|
+
* identidade, credencial, destinatário, telefone, consentimento, template — e
|
|
8
|
+
* nenhuma delas pergunta **sobre o quê** a mensagem falaria. Um cliente sem
|
|
9
|
+
* recebível nenhum passava nas seis, e a rota de envio recusava logo depois por
|
|
10
|
+
* falta de valor e vencimento.
|
|
11
|
+
*
|
|
12
|
+
* Um preflight que aprova o que a execução recusa é pior que não ter preflight:
|
|
13
|
+
* ele desloca a descoberta do defeito para o momento do disparo, que é
|
|
14
|
+
* exatamente onde ninguém quer descobrir nada.
|
|
15
|
+
*
|
|
16
|
+
* ## Por que aqui, e não no handler
|
|
17
|
+
*
|
|
18
|
+
* "Este recebível está devido na etapa D+3 hoje?" é regra da RÉGUA. Ela já vive
|
|
19
|
+
* em `policy.ts` (`dueSteps`, `scheduledDateFor`) e em `engine.ts`
|
|
20
|
+
* (`isCollectible`), e é usada pelo ciclo automático. Reimplementar a mesma
|
|
21
|
+
* conta dentro de uma rota criaria a segunda derivação de sempre — as duas
|
|
22
|
+
* concordariam no dia da escrita e divergiriam na primeira mudança da régua,
|
|
23
|
+
* com o avulso mandando o que o ciclo não mandaria.
|
|
24
|
+
*
|
|
25
|
+
* Este módulo não decide política nova: ele **lê** a política vigente e responde
|
|
26
|
+
* quem ela alcança, sem escrever nada.
|
|
27
|
+
*/
|
|
28
|
+
import type { Tx } from '../db/client.js';
|
|
29
|
+
import { type ReceivableWithBalance } from '../billing/ar-repository.js';
|
|
30
|
+
import { type CollectionPolicy } from './policy.js';
|
|
31
|
+
/**
|
|
32
|
+
* Um recebível ainda merece cobrança?
|
|
33
|
+
*
|
|
34
|
+
* Cópia deliberada da regra de `engine.ts`, que era privada. Exportar de lá e
|
|
35
|
+
* importar aqui criaria ciclo (`engine` já importa deste módulo o suficiente);
|
|
36
|
+
* a duplicação é de UMA função pequena e está coberta pelo teste de
|
|
37
|
+
* equivalência em `collection-subject.test.ts`, que exercita as duas contra os
|
|
38
|
+
* mesmos casos.
|
|
39
|
+
*/
|
|
40
|
+
export declare function isCollectibleSubject(r: ReceivableWithBalance): boolean;
|
|
41
|
+
export interface EligibleSubjectQuery {
|
|
42
|
+
clientId: string;
|
|
43
|
+
/** Etapa da régua, como `D+3`. */
|
|
44
|
+
stepKey: string;
|
|
45
|
+
/** Data de referência, `YYYY-MM-DD`. Do chamador — o domínio não lê relógio. */
|
|
46
|
+
today: string;
|
|
47
|
+
policy?: CollectionPolicy;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Os recebíveis do cliente que a etapa alcança HOJE.
|
|
51
|
+
*
|
|
52
|
+
* Vazio quer dizer "não há sobre o que cobrar nesta etapa", e é um desfecho
|
|
53
|
+
* legítimo — não um erro. Cabe a quem chama transformar isso em recusa.
|
|
54
|
+
*
|
|
55
|
+
* A ordem é a mesma da régua (vencimento mais antigo primeiro), para que o
|
|
56
|
+
* avulso e o ciclo escolham o mesmo quando houver mais de um.
|
|
57
|
+
*/
|
|
58
|
+
export declare function findEligibleSubjects(tx: Tx, q: EligibleSubjectQuery): Promise<ReceivableWithBalance[]>;
|
|
59
|
+
/**
|
|
60
|
+
* O assunto que o envio avulso usaria, ou `null`.
|
|
61
|
+
*
|
|
62
|
+
* Quando há mais de um, o mais antigo — mesma preferência da régua. Escolher o
|
|
63
|
+
* mais recente faria a dívida velha envelhecer sem cobrança.
|
|
64
|
+
*/
|
|
65
|
+
export declare function resolveSubjectForStep(tx: Tx, q: EligibleSubjectQuery): Promise<ReceivableWithBalance | null>;
|
|
66
|
+
//# sourceMappingURL=subject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../src/collection/subject.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAAY,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG9D;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAQtE;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,EAAE,EACN,CAAC,EAAE,oBAAoB,GACtB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CA2BlC;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,CAAC,EAAE,oBAAoB,GACtB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAGvC"}
|