@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,407 @@
|
|
|
1
|
+
import { getReceivable, listReceivables, } from '../billing/ar-repository.js';
|
|
2
|
+
import { dueSteps } from './policy.js';
|
|
3
|
+
import { renderCopy } from './copy.js';
|
|
4
|
+
import {} from './email-layout.js';
|
|
5
|
+
import { dispatch, } from '../communication/index.js';
|
|
6
|
+
import { buildCollectionContent, collectionContext, collectionEventType, collectionVariables, } from './communication-bridge.js';
|
|
7
|
+
import { cancelPendingActions, getCollectionPolicy, handledStepKeys, listActions, markEscalated, markFailed, markSent, scheduleAction, } from './repository.js';
|
|
8
|
+
/**
|
|
9
|
+
* Motor de cobrança: RECEIVABLE → EVENT → RULE → ACTION → DELIVERY → STOP.
|
|
10
|
+
*
|
|
11
|
+
* Dois passos separados de propósito:
|
|
12
|
+
*
|
|
13
|
+
* `planCollections` decide o que DEVE acontecer (puro em relação a I/O de
|
|
14
|
+
* provider — só toca o banco)
|
|
15
|
+
* `executeCollections` faz acontecer
|
|
16
|
+
*
|
|
17
|
+
* Separar permite rodar o planejamento em dry-run e mostrar ao escritório o que
|
|
18
|
+
* sairia, antes de qualquer mensagem existir. Numa régua de cobrança isso não é
|
|
19
|
+
* luxo: a primeira execução contra uma carteira real precisa ser inspecionável.
|
|
20
|
+
*/
|
|
21
|
+
const MAX_ATTEMPTS = 3;
|
|
22
|
+
/** Um recebível ainda merece cobrança? */
|
|
23
|
+
function isCollectible(r) {
|
|
24
|
+
if (r.status === 'paid' || r.status === 'canceled')
|
|
25
|
+
return false;
|
|
26
|
+
if (r.status === 'renegotiated' || r.status === 'written_off')
|
|
27
|
+
return false;
|
|
28
|
+
// Saldo zero sem status `paid` acontece quando a soma dos pagamentos fecha o
|
|
29
|
+
// valor mas o status ainda não foi reavaliado. Cobrar aqui seria pedir dinheiro
|
|
30
|
+
// de quem já pagou — o pior erro operacional deste motor.
|
|
31
|
+
if (r.outstandingAmount <= 0)
|
|
32
|
+
return false;
|
|
33
|
+
if (!r.dueDate)
|
|
34
|
+
return false;
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Planeja: cancela o que não deve mais sair e agenda o que a régua manda.
|
|
39
|
+
*
|
|
40
|
+
* A ordem importa. Cancelar ANTES de agendar evita a janela em que um recebível
|
|
41
|
+
* pago recebe uma etapa nova no mesmo ciclo.
|
|
42
|
+
*/
|
|
43
|
+
export async function planCollections(tx, today, policyOverride) {
|
|
44
|
+
const policy = policyOverride ?? (await getCollectionPolicy(tx));
|
|
45
|
+
const report = {
|
|
46
|
+
examined: 0,
|
|
47
|
+
scheduled: 0,
|
|
48
|
+
skippedAlreadyHandled: 0,
|
|
49
|
+
canceledByPayment: 0,
|
|
50
|
+
canceledByCancellation: 0,
|
|
51
|
+
};
|
|
52
|
+
// Tudo que não está cancelado — inclusive pago, porque é justamente o pago que
|
|
53
|
+
// precisa ter a régua interrompida.
|
|
54
|
+
const { items } = await listReceivables(tx, { limit: 200 });
|
|
55
|
+
for (const r of items) {
|
|
56
|
+
report.examined += 1;
|
|
57
|
+
if (r.status === 'paid' || r.outstandingAmount <= 0) {
|
|
58
|
+
report.canceledByPayment += await cancelPendingActions(tx, r.id, 'paid');
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (r.status === 'canceled') {
|
|
62
|
+
report.canceledByCancellation += await cancelPendingActions(tx, r.id, 'canceled');
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (!isCollectible(r))
|
|
66
|
+
continue;
|
|
67
|
+
const handled = await handledStepKeys(tx, r.id);
|
|
68
|
+
const due = dueSteps(policy, r.dueDate, today, handled);
|
|
69
|
+
// Quantas etapas a régua já cobriu para este recebível — é o que explica
|
|
70
|
+
// "por que não agendei nada" num ciclo que não criou ação nenhuma.
|
|
71
|
+
report.skippedAlreadyHandled += handled.size;
|
|
72
|
+
for (const { step, scheduledFor } of due) {
|
|
73
|
+
const action = await scheduleAction(tx, {
|
|
74
|
+
receivableId: r.id,
|
|
75
|
+
stepKey: step.key,
|
|
76
|
+
channel: step.channel,
|
|
77
|
+
template: step.templateKey,
|
|
78
|
+
scheduledFor,
|
|
79
|
+
});
|
|
80
|
+
if (action)
|
|
81
|
+
report.scheduled += 1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return report;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Monta a cópia da etapa.
|
|
88
|
+
*
|
|
89
|
+
* Extraída para que os dois caminhos de entrega — legado e compartilhado — usem
|
|
90
|
+
* exatamente o mesmo texto. Duas montagens em paralelo divergiriam na primeira
|
|
91
|
+
* correção feita só de um lado, e o defeito apareceria como "o WhatsApp diz uma
|
|
92
|
+
* coisa e o e-mail diz outra" para o mesmo cliente, no mesmo dia.
|
|
93
|
+
*/
|
|
94
|
+
async function buildStepCopy(ctx, receivableId, current, step) {
|
|
95
|
+
const description = ctx.describeReceivable ? await ctx.describeReceivable(receivableId) : null;
|
|
96
|
+
const payment = (await ctx.resolvePayment?.(receivableId)) ?? undefined;
|
|
97
|
+
const { subject, block } = renderCopy(step.tone, {
|
|
98
|
+
clientName: current.clientName ?? 'cliente',
|
|
99
|
+
branding: ctx.branding,
|
|
100
|
+
// Saldo de AGORA, não o valor original: depois de uma baixa parcial,
|
|
101
|
+
// anunciar o valor cheio é cobrar duas vezes o que já entrou.
|
|
102
|
+
outstandingAmount: current.outstandingAmount,
|
|
103
|
+
originalAmount: current.amount,
|
|
104
|
+
hasPartialPayment: current.amountPaid > 0,
|
|
105
|
+
dueDate: current.dueDate,
|
|
106
|
+
competence: current.competence,
|
|
107
|
+
description,
|
|
108
|
+
daysOverdue: current.daysOverdue,
|
|
109
|
+
payment,
|
|
110
|
+
});
|
|
111
|
+
return { subject, block, payment };
|
|
112
|
+
}
|
|
113
|
+
const NO_ATTEMPT = {
|
|
114
|
+
sent: 0,
|
|
115
|
+
escalated: 0,
|
|
116
|
+
skippedNoChannel: 0,
|
|
117
|
+
failedPermanent: 0,
|
|
118
|
+
failedTemporary: 0,
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Traduz uma etapa da régua em intenção de comunicação e assenta o desfecho.
|
|
122
|
+
*
|
|
123
|
+
* Tudo que é específico da SC (evento, variáveis, cópia) é montado aqui e
|
|
124
|
+
* entregue pronto ao motor; tudo que é específico de canal (identidade,
|
|
125
|
+
* consentimento, template, provider) fica lá. Nenhum dos dois lados precisa
|
|
126
|
+
* conhecer o vocabulário do outro.
|
|
127
|
+
*/
|
|
128
|
+
async function sendViaSharedEngine(tx, ctx, comm, action, current, step) {
|
|
129
|
+
const receivableId = action.receivableId;
|
|
130
|
+
const copy = await buildStepCopy(ctx, receivableId, current, step);
|
|
131
|
+
const result = await dispatch({
|
|
132
|
+
ctx: collectionContext(comm.tenantId, comm.brand),
|
|
133
|
+
eventType: collectionEventType(step.key),
|
|
134
|
+
subjectRef: receivableId,
|
|
135
|
+
// A permissão pertence à PESSOA, não ao número: a referência é o cliente.
|
|
136
|
+
recipientRef: current.clientId,
|
|
137
|
+
variables: collectionVariables({
|
|
138
|
+
clientName: current.clientName ?? 'cliente',
|
|
139
|
+
officeName: ctx.branding.officeName,
|
|
140
|
+
outstandingAmount: current.outstandingAmount,
|
|
141
|
+
dueDate: current.dueDate,
|
|
142
|
+
reference: current.competence ?? null,
|
|
143
|
+
paymentUrl: copy.payment?.url,
|
|
144
|
+
}),
|
|
145
|
+
// Sem política declarada, o canal do passo é o único tentado — que é
|
|
146
|
+
// exatamente o comportamento da régua hoje. Ligar fallback é decisão do
|
|
147
|
+
// escritório, nunca default do motor.
|
|
148
|
+
policy: comm.policyFor?.(step) ?? { order: [step.channel] },
|
|
149
|
+
}, {
|
|
150
|
+
channels: comm.channels,
|
|
151
|
+
accounts: comm.accounts,
|
|
152
|
+
templates: comm.templates,
|
|
153
|
+
consent: comm.consent,
|
|
154
|
+
consentPolicy: comm.consentPolicy,
|
|
155
|
+
resolveRecipient: (ref, channel) => ctx.resolveRecipient(ref, channel),
|
|
156
|
+
buildContent: buildCollectionContent({
|
|
157
|
+
branding: ctx.branding,
|
|
158
|
+
subject: copy.subject,
|
|
159
|
+
block: copy.block,
|
|
160
|
+
}),
|
|
161
|
+
claims: comm.claims,
|
|
162
|
+
audit: comm.audit,
|
|
163
|
+
}, { dryRun: comm.dryRun });
|
|
164
|
+
// Ensaio não escreve. Um dry-run que marca a ação como enviada não é ensaio —
|
|
165
|
+
// é a execução real com o envio removido, e cala a etapa para sempre.
|
|
166
|
+
if (comm.dryRun) {
|
|
167
|
+
return { ...NO_ATTEMPT, sent: result.delivered ? 1 : 0, notAttempted: true };
|
|
168
|
+
}
|
|
169
|
+
if (result.invalidContext) {
|
|
170
|
+
// Defeito de integração, não estado do cliente. Escala para humano em vez de
|
|
171
|
+
// fechar a etapa: ninguém deve descobrir isso só quando a dívida prescrever.
|
|
172
|
+
await markEscalated(tx, action.id);
|
|
173
|
+
return { ...NO_ATTEMPT, escalated: 1, skippedNoChannel: 1, notAttempted: true };
|
|
174
|
+
}
|
|
175
|
+
if (result.delivered) {
|
|
176
|
+
const recipient = await ctx.resolveRecipient(current.clientId, result.delivered);
|
|
177
|
+
await markSent(tx, action.id, {
|
|
178
|
+
recipientRef: recipient ?? '',
|
|
179
|
+
amount: current.outstandingAmount,
|
|
180
|
+
providerRef: result.providerRef,
|
|
181
|
+
// A reserva já é a proteção contra reenvio; esta coluna é a JUNÇÃO entre
|
|
182
|
+
// a etapa da régua e a linha de `communication_dispatch`. Sem ela, ver "o
|
|
183
|
+
// que aconteceu com esta cobrança" exigiria adivinhar a chave a partir de
|
|
184
|
+
// sete campos.
|
|
185
|
+
idempotencyKey: result.idempotencyKey,
|
|
186
|
+
});
|
|
187
|
+
return { ...NO_ATTEMPT, sent: 1 };
|
|
188
|
+
}
|
|
189
|
+
const permanentAttempt = result.attempts.find((a) => a.outcome === 'permanent');
|
|
190
|
+
/*
|
|
191
|
+
* `unavailable` entra aqui junto com `temporary`, e a distinção importa.
|
|
192
|
+
*
|
|
193
|
+
* Canal indisponível é falha de INFRAESTRUTURA — cofre fora do ar, credencial
|
|
194
|
+
* ainda não propagada, canal não registrado. Não é uma decisão sobre o
|
|
195
|
+
* cliente, e por isso não pode virar `escalated`, que no domínio significa
|
|
196
|
+
* "sai da automação e vai para a fila humana": a etapa fecharia para sempre,
|
|
197
|
+
* porque `planCollections` não reagenda um `step_key` que já existe e
|
|
198
|
+
* `listActions` só enxerga `scheduled`. Foi o que aconteceu no incidente
|
|
199
|
+
* C1-PROV-R1B-C2 — a infra voltou e as quatro cobranças continuaram mortas.
|
|
200
|
+
*
|
|
201
|
+
* Tratado como temporário, `markFailed` devolve a etapa a `scheduled` e o
|
|
202
|
+
* ciclo seguinte tenta de novo. O teto é o mesmo `MAX_ATTEMPTS` das demais
|
|
203
|
+
* falhas: uma credencial ausente de forma PERMANENTE consome as três
|
|
204
|
+
* tentativas e assenta como `permanent_failure`, em vez de reagendar em
|
|
205
|
+
* silêncio para sempre.
|
|
206
|
+
*/
|
|
207
|
+
const temporaryAttempt = result.attempts.find((a) => a.outcome === 'temporary' || a.outcome === 'unavailable');
|
|
208
|
+
if (permanentAttempt || temporaryAttempt) {
|
|
209
|
+
const permanent = Boolean(permanentAttempt) || action.attempts + 1 >= MAX_ATTEMPTS;
|
|
210
|
+
await markFailed(tx, action.id, {
|
|
211
|
+
error: (permanentAttempt ?? temporaryAttempt).detail ?? 'falha de entrega',
|
|
212
|
+
permanent,
|
|
213
|
+
});
|
|
214
|
+
return permanent
|
|
215
|
+
? { ...NO_ATTEMPT, failedPermanent: 1 }
|
|
216
|
+
: { ...NO_ATTEMPT, failedTemporary: 1 };
|
|
217
|
+
}
|
|
218
|
+
// Reserva negada: a etapa fica exatamente como está. Não é falha, não é
|
|
219
|
+
// escalonamento, e não gasta tentativa — outra execução já entregou, ou está
|
|
220
|
+
// entregando agora, e é ela quem vai assentar o desfecho.
|
|
221
|
+
if (claimRefusedIn(result.attempts)) {
|
|
222
|
+
return { ...NO_ATTEMPT, notAttempted: true };
|
|
223
|
+
}
|
|
224
|
+
// Nada foi enviado e nenhum adapter falhou: todas as portas recusaram antes.
|
|
225
|
+
// O motivo é o que diz ao escritório o que fazer — e cada um exige uma ação
|
|
226
|
+
// diferente, então nenhum deles pode virar um "não enviado" genérico.
|
|
227
|
+
const reason = closeReasonFor(result.attempts);
|
|
228
|
+
await markEscalated(tx, action.id, reason);
|
|
229
|
+
return { ...NO_ATTEMPT, escalated: 1, skippedNoChannel: 1, notAttempted: true };
|
|
230
|
+
}
|
|
231
|
+
function closeReasonFor(attempts) {
|
|
232
|
+
const skips = attempts.map((a) => a.skipped);
|
|
233
|
+
// Opt-out é o mais forte: se QUALQUER canal foi recusado por vontade do
|
|
234
|
+
// cliente, é isso que o escritório precisa ver — não "faltou cadastro".
|
|
235
|
+
if (skips.includes('opted_out'))
|
|
236
|
+
return 'opted_out';
|
|
237
|
+
if (skips.includes('consent_unknown'))
|
|
238
|
+
return 'consent_unknown';
|
|
239
|
+
if (skips.includes('no_recipient') || skips.includes('invalid_recipient')) {
|
|
240
|
+
return 'no_contact_data';
|
|
241
|
+
}
|
|
242
|
+
return 'escalated';
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* A etapa não saiu porque a RESERVA foi negada — ou seja, o sistema funcionou.
|
|
246
|
+
*
|
|
247
|
+
* Precisa de tratamento próprio: `already_sent` e `claim_in_flight` não são
|
|
248
|
+
* falha, não são cadastro e não são escalonamento. Marcar a ação como escalada
|
|
249
|
+
* mandaria um humano investigar um envio que ou já aconteceu, ou está
|
|
250
|
+
* acontecendo — e encheria a fila operacional de ruído justamente quando a
|
|
251
|
+
* proteção está trabalhando.
|
|
252
|
+
*/
|
|
253
|
+
function claimRefusedIn(attempts) {
|
|
254
|
+
return attempts.some((a) => a.skipped === 'already_sent' || a.skipped === 'claim_in_flight');
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Executa as ações vencidas.
|
|
258
|
+
*
|
|
259
|
+
* **Revalida o estado no momento do envio.** O agendamento pode ter dias; entre
|
|
260
|
+
* ele e agora o cliente pode ter pago, o recebível pode ter sido cancelado, ou
|
|
261
|
+
* uma baixa parcial pode ter mudado o valor. Confiar no que foi agendado é como
|
|
262
|
+
* o motor manda cobrança de dívida quitada.
|
|
263
|
+
*/
|
|
264
|
+
export async function executeCollections(tx, ctx, today, policyOverride) {
|
|
265
|
+
const policy = policyOverride ?? (await getCollectionPolicy(tx));
|
|
266
|
+
const report = {
|
|
267
|
+
attempted: 0,
|
|
268
|
+
sent: 0,
|
|
269
|
+
failedTemporary: 0,
|
|
270
|
+
failedPermanent: 0,
|
|
271
|
+
skippedNoLongerDue: 0,
|
|
272
|
+
skippedNoChannel: 0,
|
|
273
|
+
escalated: 0,
|
|
274
|
+
};
|
|
275
|
+
const pending = await listActions(tx, { dueOnly: true, dueUntil: today, limit: 200 });
|
|
276
|
+
for (const action of pending) {
|
|
277
|
+
if (!action.receivableId)
|
|
278
|
+
continue;
|
|
279
|
+
// Estado atual, não o do agendamento. Busca pelo id — filtrar por cliente e
|
|
280
|
+
// procurar na página seria correto só enquanto a página coubesse.
|
|
281
|
+
const current = await getReceivable(tx, action.receivableId).catch(() => null);
|
|
282
|
+
if (!current || !isCollectible(current)) {
|
|
283
|
+
const reason = current?.status === 'canceled' ? 'canceled' : 'paid';
|
|
284
|
+
await cancelPendingActions(tx, action.receivableId, reason);
|
|
285
|
+
report.skippedNoLongerDue += 1;
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
const step = policy.steps.find((s) => s.key === action.stepKey);
|
|
289
|
+
if (!step || step.active === false) {
|
|
290
|
+
await cancelPendingActions(tx, action.receivableId, 'rule_disabled');
|
|
291
|
+
report.skippedNoLongerDue += 1;
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
// Escalonamento é evento interno: fecha a ação e entra na fila humana, sem
|
|
295
|
+
// mensagem ao cliente.
|
|
296
|
+
if (step.tone === 'human_escalation') {
|
|
297
|
+
await markEscalated(tx, action.id);
|
|
298
|
+
report.escalated += 1;
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
// Caminho ÚNICO. Não há alternativa: `ctx.communication` é obrigatório, e o
|
|
302
|
+
// registry legado de canais saiu do contexto. Enquanto existiam dois, o
|
|
303
|
+
// cron e a rota manual enviavam por vias com idempotências diferentes que
|
|
304
|
+
// não se enxergavam — `LEGACY_SHARED_COEXISTENCE=BLOCKING` na certificação.
|
|
305
|
+
report.attempted += 1;
|
|
306
|
+
const applied = await sendViaSharedEngine(tx, ctx, ctx.communication, action, current, step);
|
|
307
|
+
report.sent += applied.sent;
|
|
308
|
+
report.escalated += applied.escalated;
|
|
309
|
+
report.skippedNoChannel += applied.skippedNoChannel;
|
|
310
|
+
report.failedPermanent += applied.failedPermanent;
|
|
311
|
+
report.failedTemporary += applied.failedTemporary;
|
|
312
|
+
if (applied.notAttempted)
|
|
313
|
+
report.attempted -= 1;
|
|
314
|
+
}
|
|
315
|
+
return report;
|
|
316
|
+
}
|
|
317
|
+
/** Ciclo completo — o que o job roda. */
|
|
318
|
+
export async function runCollectionCycle(tx, ctx, today) {
|
|
319
|
+
const policy = await getCollectionPolicy(tx);
|
|
320
|
+
const plan = await planCollections(tx, today, policy);
|
|
321
|
+
const exec = await executeCollections(tx, ctx, today, policy);
|
|
322
|
+
return { ...plan, ...exec };
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Desliga a régua de um recebível que acabou de ser quitado.
|
|
326
|
+
*
|
|
327
|
+
* Existe porque a baixa passou a ter dois caminhos: o job diário, que varre
|
|
328
|
+
* todos os recebíveis, e o webhook, que sabe exatamente qual foi pago. Sem esta
|
|
329
|
+
* função o webhook baixaria o valor e deixaria a comunicação agendada — o
|
|
330
|
+
* cliente pagaria e receberia a cobrança de atraso mesmo assim, que é a pior
|
|
331
|
+
* falha possível numa régua automática.
|
|
332
|
+
*
|
|
333
|
+
* Só o que ainda não saiu é cancelado. Mensagem enviada é histórico.
|
|
334
|
+
*/
|
|
335
|
+
export async function cancelDunningForSettled(tx, receivableId) {
|
|
336
|
+
return cancelPendingActions(tx, receivableId, 'paid');
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Religa a régua de um recebível cuja liquidação foi anulada.
|
|
340
|
+
*
|
|
341
|
+
* Sem isto, corrigir o saldo não bastaria: `planCollections` não reagenda um
|
|
342
|
+
* passo cujo `step_key` já existe na tabela — a idempotência olha a EXISTÊNCIA
|
|
343
|
+
* da linha, não o status dela. Os passos desligados pela baixa ficariam
|
|
344
|
+
* `canceled` para sempre, e o cliente voltaria a dever sem que ninguém jamais o
|
|
345
|
+
* lembrasse. O saldo estaria certo e a cobrança nunca aconteceria.
|
|
346
|
+
*
|
|
347
|
+
* Reabre **somente** o que foi fechado POR PAGAMENTO. Um passo cancelado porque
|
|
348
|
+
* o recebível foi cancelado, ou já enviado, é história e permanece intocado —
|
|
349
|
+
* reabrir tudo faria a régua reenviar mensagem que o cliente já recebeu.
|
|
350
|
+
*/
|
|
351
|
+
/**
|
|
352
|
+
* Religa etapas fechadas por FALHA DE INFRAESTRUTURA, nunca por decisão humana.
|
|
353
|
+
*
|
|
354
|
+
* Existe para o resíduo do incidente C1-PROV-R1B-C2: etapas que o motor fechou
|
|
355
|
+
* como `escalated` porque o canal ficou indisponível (cofre de credenciais fora
|
|
356
|
+
* do ar). A correção em `sendViaSharedEngine` impede que isso volte a
|
|
357
|
+
* acontecer, mas não desfaz o que já foi fechado — e nada mais no domínio
|
|
358
|
+
* consegue, porque `planCollections` não reagenda um `step_key` existente e
|
|
359
|
+
* `listActions` só enxerga `scheduled`.
|
|
360
|
+
*
|
|
361
|
+
* As guardas são deliberadamente estreitas, e cada uma exclui uma classe:
|
|
362
|
+
*
|
|
363
|
+
* - `closed_reason = 'escalated'` — deixa de fora `no_contact_data`,
|
|
364
|
+
* `opted_out`, `consent_unknown`, `paid`, `canceled`, `rule_disabled` e
|
|
365
|
+
* `permanent_failure`. Todas são decisão de negócio e permanecem terminais.
|
|
366
|
+
* - `attempts = 0` — `markEscalated` NUNCA incrementa `attempts`, enquanto
|
|
367
|
+
* `markSent` e `markFailed` sempre incrementam. Zero prova que nenhum adapter
|
|
368
|
+
* chegou a tentar.
|
|
369
|
+
* - `provider_ref IS NULL` e `sent_at IS NULL` — prova que nada saiu. Uma
|
|
370
|
+
* mensagem entregue jamais é reaberta, e o cliente nunca recebe duplicata.
|
|
371
|
+
*
|
|
372
|
+
* O `step_key` é obrigatório: recuperação é pontual e auditável, nunca
|
|
373
|
+
* "reabra tudo deste recebível".
|
|
374
|
+
*
|
|
375
|
+
* O histórico da falha NÃO é apagado. `communication_event`
|
|
376
|
+
* (`dispatch_skipped` / `no_credential`) e `communication_dispatch`
|
|
377
|
+
* (`failed_retryable`) continuam intactos — esta função move apenas o estado da
|
|
378
|
+
* régua, e `last_error` registra a origem da reabertura.
|
|
379
|
+
*/
|
|
380
|
+
export async function rearmDunningAfterInfraFailure(tx, receivableId, stepKey, incidentRef) {
|
|
381
|
+
const rows = await tx `
|
|
382
|
+
UPDATE dunning_event
|
|
383
|
+
SET status = 'scheduled', closed_at = NULL, closed_reason = NULL,
|
|
384
|
+
last_error = ${`infra_failure_recovery:${incidentRef}`.slice(0, 300)}
|
|
385
|
+
WHERE receivable_id = ${receivableId}
|
|
386
|
+
AND step_key = ${stepKey}
|
|
387
|
+
AND status = 'escalated'
|
|
388
|
+
AND closed_reason = 'escalated'
|
|
389
|
+
AND attempts = 0
|
|
390
|
+
AND provider_ref IS NULL
|
|
391
|
+
AND sent_at IS NULL
|
|
392
|
+
RETURNING id
|
|
393
|
+
`;
|
|
394
|
+
return rows.length;
|
|
395
|
+
}
|
|
396
|
+
export async function rearmDunningAfterReversal(tx, receivableId) {
|
|
397
|
+
const rows = await tx `
|
|
398
|
+
UPDATE dunning_event
|
|
399
|
+
SET status = 'scheduled', closed_at = NULL, closed_reason = NULL
|
|
400
|
+
WHERE receivable_id = ${receivableId}
|
|
401
|
+
AND status = 'canceled'
|
|
402
|
+
AND closed_reason = 'paid'
|
|
403
|
+
RETURNING id
|
|
404
|
+
`;
|
|
405
|
+
return rows.length;
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/collection/engine.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,eAAe,GAEhB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,QAAQ,EAA8C,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAmB,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EACL,QAAQ,GAUT,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,aAAa,EACb,UAAU,EACV,QAAQ,EACR,cAAc,GAGf,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;;;GAYG;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC;AAUvB,0CAA0C;AAC1C,SAAS,aAAa,CAAC,CAAwB;IAC7C,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,6EAA6E;IAC7E,gFAAgF;IAChF,0DAA0D;IAC1D,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;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAM,EACN,KAAa,EACb,cAAiC;IAEjC,MAAM,MAAM,GAAG,cAAc,IAAI,CAAC,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,MAAM,MAAM,GAAe;QACzB,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,CAAC;QACZ,qBAAqB,EAAE,CAAC;QACxB,iBAAiB,EAAE,CAAC;QACpB,sBAAsB,EAAE,CAAC;KAC1B,CAAC;IAEF,+EAA+E;IAC/E,oCAAoC;IACpC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAE5D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;QAErB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,iBAAiB,IAAI,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,iBAAiB,IAAI,MAAM,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACzE,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC5B,MAAM,CAAC,sBAAsB,IAAI,MAAM,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAClF,SAAS;QACX,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAAE,SAAS;QAEhC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,OAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACzD,yEAAyE;QACzE,mEAAmE;QACnE,MAAM,CAAC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;QAE7C,KAAK,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,GAAG,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE;gBACtC,YAAY,EAAE,CAAC,CAAC,EAAE;gBAClB,OAAO,EAAE,IAAI,CAAC,GAAG;gBACjB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,WAAW;gBAC1B,YAAY;aACb,CAAC,CAAC;YACH,IAAI,MAAM;gBAAE,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AA2FD;;;;;;;GAOG;AACH,KAAK,UAAU,aAAa,CAC1B,GAAmB,EACnB,YAAoB,EACpB,OAA8B,EAC9B,IAAoB;IAEpB,MAAM,WAAW,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE/F,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,SAAS,CAAC;IAExE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE;QAC/C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,SAAS;QAC3C,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,qEAAqE;QACrE,8DAA8D;QAC9D,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,cAAc,EAAE,OAAO,CAAC,MAAM;QAC9B,iBAAiB,EAAE,OAAO,CAAC,UAAU,GAAG,CAAC;QACzC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW;QACX,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO;KACR,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC;AAYD,MAAM,UAAU,GAAoB;IAClC,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,CAAC;IACZ,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,CAAC;IAClB,eAAe,EAAE,CAAC;CACnB,CAAC;AAEF;;;;;;;GAOG;AACH,KAAK,UAAU,mBAAmB,CAChC,EAAM,EACN,GAAmB,EACnB,IAA6B,EAC7B,MAA8B,EAC9B,OAA8B,EAC9B,IAAoB;IAEpB,MAAM,YAAY,GAAG,MAAM,CAAC,YAAa,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAEnE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B;QACE,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;QACjD,SAAS,EAAE,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;QACxC,UAAU,EAAE,YAAY;QACxB,0EAA0E;QAC1E,YAAY,EAAE,OAAO,CAAC,QAAQ;QAC9B,SAAS,EAAE,mBAAmB,CAAC;YAC7B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,SAAS;YAC3C,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU;YACnC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;YACrC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG;SAC9B,CAAC;QACF,qEAAqE;QACrE,wEAAwE;QACxE,sCAAsC;QACtC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;KAC5D,EACD;QACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,gBAAgB,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC;QACtE,YAAY,EAAE,sBAAsB,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;QACF,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,EACD,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CACxB,CAAC;IAEF,8EAA8E;IAC9E,sEAAsE;IACtE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAC/E,CAAC;IAED,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,6EAA6E;QAC7E,6EAA6E;QAC7E,MAAM,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAClF,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACjF,MAAM,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YAC5B,YAAY,EAAE,SAAS,IAAI,EAAE;YAC7B,MAAM,EAAE,OAAO,CAAC,iBAAiB;YACjC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,yEAAyE;YACzE,0EAA0E;YAC1E,0EAA0E;YAC1E,eAAe;YACf,cAAc,EAAE,MAAM,CAAC,cAAc;SACtC,CAAC,CAAC;QACH,OAAO,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC;IAChF;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,KAAK,aAAa,CAChE,CAAC;IAEF,IAAI,gBAAgB,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,IAAI,YAAY,CAAC;QACnF,MAAM,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YAC9B,KAAK,EAAE,CAAC,gBAAgB,IAAI,gBAAgB,CAAE,CAAC,MAAM,IAAI,kBAAkB;YAC3E,SAAS;SACV,CAAC,CAAC;QACH,OAAO,SAAS;YACd,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,eAAe,EAAE,CAAC,EAAE;YACvC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;IAC5C,CAAC;IAED,wEAAwE;IACxE,6EAA6E;IAC7E,0DAA0D;IAC1D,IAAI,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,GAAG,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,6EAA6E;IAC7E,4EAA4E;IAC5E,sEAAsE;IACtE,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAClF,CAAC;AAED,SAAS,cAAc,CAAC,QAAyC;IAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC7C,wEAAwE;IACxE,wEAAwE;IACxE,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAC;IACpD,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,iBAAiB,CAAC;IAChE,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC1E,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,cAAc,CAAC,QAAyC;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,cAAc,IAAI,CAAC,CAAC,OAAO,KAAK,iBAAiB,CAAC,CAAC;AAC/F,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAM,EACN,GAAmB,EACnB,KAAa,EACb,cAAiC;IAEjC,MAAM,MAAM,GAAG,cAAc,IAAI,CAAC,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,MAAM,MAAM,GAAkB;QAC5B,SAAS,EAAE,CAAC;QACZ,IAAI,EAAE,CAAC;QACP,eAAe,EAAE,CAAC;QAClB,eAAe,EAAE,CAAC;QAClB,kBAAkB,EAAE,CAAC;QACrB,gBAAgB,EAAE,CAAC;QACnB,SAAS,EAAE,CAAC;KACb,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAEtF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,SAAS;QAEnC,4EAA4E;QAC5E,kEAAkE;QAClE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAE/E,IAAI,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;YACpE,MAAM,oBAAoB,CAAC,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,CAAC,kBAAkB,IAAI,CAAC,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACnC,MAAM,oBAAoB,CAAC,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;YACrE,MAAM,CAAC,kBAAkB,IAAI,CAAC,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,2EAA2E;QAC3E,uBAAuB;QACvB,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACrC,MAAM,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QAED,4EAA4E;QAC5E,wEAAwE;QACxE,0EAA0E;QAC1E,4EAA4E;QAC5E,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7F,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;QAC5B,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;QACtC,MAAM,CAAC,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC;QACpD,MAAM,CAAC,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC;QAClD,MAAM,CAAC,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC;QAClD,IAAI,OAAO,CAAC,YAAY;YAAE,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAID,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAM,EACN,GAAmB,EACnB,KAAa;IAEb,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9D,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;AAC9B,CAAC;AAID;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,EAAM,EAAE,YAAoB;IACxE,OAAO,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,EAAM,EACN,YAAoB,EACpB,OAAe,EACf,WAAmB;IAEnB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAkB;;;0BAGf,0BAA0B,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;6BAClD,YAAY;wBACjB,OAAO;;;;;;;GAO5B,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,EAAM,EAAE,YAAoB;IAC1E,MAAM,IAAI,GAAG,MAAM,EAAE,CAAkB;;;6BAGZ,YAAY;;;;GAItC,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apresentação para o cliente final.
|
|
3
|
+
*
|
|
4
|
+
* O armazenamento continua canônico — `date` ISO no banco, `numeric(14,2)` no
|
|
5
|
+
* valor. Isto aqui é só a camada de leitura humana: um contribuinte brasileiro
|
|
6
|
+
* lê "15/08/2026", não "2026-08-15", e converter no ponto de exibição evita
|
|
7
|
+
* mexer no dado por causa de idioma.
|
|
8
|
+
*/
|
|
9
|
+
/** `2026-08-15` → `15/08/2026`. Entrada inválida volta como veio. */
|
|
10
|
+
export declare function formatDateBR(iso: string | null | undefined): string;
|
|
11
|
+
/**
|
|
12
|
+
* Valor monetário em pt-BR.
|
|
13
|
+
*
|
|
14
|
+
* `Intl` normalmente devolve espaço não separável entre "R$" e o número, o que
|
|
15
|
+
* costuma virar caractere estranho em cliente de e-mail antigo. Montamos o
|
|
16
|
+
* texto à mão para garantir "R$ 1.234,56" em qualquer leitor.
|
|
17
|
+
*/
|
|
18
|
+
export declare function formatBRL(value: number): string;
|
|
19
|
+
/** Dias de atraso em linguagem natural. */
|
|
20
|
+
export declare function formatOverdue(days: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* Como a dívida é identificada para o cliente.
|
|
23
|
+
*
|
|
24
|
+
* "Referência: serviço avulso" não diz nada a quem recebe. Com competência,
|
|
25
|
+
* dizemos o mês; sem ela, usamos a descrição do que foi contratado. Nada é
|
|
26
|
+
* inventado — se não houver nem uma nem outra, o campo simplesmente não aparece.
|
|
27
|
+
*/
|
|
28
|
+
export declare function describeReference(input: {
|
|
29
|
+
competence?: string | null;
|
|
30
|
+
description?: string | null;
|
|
31
|
+
}): string | null;
|
|
32
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/collection/format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAInE;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED,2CAA2C;AAC3C,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,GAAG,MAAM,GAAG,IAAI,CAwBhB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apresentação para o cliente final.
|
|
3
|
+
*
|
|
4
|
+
* O armazenamento continua canônico — `date` ISO no banco, `numeric(14,2)` no
|
|
5
|
+
* valor. Isto aqui é só a camada de leitura humana: um contribuinte brasileiro
|
|
6
|
+
* lê "15/08/2026", não "2026-08-15", e converter no ponto de exibição evita
|
|
7
|
+
* mexer no dado por causa de idioma.
|
|
8
|
+
*/
|
|
9
|
+
/** `2026-08-15` → `15/08/2026`. Entrada inválida volta como veio. */
|
|
10
|
+
export function formatDateBR(iso) {
|
|
11
|
+
if (!iso)
|
|
12
|
+
return '—';
|
|
13
|
+
const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(iso);
|
|
14
|
+
return m ? `${m[3]}/${m[2]}/${m[1]}` : iso;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Valor monetário em pt-BR.
|
|
18
|
+
*
|
|
19
|
+
* `Intl` normalmente devolve espaço não separável entre "R$" e o número, o que
|
|
20
|
+
* costuma virar caractere estranho em cliente de e-mail antigo. Montamos o
|
|
21
|
+
* texto à mão para garantir "R$ 1.234,56" em qualquer leitor.
|
|
22
|
+
*/
|
|
23
|
+
export function formatBRL(value) {
|
|
24
|
+
const fixed = Math.abs(value).toFixed(2);
|
|
25
|
+
const [int, dec] = fixed.split('.');
|
|
26
|
+
const withThousands = int.replace(/\B(?=(\d{3})+(?!\d))/g, '.');
|
|
27
|
+
return `${value < 0 ? '-' : ''}R$ ${withThousands},${dec}`;
|
|
28
|
+
}
|
|
29
|
+
/** Dias de atraso em linguagem natural. */
|
|
30
|
+
export function formatOverdue(days) {
|
|
31
|
+
if (days <= 0)
|
|
32
|
+
return '';
|
|
33
|
+
if (days === 1)
|
|
34
|
+
return 'há 1 dia';
|
|
35
|
+
return `há ${days} dias`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Como a dívida é identificada para o cliente.
|
|
39
|
+
*
|
|
40
|
+
* "Referência: serviço avulso" não diz nada a quem recebe. Com competência,
|
|
41
|
+
* dizemos o mês; sem ela, usamos a descrição do que foi contratado. Nada é
|
|
42
|
+
* inventado — se não houver nem uma nem outra, o campo simplesmente não aparece.
|
|
43
|
+
*/
|
|
44
|
+
export function describeReference(input) {
|
|
45
|
+
if (input.competence) {
|
|
46
|
+
const m = /^(\d{4})-(\d{2})$/.exec(input.competence);
|
|
47
|
+
if (m) {
|
|
48
|
+
const meses = [
|
|
49
|
+
'janeiro',
|
|
50
|
+
'fevereiro',
|
|
51
|
+
'março',
|
|
52
|
+
'abril',
|
|
53
|
+
'maio',
|
|
54
|
+
'junho',
|
|
55
|
+
'julho',
|
|
56
|
+
'agosto',
|
|
57
|
+
'setembro',
|
|
58
|
+
'outubro',
|
|
59
|
+
'novembro',
|
|
60
|
+
'dezembro',
|
|
61
|
+
];
|
|
62
|
+
const idx = Number(m[2]) - 1;
|
|
63
|
+
if (idx >= 0 && idx < 12)
|
|
64
|
+
return `honorários de ${meses[idx]} de ${m[1]}`;
|
|
65
|
+
}
|
|
66
|
+
return `competência ${input.competence}`;
|
|
67
|
+
}
|
|
68
|
+
return input.description?.trim() || null;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/collection/format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qEAAqE;AACrE,MAAM,UAAU,YAAY,CAAC,GAA8B;IACzD,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,MAAM,CAAC,GAAG,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IACxD,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;IAChE,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,aAAa,IAAI,GAAG,EAAE,CAAC;AAC7D,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACzB,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAClC,OAAO,MAAM,IAAI,OAAO,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAGjC;IACC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,KAAK,GAAG;gBACZ,SAAS;gBACT,WAAW;gBACX,OAAO;gBACP,OAAO;gBACP,MAAM;gBACN,OAAO;gBACP,OAAO;gBACP,QAAQ;gBACR,UAAU;gBACV,SAAS;gBACT,UAAU;gBACV,UAAU;aACX,CAAC;YACF,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE;gBAAE,OAAO,iBAAiB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,CAAC;QACD,OAAO,eAAe,KAAK,CAAC,UAAU,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Como o cliente paga — a verdade financeira que qualquer canal entrega.
|
|
3
|
+
*
|
|
4
|
+
* Mora aqui, e não no layout do e-mail, porque não é assunto do e-mail. O
|
|
5
|
+
* mesmo bloco alimenta WhatsApp, portal ou qualquer canal futuro: o motor de
|
|
6
|
+
* cobrança resolve o pagamento uma vez por recebível (`resolvePayment`), e cada
|
|
7
|
+
* canal decide como apresentar.
|
|
8
|
+
*
|
|
9
|
+
* A separação importa na prática: um canal que precisasse importar de
|
|
10
|
+
* `email-layout.ts` acabaria herdando decisões de renderização de e-mail — e a
|
|
11
|
+
* primeira regra de negócio duplicada dentro do canal seria a próxima.
|
|
12
|
+
*
|
|
13
|
+
* Tudo opcional porque cada gateway (e cada método) entrega um subconjunto
|
|
14
|
+
* diferente. Quem renderiza mostra o que veio; nada é inventado para preencher.
|
|
15
|
+
*/
|
|
16
|
+
export interface PaymentBlock {
|
|
17
|
+
/** Destino do CTA. Sem ele não há botão: um "Pagar agora" que não paga é pior que nada. */
|
|
18
|
+
url?: string;
|
|
19
|
+
pixPayload?: string;
|
|
20
|
+
pixQrCodeImage?: string;
|
|
21
|
+
boletoUrl?: string;
|
|
22
|
+
identificationField?: string;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=payment-block.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-block.d.ts","sourceRoot":"","sources":["../../src/collection/payment-block.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,YAAY;IAC3B,2FAA2F;IAC3F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-block.js","sourceRoot":"","sources":["../../src/collection/payment-block.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { CollectionChannelKey } from './channel.js';
|
|
2
|
+
/**
|
|
3
|
+
* Política de cobrança do escritório.
|
|
4
|
+
*
|
|
5
|
+
* Os offsets são RELATIVOS ao vencimento e vivem em `dunning_rule.steps` (jsonb,
|
|
6
|
+
* por tenant) — nenhum dia está no código. O padrão abaixo é ponto de partida
|
|
7
|
+
* para quem ainda não configurou nada, jamais política imposta.
|
|
8
|
+
*/
|
|
9
|
+
export type StepTiming = 'before_due' | 'on_due_date' | 'after_due';
|
|
10
|
+
/** Tom da etapa. Governa o template, e serve de guarda contra escalada indevida. */
|
|
11
|
+
export type StepTone = 'reminder' | 'due_notice' | 'friendly_collection' | 'overdue_collection' | 'human_escalation';
|
|
12
|
+
export interface CollectionStep {
|
|
13
|
+
/** Chave estável — é o que garante idempotência. Mudar isto reexecuta a etapa. */
|
|
14
|
+
key: string;
|
|
15
|
+
timing: StepTiming;
|
|
16
|
+
/** Dias de distância do vencimento. Sempre positivo; `timing` dá o sinal. */
|
|
17
|
+
offsetDays: number;
|
|
18
|
+
channel: CollectionChannelKey;
|
|
19
|
+
tone: StepTone;
|
|
20
|
+
templateKey: string;
|
|
21
|
+
active?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface CollectionPolicy {
|
|
24
|
+
id: string | null;
|
|
25
|
+
name: string;
|
|
26
|
+
steps: CollectionStep[];
|
|
27
|
+
active: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Régua padrão — sugestão, não regra do produto.
|
|
31
|
+
*
|
|
32
|
+
* Para a última etapa o canal é `notification`: escalar para humano é um evento
|
|
33
|
+
* INTERNO. Mandar ao cliente uma mensagem dizendo que o caso foi escalado seria
|
|
34
|
+
* transformar procedimento interno em pressão, e é exatamente onde cobrança
|
|
35
|
+
* automatizada vira problema jurídico e de relacionamento.
|
|
36
|
+
*/
|
|
37
|
+
export declare const DEFAULT_COLLECTION_STEPS: readonly CollectionStep[];
|
|
38
|
+
export declare const DEFAULT_POLICY: CollectionPolicy;
|
|
39
|
+
/** Data em que a etapa deve acontecer, dado o vencimento. */
|
|
40
|
+
export declare function scheduledDateFor(step: CollectionStep, dueDate: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Etapas já devidas em `today` e ainda não registradas.
|
|
43
|
+
*
|
|
44
|
+
* Pura e determinística: recebe o que já foi executado e devolve o que falta.
|
|
45
|
+
* Nenhum I/O — é o que permite testar a régua inteira sem banco nem provider.
|
|
46
|
+
*/
|
|
47
|
+
export declare function dueSteps(policy: CollectionPolicy, dueDate: string, today: string, alreadyHandled: ReadonlySet<string>): {
|
|
48
|
+
step: CollectionStep;
|
|
49
|
+
scheduledFor: string;
|
|
50
|
+
}[];
|
|
51
|
+
/** Validação de política vinda do banco — protege contra jsonb malformado. */
|
|
52
|
+
export declare function parsePolicySteps(raw: unknown): CollectionStep[];
|
|
53
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/collection/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;;GAMG;AAEH,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,CAAC;AAEpE,oFAAoF;AACpF,MAAM,MAAM,QAAQ,GAClB,UAAU,GAAG,YAAY,GAAG,qBAAqB,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AAEhG,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,UAAU,CAAC;IACnB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,cAAc,EAiD7D,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,gBAK5B,CAAC;AAQF,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ9E;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,GAClC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAAE,CAQlD;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,EAAE,CAuC/D"}
|