@baruk/core 0.3.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.baruk-provenance.json +10 -0
- package/CHANGELOG.md +85 -0
- package/dist/auth/password-reset.d.ts +30 -1
- package/dist/auth/password-reset.d.ts.map +1 -1
- package/dist/auth/password-reset.js +139 -11
- package/dist/auth/password-reset.js.map +1 -1
- package/dist/auth/service.d.ts +39 -2
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +75 -10
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +334 -0
- package/dist/billing/ar-repository.d.ts.map +1 -0
- package/dist/billing/ar-repository.js +707 -0
- package/dist/billing/ar-repository.js.map +1 -0
- package/dist/billing/auto-generation.d.ts +87 -0
- package/dist/billing/auto-generation.d.ts.map +1 -0
- package/dist/billing/auto-generation.js +181 -0
- package/dist/billing/auto-generation.js.map +1 -0
- package/dist/billing/live-guard.d.ts +64 -0
- package/dist/billing/live-guard.d.ts.map +1 -0
- package/dist/billing/live-guard.js +68 -0
- package/dist/billing/live-guard.js.map +1 -0
- package/dist/billing/payment-means-catalog.d.ts +17 -0
- package/dist/billing/payment-means-catalog.d.ts.map +1 -0
- package/dist/billing/payment-means-catalog.js +21 -0
- package/dist/billing/payment-means-catalog.js.map +1 -0
- package/dist/billing/payment-means.d.ts +38 -0
- package/dist/billing/payment-means.d.ts.map +1 -0
- package/dist/billing/payment-means.js +29 -0
- package/dist/billing/payment-means.js.map +1 -0
- package/dist/billing/payment-rail.d.ts +118 -0
- package/dist/billing/payment-rail.d.ts.map +1 -0
- package/dist/billing/payment-rail.js +295 -0
- package/dist/billing/payment-rail.js.map +1 -0
- package/dist/billing/provider/asaas.d.ts +46 -1
- package/dist/billing/provider/asaas.d.ts.map +1 -1
- package/dist/billing/provider/asaas.js +194 -14
- package/dist/billing/provider/asaas.js.map +1 -1
- package/dist/billing/provider/manual.js +1 -1
- package/dist/billing/provider/manual.js.map +1 -1
- package/dist/billing/provider/types.d.ts +115 -8
- package/dist/billing/provider/types.d.ts.map +1 -1
- package/dist/billing/provider-account.d.ts +89 -0
- package/dist/billing/provider-account.d.ts.map +1 -0
- package/dist/billing/provider-account.js +161 -0
- package/dist/billing/provider-account.js.map +1 -0
- package/dist/billing/provider-onboarding.d.ts +67 -0
- package/dist/billing/provider-onboarding.d.ts.map +1 -0
- package/dist/billing/provider-onboarding.js +234 -0
- package/dist/billing/provider-onboarding.js.map +1 -0
- package/dist/billing/receivable.d.ts +5 -1
- package/dist/billing/receivable.d.ts.map +1 -1
- package/dist/billing/reconcile.d.ts +58 -0
- package/dist/billing/reconcile.d.ts.map +1 -0
- package/dist/billing/reconcile.js +138 -0
- package/dist/billing/reconcile.js.map +1 -0
- package/dist/billing/repository.d.ts +90 -1
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +148 -19
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/auth/password-reset.js +141 -11
- package/dist/cjs/auth/password-reset.js.map +1 -1
- package/dist/cjs/auth/service.js +75 -9
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +728 -0
- package/dist/cjs/billing/ar-repository.js.map +1 -0
- package/dist/cjs/billing/auto-generation.js +186 -0
- package/dist/cjs/billing/auto-generation.js.map +1 -0
- package/dist/cjs/billing/live-guard.js +72 -0
- package/dist/cjs/billing/live-guard.js.map +1 -0
- package/dist/cjs/billing/payment-means-catalog.js +25 -0
- package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
- package/dist/cjs/billing/payment-means.js +33 -0
- package/dist/cjs/billing/payment-means.js.map +1 -0
- package/dist/cjs/billing/payment-rail.js +301 -0
- package/dist/cjs/billing/payment-rail.js.map +1 -0
- package/dist/cjs/billing/provider/asaas.js +194 -14
- package/dist/cjs/billing/provider/asaas.js.map +1 -1
- package/dist/cjs/billing/provider/manual.js +1 -1
- package/dist/cjs/billing/provider/manual.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +170 -0
- package/dist/cjs/billing/provider-account.js.map +1 -0
- package/dist/cjs/billing/provider-onboarding.js +239 -0
- package/dist/cjs/billing/provider-onboarding.js.map +1 -0
- package/dist/cjs/billing/reconcile.js +143 -0
- package/dist/cjs/billing/reconcile.js.map +1 -0
- package/dist/cjs/billing/repository.js +150 -18
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/repository.js +96 -20
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +140 -0
- package/dist/cjs/collection/branding.js.map +1 -0
- package/dist/cjs/collection/channel-accounts.js +137 -0
- package/dist/cjs/collection/channel-accounts.js.map +1 -0
- package/dist/cjs/collection/channel.js +17 -0
- package/dist/cjs/collection/channel.js.map +1 -0
- package/dist/cjs/collection/communication-bridge.js +140 -0
- package/dist/cjs/collection/communication-bridge.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +193 -0
- package/dist/cjs/collection/communication-runtime.js.map +1 -0
- package/dist/cjs/collection/consent-repository.js +84 -0
- package/dist/cjs/collection/consent-repository.js.map +1 -0
- package/dist/cjs/collection/copy.js +125 -0
- package/dist/cjs/collection/copy.js.map +1 -0
- package/dist/cjs/collection/delivery-callback.js +151 -0
- package/dist/cjs/collection/delivery-callback.js.map +1 -0
- package/dist/cjs/collection/email-layout.js +252 -0
- package/dist/cjs/collection/email-layout.js.map +1 -0
- package/dist/cjs/collection/engine.js +414 -0
- package/dist/cjs/collection/engine.js.map +1 -0
- package/dist/cjs/collection/format.js +76 -0
- package/dist/cjs/collection/format.js.map +1 -0
- package/dist/cjs/collection/payment-block.js +3 -0
- package/dist/cjs/collection/payment-block.js.map +1 -0
- package/dist/cjs/collection/policy.js +147 -0
- package/dist/cjs/collection/policy.js.map +1 -0
- package/dist/cjs/collection/repository.js +260 -0
- package/dist/cjs/collection/repository.js.map +1 -0
- package/dist/cjs/collection/subject.js +104 -0
- package/dist/cjs/collection/subject.js.map +1 -0
- package/dist/cjs/collection/template-catalog.js +165 -0
- package/dist/cjs/collection/template-catalog.js.map +1 -0
- package/dist/cjs/collection/template.js +78 -0
- package/dist/cjs/collection/template.js.map +1 -0
- package/dist/cjs/communication/adapters/email.js +132 -0
- package/dist/cjs/communication/adapters/email.js.map +1 -0
- package/dist/cjs/communication/adapters/sms.js +127 -0
- package/dist/cjs/communication/adapters/sms.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp.js +213 -0
- package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
- package/dist/cjs/communication/audit.js +61 -0
- package/dist/cjs/communication/audit.js.map +1 -0
- package/dist/cjs/communication/capabilities.js +76 -0
- package/dist/cjs/communication/capabilities.js.map +1 -0
- package/dist/cjs/communication/channel.js +53 -0
- package/dist/cjs/communication/channel.js.map +1 -0
- package/dist/cjs/communication/claim.js +228 -0
- package/dist/cjs/communication/claim.js.map +1 -0
- package/dist/cjs/communication/consent.js +43 -0
- package/dist/cjs/communication/consent.js.map +1 -0
- package/dist/cjs/communication/context.js +45 -0
- package/dist/cjs/communication/context.js.map +1 -0
- package/dist/cjs/communication/credentials.js +121 -0
- package/dist/cjs/communication/credentials.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +161 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
- package/dist/cjs/communication/dry-run.js +97 -0
- package/dist/cjs/communication/dry-run.js.map +1 -0
- package/dist/cjs/communication/engine.js +483 -0
- package/dist/cjs/communication/engine.js.map +1 -0
- package/dist/cjs/communication/graph.js +50 -0
- package/dist/cjs/communication/graph.js.map +1 -0
- package/dist/cjs/communication/idempotency.js +26 -0
- package/dist/cjs/communication/idempotency.js.map +1 -0
- package/dist/cjs/communication/identity.js +110 -0
- package/dist/cjs/communication/identity.js.map +1 -0
- package/dist/cjs/communication/index.js +135 -0
- package/dist/cjs/communication/index.js.map +1 -0
- package/dist/cjs/communication/onboarding.js +297 -0
- package/dist/cjs/communication/onboarding.js.map +1 -0
- package/dist/cjs/communication/policy.js +16 -0
- package/dist/cjs/communication/policy.js.map +1 -0
- package/dist/cjs/communication/routing.js +77 -0
- package/dist/cjs/communication/routing.js.map +1 -0
- package/dist/cjs/communication/sender-profile.js +128 -0
- package/dist/cjs/communication/sender-profile.js.map +1 -0
- package/dist/cjs/communication/status.js +86 -0
- package/dist/cjs/communication/status.js.map +1 -0
- package/dist/cjs/communication/stores/onboarding.js +135 -0
- package/dist/cjs/communication/stores/onboarding.js.map +1 -0
- package/dist/cjs/communication/stores/postgres.js +458 -0
- package/dist/cjs/communication/stores/postgres.js.map +1 -0
- package/dist/cjs/communication/stores/routing.js +334 -0
- package/dist/cjs/communication/stores/routing.js.map +1 -0
- package/dist/cjs/communication/stores/secrets.js +126 -0
- package/dist/cjs/communication/stores/secrets.js.map +1 -0
- package/dist/cjs/communication/template-provider.js +22 -0
- package/dist/cjs/communication/template-provider.js.map +1 -0
- package/dist/cjs/communication/template.js +63 -0
- package/dist/cjs/communication/template.js.map +1 -0
- package/dist/cjs/communication/webhook-subscription.js +258 -0
- package/dist/cjs/communication/webhook-subscription.js.map +1 -0
- package/dist/cjs/communication/webhook.js +292 -0
- package/dist/cjs/communication/webhook.js.map +1 -0
- package/dist/cjs/competence/repository.js +309 -0
- package/dist/cjs/competence/repository.js.map +1 -0
- package/dist/cjs/contacts/phone.js +192 -0
- package/dist/cjs/contacts/phone.js.map +1 -0
- package/dist/cjs/db/seed-catalog.js +48 -0
- package/dist/cjs/db/seed-catalog.js.map +1 -0
- package/dist/cjs/db/seed.js +15 -7
- package/dist/cjs/db/seed.js.map +1 -1
- package/dist/cjs/documents/repository.js +244 -0
- package/dist/cjs/documents/repository.js.map +1 -0
- package/dist/cjs/documents/requests.js +136 -0
- package/dist/cjs/documents/requests.js.map +1 -0
- package/dist/cjs/index.js +406 -39
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +125 -3
- package/dist/cjs/legal/documents.js.map +1 -1
- package/dist/cjs/legal/types.js +1 -0
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/mail/auth-templates.js +29 -0
- package/dist/cjs/mail/auth-templates.js.map +1 -0
- package/dist/cjs/mail/dedup-store.js +12 -51
- package/dist/cjs/mail/dedup-store.js.map +1 -1
- package/dist/cjs/mail/index.js +16 -4
- package/dist/cjs/mail/index.js.map +1 -1
- package/dist/cjs/mail/provider.js +12 -247
- package/dist/cjs/mail/provider.js.map +1 -1
- package/dist/cjs/mail/resend.js +14 -18
- package/dist/cjs/mail/resend.js.map +1 -1
- package/dist/cjs/mail/sender-resolver.js +12 -11
- package/dist/cjs/mail/sender-resolver.js.map +1 -1
- package/dist/cjs/mail/template-renderer.js +11 -16
- package/dist/cjs/mail/template-renderer.js.map +1 -1
- package/dist/cjs/mail/transactional-outbound.js +117 -0
- package/dist/cjs/mail/transactional-outbound.js.map +1 -0
- package/dist/cjs/mail/types.js +8 -35
- package/dist/cjs/mail/types.js.map +1 -1
- package/dist/cjs/portal/provisioning.js +144 -0
- package/dist/cjs/portal/provisioning.js.map +1 -0
- package/dist/cjs/pricing-engine/canonical.js +42 -0
- package/dist/cjs/pricing-engine/canonical.js.map +1 -0
- package/dist/cjs/pricing-engine/errors.js +6 -1
- package/dist/cjs/pricing-engine/errors.js.map +1 -1
- package/dist/cjs/pricing-engine/index.js +12 -1
- package/dist/cjs/pricing-engine/index.js.map +1 -1
- package/dist/cjs/pricing-engine/pipeline.js +200 -26
- package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
- package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
- package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
- package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
- package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/cjs/rbac/authorize.js +28 -0
- package/dist/cjs/rbac/authorize.js.map +1 -1
- package/dist/cjs/rbac/catalog.js +67 -1
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/rbac/workload-provisioning.js +160 -0
- package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
- package/dist/cjs/rbac/workload.js +191 -0
- package/dist/cjs/rbac/workload.js.map +1 -0
- package/dist/cjs/storage/checksum.js +15 -0
- package/dist/cjs/storage/checksum.js.map +1 -0
- package/dist/cjs/storage/key.js +72 -0
- package/dist/cjs/storage/key.js.map +1 -0
- package/dist/cjs/storage/local.js +100 -0
- package/dist/cjs/storage/local.js.map +1 -0
- package/dist/cjs/storage/r2.js +181 -0
- package/dist/cjs/storage/r2.js.map +1 -0
- package/dist/cjs/storage/registry.js +41 -0
- package/dist/cjs/storage/registry.js.map +1 -0
- package/dist/cjs/storage/types.js +50 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
- package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
- package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/registry.js +17 -0
- package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
- package/dist/cjs/subscription-billing/service.js +57 -8
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/subscription-billing/types.js.map +1 -1
- package/dist/cjs/tenancy/provisioning.js +32 -8
- package/dist/cjs/tenancy/provisioning.js.map +1 -1
- package/dist/cjs/users/repository.js +119 -2
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +81 -0
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/repository.d.ts +42 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +94 -21
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +72 -0
- package/dist/collection/branding.d.ts.map +1 -0
- package/dist/collection/branding.js +136 -0
- package/dist/collection/branding.js.map +1 -0
- package/dist/collection/channel-accounts.d.ts +57 -0
- package/dist/collection/channel-accounts.d.ts.map +1 -0
- package/dist/collection/channel-accounts.js +133 -0
- package/dist/collection/channel-accounts.js.map +1 -0
- package/dist/collection/channel.d.ts +24 -0
- package/dist/collection/channel.d.ts.map +1 -0
- package/dist/collection/channel.js +16 -0
- package/dist/collection/channel.js.map +1 -0
- package/dist/collection/communication-bridge.d.ts +66 -0
- package/dist/collection/communication-bridge.d.ts.map +1 -0
- package/dist/collection/communication-bridge.js +134 -0
- package/dist/collection/communication-bridge.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +95 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -0
- package/dist/collection/communication-runtime.js +187 -0
- package/dist/collection/communication-runtime.js.map +1 -0
- package/dist/collection/consent-repository.d.ts +32 -0
- package/dist/collection/consent-repository.d.ts.map +1 -0
- package/dist/collection/consent-repository.js +79 -0
- package/dist/collection/consent-repository.js.map +1 -0
- package/dist/collection/copy.d.ts +50 -0
- package/dist/collection/copy.d.ts.map +1 -0
- package/dist/collection/copy.js +122 -0
- package/dist/collection/copy.js.map +1 -0
- package/dist/collection/delivery-callback.d.ts +49 -0
- package/dist/collection/delivery-callback.d.ts.map +1 -0
- package/dist/collection/delivery-callback.js +147 -0
- package/dist/collection/delivery-callback.js.map +1 -0
- package/dist/collection/email-layout.d.ts +45 -0
- package/dist/collection/email-layout.d.ts.map +1 -0
- package/dist/collection/email-layout.js +247 -0
- package/dist/collection/email-layout.js.map +1 -0
- package/dist/collection/engine.d.ts +177 -0
- package/dist/collection/engine.d.ts.map +1 -0
- package/dist/collection/engine.js +407 -0
- package/dist/collection/engine.js.map +1 -0
- package/dist/collection/format.d.ts +32 -0
- package/dist/collection/format.d.ts.map +1 -0
- package/dist/collection/format.js +70 -0
- package/dist/collection/format.js.map +1 -0
- package/dist/collection/payment-block.d.ts +24 -0
- package/dist/collection/payment-block.d.ts.map +1 -0
- package/dist/collection/payment-block.js +2 -0
- package/dist/collection/payment-block.js.map +1 -0
- package/dist/collection/policy.d.ts +53 -0
- package/dist/collection/policy.d.ts.map +1 -0
- package/dist/collection/policy.js +141 -0
- package/dist/collection/policy.js.map +1 -0
- package/dist/collection/repository.d.ts +129 -0
- package/dist/collection/repository.d.ts.map +1 -0
- package/dist/collection/repository.js +246 -0
- package/dist/collection/repository.js.map +1 -0
- package/dist/collection/subject.d.ts +66 -0
- package/dist/collection/subject.d.ts.map +1 -0
- package/dist/collection/subject.js +99 -0
- package/dist/collection/subject.js.map +1 -0
- package/dist/collection/template-catalog.d.ts +16 -0
- package/dist/collection/template-catalog.d.ts.map +1 -0
- package/dist/collection/template-catalog.js +162 -0
- package/dist/collection/template-catalog.js.map +1 -0
- package/dist/collection/template.d.ts +37 -0
- package/dist/collection/template.d.ts.map +1 -0
- package/dist/collection/template.js +73 -0
- package/dist/collection/template.js.map +1 -0
- package/dist/communication/adapters/email.d.ts +28 -0
- package/dist/communication/adapters/email.d.ts.map +1 -0
- package/dist/communication/adapters/email.js +129 -0
- package/dist/communication/adapters/email.js.map +1 -0
- package/dist/communication/adapters/sms.d.ts +95 -0
- package/dist/communication/adapters/sms.d.ts.map +1 -0
- package/dist/communication/adapters/sms.js +121 -0
- package/dist/communication/adapters/sms.js.map +1 -0
- package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
- package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-language.js +36 -0
- package/dist/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.js +97 -0
- package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/communication/adapters/whatsapp.d.ts +29 -0
- package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp.js +210 -0
- package/dist/communication/adapters/whatsapp.js.map +1 -0
- package/dist/communication/audit.d.ts +105 -0
- package/dist/communication/audit.d.ts.map +1 -0
- package/dist/communication/audit.js +56 -0
- package/dist/communication/audit.js.map +1 -0
- package/dist/communication/capabilities.d.ts +88 -0
- package/dist/communication/capabilities.d.ts.map +1 -0
- package/dist/communication/capabilities.js +72 -0
- package/dist/communication/capabilities.js.map +1 -0
- package/dist/communication/channel.d.ts +125 -0
- package/dist/communication/channel.d.ts.map +1 -0
- package/dist/communication/channel.js +47 -0
- package/dist/communication/channel.js.map +1 -0
- package/dist/communication/claim.d.ts +368 -0
- package/dist/communication/claim.d.ts.map +1 -0
- package/dist/communication/claim.js +224 -0
- package/dist/communication/claim.js.map +1 -0
- package/dist/communication/consent.d.ts +65 -0
- package/dist/communication/consent.d.ts.map +1 -0
- package/dist/communication/consent.js +40 -0
- package/dist/communication/consent.js.map +1 -0
- package/dist/communication/context.d.ts +48 -0
- package/dist/communication/context.d.ts.map +1 -0
- package/dist/communication/context.js +41 -0
- package/dist/communication/context.js.map +1 -0
- package/dist/communication/credentials.d.ts +74 -0
- package/dist/communication/credentials.d.ts.map +1 -0
- package/dist/communication/credentials.js +115 -0
- package/dist/communication/credentials.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts +37 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -0
- package/dist/communication/dry-run-scenario.js +158 -0
- package/dist/communication/dry-run-scenario.js.map +1 -0
- package/dist/communication/dry-run.d.ts +40 -0
- package/dist/communication/dry-run.d.ts.map +1 -0
- package/dist/communication/dry-run.js +92 -0
- package/dist/communication/dry-run.js.map +1 -0
- package/dist/communication/engine.d.ts +153 -0
- package/dist/communication/engine.d.ts.map +1 -0
- package/dist/communication/engine.js +480 -0
- package/dist/communication/engine.js.map +1 -0
- package/dist/communication/graph.d.ts +38 -0
- package/dist/communication/graph.d.ts.map +1 -0
- package/dist/communication/graph.js +45 -0
- package/dist/communication/graph.js.map +1 -0
- package/dist/communication/idempotency.d.ts +33 -0
- package/dist/communication/idempotency.d.ts.map +1 -0
- package/dist/communication/idempotency.js +23 -0
- package/dist/communication/idempotency.js.map +1 -0
- package/dist/communication/identity.d.ts +127 -0
- package/dist/communication/identity.d.ts.map +1 -0
- package/dist/communication/identity.js +105 -0
- package/dist/communication/identity.js.map +1 -0
- package/dist/communication/index.d.ts +66 -0
- package/dist/communication/index.d.ts.map +1 -0
- package/dist/communication/index.js +42 -0
- package/dist/communication/index.js.map +1 -0
- package/dist/communication/onboarding.d.ts +223 -0
- package/dist/communication/onboarding.d.ts.map +1 -0
- package/dist/communication/onboarding.js +287 -0
- package/dist/communication/onboarding.js.map +1 -0
- package/dist/communication/policy.d.ts +99 -0
- package/dist/communication/policy.d.ts.map +1 -0
- package/dist/communication/policy.js +13 -0
- package/dist/communication/policy.js.map +1 -0
- package/dist/communication/routing.d.ts +99 -0
- package/dist/communication/routing.d.ts.map +1 -0
- package/dist/communication/routing.js +73 -0
- package/dist/communication/routing.js.map +1 -0
- package/dist/communication/sender-profile.d.ts +100 -0
- package/dist/communication/sender-profile.d.ts.map +1 -0
- package/dist/communication/sender-profile.js +123 -0
- package/dist/communication/sender-profile.js.map +1 -0
- package/dist/communication/status.d.ts +48 -0
- package/dist/communication/status.d.ts.map +1 -0
- package/dist/communication/status.js +79 -0
- package/dist/communication/status.js.map +1 -0
- package/dist/communication/stores/onboarding.d.ts +88 -0
- package/dist/communication/stores/onboarding.d.ts.map +1 -0
- package/dist/communication/stores/onboarding.js +127 -0
- package/dist/communication/stores/onboarding.js.map +1 -0
- package/dist/communication/stores/postgres.d.ts +81 -0
- package/dist/communication/stores/postgres.d.ts.map +1 -0
- package/dist/communication/stores/postgres.js +453 -0
- package/dist/communication/stores/postgres.js.map +1 -0
- package/dist/communication/stores/routing.d.ts +169 -0
- package/dist/communication/stores/routing.d.ts.map +1 -0
- package/dist/communication/stores/routing.js +324 -0
- package/dist/communication/stores/routing.js.map +1 -0
- package/dist/communication/stores/secrets.d.ts +89 -0
- package/dist/communication/stores/secrets.d.ts.map +1 -0
- package/dist/communication/stores/secrets.js +122 -0
- package/dist/communication/stores/secrets.js.map +1 -0
- package/dist/communication/template-provider.d.ts +85 -0
- package/dist/communication/template-provider.d.ts.map +1 -0
- package/dist/communication/template-provider.js +21 -0
- package/dist/communication/template-provider.js.map +1 -0
- package/dist/communication/template.d.ts +87 -0
- package/dist/communication/template.d.ts.map +1 -0
- package/dist/communication/template.js +59 -0
- package/dist/communication/template.js.map +1 -0
- package/dist/communication/webhook-subscription.d.ts +156 -0
- package/dist/communication/webhook-subscription.d.ts.map +1 -0
- package/dist/communication/webhook-subscription.js +252 -0
- package/dist/communication/webhook-subscription.js.map +1 -0
- package/dist/communication/webhook.d.ts +121 -0
- package/dist/communication/webhook.d.ts.map +1 -0
- package/dist/communication/webhook.js +283 -0
- package/dist/communication/webhook.js.map +1 -0
- package/dist/competence/repository.d.ts +147 -0
- package/dist/competence/repository.d.ts.map +1 -0
- package/dist/competence/repository.js +294 -0
- package/dist/competence/repository.js.map +1 -0
- package/dist/contacts/phone.d.ts +70 -0
- package/dist/contacts/phone.d.ts.map +1 -0
- package/dist/contacts/phone.js +186 -0
- package/dist/contacts/phone.js.map +1 -0
- package/dist/db/migrate.js +17 -11
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/seed-catalog.d.ts +18 -0
- package/dist/db/seed-catalog.d.ts.map +1 -0
- package/dist/db/seed-catalog.js +45 -0
- package/dist/db/seed-catalog.js.map +1 -0
- package/dist/db/seed.js +16 -8
- package/dist/db/seed.js.map +1 -1
- package/dist/documents/repository.d.ts +97 -0
- package/dist/documents/repository.d.ts.map +1 -0
- package/dist/documents/repository.js +236 -0
- package/dist/documents/repository.js.map +1 -0
- package/dist/documents/requests.d.ts +73 -0
- package/dist/documents/requests.d.ts.map +1 -0
- package/dist/documents/requests.js +127 -0
- package/dist/documents/requests.js.map +1 -0
- package/dist/index.d.ts +109 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -8
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +125 -3
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +1 -1
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/types.d.ts +32 -1
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js +1 -0
- package/dist/legal/types.js.map +1 -1
- package/dist/mail/auth-templates.d.ts +15 -0
- package/dist/mail/auth-templates.d.ts.map +1 -0
- package/dist/mail/auth-templates.js +26 -0
- package/dist/mail/auth-templates.js.map +1 -0
- package/dist/mail/dedup-store.d.ts +1 -24
- package/dist/mail/dedup-store.d.ts.map +1 -1
- package/dist/mail/dedup-store.js +9 -48
- package/dist/mail/dedup-store.js.map +1 -1
- package/dist/mail/index.d.ts +2 -1
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +13 -2
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/provider.d.ts +2 -30
- package/dist/mail/provider.d.ts.map +1 -1
- package/dist/mail/provider.js +10 -246
- package/dist/mail/provider.js.map +1 -1
- package/dist/mail/resend.d.ts +2 -12
- package/dist/mail/resend.d.ts.map +1 -1
- package/dist/mail/resend.js +11 -17
- package/dist/mail/resend.js.map +1 -1
- package/dist/mail/sender-resolver.d.ts +1 -7
- package/dist/mail/sender-resolver.d.ts.map +1 -1
- package/dist/mail/sender-resolver.js +11 -10
- package/dist/mail/sender-resolver.js.map +1 -1
- package/dist/mail/template-renderer.d.ts +1 -9
- package/dist/mail/template-renderer.d.ts.map +1 -1
- package/dist/mail/template-renderer.js +10 -15
- package/dist/mail/template-renderer.js.map +1 -1
- package/dist/mail/transactional-outbound.d.ts +115 -0
- package/dist/mail/transactional-outbound.d.ts.map +1 -0
- package/dist/mail/transactional-outbound.js +113 -0
- package/dist/mail/transactional-outbound.js.map +1 -0
- package/dist/mail/types.d.ts +2 -142
- package/dist/mail/types.d.ts.map +1 -1
- package/dist/mail/types.js +1 -33
- package/dist/mail/types.js.map +1 -1
- package/dist/portal/provisioning.d.ts +58 -0
- package/dist/portal/provisioning.d.ts.map +1 -0
- package/dist/portal/provisioning.js +139 -0
- package/dist/portal/provisioning.js.map +1 -0
- package/dist/pricing-engine/canonical.d.ts +14 -0
- package/dist/pricing-engine/canonical.d.ts.map +1 -0
- package/dist/pricing-engine/canonical.js +39 -0
- package/dist/pricing-engine/canonical.js.map +1 -0
- package/dist/pricing-engine/errors.d.ts.map +1 -1
- package/dist/pricing-engine/errors.js +6 -1
- package/dist/pricing-engine/errors.js.map +1 -1
- package/dist/pricing-engine/index.d.ts +12 -2
- package/dist/pricing-engine/index.d.ts.map +1 -1
- package/dist/pricing-engine/index.js +6 -1
- package/dist/pricing-engine/index.js.map +1 -1
- package/dist/pricing-engine/pipeline.d.ts.map +1 -1
- package/dist/pricing-engine/pipeline.js +202 -28
- package/dist/pricing-engine/pipeline.js.map +1 -1
- package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
- package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-adapter.js +75 -0
- package/dist/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/pricing-engine/shadow-diff.d.ts +26 -0
- package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-diff.js +52 -0
- package/dist/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/pricing-engine/shadow-facade.d.ts +42 -0
- package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-facade.js +82 -0
- package/dist/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.js +18 -0
- package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
- package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-metrics.js +31 -0
- package/dist/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.js +39 -0
- package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/pricing-engine/types.d.ts +2 -0
- package/dist/pricing-engine/types.d.ts.map +1 -1
- package/dist/rbac/authorize.d.ts +12 -0
- package/dist/rbac/authorize.d.ts.map +1 -1
- package/dist/rbac/authorize.js +27 -0
- package/dist/rbac/authorize.js.map +1 -1
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +67 -1
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/rbac/workload-provisioning.d.ts +66 -0
- package/dist/rbac/workload-provisioning.d.ts.map +1 -0
- package/dist/rbac/workload-provisioning.js +153 -0
- package/dist/rbac/workload-provisioning.js.map +1 -0
- package/dist/rbac/workload.d.ts +124 -0
- package/dist/rbac/workload.d.ts.map +1 -0
- package/dist/rbac/workload.js +184 -0
- package/dist/rbac/workload.js.map +1 -0
- package/dist/storage/checksum.d.ts +9 -0
- package/dist/storage/checksum.d.ts.map +1 -0
- package/dist/storage/checksum.js +12 -0
- package/dist/storage/checksum.js.map +1 -0
- package/dist/storage/key.d.ts +37 -0
- package/dist/storage/key.d.ts.map +1 -0
- package/dist/storage/key.js +67 -0
- package/dist/storage/key.js.map +1 -0
- package/dist/storage/local.d.ts +40 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +96 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/r2.d.ts +43 -0
- package/dist/storage/r2.d.ts.map +1 -0
- package/dist/storage/r2.js +177 -0
- package/dist/storage/r2.js.map +1 -0
- package/dist/storage/registry.d.ts +23 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +37 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/types.d.ts +67 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +45 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/subscription-billing/provider/asaas.d.ts +14 -0
- package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
- package/dist/subscription-billing/provider/asaas.js +32 -7
- package/dist/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/subscription-billing/provider/disabled.d.ts +9 -0
- package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
- package/dist/subscription-billing/provider/disabled.js +8 -0
- package/dist/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/subscription-billing/provider/registry.d.ts +10 -0
- package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
- package/dist/subscription-billing/provider/registry.js +17 -0
- package/dist/subscription-billing/provider/registry.js.map +1 -1
- package/dist/subscription-billing/service.d.ts +17 -1
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +57 -8
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/subscription-billing/types.d.ts +13 -0
- package/dist/subscription-billing/types.d.ts.map +1 -1
- package/dist/subscription-billing/types.js.map +1 -1
- package/dist/tenancy/provisioning.d.ts.map +1 -1
- package/dist/tenancy/provisioning.js +32 -8
- package/dist/tenancy/provisioning.js.map +1 -1
- package/dist/users/repository.d.ts +38 -0
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +118 -3
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +67 -0
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +78 -0
- package/dist/vault/repository.js.map +1 -1
- package/package.json +13 -4
- package/src/db/migrations/0023_user_invite_activation.sql +15 -0
- package/src/db/migrations/0024_set_user_password_function.sql +32 -0
- package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
- package/src/db/migrations/0026_documents_and_competence.sql +353 -0
- package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
- package/src/db/migrations/0028_collection_engine.sql +94 -0
- package/src/db/migrations/0029_payment_rail.sql +107 -0
- package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
- package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
- package/src/db/migrations/0032_settlement_reversal.sql +76 -0
- package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
- package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
- package/src/db/migrations/0035_payment_account_environments.sql +61 -0
- package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
- package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
- package/src/db/migrations/0038_notification_channels.sql +175 -0
- package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
- package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
- package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
- package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
- package/src/db/migrations/0043_workload_identity.sql +105 -0
- package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
- package/dist/cjs/mail/resend-client.js +0 -103
- package/dist/cjs/mail/resend-client.js.map +0 -1
- package/dist/mail/resend-client.d.ts +0 -16
- package/dist/mail/resend-client.d.ts.map +0 -1
- package/dist/mail/resend-client.js +0 -100
- package/dist/mail/resend-client.js.map +0 -1
|
@@ -3,8 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createFeeAgreement = createFeeAgreement;
|
|
4
4
|
exports.listFeeAgreements = listFeeAgreements;
|
|
5
5
|
exports.setFeeStatus = setFeeStatus;
|
|
6
|
+
exports.getFeeAgreement = getFeeAgreement;
|
|
7
|
+
exports.updateFeeAgreement = updateFeeAgreement;
|
|
6
8
|
exports.createCharge = createCharge;
|
|
7
9
|
exports.listCharges = listCharges;
|
|
10
|
+
exports.listChargesForReceivable = listChargesForReceivable;
|
|
8
11
|
exports.getCharge = getCharge;
|
|
9
12
|
exports.markChargePaid = markChargePaid;
|
|
10
13
|
exports.markChargePaidByExternal = markChargePaidByExternal;
|
|
@@ -16,6 +19,7 @@ function mapFee(r) {
|
|
|
16
19
|
return {
|
|
17
20
|
id: r.id,
|
|
18
21
|
clientId: r.client_id,
|
|
22
|
+
clientName: r.client_name ?? null,
|
|
19
23
|
description: r.description,
|
|
20
24
|
amount: Number(r.amount),
|
|
21
25
|
periodicity: r.periodicity,
|
|
@@ -30,31 +34,55 @@ function mapFee(r) {
|
|
|
30
34
|
createdAt: r.created_at.toISOString(),
|
|
31
35
|
};
|
|
32
36
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Vigência coerente: fim nunca antes do início.
|
|
39
|
+
*
|
|
40
|
+
* Mora no domínio, e não só no schema da rota, porque um acordo com término
|
|
41
|
+
* anterior ao início nunca se aplica a competência alguma — `feeAppliesTo`
|
|
42
|
+
* devolve `false` para sempre. O escritório cadastraria um honorário que
|
|
43
|
+
* simplesmente nunca cobra, sem nenhum erro em lugar nenhum.
|
|
44
|
+
*/
|
|
45
|
+
function assertValidity(startsOn, endsOn) {
|
|
46
|
+
if (startsOn && endsOn && endsOn < startsOn) {
|
|
47
|
+
throw new shared_1.ValidationError('Término da vigência não pode ser anterior ao início');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** As mesmas colunas, qualificadas e com o nome do cliente ao lado. */
|
|
51
|
+
const FEE_COLS_JOINED = `
|
|
52
|
+
f.id, f.client_id, f.description, f.amount, f.periodicity, f.due_day, f.billing_method,
|
|
53
|
+
f.discount, f.fine_percent, f.interest_percent, f.status, f.starts_on, f.ends_on, f.created_at,
|
|
54
|
+
cl.display_name AS client_name
|
|
36
55
|
`;
|
|
37
56
|
async function createFeeAgreement(tx, input) {
|
|
57
|
+
assertValidity(input.startsOn, input.endsOn);
|
|
38
58
|
const rows = await tx `
|
|
39
59
|
INSERT INTO fee_agreement (
|
|
40
60
|
id, tenant_id, client_id, description, amount, periodicity, due_day,
|
|
41
|
-
billing_method, discount, fine_percent, interest_percent, starts_on, created_by
|
|
61
|
+
billing_method, discount, fine_percent, interest_percent, starts_on, ends_on, created_by
|
|
42
62
|
) VALUES (
|
|
43
63
|
${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid, ${input.clientId},
|
|
44
64
|
${input.description ?? 'Honorários'}, ${input.amount}, ${input.periodicity ?? 'monthly'},
|
|
45
65
|
${input.dueDay ?? null}, ${input.billingMethod ?? 'pix'}, ${input.discount ?? 0},
|
|
46
|
-
${input.finePercent ?? 0}, ${input.interestPercent ?? 0}, ${input.startsOn ?? null},
|
|
66
|
+
${input.finePercent ?? 0}, ${input.interestPercent ?? 0}, ${input.startsOn ?? null},
|
|
67
|
+
${input.endsOn ?? null}, ${input.createdBy ?? null}
|
|
47
68
|
)
|
|
48
|
-
RETURNING
|
|
69
|
+
RETURNING id
|
|
49
70
|
`;
|
|
50
|
-
|
|
71
|
+
// Releitura em vez de `RETURNING` das colunas: um `RETURNING` não alcança o
|
|
72
|
+
// JOIN do cliente, e devolver aqui um registro sem `clientName` criaria duas
|
|
73
|
+
// formas do mesmo tipo — uma completa na leitura, outra pela metade na
|
|
74
|
+
// criação. Quem consumisse o retorno do POST veria o nome como null sem que
|
|
75
|
+
// nada estivesse errado no banco.
|
|
76
|
+
return getFeeAgreement(tx, rows[0].id);
|
|
51
77
|
}
|
|
52
78
|
async function listFeeAgreements(tx, clientId) {
|
|
53
79
|
const rows = await tx `
|
|
54
|
-
SELECT ${tx.unsafe(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
80
|
+
SELECT ${tx.unsafe(FEE_COLS_JOINED)}
|
|
81
|
+
FROM fee_agreement f
|
|
82
|
+
LEFT JOIN client cl ON cl.id = f.client_id AND cl.deleted_at IS NULL
|
|
83
|
+
WHERE f.deleted_at IS NULL
|
|
84
|
+
AND (${clientId ?? null}::uuid IS NULL OR f.client_id = ${clientId ?? null})
|
|
85
|
+
ORDER BY f.created_at DESC
|
|
58
86
|
`;
|
|
59
87
|
return rows.map(mapFee);
|
|
60
88
|
}
|
|
@@ -65,10 +93,64 @@ async function setFeeStatus(tx, id, status) {
|
|
|
65
93
|
`;
|
|
66
94
|
return rows.count;
|
|
67
95
|
}
|
|
96
|
+
async function getFeeAgreement(tx, id) {
|
|
97
|
+
const rows = await tx `
|
|
98
|
+
SELECT ${tx.unsafe(FEE_COLS_JOINED)}
|
|
99
|
+
FROM fee_agreement f
|
|
100
|
+
LEFT JOIN client cl ON cl.id = f.client_id AND cl.deleted_at IS NULL
|
|
101
|
+
WHERE f.id = ${id} AND f.deleted_at IS NULL
|
|
102
|
+
`;
|
|
103
|
+
if (!rows[0])
|
|
104
|
+
throw new shared_1.NotFoundError('Honorário não encontrado');
|
|
105
|
+
return mapFee(rows[0]);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Altera o acordo daqui para a frente.
|
|
109
|
+
*
|
|
110
|
+
* Recebíveis já gerados NÃO são reescritos: a competência de julho foi emitida
|
|
111
|
+
* pelo valor de julho, e o cliente pode já tê-la pago. Alterar o passado faria
|
|
112
|
+
* o extrato do Portal deixar de bater com o boleto que a pessoa tem em mãos.
|
|
113
|
+
*/
|
|
114
|
+
async function updateFeeAgreement(tx, id, patch) {
|
|
115
|
+
const has = (k) => patch[k] !== undefined;
|
|
116
|
+
// Sem campo nenhum, o UPDATE viraria `SET updated_at = now()` e bumparia a
|
|
117
|
+
// versão de um acordo intocado — ruído na trilha de auditoria.
|
|
118
|
+
const touched = Object.keys(patch).some((k) => has(k));
|
|
119
|
+
if (!touched)
|
|
120
|
+
return getFeeAgreement(tx, id);
|
|
121
|
+
// A vigência é validada contra o estado RESULTANTE, não contra o patch: quem
|
|
122
|
+
// muda só o término precisa ser comparado com o início que já está gravado.
|
|
123
|
+
const current = await getFeeAgreement(tx, id);
|
|
124
|
+
assertValidity(has('startsOn') ? (patch.startsOn ?? null) : current.startsOn, has('endsOn') ? (patch.endsOn ?? null) : current.endsOn);
|
|
125
|
+
const rows = await tx `
|
|
126
|
+
UPDATE fee_agreement SET
|
|
127
|
+
description = ${has('description') ? patch.description : tx `description`},
|
|
128
|
+
amount = ${has('amount') ? patch.amount : tx `amount`},
|
|
129
|
+
periodicity = ${has('periodicity') ? patch.periodicity : tx `periodicity`},
|
|
130
|
+
due_day = ${has('dueDay') ? (patch.dueDay ?? null) : tx `due_day`},
|
|
131
|
+
billing_method = ${has('billingMethod') ? patch.billingMethod : tx `billing_method`},
|
|
132
|
+
discount = ${has('discount') ? patch.discount : tx `discount`},
|
|
133
|
+
fine_percent = ${has('finePercent') ? patch.finePercent : tx `fine_percent`},
|
|
134
|
+
interest_percent = ${has('interestPercent') ? patch.interestPercent : tx `interest_percent`},
|
|
135
|
+
starts_on = ${has('startsOn') ? (patch.startsOn ?? null) : tx `starts_on`},
|
|
136
|
+
ends_on = ${has('endsOn') ? (patch.endsOn ?? null) : tx `ends_on`},
|
|
137
|
+
updated_at = now(), version = version + 1
|
|
138
|
+
WHERE id = ${id} AND deleted_at IS NULL
|
|
139
|
+
RETURNING id
|
|
140
|
+
`;
|
|
141
|
+
if (!rows[0])
|
|
142
|
+
throw new shared_1.NotFoundError('Honorário não encontrado');
|
|
143
|
+
return getFeeAgreement(tx, rows[0].id);
|
|
144
|
+
}
|
|
68
145
|
function mapCharge(r) {
|
|
146
|
+
const recurring = Boolean(r.receivable_fee_agreement_id ?? r.fee_agreement_id);
|
|
69
147
|
return {
|
|
70
148
|
id: r.id,
|
|
71
149
|
clientId: r.client_id,
|
|
150
|
+
clientName: r.client_name ?? null,
|
|
151
|
+
receivableId: r.receivable_id ?? null,
|
|
152
|
+
competence: r.competence ?? null,
|
|
153
|
+
origin: recurring ? 'recurring' : 'one_off',
|
|
72
154
|
feeAgreementId: r.fee_agreement_id,
|
|
73
155
|
provider: r.provider,
|
|
74
156
|
externalId: r.external_id,
|
|
@@ -86,6 +168,26 @@ const CHARGE_COLS = `
|
|
|
86
168
|
id, client_id, fee_agreement_id, provider, external_id, method, amount,
|
|
87
169
|
status, description, due_date, paid_at, metadata, created_at
|
|
88
170
|
`;
|
|
171
|
+
/**
|
|
172
|
+
* Colunas da cobrança já acompanhadas do que a operação precisa ler.
|
|
173
|
+
*
|
|
174
|
+
* O `LEFT JOIN` é deliberado nos dois lados: cliente removido não deve fazer a
|
|
175
|
+
* cobrança desaparecer da lista financeira, e cobrança anterior ao Payment Rail
|
|
176
|
+
* não tem recebível. Em ambos os casos o campo vem nulo e a tela mostra "—".
|
|
177
|
+
*/
|
|
178
|
+
const CHARGE_COLS_JOINED = `
|
|
179
|
+
c.id, c.client_id, c.fee_agreement_id, c.provider, c.external_id, c.method, c.amount,
|
|
180
|
+
c.status, c.description, c.due_date, c.paid_at, c.metadata, c.created_at,
|
|
181
|
+
cl.display_name AS client_name,
|
|
182
|
+
c.receivable_id,
|
|
183
|
+
r.competence,
|
|
184
|
+
r.fee_agreement_id AS receivable_fee_agreement_id
|
|
185
|
+
`;
|
|
186
|
+
const CHARGE_JOINS = `
|
|
187
|
+
FROM charge c
|
|
188
|
+
LEFT JOIN client cl ON cl.id = c.client_id AND cl.deleted_at IS NULL
|
|
189
|
+
LEFT JOIN receivable r ON r.id = c.receivable_id AND r.deleted_at IS NULL
|
|
190
|
+
`;
|
|
89
191
|
async function createCharge(tx, input) {
|
|
90
192
|
const rows = await tx `
|
|
91
193
|
INSERT INTO charge (
|
|
@@ -105,21 +207,51 @@ async function createCharge(tx, input) {
|
|
|
105
207
|
async function listCharges(tx, filter = {}) {
|
|
106
208
|
const limit = Math.min(filter.limit ?? 50, 200);
|
|
107
209
|
const offset = filter.offset ?? 0;
|
|
210
|
+
// `origin` é filtrado sobre a MESMA derivação que `mapCharge` usa. Repetir a
|
|
211
|
+
// regra em SQL com outro critério faria a lista e o rótulo da linha
|
|
212
|
+
// discordarem — a tela diria "avulsa" num item trazido pelo filtro
|
|
213
|
+
// "recorrente".
|
|
214
|
+
const search = filter.search?.trim();
|
|
108
215
|
const rows = await tx `
|
|
109
|
-
SELECT ${tx.unsafe(
|
|
110
|
-
|
|
111
|
-
WHERE deleted_at IS NULL
|
|
112
|
-
AND (${filter.clientId ?? null}::uuid IS NULL OR client_id = ${filter.clientId ?? null})
|
|
113
|
-
AND (${filter.status ?? null}::text IS NULL OR status = ${filter.status ?? null})
|
|
114
|
-
|
|
216
|
+
SELECT ${tx.unsafe(CHARGE_COLS_JOINED)}, count(*) OVER() AS total
|
|
217
|
+
${tx.unsafe(CHARGE_JOINS)}
|
|
218
|
+
WHERE c.deleted_at IS NULL
|
|
219
|
+
AND (${filter.clientId ?? null}::uuid IS NULL OR c.client_id = ${filter.clientId ?? null})
|
|
220
|
+
AND (${filter.status ?? null}::text IS NULL OR c.status = ${filter.status ?? null})
|
|
221
|
+
AND (${filter.competence ?? null}::text IS NULL OR r.competence = ${filter.competence ?? null})
|
|
222
|
+
AND (${filter.dueFrom ?? null}::date IS NULL OR c.due_date >= ${filter.dueFrom ?? null}::date)
|
|
223
|
+
AND (${filter.dueTo ?? null}::date IS NULL OR c.due_date <= ${filter.dueTo ?? null}::date)
|
|
224
|
+
AND (${filter.origin ?? null}::text IS NULL
|
|
225
|
+
OR (${filter.origin ?? null} = 'recurring')
|
|
226
|
+
= (COALESCE(r.fee_agreement_id, c.fee_agreement_id) IS NOT NULL))
|
|
227
|
+
AND (${search ?? null}::text IS NULL
|
|
228
|
+
OR c.description ILIKE '%' || ${search ?? null} || '%'
|
|
229
|
+
OR cl.display_name ILIKE '%' || ${search ?? null} || '%')
|
|
230
|
+
ORDER BY c.due_date DESC NULLS LAST, c.created_at DESC
|
|
115
231
|
LIMIT ${limit} OFFSET ${offset}
|
|
116
232
|
`;
|
|
117
233
|
const total = rows[0] ? Number(rows[0].total) : 0;
|
|
118
234
|
return { items: rows.map(mapCharge), total };
|
|
119
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* Cobranças emitidas para um recebível — a cadeia dívida → instrumento.
|
|
238
|
+
*
|
|
239
|
+
* Mais de uma é o caso NORMAL, não a exceção: a primeira vence, o escritório
|
|
240
|
+
* reemite, e ambas ficam. Ordenadas da mais recente para a mais antiga porque a
|
|
241
|
+
* pergunta operacional é "qual é a que vale agora".
|
|
242
|
+
*/
|
|
243
|
+
async function listChargesForReceivable(tx, receivableId) {
|
|
244
|
+
const rows = await tx `
|
|
245
|
+
SELECT ${tx.unsafe(CHARGE_COLS_JOINED)} ${tx.unsafe(CHARGE_JOINS)}
|
|
246
|
+
WHERE c.receivable_id = ${receivableId} AND c.deleted_at IS NULL
|
|
247
|
+
ORDER BY c.created_at DESC
|
|
248
|
+
`;
|
|
249
|
+
return rows.map(mapCharge);
|
|
250
|
+
}
|
|
120
251
|
async function getCharge(tx, id) {
|
|
121
252
|
const rows = await tx `
|
|
122
|
-
SELECT ${tx.unsafe(
|
|
253
|
+
SELECT ${tx.unsafe(CHARGE_COLS_JOINED)} ${tx.unsafe(CHARGE_JOINS)}
|
|
254
|
+
WHERE c.id = ${id} AND c.deleted_at IS NULL
|
|
123
255
|
`;
|
|
124
256
|
if (!rows[0])
|
|
125
257
|
throw new shared_1.NotFoundError('Cobrança não encontrada');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/billing/repository.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/billing/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.contactabilityOf = contactabilityOf;
|
|
4
|
+
exports.normalizeEmail = normalizeEmail;
|
|
5
|
+
exports.normalizePhone = normalizePhone;
|
|
3
6
|
exports.createClient = createClient;
|
|
4
7
|
exports.listClients = listClients;
|
|
5
8
|
exports.getClient = getClient;
|
|
@@ -9,6 +12,35 @@ exports.updateClient = updateClient;
|
|
|
9
12
|
exports.softDeleteClient = softDeleteClient;
|
|
10
13
|
exports.findClientIdByDocument = findClientIdByDocument;
|
|
11
14
|
const shared_1 = require("@baruk/shared");
|
|
15
|
+
const phone_js_1 = require("../contacts/phone.js");
|
|
16
|
+
function contactabilityOf(input) {
|
|
17
|
+
const email = input.email?.trim() ? 'ready' : 'missing';
|
|
18
|
+
const phone = input.phone?.trim() ? 'ready' : 'missing';
|
|
19
|
+
return { email, phone, reachable: email === 'ready' || phone === 'ready' };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Normalização de contato.
|
|
23
|
+
*
|
|
24
|
+
* E-mail vira minúsculo e sem espaços — a coluna é `citext`, mas quem lê o dado
|
|
25
|
+
* fora do banco não herda essa insensibilidade. Telefone guarda só dígitos e um
|
|
26
|
+
* `+` inicial: máscara é apresentação, e comparar "(62) 99999-9999" com
|
|
27
|
+
* "+5562999999999" é o tipo de divergência que só aparece quando a mensagem não
|
|
28
|
+
* chega.
|
|
29
|
+
*/
|
|
30
|
+
function normalizeEmail(v) {
|
|
31
|
+
const t = v?.trim().toLowerCase();
|
|
32
|
+
return t ? t : null;
|
|
33
|
+
}
|
|
34
|
+
function normalizePhone(v) {
|
|
35
|
+
if (!v)
|
|
36
|
+
return null;
|
|
37
|
+
const trimmed = v.trim();
|
|
38
|
+
const plus = trimmed.startsWith('+');
|
|
39
|
+
const digits = trimmed.replace(/\D/g, '');
|
|
40
|
+
if (!digits)
|
|
41
|
+
return null;
|
|
42
|
+
return plus ? `+${digits}` : digits;
|
|
43
|
+
}
|
|
12
44
|
function mapRow(r) {
|
|
13
45
|
return {
|
|
14
46
|
id: r.id,
|
|
@@ -16,30 +48,58 @@ function mapRow(r) {
|
|
|
16
48
|
clientType: r.client_type,
|
|
17
49
|
displayName: r.display_name,
|
|
18
50
|
documentNumber: r.document_number,
|
|
51
|
+
email: r.email ?? null,
|
|
52
|
+
phone: r.phone ?? null,
|
|
19
53
|
status: r.status,
|
|
20
54
|
createdAt: r.created_at.toISOString(),
|
|
55
|
+
contactability: contactabilityOf({ email: r.email, phone: r.phone }),
|
|
21
56
|
};
|
|
22
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Traduz a violação de documento duplicado.
|
|
60
|
+
*
|
|
61
|
+
* O banco impede dois clientes com o mesmo CPF/CNPJ no tenant — regra correta,
|
|
62
|
+
* e o escritório precisa saber que foi ISSO. Sem tradução, a rota devolvia 500
|
|
63
|
+
* genérico: quem cadastrava via um "erro interno" onde havia um cadastro já
|
|
64
|
+
* existente, e não tinha como descobrir.
|
|
65
|
+
*/
|
|
66
|
+
function asDuplicateDocument(err) {
|
|
67
|
+
const e = err;
|
|
68
|
+
if (e?.code === '23505' && (e.constraint_name ?? '').includes('document')) {
|
|
69
|
+
throw new shared_1.ConflictError('Já existe um cliente com este CPF/CNPJ neste escritório.');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
23
72
|
async function createClient(tx, input) {
|
|
24
73
|
// tenant_id vem da GUC — nunca do input. A WITH CHECK da RLS recusa qualquer
|
|
25
74
|
// tentativa de gravar fora do tenant corrente.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
75
|
+
try {
|
|
76
|
+
const rows = await tx `
|
|
77
|
+
INSERT INTO client (id, tenant_id, client_type, display_name, document_number,
|
|
78
|
+
email, phone, phone_e164, created_by)
|
|
79
|
+
VALUES (
|
|
80
|
+
${(0, shared_1.uuidv7)()},
|
|
81
|
+
current_setting('app.current_tenant')::uuid,
|
|
82
|
+
${input.clientType ?? 'pj'},
|
|
83
|
+
${input.displayName},
|
|
84
|
+
${input.documentNumber ?? null},
|
|
85
|
+
${normalizeEmail(input.email)},
|
|
86
|
+
${normalizePhone(input.phone)},
|
|
87
|
+
${(0, phone_js_1.toE164OrNull)(input.phone)},
|
|
88
|
+
${input.createdBy ?? null}
|
|
89
|
+
)
|
|
90
|
+
RETURNING id, tenant_id, client_type, display_name, document_number, email, phone,
|
|
91
|
+
status, created_at
|
|
92
|
+
`;
|
|
93
|
+
return mapRow(rows[0]);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
asDuplicateDocument(err);
|
|
97
|
+
throw err;
|
|
98
|
+
}
|
|
39
99
|
}
|
|
40
100
|
async function listClients(tx) {
|
|
41
101
|
const rows = await tx `
|
|
42
|
-
SELECT id, tenant_id, client_type, display_name, document_number, status, created_at
|
|
102
|
+
SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at
|
|
43
103
|
FROM client
|
|
44
104
|
WHERE deleted_at IS NULL
|
|
45
105
|
ORDER BY created_at DESC
|
|
@@ -48,7 +108,7 @@ async function listClients(tx) {
|
|
|
48
108
|
}
|
|
49
109
|
async function getClient(tx, id) {
|
|
50
110
|
const rows = await tx `
|
|
51
|
-
SELECT id, tenant_id, client_type, display_name, document_number, status, created_at
|
|
111
|
+
SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at
|
|
52
112
|
FROM client
|
|
53
113
|
WHERE id = ${id} AND deleted_at IS NULL
|
|
54
114
|
`;
|
|
@@ -74,7 +134,7 @@ async function listClientsPaged(tx, filter = {}) {
|
|
|
74
134
|
const offset = filter.offset ?? 0;
|
|
75
135
|
const like = filter.search ? `%${filter.search}%` : null;
|
|
76
136
|
const rows = await tx `
|
|
77
|
-
SELECT id, tenant_id, client_type, display_name, document_number, status, created_at,
|
|
137
|
+
SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at,
|
|
78
138
|
count(*) OVER() AS total
|
|
79
139
|
FROM client
|
|
80
140
|
WHERE deleted_at IS NULL
|
|
@@ -87,14 +147,25 @@ async function listClientsPaged(tx, filter = {}) {
|
|
|
87
147
|
return { items: rows.map((r) => mapRow(r)), total };
|
|
88
148
|
}
|
|
89
149
|
async function updateClient(tx, id, input) {
|
|
150
|
+
// Corrigir um documento para um que já existe cai na mesma violação — e o
|
|
151
|
+
// escritório precisa da mesma explicação, não de um 500.
|
|
90
152
|
// Casts explícitos: parâmetros NULL sem tipo quebram COALESCE ("could not
|
|
91
153
|
// determine data type of parameter") no PostgreSQL.
|
|
92
|
-
|
|
154
|
+
try {
|
|
155
|
+
const rows = await tx `
|
|
93
156
|
UPDATE client SET
|
|
94
157
|
display_name = COALESCE(${input.displayName ?? null}::text, display_name),
|
|
95
158
|
legal_name = COALESCE(${input.legalName ?? null}::text, legal_name),
|
|
96
|
-
|
|
97
|
-
|
|
159
|
+
document_number = COALESCE(${input.documentNumber ?? null}::text, document_number),
|
|
160
|
+
email = COALESCE(${normalizeEmail(input.email)}::citext, email),
|
|
161
|
+
phone = COALESCE(${normalizePhone(input.phone)}::text, phone),
|
|
162
|
+
-- Derivado, nunca digitado. A coluna phone guarda o que o operador
|
|
163
|
+
-- escreveu e continua sendo dele; phone_e164 e a forma que os providers
|
|
164
|
+
-- exigem. So e recalculado quando o telefone vem no corpo: ausente
|
|
165
|
+
-- preserva o valor, e um telefone que nao parseia zera o canonico em vez
|
|
166
|
+
-- de manter um E.164 velho apontando para outro numero.
|
|
167
|
+
phone_e164 = CASE WHEN ${input.phone ?? null}::text IS NULL THEN phone_e164
|
|
168
|
+
ELSE ${(0, phone_js_1.toE164OrNull)(input.phone)}::text END,
|
|
98
169
|
status = COALESCE(${input.status ?? null}::text, status),
|
|
99
170
|
updated_by = ${input.updatedBy ?? null}::uuid,
|
|
100
171
|
updated_at = now(),
|
|
@@ -102,7 +173,12 @@ async function updateClient(tx, id, input) {
|
|
|
102
173
|
WHERE id = ${id} AND deleted_at IS NULL
|
|
103
174
|
RETURNING id
|
|
104
175
|
`;
|
|
105
|
-
|
|
176
|
+
return rows.count;
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
asDuplicateDocument(err);
|
|
180
|
+
throw err;
|
|
181
|
+
}
|
|
106
182
|
}
|
|
107
183
|
async function softDeleteClient(tx, id, deletedBy) {
|
|
108
184
|
const rows = await tx `
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/clients/repository.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/clients/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTenantBranding = getTenantBranding;
|
|
4
|
+
exports.senderFor = senderFor;
|
|
5
|
+
/**
|
|
6
|
+
* Padrão neutro do produto — deliberadamente SEM marca.
|
|
7
|
+
*
|
|
8
|
+
* Um tenant sem branding configurado não deve herdar a identidade de outro
|
|
9
|
+
* escritório nem a do Baruk: o cinza-azulado abaixo não pertence a marca
|
|
10
|
+
* nenhuma, e é o sinal visível de que falta configurar.
|
|
11
|
+
*/
|
|
12
|
+
const NEUTRAL_PRIMARY = '#2b3440';
|
|
13
|
+
const NEUTRAL_ACCENT = '#4a5563';
|
|
14
|
+
const NEUTRAL_BACKGROUND = '#eef1f4';
|
|
15
|
+
const NEUTRAL_TEXT = '#2b3440';
|
|
16
|
+
const NEUTRAL_MUTED = '#6b7684';
|
|
17
|
+
/** Famílias que existem em qualquer cliente de e-mail — o fim de toda stack. */
|
|
18
|
+
const UNIVERSAL_FALLBACK = `-apple-system,'Segoe UI',Helvetica,Arial,sans-serif`;
|
|
19
|
+
/**
|
|
20
|
+
* Cor só entra se for hex válido.
|
|
21
|
+
*
|
|
22
|
+
* O valor vem de configuração editável e é interpolado dentro de um atributo
|
|
23
|
+
* `style` — aceitar texto livre deixaria o tenant injetar CSS, ou fechar o
|
|
24
|
+
* atributo e injetar markup, na mensagem que sai em nome dele.
|
|
25
|
+
*/
|
|
26
|
+
function safeColor(v, fallback) {
|
|
27
|
+
return typeof v === 'string' && /^#[0-9a-fA-F]{6}$/.test(v) ? v : fallback;
|
|
28
|
+
}
|
|
29
|
+
/** URL só entra se for https — evita `javascript:` e `data:` no `src`/`href`. */
|
|
30
|
+
function safeUrl(v) {
|
|
31
|
+
if (typeof v !== 'string')
|
|
32
|
+
return null;
|
|
33
|
+
return /^https:\/\/[^\s"'<>]+$/i.test(v) ? v : null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Logo só entra se for uma imagem que cliente de e-mail sabe desenhar.
|
|
37
|
+
*
|
|
38
|
+
* SVG é o formato em que os kits de marca vivem — e é justamente o que Gmail e
|
|
39
|
+
* Outlook não renderizam em e-mail. Aceitar o SVG produziria o pior resultado
|
|
40
|
+
* possível: um cabeçalho vazio, sem imagem e sem o nome que o fallback teria
|
|
41
|
+
* escrito. Rasterize antes; aqui, entra PNG ou JPG.
|
|
42
|
+
*/
|
|
43
|
+
function safeLogoUrl(v) {
|
|
44
|
+
const url = safeUrl(v);
|
|
45
|
+
if (!url)
|
|
46
|
+
return null;
|
|
47
|
+
const path = url.split(/[?#]/)[0] ?? '';
|
|
48
|
+
return /\.(png|jpe?g)$/i.test(path) ? url : null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A stack de fontes vai para dentro de um atributo `style`.
|
|
52
|
+
*
|
|
53
|
+
* Aspas duplas, `;`, `{` e `}` deixariam o tenant fechar a declaração e escrever
|
|
54
|
+
* CSS próprio na mensagem que sai em nome dele. Sobram letras, dígitos, espaço,
|
|
55
|
+
* hífen, vírgula, ponto e aspa simples — o que um `font-family` legítimo usa.
|
|
56
|
+
*/
|
|
57
|
+
function safeFontFamily(v) {
|
|
58
|
+
if (typeof v !== 'string')
|
|
59
|
+
return UNIVERSAL_FALLBACK;
|
|
60
|
+
const t = v.trim().slice(0, 160);
|
|
61
|
+
if (!t || !/^[A-Za-z0-9 ,.'-]+$/.test(t))
|
|
62
|
+
return UNIVERSAL_FALLBACK;
|
|
63
|
+
// A queda universal é acrescentada sempre: uma stack que termina numa webfont
|
|
64
|
+
// vira Times New Roman no Outlook, e o e-mail perde a hierarquia inteira.
|
|
65
|
+
return `${t},${UNIVERSAL_FALLBACK}`;
|
|
66
|
+
}
|
|
67
|
+
function safeLogoKind(v) {
|
|
68
|
+
return v === 'lockup' ? 'lockup' : 'symbol';
|
|
69
|
+
}
|
|
70
|
+
function safeText(v, max = 160) {
|
|
71
|
+
if (typeof v !== 'string')
|
|
72
|
+
return null;
|
|
73
|
+
const t = v.trim().slice(0, max);
|
|
74
|
+
return t ? t : null;
|
|
75
|
+
}
|
|
76
|
+
async function getTenantBranding(tx) {
|
|
77
|
+
/*
|
|
78
|
+
* O tenant CORRENTE, e não "o primeiro que aparecer".
|
|
79
|
+
*
|
|
80
|
+
* A consulta era `SELECT display_name, settings FROM tenant LIMIT 1`, sem
|
|
81
|
+
* `WHERE`. Parecia segura porque toda leitura tenant-scoped deste produto
|
|
82
|
+
* passa por `withContext` — mas `tenant` é a tabela RAIZ e **não tem RLS**:
|
|
83
|
+
* ela é a fonte da própria fronteira, não uma linha protegida por ela. Sem
|
|
84
|
+
* `WHERE`, a política que protege todas as outras tabelas não protege esta, e
|
|
85
|
+
* o `LIMIT 1` devolve um escritório arbitrário.
|
|
86
|
+
*
|
|
87
|
+
* A consequência é a pior possível para uma régua de cobrança: o e-mail sai
|
|
88
|
+
* com o nome, a logomarca e as cores de OUTRO escritório. Nunca apareceu
|
|
89
|
+
* porque a base de produção tem um tenant operando — ou seja, o defeito estava
|
|
90
|
+
* esperando o segundo cliente.
|
|
91
|
+
*
|
|
92
|
+
* Sem contexto de tenant a consulta devolve zero linhas de propósito, e o
|
|
93
|
+
* branding cai no padrão NEUTRO — que não pertence a marca nenhuma. Um default
|
|
94
|
+
* que herda a marca do vizinho é o defeito, não o conserto.
|
|
95
|
+
*/
|
|
96
|
+
const rows = await tx `
|
|
97
|
+
SELECT display_name, settings FROM tenant
|
|
98
|
+
WHERE id = NULLIF(current_setting('app.current_tenant', true), '')::uuid
|
|
99
|
+
LIMIT 1
|
|
100
|
+
`;
|
|
101
|
+
const row = rows[0];
|
|
102
|
+
const raw = (row?.settings?.branding ?? {});
|
|
103
|
+
const officeName = safeText(raw.officeName) ?? row?.display_name ?? 'Seu escritório contábil';
|
|
104
|
+
const primary = safeColor(raw.primaryColor, NEUTRAL_PRIMARY);
|
|
105
|
+
return {
|
|
106
|
+
officeName,
|
|
107
|
+
signatureName: safeText(raw.signatureName) ?? officeName,
|
|
108
|
+
tagline: safeText(raw.tagline, 120),
|
|
109
|
+
logoUrl: safeLogoUrl(raw.logoUrl),
|
|
110
|
+
logoKind: safeLogoKind(raw.logoKind),
|
|
111
|
+
primaryColor: primary,
|
|
112
|
+
// Secundária cai na primária: um tenant que configurou só uma cor fica
|
|
113
|
+
// coerente, em vez de ganhar um segundo tom que ninguém escolheu.
|
|
114
|
+
secondaryColor: safeColor(raw.secondaryColor, primary),
|
|
115
|
+
accentColor: safeColor(raw.accentColor, NEUTRAL_ACCENT),
|
|
116
|
+
backgroundColor: safeColor(raw.backgroundColor, NEUTRAL_BACKGROUND),
|
|
117
|
+
textColor: safeColor(raw.textColor, NEUTRAL_TEXT),
|
|
118
|
+
mutedColor: safeColor(raw.mutedColor, NEUTRAL_MUTED),
|
|
119
|
+
fontFamily: safeFontFamily(raw.fontFamily),
|
|
120
|
+
supportEmail: safeText(raw.supportEmail, 120),
|
|
121
|
+
supportPhone: safeText(raw.supportPhone, 40),
|
|
122
|
+
website: safeUrl(raw.website),
|
|
123
|
+
locale: 'pt-BR',
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Remetente no formato `Nome <endereço>`.
|
|
128
|
+
*
|
|
129
|
+
* O endereço continua sendo o do domínio verificado no provider — trocá-lo
|
|
130
|
+
* quebraria a entrega. O que muda é o NOME exibido: as mensagens saíam como
|
|
131
|
+
* "Baruk Contábil" e assinavam "SC Organização Contábil", o que faz o cliente
|
|
132
|
+
* duvidar de quem está cobrando.
|
|
133
|
+
*/
|
|
134
|
+
function senderFor(branding, fallbackFrom) {
|
|
135
|
+
const address = /<([^>]+)>/.exec(fallbackFrom)?.[1] ?? fallbackFrom;
|
|
136
|
+
// Aspas e `<` no nome quebrariam o cabeçalho do e-mail.
|
|
137
|
+
const name = branding.officeName.replace(/["<>\\]/g, '').trim();
|
|
138
|
+
return name ? `${name} <${address}>` : fallbackFrom;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=branding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branding.js","sourceRoot":"","sources":["../../../src/collection/branding.ts"],"names":[],"mappings":"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"}
|