@baruk/core 0.3.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.baruk-provenance.json +10 -0
- package/CHANGELOG.md +85 -0
- package/dist/auth/password-reset.d.ts +30 -1
- package/dist/auth/password-reset.d.ts.map +1 -1
- package/dist/auth/password-reset.js +139 -11
- package/dist/auth/password-reset.js.map +1 -1
- package/dist/auth/service.d.ts +39 -2
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +75 -10
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +334 -0
- package/dist/billing/ar-repository.d.ts.map +1 -0
- package/dist/billing/ar-repository.js +707 -0
- package/dist/billing/ar-repository.js.map +1 -0
- package/dist/billing/auto-generation.d.ts +87 -0
- package/dist/billing/auto-generation.d.ts.map +1 -0
- package/dist/billing/auto-generation.js +181 -0
- package/dist/billing/auto-generation.js.map +1 -0
- package/dist/billing/live-guard.d.ts +64 -0
- package/dist/billing/live-guard.d.ts.map +1 -0
- package/dist/billing/live-guard.js +68 -0
- package/dist/billing/live-guard.js.map +1 -0
- package/dist/billing/payment-means-catalog.d.ts +17 -0
- package/dist/billing/payment-means-catalog.d.ts.map +1 -0
- package/dist/billing/payment-means-catalog.js +21 -0
- package/dist/billing/payment-means-catalog.js.map +1 -0
- package/dist/billing/payment-means.d.ts +38 -0
- package/dist/billing/payment-means.d.ts.map +1 -0
- package/dist/billing/payment-means.js +29 -0
- package/dist/billing/payment-means.js.map +1 -0
- package/dist/billing/payment-rail.d.ts +118 -0
- package/dist/billing/payment-rail.d.ts.map +1 -0
- package/dist/billing/payment-rail.js +295 -0
- package/dist/billing/payment-rail.js.map +1 -0
- package/dist/billing/provider/asaas.d.ts +46 -1
- package/dist/billing/provider/asaas.d.ts.map +1 -1
- package/dist/billing/provider/asaas.js +194 -14
- package/dist/billing/provider/asaas.js.map +1 -1
- package/dist/billing/provider/manual.js +1 -1
- package/dist/billing/provider/manual.js.map +1 -1
- package/dist/billing/provider/types.d.ts +115 -8
- package/dist/billing/provider/types.d.ts.map +1 -1
- package/dist/billing/provider-account.d.ts +89 -0
- package/dist/billing/provider-account.d.ts.map +1 -0
- package/dist/billing/provider-account.js +161 -0
- package/dist/billing/provider-account.js.map +1 -0
- package/dist/billing/provider-onboarding.d.ts +67 -0
- package/dist/billing/provider-onboarding.d.ts.map +1 -0
- package/dist/billing/provider-onboarding.js +234 -0
- package/dist/billing/provider-onboarding.js.map +1 -0
- package/dist/billing/receivable.d.ts +5 -1
- package/dist/billing/receivable.d.ts.map +1 -1
- package/dist/billing/reconcile.d.ts +58 -0
- package/dist/billing/reconcile.d.ts.map +1 -0
- package/dist/billing/reconcile.js +138 -0
- package/dist/billing/reconcile.js.map +1 -0
- package/dist/billing/repository.d.ts +90 -1
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +148 -19
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/auth/password-reset.js +141 -11
- package/dist/cjs/auth/password-reset.js.map +1 -1
- package/dist/cjs/auth/service.js +75 -9
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +728 -0
- package/dist/cjs/billing/ar-repository.js.map +1 -0
- package/dist/cjs/billing/auto-generation.js +186 -0
- package/dist/cjs/billing/auto-generation.js.map +1 -0
- package/dist/cjs/billing/live-guard.js +72 -0
- package/dist/cjs/billing/live-guard.js.map +1 -0
- package/dist/cjs/billing/payment-means-catalog.js +25 -0
- package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
- package/dist/cjs/billing/payment-means.js +33 -0
- package/dist/cjs/billing/payment-means.js.map +1 -0
- package/dist/cjs/billing/payment-rail.js +301 -0
- package/dist/cjs/billing/payment-rail.js.map +1 -0
- package/dist/cjs/billing/provider/asaas.js +194 -14
- package/dist/cjs/billing/provider/asaas.js.map +1 -1
- package/dist/cjs/billing/provider/manual.js +1 -1
- package/dist/cjs/billing/provider/manual.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +170 -0
- package/dist/cjs/billing/provider-account.js.map +1 -0
- package/dist/cjs/billing/provider-onboarding.js +239 -0
- package/dist/cjs/billing/provider-onboarding.js.map +1 -0
- package/dist/cjs/billing/reconcile.js +143 -0
- package/dist/cjs/billing/reconcile.js.map +1 -0
- package/dist/cjs/billing/repository.js +150 -18
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/repository.js +96 -20
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +140 -0
- package/dist/cjs/collection/branding.js.map +1 -0
- package/dist/cjs/collection/channel-accounts.js +137 -0
- package/dist/cjs/collection/channel-accounts.js.map +1 -0
- package/dist/cjs/collection/channel.js +17 -0
- package/dist/cjs/collection/channel.js.map +1 -0
- package/dist/cjs/collection/communication-bridge.js +140 -0
- package/dist/cjs/collection/communication-bridge.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +193 -0
- package/dist/cjs/collection/communication-runtime.js.map +1 -0
- package/dist/cjs/collection/consent-repository.js +84 -0
- package/dist/cjs/collection/consent-repository.js.map +1 -0
- package/dist/cjs/collection/copy.js +125 -0
- package/dist/cjs/collection/copy.js.map +1 -0
- package/dist/cjs/collection/delivery-callback.js +151 -0
- package/dist/cjs/collection/delivery-callback.js.map +1 -0
- package/dist/cjs/collection/email-layout.js +252 -0
- package/dist/cjs/collection/email-layout.js.map +1 -0
- package/dist/cjs/collection/engine.js +414 -0
- package/dist/cjs/collection/engine.js.map +1 -0
- package/dist/cjs/collection/format.js +76 -0
- package/dist/cjs/collection/format.js.map +1 -0
- package/dist/cjs/collection/payment-block.js +3 -0
- package/dist/cjs/collection/payment-block.js.map +1 -0
- package/dist/cjs/collection/policy.js +147 -0
- package/dist/cjs/collection/policy.js.map +1 -0
- package/dist/cjs/collection/repository.js +260 -0
- package/dist/cjs/collection/repository.js.map +1 -0
- package/dist/cjs/collection/subject.js +104 -0
- package/dist/cjs/collection/subject.js.map +1 -0
- package/dist/cjs/collection/template-catalog.js +165 -0
- package/dist/cjs/collection/template-catalog.js.map +1 -0
- package/dist/cjs/collection/template.js +78 -0
- package/dist/cjs/collection/template.js.map +1 -0
- package/dist/cjs/communication/adapters/email.js +132 -0
- package/dist/cjs/communication/adapters/email.js.map +1 -0
- package/dist/cjs/communication/adapters/sms.js +127 -0
- package/dist/cjs/communication/adapters/sms.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp.js +213 -0
- package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
- package/dist/cjs/communication/audit.js +61 -0
- package/dist/cjs/communication/audit.js.map +1 -0
- package/dist/cjs/communication/capabilities.js +76 -0
- package/dist/cjs/communication/capabilities.js.map +1 -0
- package/dist/cjs/communication/channel.js +53 -0
- package/dist/cjs/communication/channel.js.map +1 -0
- package/dist/cjs/communication/claim.js +228 -0
- package/dist/cjs/communication/claim.js.map +1 -0
- package/dist/cjs/communication/consent.js +43 -0
- package/dist/cjs/communication/consent.js.map +1 -0
- package/dist/cjs/communication/context.js +45 -0
- package/dist/cjs/communication/context.js.map +1 -0
- package/dist/cjs/communication/credentials.js +121 -0
- package/dist/cjs/communication/credentials.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +161 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
- package/dist/cjs/communication/dry-run.js +97 -0
- package/dist/cjs/communication/dry-run.js.map +1 -0
- package/dist/cjs/communication/engine.js +483 -0
- package/dist/cjs/communication/engine.js.map +1 -0
- package/dist/cjs/communication/graph.js +50 -0
- package/dist/cjs/communication/graph.js.map +1 -0
- package/dist/cjs/communication/idempotency.js +26 -0
- package/dist/cjs/communication/idempotency.js.map +1 -0
- package/dist/cjs/communication/identity.js +110 -0
- package/dist/cjs/communication/identity.js.map +1 -0
- package/dist/cjs/communication/index.js +135 -0
- package/dist/cjs/communication/index.js.map +1 -0
- package/dist/cjs/communication/onboarding.js +297 -0
- package/dist/cjs/communication/onboarding.js.map +1 -0
- package/dist/cjs/communication/policy.js +16 -0
- package/dist/cjs/communication/policy.js.map +1 -0
- package/dist/cjs/communication/routing.js +77 -0
- package/dist/cjs/communication/routing.js.map +1 -0
- package/dist/cjs/communication/sender-profile.js +128 -0
- package/dist/cjs/communication/sender-profile.js.map +1 -0
- package/dist/cjs/communication/status.js +86 -0
- package/dist/cjs/communication/status.js.map +1 -0
- package/dist/cjs/communication/stores/onboarding.js +135 -0
- package/dist/cjs/communication/stores/onboarding.js.map +1 -0
- package/dist/cjs/communication/stores/postgres.js +458 -0
- package/dist/cjs/communication/stores/postgres.js.map +1 -0
- package/dist/cjs/communication/stores/routing.js +334 -0
- package/dist/cjs/communication/stores/routing.js.map +1 -0
- package/dist/cjs/communication/stores/secrets.js +126 -0
- package/dist/cjs/communication/stores/secrets.js.map +1 -0
- package/dist/cjs/communication/template-provider.js +22 -0
- package/dist/cjs/communication/template-provider.js.map +1 -0
- package/dist/cjs/communication/template.js +63 -0
- package/dist/cjs/communication/template.js.map +1 -0
- package/dist/cjs/communication/webhook-subscription.js +258 -0
- package/dist/cjs/communication/webhook-subscription.js.map +1 -0
- package/dist/cjs/communication/webhook.js +292 -0
- package/dist/cjs/communication/webhook.js.map +1 -0
- package/dist/cjs/competence/repository.js +309 -0
- package/dist/cjs/competence/repository.js.map +1 -0
- package/dist/cjs/contacts/phone.js +192 -0
- package/dist/cjs/contacts/phone.js.map +1 -0
- package/dist/cjs/db/seed-catalog.js +48 -0
- package/dist/cjs/db/seed-catalog.js.map +1 -0
- package/dist/cjs/db/seed.js +15 -7
- package/dist/cjs/db/seed.js.map +1 -1
- package/dist/cjs/documents/repository.js +244 -0
- package/dist/cjs/documents/repository.js.map +1 -0
- package/dist/cjs/documents/requests.js +136 -0
- package/dist/cjs/documents/requests.js.map +1 -0
- package/dist/cjs/index.js +406 -39
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +125 -3
- package/dist/cjs/legal/documents.js.map +1 -1
- package/dist/cjs/legal/types.js +1 -0
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/mail/auth-templates.js +29 -0
- package/dist/cjs/mail/auth-templates.js.map +1 -0
- package/dist/cjs/mail/dedup-store.js +12 -51
- package/dist/cjs/mail/dedup-store.js.map +1 -1
- package/dist/cjs/mail/index.js +16 -4
- package/dist/cjs/mail/index.js.map +1 -1
- package/dist/cjs/mail/provider.js +12 -247
- package/dist/cjs/mail/provider.js.map +1 -1
- package/dist/cjs/mail/resend.js +14 -18
- package/dist/cjs/mail/resend.js.map +1 -1
- package/dist/cjs/mail/sender-resolver.js +12 -11
- package/dist/cjs/mail/sender-resolver.js.map +1 -1
- package/dist/cjs/mail/template-renderer.js +11 -16
- package/dist/cjs/mail/template-renderer.js.map +1 -1
- package/dist/cjs/mail/transactional-outbound.js +117 -0
- package/dist/cjs/mail/transactional-outbound.js.map +1 -0
- package/dist/cjs/mail/types.js +8 -35
- package/dist/cjs/mail/types.js.map +1 -1
- package/dist/cjs/portal/provisioning.js +144 -0
- package/dist/cjs/portal/provisioning.js.map +1 -0
- package/dist/cjs/pricing-engine/canonical.js +42 -0
- package/dist/cjs/pricing-engine/canonical.js.map +1 -0
- package/dist/cjs/pricing-engine/errors.js +6 -1
- package/dist/cjs/pricing-engine/errors.js.map +1 -1
- package/dist/cjs/pricing-engine/index.js +12 -1
- package/dist/cjs/pricing-engine/index.js.map +1 -1
- package/dist/cjs/pricing-engine/pipeline.js +200 -26
- package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
- package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
- package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
- package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
- package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/cjs/rbac/authorize.js +28 -0
- package/dist/cjs/rbac/authorize.js.map +1 -1
- package/dist/cjs/rbac/catalog.js +67 -1
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/rbac/workload-provisioning.js +160 -0
- package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
- package/dist/cjs/rbac/workload.js +191 -0
- package/dist/cjs/rbac/workload.js.map +1 -0
- package/dist/cjs/storage/checksum.js +15 -0
- package/dist/cjs/storage/checksum.js.map +1 -0
- package/dist/cjs/storage/key.js +72 -0
- package/dist/cjs/storage/key.js.map +1 -0
- package/dist/cjs/storage/local.js +100 -0
- package/dist/cjs/storage/local.js.map +1 -0
- package/dist/cjs/storage/r2.js +181 -0
- package/dist/cjs/storage/r2.js.map +1 -0
- package/dist/cjs/storage/registry.js +41 -0
- package/dist/cjs/storage/registry.js.map +1 -0
- package/dist/cjs/storage/types.js +50 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
- package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
- package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/registry.js +17 -0
- package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
- package/dist/cjs/subscription-billing/service.js +57 -8
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/subscription-billing/types.js.map +1 -1
- package/dist/cjs/tenancy/provisioning.js +32 -8
- package/dist/cjs/tenancy/provisioning.js.map +1 -1
- package/dist/cjs/users/repository.js +119 -2
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +81 -0
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/repository.d.ts +42 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +94 -21
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +72 -0
- package/dist/collection/branding.d.ts.map +1 -0
- package/dist/collection/branding.js +136 -0
- package/dist/collection/branding.js.map +1 -0
- package/dist/collection/channel-accounts.d.ts +57 -0
- package/dist/collection/channel-accounts.d.ts.map +1 -0
- package/dist/collection/channel-accounts.js +133 -0
- package/dist/collection/channel-accounts.js.map +1 -0
- package/dist/collection/channel.d.ts +24 -0
- package/dist/collection/channel.d.ts.map +1 -0
- package/dist/collection/channel.js +16 -0
- package/dist/collection/channel.js.map +1 -0
- package/dist/collection/communication-bridge.d.ts +66 -0
- package/dist/collection/communication-bridge.d.ts.map +1 -0
- package/dist/collection/communication-bridge.js +134 -0
- package/dist/collection/communication-bridge.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +95 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -0
- package/dist/collection/communication-runtime.js +187 -0
- package/dist/collection/communication-runtime.js.map +1 -0
- package/dist/collection/consent-repository.d.ts +32 -0
- package/dist/collection/consent-repository.d.ts.map +1 -0
- package/dist/collection/consent-repository.js +79 -0
- package/dist/collection/consent-repository.js.map +1 -0
- package/dist/collection/copy.d.ts +50 -0
- package/dist/collection/copy.d.ts.map +1 -0
- package/dist/collection/copy.js +122 -0
- package/dist/collection/copy.js.map +1 -0
- package/dist/collection/delivery-callback.d.ts +49 -0
- package/dist/collection/delivery-callback.d.ts.map +1 -0
- package/dist/collection/delivery-callback.js +147 -0
- package/dist/collection/delivery-callback.js.map +1 -0
- package/dist/collection/email-layout.d.ts +45 -0
- package/dist/collection/email-layout.d.ts.map +1 -0
- package/dist/collection/email-layout.js +247 -0
- package/dist/collection/email-layout.js.map +1 -0
- package/dist/collection/engine.d.ts +177 -0
- package/dist/collection/engine.d.ts.map +1 -0
- package/dist/collection/engine.js +407 -0
- package/dist/collection/engine.js.map +1 -0
- package/dist/collection/format.d.ts +32 -0
- package/dist/collection/format.d.ts.map +1 -0
- package/dist/collection/format.js +70 -0
- package/dist/collection/format.js.map +1 -0
- package/dist/collection/payment-block.d.ts +24 -0
- package/dist/collection/payment-block.d.ts.map +1 -0
- package/dist/collection/payment-block.js +2 -0
- package/dist/collection/payment-block.js.map +1 -0
- package/dist/collection/policy.d.ts +53 -0
- package/dist/collection/policy.d.ts.map +1 -0
- package/dist/collection/policy.js +141 -0
- package/dist/collection/policy.js.map +1 -0
- package/dist/collection/repository.d.ts +129 -0
- package/dist/collection/repository.d.ts.map +1 -0
- package/dist/collection/repository.js +246 -0
- package/dist/collection/repository.js.map +1 -0
- package/dist/collection/subject.d.ts +66 -0
- package/dist/collection/subject.d.ts.map +1 -0
- package/dist/collection/subject.js +99 -0
- package/dist/collection/subject.js.map +1 -0
- package/dist/collection/template-catalog.d.ts +16 -0
- package/dist/collection/template-catalog.d.ts.map +1 -0
- package/dist/collection/template-catalog.js +162 -0
- package/dist/collection/template-catalog.js.map +1 -0
- package/dist/collection/template.d.ts +37 -0
- package/dist/collection/template.d.ts.map +1 -0
- package/dist/collection/template.js +73 -0
- package/dist/collection/template.js.map +1 -0
- package/dist/communication/adapters/email.d.ts +28 -0
- package/dist/communication/adapters/email.d.ts.map +1 -0
- package/dist/communication/adapters/email.js +129 -0
- package/dist/communication/adapters/email.js.map +1 -0
- package/dist/communication/adapters/sms.d.ts +95 -0
- package/dist/communication/adapters/sms.d.ts.map +1 -0
- package/dist/communication/adapters/sms.js +121 -0
- package/dist/communication/adapters/sms.js.map +1 -0
- package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
- package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-language.js +36 -0
- package/dist/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.js +97 -0
- package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/communication/adapters/whatsapp.d.ts +29 -0
- package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp.js +210 -0
- package/dist/communication/adapters/whatsapp.js.map +1 -0
- package/dist/communication/audit.d.ts +105 -0
- package/dist/communication/audit.d.ts.map +1 -0
- package/dist/communication/audit.js +56 -0
- package/dist/communication/audit.js.map +1 -0
- package/dist/communication/capabilities.d.ts +88 -0
- package/dist/communication/capabilities.d.ts.map +1 -0
- package/dist/communication/capabilities.js +72 -0
- package/dist/communication/capabilities.js.map +1 -0
- package/dist/communication/channel.d.ts +125 -0
- package/dist/communication/channel.d.ts.map +1 -0
- package/dist/communication/channel.js +47 -0
- package/dist/communication/channel.js.map +1 -0
- package/dist/communication/claim.d.ts +368 -0
- package/dist/communication/claim.d.ts.map +1 -0
- package/dist/communication/claim.js +224 -0
- package/dist/communication/claim.js.map +1 -0
- package/dist/communication/consent.d.ts +65 -0
- package/dist/communication/consent.d.ts.map +1 -0
- package/dist/communication/consent.js +40 -0
- package/dist/communication/consent.js.map +1 -0
- package/dist/communication/context.d.ts +48 -0
- package/dist/communication/context.d.ts.map +1 -0
- package/dist/communication/context.js +41 -0
- package/dist/communication/context.js.map +1 -0
- package/dist/communication/credentials.d.ts +74 -0
- package/dist/communication/credentials.d.ts.map +1 -0
- package/dist/communication/credentials.js +115 -0
- package/dist/communication/credentials.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts +37 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -0
- package/dist/communication/dry-run-scenario.js +158 -0
- package/dist/communication/dry-run-scenario.js.map +1 -0
- package/dist/communication/dry-run.d.ts +40 -0
- package/dist/communication/dry-run.d.ts.map +1 -0
- package/dist/communication/dry-run.js +92 -0
- package/dist/communication/dry-run.js.map +1 -0
- package/dist/communication/engine.d.ts +153 -0
- package/dist/communication/engine.d.ts.map +1 -0
- package/dist/communication/engine.js +480 -0
- package/dist/communication/engine.js.map +1 -0
- package/dist/communication/graph.d.ts +38 -0
- package/dist/communication/graph.d.ts.map +1 -0
- package/dist/communication/graph.js +45 -0
- package/dist/communication/graph.js.map +1 -0
- package/dist/communication/idempotency.d.ts +33 -0
- package/dist/communication/idempotency.d.ts.map +1 -0
- package/dist/communication/idempotency.js +23 -0
- package/dist/communication/idempotency.js.map +1 -0
- package/dist/communication/identity.d.ts +127 -0
- package/dist/communication/identity.d.ts.map +1 -0
- package/dist/communication/identity.js +105 -0
- package/dist/communication/identity.js.map +1 -0
- package/dist/communication/index.d.ts +66 -0
- package/dist/communication/index.d.ts.map +1 -0
- package/dist/communication/index.js +42 -0
- package/dist/communication/index.js.map +1 -0
- package/dist/communication/onboarding.d.ts +223 -0
- package/dist/communication/onboarding.d.ts.map +1 -0
- package/dist/communication/onboarding.js +287 -0
- package/dist/communication/onboarding.js.map +1 -0
- package/dist/communication/policy.d.ts +99 -0
- package/dist/communication/policy.d.ts.map +1 -0
- package/dist/communication/policy.js +13 -0
- package/dist/communication/policy.js.map +1 -0
- package/dist/communication/routing.d.ts +99 -0
- package/dist/communication/routing.d.ts.map +1 -0
- package/dist/communication/routing.js +73 -0
- package/dist/communication/routing.js.map +1 -0
- package/dist/communication/sender-profile.d.ts +100 -0
- package/dist/communication/sender-profile.d.ts.map +1 -0
- package/dist/communication/sender-profile.js +123 -0
- package/dist/communication/sender-profile.js.map +1 -0
- package/dist/communication/status.d.ts +48 -0
- package/dist/communication/status.d.ts.map +1 -0
- package/dist/communication/status.js +79 -0
- package/dist/communication/status.js.map +1 -0
- package/dist/communication/stores/onboarding.d.ts +88 -0
- package/dist/communication/stores/onboarding.d.ts.map +1 -0
- package/dist/communication/stores/onboarding.js +127 -0
- package/dist/communication/stores/onboarding.js.map +1 -0
- package/dist/communication/stores/postgres.d.ts +81 -0
- package/dist/communication/stores/postgres.d.ts.map +1 -0
- package/dist/communication/stores/postgres.js +453 -0
- package/dist/communication/stores/postgres.js.map +1 -0
- package/dist/communication/stores/routing.d.ts +169 -0
- package/dist/communication/stores/routing.d.ts.map +1 -0
- package/dist/communication/stores/routing.js +324 -0
- package/dist/communication/stores/routing.js.map +1 -0
- package/dist/communication/stores/secrets.d.ts +89 -0
- package/dist/communication/stores/secrets.d.ts.map +1 -0
- package/dist/communication/stores/secrets.js +122 -0
- package/dist/communication/stores/secrets.js.map +1 -0
- package/dist/communication/template-provider.d.ts +85 -0
- package/dist/communication/template-provider.d.ts.map +1 -0
- package/dist/communication/template-provider.js +21 -0
- package/dist/communication/template-provider.js.map +1 -0
- package/dist/communication/template.d.ts +87 -0
- package/dist/communication/template.d.ts.map +1 -0
- package/dist/communication/template.js +59 -0
- package/dist/communication/template.js.map +1 -0
- package/dist/communication/webhook-subscription.d.ts +156 -0
- package/dist/communication/webhook-subscription.d.ts.map +1 -0
- package/dist/communication/webhook-subscription.js +252 -0
- package/dist/communication/webhook-subscription.js.map +1 -0
- package/dist/communication/webhook.d.ts +121 -0
- package/dist/communication/webhook.d.ts.map +1 -0
- package/dist/communication/webhook.js +283 -0
- package/dist/communication/webhook.js.map +1 -0
- package/dist/competence/repository.d.ts +147 -0
- package/dist/competence/repository.d.ts.map +1 -0
- package/dist/competence/repository.js +294 -0
- package/dist/competence/repository.js.map +1 -0
- package/dist/contacts/phone.d.ts +70 -0
- package/dist/contacts/phone.d.ts.map +1 -0
- package/dist/contacts/phone.js +186 -0
- package/dist/contacts/phone.js.map +1 -0
- package/dist/db/migrate.js +17 -11
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/seed-catalog.d.ts +18 -0
- package/dist/db/seed-catalog.d.ts.map +1 -0
- package/dist/db/seed-catalog.js +45 -0
- package/dist/db/seed-catalog.js.map +1 -0
- package/dist/db/seed.js +16 -8
- package/dist/db/seed.js.map +1 -1
- package/dist/documents/repository.d.ts +97 -0
- package/dist/documents/repository.d.ts.map +1 -0
- package/dist/documents/repository.js +236 -0
- package/dist/documents/repository.js.map +1 -0
- package/dist/documents/requests.d.ts +73 -0
- package/dist/documents/requests.d.ts.map +1 -0
- package/dist/documents/requests.js +127 -0
- package/dist/documents/requests.js.map +1 -0
- package/dist/index.d.ts +109 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -8
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +125 -3
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +1 -1
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/types.d.ts +32 -1
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js +1 -0
- package/dist/legal/types.js.map +1 -1
- package/dist/mail/auth-templates.d.ts +15 -0
- package/dist/mail/auth-templates.d.ts.map +1 -0
- package/dist/mail/auth-templates.js +26 -0
- package/dist/mail/auth-templates.js.map +1 -0
- package/dist/mail/dedup-store.d.ts +1 -24
- package/dist/mail/dedup-store.d.ts.map +1 -1
- package/dist/mail/dedup-store.js +9 -48
- package/dist/mail/dedup-store.js.map +1 -1
- package/dist/mail/index.d.ts +2 -1
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +13 -2
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/provider.d.ts +2 -30
- package/dist/mail/provider.d.ts.map +1 -1
- package/dist/mail/provider.js +10 -246
- package/dist/mail/provider.js.map +1 -1
- package/dist/mail/resend.d.ts +2 -12
- package/dist/mail/resend.d.ts.map +1 -1
- package/dist/mail/resend.js +11 -17
- package/dist/mail/resend.js.map +1 -1
- package/dist/mail/sender-resolver.d.ts +1 -7
- package/dist/mail/sender-resolver.d.ts.map +1 -1
- package/dist/mail/sender-resolver.js +11 -10
- package/dist/mail/sender-resolver.js.map +1 -1
- package/dist/mail/template-renderer.d.ts +1 -9
- package/dist/mail/template-renderer.d.ts.map +1 -1
- package/dist/mail/template-renderer.js +10 -15
- package/dist/mail/template-renderer.js.map +1 -1
- package/dist/mail/transactional-outbound.d.ts +115 -0
- package/dist/mail/transactional-outbound.d.ts.map +1 -0
- package/dist/mail/transactional-outbound.js +113 -0
- package/dist/mail/transactional-outbound.js.map +1 -0
- package/dist/mail/types.d.ts +2 -142
- package/dist/mail/types.d.ts.map +1 -1
- package/dist/mail/types.js +1 -33
- package/dist/mail/types.js.map +1 -1
- package/dist/portal/provisioning.d.ts +58 -0
- package/dist/portal/provisioning.d.ts.map +1 -0
- package/dist/portal/provisioning.js +139 -0
- package/dist/portal/provisioning.js.map +1 -0
- package/dist/pricing-engine/canonical.d.ts +14 -0
- package/dist/pricing-engine/canonical.d.ts.map +1 -0
- package/dist/pricing-engine/canonical.js +39 -0
- package/dist/pricing-engine/canonical.js.map +1 -0
- package/dist/pricing-engine/errors.d.ts.map +1 -1
- package/dist/pricing-engine/errors.js +6 -1
- package/dist/pricing-engine/errors.js.map +1 -1
- package/dist/pricing-engine/index.d.ts +12 -2
- package/dist/pricing-engine/index.d.ts.map +1 -1
- package/dist/pricing-engine/index.js +6 -1
- package/dist/pricing-engine/index.js.map +1 -1
- package/dist/pricing-engine/pipeline.d.ts.map +1 -1
- package/dist/pricing-engine/pipeline.js +202 -28
- package/dist/pricing-engine/pipeline.js.map +1 -1
- package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
- package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-adapter.js +75 -0
- package/dist/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/pricing-engine/shadow-diff.d.ts +26 -0
- package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-diff.js +52 -0
- package/dist/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/pricing-engine/shadow-facade.d.ts +42 -0
- package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-facade.js +82 -0
- package/dist/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.js +18 -0
- package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
- package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-metrics.js +31 -0
- package/dist/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.js +39 -0
- package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/pricing-engine/types.d.ts +2 -0
- package/dist/pricing-engine/types.d.ts.map +1 -1
- package/dist/rbac/authorize.d.ts +12 -0
- package/dist/rbac/authorize.d.ts.map +1 -1
- package/dist/rbac/authorize.js +27 -0
- package/dist/rbac/authorize.js.map +1 -1
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +67 -1
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/rbac/workload-provisioning.d.ts +66 -0
- package/dist/rbac/workload-provisioning.d.ts.map +1 -0
- package/dist/rbac/workload-provisioning.js +153 -0
- package/dist/rbac/workload-provisioning.js.map +1 -0
- package/dist/rbac/workload.d.ts +124 -0
- package/dist/rbac/workload.d.ts.map +1 -0
- package/dist/rbac/workload.js +184 -0
- package/dist/rbac/workload.js.map +1 -0
- package/dist/storage/checksum.d.ts +9 -0
- package/dist/storage/checksum.d.ts.map +1 -0
- package/dist/storage/checksum.js +12 -0
- package/dist/storage/checksum.js.map +1 -0
- package/dist/storage/key.d.ts +37 -0
- package/dist/storage/key.d.ts.map +1 -0
- package/dist/storage/key.js +67 -0
- package/dist/storage/key.js.map +1 -0
- package/dist/storage/local.d.ts +40 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +96 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/r2.d.ts +43 -0
- package/dist/storage/r2.d.ts.map +1 -0
- package/dist/storage/r2.js +177 -0
- package/dist/storage/r2.js.map +1 -0
- package/dist/storage/registry.d.ts +23 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +37 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/types.d.ts +67 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +45 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/subscription-billing/provider/asaas.d.ts +14 -0
- package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
- package/dist/subscription-billing/provider/asaas.js +32 -7
- package/dist/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/subscription-billing/provider/disabled.d.ts +9 -0
- package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
- package/dist/subscription-billing/provider/disabled.js +8 -0
- package/dist/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/subscription-billing/provider/registry.d.ts +10 -0
- package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
- package/dist/subscription-billing/provider/registry.js +17 -0
- package/dist/subscription-billing/provider/registry.js.map +1 -1
- package/dist/subscription-billing/service.d.ts +17 -1
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +57 -8
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/subscription-billing/types.d.ts +13 -0
- package/dist/subscription-billing/types.d.ts.map +1 -1
- package/dist/subscription-billing/types.js.map +1 -1
- package/dist/tenancy/provisioning.d.ts.map +1 -1
- package/dist/tenancy/provisioning.js +32 -8
- package/dist/tenancy/provisioning.js.map +1 -1
- package/dist/users/repository.d.ts +38 -0
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +118 -3
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +67 -0
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +78 -0
- package/dist/vault/repository.js.map +1 -1
- package/package.json +13 -4
- package/src/db/migrations/0023_user_invite_activation.sql +15 -0
- package/src/db/migrations/0024_set_user_password_function.sql +32 -0
- package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
- package/src/db/migrations/0026_documents_and_competence.sql +353 -0
- package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
- package/src/db/migrations/0028_collection_engine.sql +94 -0
- package/src/db/migrations/0029_payment_rail.sql +107 -0
- package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
- package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
- package/src/db/migrations/0032_settlement_reversal.sql +76 -0
- package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
- package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
- package/src/db/migrations/0035_payment_account_environments.sql +61 -0
- package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
- package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
- package/src/db/migrations/0038_notification_channels.sql +175 -0
- package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
- package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
- package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
- package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
- package/src/db/migrations/0043_workload_identity.sql +105 -0
- package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
- package/dist/cjs/mail/resend-client.js +0 -103
- package/dist/cjs/mail/resend-client.js.map +0 -1
- package/dist/mail/resend-client.d.ts +0 -16
- package/dist/mail/resend-client.d.ts.map +0 -1
- package/dist/mail/resend-client.js +0 -100
- package/dist/mail/resend-client.js.map +0 -1
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findActiveCharge = findActiveCharge;
|
|
4
|
+
exports.ensureChargeForReceivable = ensureChargeForReceivable;
|
|
5
|
+
exports.customerFingerprint = customerFingerprint;
|
|
6
|
+
exports.pixQrPngOf = pixQrPngOf;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const live_guard_js_1 = require("./live-guard.js");
|
|
9
|
+
const toCharge = (r) => ({
|
|
10
|
+
id: r.id,
|
|
11
|
+
receivableId: r.receivable_id,
|
|
12
|
+
provider: r.provider,
|
|
13
|
+
externalId: r.external_id,
|
|
14
|
+
method: r.method,
|
|
15
|
+
amount: Number(r.amount),
|
|
16
|
+
status: r.status,
|
|
17
|
+
instructions: r.metadata ?? {},
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* Vencimento que o gateway aceita.
|
|
21
|
+
*
|
|
22
|
+
* Gateway não emite cobrança vencida — o Asaas recusa com `invalid_dueDate`. E
|
|
23
|
+
* recebível vencido é justamente o caso em que a cobrança mais importa: sem
|
|
24
|
+
* isto, quem está atrasado recebe o e-mail de cobrança **sem botão de pagar**,
|
|
25
|
+
* que é o oposto do que a régua existe para fazer.
|
|
26
|
+
*
|
|
27
|
+
* A data do gateway é empurrada para hoje; o vencimento REAL do recebível não
|
|
28
|
+
* muda, e é ele que o e-mail anuncia. O cliente vê "venceu em 10/08" no texto e
|
|
29
|
+
* uma cobrança pagável hoje — que é a verdade dos dois lados.
|
|
30
|
+
*/
|
|
31
|
+
function gatewayDueDate(dueDate, today) {
|
|
32
|
+
if (!dueDate)
|
|
33
|
+
return null;
|
|
34
|
+
const hoje = today ?? new Date().toISOString().slice(0, 10);
|
|
35
|
+
return dueDate < hoje ? hoje : dueDate;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Cobrança viva de um recebível.
|
|
39
|
+
*
|
|
40
|
+
* "Viva" exclui cancelada e estornada — é a mesma definição do índice único da
|
|
41
|
+
* migration, e as duas precisam concordar: se divergirem, o código busca uma
|
|
42
|
+
* cobrança que o banco considera livre e a emissão seguinte estoura.
|
|
43
|
+
*/
|
|
44
|
+
async function findActiveCharge(tx, receivableId) {
|
|
45
|
+
const rows = await tx `
|
|
46
|
+
SELECT id, receivable_id, provider, external_id, method, amount, status, metadata
|
|
47
|
+
FROM charge
|
|
48
|
+
WHERE receivable_id = ${receivableId}
|
|
49
|
+
AND deleted_at IS NULL
|
|
50
|
+
AND status NOT IN ('canceled', 'refunded')
|
|
51
|
+
LIMIT 1
|
|
52
|
+
`;
|
|
53
|
+
return rows[0] ? toCharge(rows[0]) : null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Emite a cobrança de um recebível, ou devolve a que já existe.
|
|
57
|
+
*
|
|
58
|
+
* Três camadas de proteção contra duplicidade, porque cada uma falha num caso
|
|
59
|
+
* diferente:
|
|
60
|
+
*
|
|
61
|
+
* 1. **Busca antes de emitir** — resolve o caso comum (clique repetido, job que
|
|
62
|
+
* roda de novo depois de concluir).
|
|
63
|
+
* 2. **`externalReference` determinístico** — o gateway recebe sempre a mesma
|
|
64
|
+
* referência para o mesmo recebível, o que dá rastreabilidade de ida e volta.
|
|
65
|
+
* 3. **Índice único parcial** — resolve a corrida real: dois processos que
|
|
66
|
+
* passaram juntos pela busca. O segundo leva erro do banco e relê.
|
|
67
|
+
*
|
|
68
|
+
* Só a terceira é garantia; as duas primeiras existem para que a terceira quase
|
|
69
|
+
* nunca precise disparar.
|
|
70
|
+
*/
|
|
71
|
+
async function ensureChargeForReceivable(tx, deps, input) {
|
|
72
|
+
// A chave geral vale para EMISSÃO NOVA, e só. Uma cobrança que já existe
|
|
73
|
+
// continua sendo devolvida, e o dinheiro que entrar continua sendo baixado:
|
|
74
|
+
// pausar emissão não pode significar parar de reconhecer pagamento.
|
|
75
|
+
// O escopo é o recebível: uma autorização nomeada libera a emissão DESTE
|
|
76
|
+
// lançamento e de nenhum outro, com a chave geral seguindo armada.
|
|
77
|
+
(0, live_guard_js_1.assertLiveProviderAllowed)(deps.account.environment, (0, live_guard_js_1.readLiveRuntime)(), 'charge', input.receivableId);
|
|
78
|
+
const existing = await findActiveCharge(tx, input.receivableId);
|
|
79
|
+
if (existing) {
|
|
80
|
+
return {
|
|
81
|
+
charge: await refreshInstructionsIfIncomplete(tx, deps, existing),
|
|
82
|
+
created: false,
|
|
83
|
+
customerSync: 'unchanged',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Reconciliação ANTES da emissão, e não depois: o gateway valida o pagador no
|
|
87
|
+
// momento em que a cobrança é criada. Corrigir o cadastro depois de a emissão
|
|
88
|
+
// ser recusada não ajudaria ninguém.
|
|
89
|
+
const customerSync = await ensurePaymentCustomer(tx, deps, input);
|
|
90
|
+
const customerExternalId = customerSync.externalId;
|
|
91
|
+
const emitted = await deps.provider.createCharge({
|
|
92
|
+
// Determinístico: o mesmo recebível produz sempre a mesma referência, o que
|
|
93
|
+
// permite reconciliar manualmente no painel do gateway sem consultar o banco.
|
|
94
|
+
referenceId: `receivable:${input.receivableId}`,
|
|
95
|
+
amount: input.amount,
|
|
96
|
+
method: input.method,
|
|
97
|
+
dueDate: gatewayDueDate(input.dueDate, input.today),
|
|
98
|
+
description: input.description,
|
|
99
|
+
customer: input.customer,
|
|
100
|
+
customerExternalId,
|
|
101
|
+
});
|
|
102
|
+
const id = (0, node_crypto_1.randomUUID)();
|
|
103
|
+
const inserted = await tx `
|
|
104
|
+
INSERT INTO charge (
|
|
105
|
+
id, tenant_id, client_id, receivable_id, provider_account_id, provider,
|
|
106
|
+
external_id, method, amount, status, description, due_date, metadata
|
|
107
|
+
) VALUES (
|
|
108
|
+
${id},
|
|
109
|
+
NULLIF(current_setting('app.current_tenant', true), '')::uuid,
|
|
110
|
+
${input.clientId}, ${input.receivableId}, ${deps.account.id}, ${deps.provider.key},
|
|
111
|
+
${emitted.externalId}, ${input.method}, ${input.amount}, ${emitted.status},
|
|
112
|
+
${input.description}, ${input.dueDate}, ${tx.json((emitted.payment ?? {}))}
|
|
113
|
+
)
|
|
114
|
+
-- O alvo do ON CONFLICT é EXPLÍCITO, e não um "DO NOTHING" genérico.
|
|
115
|
+
-- Genérico engoliria também um external_id repetido — que não é corrida, é
|
|
116
|
+
-- defeito do adapter — e o trataria como "alguém chegou primeiro",
|
|
117
|
+
-- cancelando no gateway uma cobrança legítima. Aqui, só a duplicata de
|
|
118
|
+
-- cobrança viva é tolerada; qualquer outro conflito estoura e aparece.
|
|
119
|
+
ON CONFLICT (tenant_id, receivable_id)
|
|
120
|
+
WHERE receivable_id IS NOT NULL
|
|
121
|
+
AND deleted_at IS NULL
|
|
122
|
+
AND status NOT IN ('canceled', 'refunded')
|
|
123
|
+
DO NOTHING
|
|
124
|
+
RETURNING id, receivable_id, provider, external_id, method, amount, status, metadata
|
|
125
|
+
`;
|
|
126
|
+
if (inserted[0])
|
|
127
|
+
return { charge: toCharge(inserted[0]), created: true, customerSync: customerSync.action };
|
|
128
|
+
// Perdemos a corrida: outro processo inseriu entre a busca e o INSERT. A
|
|
129
|
+
// cobrança que acabamos de emitir no gateway fica órfã — por isso ela é
|
|
130
|
+
// cancelada, em vez de deixarmos duas cobranças ativas para o mesmo valor.
|
|
131
|
+
if (emitted.externalId) {
|
|
132
|
+
await deps.provider.cancelCharge(emitted.externalId).catch(() => undefined);
|
|
133
|
+
}
|
|
134
|
+
const winner = await findActiveCharge(tx, input.receivableId);
|
|
135
|
+
if (!winner)
|
|
136
|
+
throw new Error('charge_conflict_without_winner');
|
|
137
|
+
return { charge: winner, created: false, customerSync: customerSync.action };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Completa as instruções de pagamento que faltaram na emissão.
|
|
141
|
+
*
|
|
142
|
+
* O QR do PIX vem de um endpoint separado, e essa chamada é tolerante a falha
|
|
143
|
+
* de propósito — derrubar a emissão inteira por causa de um extra trocaria uma
|
|
144
|
+
* cobrança incompleta por nenhuma cobrança. Só que, sem este refresh, a
|
|
145
|
+
* cobrança ficava incompleta **para sempre**: nada voltava a buscar.
|
|
146
|
+
*
|
|
147
|
+
* Aconteceu de verdade na primeira cobrança da conta sandbox da SC, enquanto a
|
|
148
|
+
* chave PIX ainda era provisionada do lado do gateway. A segunda emissão veio
|
|
149
|
+
* completa; a primeira teria seguido sem QR até alguém notar.
|
|
150
|
+
*
|
|
151
|
+
* Roda só quando falta algo e o provider sabe reconsultar — uma cobrança
|
|
152
|
+
* completa não gasta chamada nenhuma.
|
|
153
|
+
*/
|
|
154
|
+
async function refreshInstructionsIfIncomplete(tx, deps, charge) {
|
|
155
|
+
if (!deps.provider.fetchPaymentInstructions || !charge.externalId)
|
|
156
|
+
return charge;
|
|
157
|
+
if (!isIncomplete(charge))
|
|
158
|
+
return charge;
|
|
159
|
+
const fresh = await deps.provider
|
|
160
|
+
.fetchPaymentInstructions(charge.externalId, charge.method)
|
|
161
|
+
.catch(() => null);
|
|
162
|
+
if (!fresh)
|
|
163
|
+
return charge;
|
|
164
|
+
// Mescla em vez de substituir: o que já estava gravado não pode sumir porque
|
|
165
|
+
// uma reconsulta veio mais pobre que a original.
|
|
166
|
+
const merged = { ...charge.instructions, ...pruneEmpty(fresh) };
|
|
167
|
+
await tx `
|
|
168
|
+
UPDATE charge SET metadata = ${tx.json(merged)}, updated_at = now()
|
|
169
|
+
WHERE id = ${charge.id}
|
|
170
|
+
`;
|
|
171
|
+
return { ...charge, instructions: merged };
|
|
172
|
+
}
|
|
173
|
+
/** O que cada método precisa ter para o e-mail ficar completo. */
|
|
174
|
+
function isIncomplete(charge) {
|
|
175
|
+
const i = charge.instructions;
|
|
176
|
+
if (charge.method === 'pix')
|
|
177
|
+
return !i.pixPayload || !i.pixQrCodeImage;
|
|
178
|
+
if (charge.method === 'boleto')
|
|
179
|
+
return !i.boletoUrl || !i.identificationField;
|
|
180
|
+
return !i.invoiceUrl;
|
|
181
|
+
}
|
|
182
|
+
function pruneEmpty(i) {
|
|
183
|
+
return Object.fromEntries(Object.entries(i).filter(([, v]) => v));
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Digest dos campos cadastrais que o provedor recebe.
|
|
187
|
+
*
|
|
188
|
+
* É o que permite responder "mudou desde a última sincronização?" sem manter uma
|
|
189
|
+
* segunda cópia de dado pessoal. Só entram os campos que o adapter realmente
|
|
190
|
+
* envia — incluir um campo que ninguém sincroniza faria a impressão digital
|
|
191
|
+
* mudar sem nada para reconciliar, e o sistema chamaria o gateway à toa.
|
|
192
|
+
*
|
|
193
|
+
* Normalização antes do hash: `null`, `undefined` e string vazia são a mesma
|
|
194
|
+
* ausência, e " Fulano " é o mesmo nome que "Fulano". Sem isso, salvar a ficha
|
|
195
|
+
* sem editar nada dispararia uma sincronização.
|
|
196
|
+
*/
|
|
197
|
+
function customerFingerprint(c) {
|
|
198
|
+
const norm = (v) => (v ?? '').trim().toLowerCase();
|
|
199
|
+
const digits = (v) => (v ?? '').replace(/\D/g, '');
|
|
200
|
+
return (0, node_crypto_1.createHash)('sha256')
|
|
201
|
+
.update([norm(c.name), digits(c.documentNumber), norm(c.email), digits(c.phone)].join('\u0000'))
|
|
202
|
+
.digest('hex');
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Garante que o pagador EXISTE no gateway e que ele está CORRETO.
|
|
206
|
+
*
|
|
207
|
+
* O mapa local continua evitando ida ao gateway na maioria das emissões — mas
|
|
208
|
+
* ele deixa de significar "existe, logo está certo para sempre", que era a
|
|
209
|
+
* dívida R. Agora ele guarda também a impressão digital do que foi sincronizado,
|
|
210
|
+
* e a decisão passa a ser:
|
|
211
|
+
*
|
|
212
|
+
* sem registro → cria (o adapter ainda busca antes, para não duplicar)
|
|
213
|
+
* registro coerente → devolve, sem tocar na rede
|
|
214
|
+
* registro divergente → ATUALIZA no gateway, e só então grava a nova digital
|
|
215
|
+
*
|
|
216
|
+
* Digital nula é tratada como divergente de propósito: é o estado das linhas
|
|
217
|
+
* anteriores a esta correção, e é assim que a base existente se cura na primeira
|
|
218
|
+
* emissão de cada cliente, sem backfill adivinhando o que o gateway tem.
|
|
219
|
+
*
|
|
220
|
+
* Falha de atualização NÃO é engolida e NÃO grava digital. O Office não pode
|
|
221
|
+
* registrar que sincronizou o que não sincronizou — na próxima tentativa, ele
|
|
222
|
+
* tenta de novo.
|
|
223
|
+
*/
|
|
224
|
+
async function ensurePaymentCustomer(tx, deps, input) {
|
|
225
|
+
if (!deps.provider.ensureCustomer)
|
|
226
|
+
return { externalId: null, action: 'unsupported' };
|
|
227
|
+
const customer = { ...input.customer, referenceId: `client:${input.clientId}` };
|
|
228
|
+
const fingerprint = customerFingerprint(input.customer);
|
|
229
|
+
const rows = await tx `
|
|
230
|
+
SELECT external_id, synced_fingerprint FROM payment_customer
|
|
231
|
+
WHERE provider_account_id = ${deps.account.id} AND client_id = ${input.clientId}
|
|
232
|
+
LIMIT 1
|
|
233
|
+
`;
|
|
234
|
+
if (rows[0]) {
|
|
235
|
+
if (rows[0].synced_fingerprint === fingerprint) {
|
|
236
|
+
return { externalId: rows[0].external_id, action: 'unchanged' };
|
|
237
|
+
}
|
|
238
|
+
if (!deps.provider.updateCustomer) {
|
|
239
|
+
// Provider sem atualização: devolver o id calado faria o Office parecer
|
|
240
|
+
// sincronizado. Melhor dizer que não é suportado e deixar quem chamou
|
|
241
|
+
// decidir — a alternativa é a dívida R de volta, silenciosa.
|
|
242
|
+
return { externalId: rows[0].external_id, action: 'unsupported' };
|
|
243
|
+
}
|
|
244
|
+
await deps.provider.updateCustomer(rows[0].external_id, customer);
|
|
245
|
+
await tx `
|
|
246
|
+
UPDATE payment_customer
|
|
247
|
+
SET synced_fingerprint = ${fingerprint}, synced_at = now(), updated_at = now()
|
|
248
|
+
WHERE provider_account_id = ${deps.account.id} AND client_id = ${input.clientId}
|
|
249
|
+
`;
|
|
250
|
+
return { externalId: rows[0].external_id, action: 'reconciled' };
|
|
251
|
+
}
|
|
252
|
+
const ensured = await deps.provider.ensureCustomer(customer);
|
|
253
|
+
// O adapter distingue "criei" de "encontrei e reconciliei"; o rail não teria
|
|
254
|
+
// como. Sem isto, a trilha registrava `created` para um pagador que já existia
|
|
255
|
+
// no gateway e acabara de ser corrigido — o histórico dizia a coisa errada
|
|
256
|
+
// justamente no caso que mais importa auditar.
|
|
257
|
+
const externalId = typeof ensured === 'string' ? ensured : ensured.externalId;
|
|
258
|
+
const action = typeof ensured === 'string' ? 'created' : ensured.action;
|
|
259
|
+
await tx `
|
|
260
|
+
INSERT INTO payment_customer (
|
|
261
|
+
id, tenant_id, client_id, provider_account_id, provider, external_id,
|
|
262
|
+
synced_fingerprint, synced_at
|
|
263
|
+
) VALUES (
|
|
264
|
+
${(0, node_crypto_1.randomUUID)()},
|
|
265
|
+
NULLIF(current_setting('app.current_tenant', true), '')::uuid,
|
|
266
|
+
${input.clientId}, ${deps.account.id}, ${deps.provider.key}, ${externalId},
|
|
267
|
+
${fingerprint}, now()
|
|
268
|
+
)
|
|
269
|
+
ON CONFLICT (tenant_id, provider_account_id, client_id) DO UPDATE
|
|
270
|
+
SET synced_fingerprint = EXCLUDED.synced_fingerprint,
|
|
271
|
+
synced_at = EXCLUDED.synced_at,
|
|
272
|
+
updated_at = now()
|
|
273
|
+
`;
|
|
274
|
+
return { externalId, action };
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* QR do PIX de uma cobrança, em PNG.
|
|
278
|
+
*
|
|
279
|
+
* O gateway entrega o QR como base64, e base64 embutido no e-mail não funciona:
|
|
280
|
+
* o Gmail serve toda imagem pelo próprio proxy, que só busca http(s). Guardamos
|
|
281
|
+
* o base64 e servimos por URL — o mesmo dado, num endereço que o cliente de
|
|
282
|
+
* e-mail consegue buscar.
|
|
283
|
+
*
|
|
284
|
+
* Devolve `null` quando a cobrança não tem QR (boleto, cobrança antiga, gateway
|
|
285
|
+
* que não expõe). Quem chama responde 404, e o e-mail simplesmente não mostra
|
|
286
|
+
* imagem.
|
|
287
|
+
*/
|
|
288
|
+
async function pixQrPngOf(tx, chargeId) {
|
|
289
|
+
const rows = await tx `
|
|
290
|
+
SELECT metadata FROM charge WHERE id = ${chargeId} AND deleted_at IS NULL
|
|
291
|
+
`;
|
|
292
|
+
const raw = rows[0]?.metadata?.pixQrCodeImage;
|
|
293
|
+
if (!raw)
|
|
294
|
+
return null;
|
|
295
|
+
// Aceita tanto o data URI (formato em que o adapter guarda) quanto base64 cru.
|
|
296
|
+
const base64 = raw.startsWith('data:') ? (raw.split(',')[1] ?? '') : raw;
|
|
297
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(base64))
|
|
298
|
+
return null;
|
|
299
|
+
return Buffer.from(base64, 'base64');
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=payment-rail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-rail.js","sourceRoot":"","sources":["../../../src/billing/payment-rail.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,10 @@ const shared_1 = require("@baruk/shared");
|
|
|
11
11
|
* IMPORTANTE: nenhum outro arquivo do Core importa este adapter diretamente — o
|
|
12
12
|
* acesso é sempre via `resolveBillingProvider('asaas', config)`. Assim, trocar
|
|
13
13
|
* Asaas por Stripe é trocar a string registrada, sem tocar em regra de negócio.
|
|
14
|
+
*
|
|
15
|
+
* A credencial define a CONTA que recebe o dinheiro. Quem escolhe a credencial
|
|
16
|
+
* é `provider-account.ts`, a partir do tenant — este adapter não sabe, e não
|
|
17
|
+
* deve saber, de quem é a conta que está usando.
|
|
14
18
|
*/
|
|
15
19
|
const BILLING_TYPE = {
|
|
16
20
|
pix: 'PIX',
|
|
@@ -27,12 +31,14 @@ class AsaasProvider {
|
|
|
27
31
|
key = 'asaas';
|
|
28
32
|
apiKey;
|
|
29
33
|
baseUrl;
|
|
34
|
+
webhookSecret;
|
|
30
35
|
fetchImpl;
|
|
31
36
|
constructor(config) {
|
|
32
37
|
if (!config.apiKey)
|
|
33
38
|
throw new AsaasError('apiKey ausente (configure no Vault).', 500);
|
|
34
39
|
this.apiKey = config.apiKey;
|
|
35
40
|
this.baseUrl = (config.baseUrl ?? 'https://api.asaas.com/v3').replace(/\/$/, '');
|
|
41
|
+
this.webhookSecret = config.webhookSecret;
|
|
36
42
|
this.fetchImpl = config.fetchImpl ?? fetch;
|
|
37
43
|
}
|
|
38
44
|
async call(path, method, body) {
|
|
@@ -47,29 +53,123 @@ class AsaasProvider {
|
|
|
47
53
|
}
|
|
48
54
|
return (await res.json());
|
|
49
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Provisiona (ou reencontra) o pagador na conta do escritório.
|
|
58
|
+
*
|
|
59
|
+
* `externalReference` é o id interno do cliente, e a busca por ele vem ANTES
|
|
60
|
+
* do POST: sem isso, cada emissão criaria um cadastro novo na conta do
|
|
61
|
+
* escritório, e o histórico do cliente lá dentro viraria uma lista de
|
|
62
|
+
* homônimos. O mapa local (`payment_customer`) evita a maioria das chamadas;
|
|
63
|
+
* esta busca é a rede de segurança para quando o mapa e o gateway divergirem.
|
|
64
|
+
*/
|
|
65
|
+
async ensureCustomer(req) {
|
|
66
|
+
const found = await this.call(`/customers?externalReference=${encodeURIComponent(req.referenceId)}&limit=1`, 'GET');
|
|
67
|
+
const existing = found.data?.[0]?.id;
|
|
68
|
+
if (existing) {
|
|
69
|
+
// ENCONTRAR NÃO BASTA. Este era o coração da dívida R: o pagador existia
|
|
70
|
+
// com dados velhos — tipicamente sem CPF/CNPJ — e devolvê-lo calado fazia a
|
|
71
|
+
// emissão ser recusada para sempre, mesmo depois de o escritório corrigir
|
|
72
|
+
// a ficha no Office.
|
|
73
|
+
//
|
|
74
|
+
// Importa que a correção esteja AQUI, e não só no cache: a transação da
|
|
75
|
+
// emissão faz rollback quando o gateway recusa, então o mapa local não
|
|
76
|
+
// persiste e a próxima tentativa cai justamente neste caminho. Se ele
|
|
77
|
+
// devolvesse sem reconciliar, o sistema gravaria uma impressão digital
|
|
78
|
+
// afirmando uma sincronização que nunca houve.
|
|
79
|
+
await this.updateCustomer(existing, req);
|
|
80
|
+
return { externalId: existing, action: 'reconciled' };
|
|
81
|
+
}
|
|
82
|
+
const created = await this.call('/customers', 'POST', customerPayload(req));
|
|
83
|
+
return { externalId: created.id, action: 'created' };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Atualiza o pagador existente. Mesmo payload da criação, mesmo endpoint com
|
|
87
|
+
* id — no Asaas, `POST /customers/{id}` é a atualização.
|
|
88
|
+
*
|
|
89
|
+
* Sem `externalReference` no corpo: ele é a âncora que liga o pagador ao
|
|
90
|
+
* cliente do Office, e reescrevê-lo a cada sincronização abriria a chance de
|
|
91
|
+
* apontar para outro cliente por um erro de chamada.
|
|
92
|
+
*/
|
|
93
|
+
async updateCustomer(externalId, req) {
|
|
94
|
+
const { externalReference: _ignored, ...payload } = customerPayload(req);
|
|
95
|
+
await this.call(`/customers/${encodeURIComponent(externalId)}`, 'POST', payload);
|
|
96
|
+
}
|
|
97
|
+
async describeAccount() {
|
|
98
|
+
const me = await this.call('/myAccount', 'GET');
|
|
99
|
+
const documentNumber = onlyDigits(me.cpfCnpj) || null;
|
|
100
|
+
return {
|
|
101
|
+
// Sem `walletId`/`id`, cai no documento — é o que identifica o TITULAR do
|
|
102
|
+
// dinheiro, que é o que o guard cross-tenant precisa comparar. Sem este
|
|
103
|
+
// fallback a referência fica nula, o índice parcial não pega nada, e duas
|
|
104
|
+
// organizações conseguiriam conectar a mesma conta.
|
|
105
|
+
reference: me.walletId ?? me.id ?? (documentNumber ? `doc:${documentNumber}` : null),
|
|
106
|
+
name: me.companyName ?? me.name ?? null,
|
|
107
|
+
documentNumber,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
50
110
|
async createCharge(req) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
111
|
+
if (!req.customerExternalId) {
|
|
112
|
+
throw new AsaasError('customer não provisionado — chame ensureCustomer antes.', 500);
|
|
113
|
+
}
|
|
114
|
+
const method = req.method;
|
|
115
|
+
const res = await this.call('/payments', 'POST', {
|
|
116
|
+
customer: req.customerExternalId,
|
|
117
|
+
billingType: BILLING_TYPE[method] ?? 'UNDEFINED',
|
|
55
118
|
value: req.amount,
|
|
56
119
|
dueDate: req.dueDate,
|
|
57
120
|
description: req.description ?? undefined,
|
|
58
121
|
externalReference: req.referenceId,
|
|
59
|
-
};
|
|
60
|
-
const res = await this.call('/payments', 'POST', payload);
|
|
122
|
+
});
|
|
61
123
|
return {
|
|
62
124
|
externalId: res.id,
|
|
63
125
|
status: mapAsaasStatus(res.status),
|
|
64
|
-
payment:
|
|
126
|
+
payment: await this.instructionsFor(res, method),
|
|
65
127
|
raw: res,
|
|
66
128
|
};
|
|
67
129
|
}
|
|
130
|
+
async fetchPaymentInstructions(externalId, method) {
|
|
131
|
+
const res = await this.call(`/payments/${externalId}`, 'GET');
|
|
132
|
+
return this.instructionsFor(res, method);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* O QR Code e a linha digitável vivem em endpoints próprios.
|
|
136
|
+
*
|
|
137
|
+
* Eles são buscados no provider, nunca gerados aqui: um BR Code montado por
|
|
138
|
+
* nós apontaria para uma chave PIX que o gateway não conhece, e o pagamento
|
|
139
|
+
* cairia fora da cobrança — dinheiro que entra sem baixar nada.
|
|
140
|
+
*
|
|
141
|
+
* A falha é tolerada de propósito. Se o QR não vier, o cliente ainda tem a
|
|
142
|
+
* página de pagamento; derrubar a emissão inteira por causa de um extra seria
|
|
143
|
+
* trocar uma cobrança incompleta por nenhuma cobrança.
|
|
144
|
+
*/
|
|
145
|
+
async instructionsFor(res, method) {
|
|
146
|
+
const out = {
|
|
147
|
+
invoiceUrl: res.invoiceUrl,
|
|
148
|
+
boletoUrl: res.bankSlipUrl,
|
|
149
|
+
};
|
|
150
|
+
if (method === 'pix') {
|
|
151
|
+
const qr = await this.call(`/payments/${res.id}/pixQrCode`, 'GET').catch(() => null);
|
|
152
|
+
if (qr?.payload)
|
|
153
|
+
out.pixPayload = qr.payload;
|
|
154
|
+
if (qr?.encodedImage)
|
|
155
|
+
out.pixQrCodeImage = `data:image/png;base64,${qr.encodedImage}`;
|
|
156
|
+
}
|
|
157
|
+
if (method === 'boleto') {
|
|
158
|
+
const slip = await this.call(`/payments/${res.id}/identificationField`, 'GET').catch(() => null);
|
|
159
|
+
if (slip?.identificationField)
|
|
160
|
+
out.identificationField = slip.identificationField;
|
|
161
|
+
}
|
|
162
|
+
return out;
|
|
163
|
+
}
|
|
68
164
|
async cancelCharge(externalId) {
|
|
69
165
|
await this.call(`/payments/${externalId}`, 'DELETE');
|
|
70
166
|
}
|
|
71
167
|
async createSubscription(req) {
|
|
72
|
-
const cycle = {
|
|
168
|
+
const cycle = {
|
|
169
|
+
monthly: 'MONTHLY',
|
|
170
|
+
quarterly: 'QUARTERLY',
|
|
171
|
+
yearly: 'YEARLY',
|
|
172
|
+
};
|
|
73
173
|
const res = await this.call('/subscriptions', 'POST', {
|
|
74
174
|
billingType: BILLING_TYPE[req.method] ?? 'UNDEFINED',
|
|
75
175
|
value: req.amount,
|
|
@@ -88,25 +188,105 @@ class AsaasProvider {
|
|
|
88
188
|
async cancelSubscription(externalId) {
|
|
89
189
|
await this.call(`/subscriptions/${externalId}`, 'DELETE');
|
|
90
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* Autenticação do webhook.
|
|
193
|
+
*
|
|
194
|
+
* O Asaas envia o token configurado na fila em `asaas-access-token`. A
|
|
195
|
+
* comparação é de tempo constante — um `===` sobre segredo vaza, byte a byte,
|
|
196
|
+
* quanto do prefixo está correto para quem consegue medir o tempo da resposta.
|
|
197
|
+
*
|
|
198
|
+
* Sem segredo configurado, reprova. Fail-closed é o único default aceitável
|
|
199
|
+
* numa rota pública que dá baixa em dinheiro.
|
|
200
|
+
*/
|
|
201
|
+
verifyWebhook(_payload, headers = {}) {
|
|
202
|
+
if (!this.webhookSecret)
|
|
203
|
+
return false;
|
|
204
|
+
const sent = headers['asaas-access-token'] ?? headers['Asaas-Access-Token'] ?? '';
|
|
205
|
+
return timingSafeEqual(sent, this.webhookSecret);
|
|
206
|
+
}
|
|
91
207
|
parseWebhook(payload) {
|
|
92
208
|
const p = payload;
|
|
93
|
-
const
|
|
209
|
+
const base = {
|
|
210
|
+
eventId: p.id ?? null,
|
|
211
|
+
externalId: p.payment?.id ?? null,
|
|
212
|
+
raw: payload,
|
|
213
|
+
};
|
|
94
214
|
switch (p.event) {
|
|
215
|
+
// RECEIVED = dinheiro creditado. CONFIRMED = autorizado, ainda não
|
|
216
|
+
// liquidado (cartão). Os dois viram baixa: para o escritório, a dívida
|
|
217
|
+
// deixou de ser dele nos dois casos, e esperar a liquidação faria a régua
|
|
218
|
+
// seguir cobrando alguém que já pagou.
|
|
219
|
+
// RECEIVED_IN_CASH é a baixa que o escritório dá à mão no painel quando o
|
|
220
|
+
// cliente pagou fora do gateway. Sem este caso o evento caía em `unknown`
|
|
221
|
+
// e a régua seguia cobrando quem já tinha pagado — dinheiro que entrou e
|
|
222
|
+
// que o sistema não enxergava.
|
|
95
223
|
case 'PAYMENT_RECEIVED':
|
|
96
224
|
case 'PAYMENT_CONFIRMED':
|
|
97
|
-
|
|
225
|
+
case 'PAYMENT_RECEIVED_IN_CASH':
|
|
226
|
+
return {
|
|
227
|
+
...base,
|
|
228
|
+
type: 'charge.paid',
|
|
229
|
+
paidAt: p.payment?.paymentDate ?? null,
|
|
230
|
+
paidAmount: p.payment?.value ?? null,
|
|
231
|
+
};
|
|
232
|
+
// O par do anterior. Reconhecer a baixa manual sem reconhecer o desfazer
|
|
233
|
+
// trocaria um defeito por outro: a cobrança ficaria paga para sempre por
|
|
234
|
+
// causa de um clique que o próprio escritório revogou.
|
|
235
|
+
case 'PAYMENT_RECEIVED_IN_CASH_UNDONE':
|
|
236
|
+
return { ...base, type: 'charge.settlement_undone' };
|
|
237
|
+
case 'PAYMENT_CREATED':
|
|
238
|
+
return { ...base, type: 'charge.created' };
|
|
98
239
|
case 'PAYMENT_OVERDUE':
|
|
99
|
-
return { type: 'charge.overdue'
|
|
240
|
+
return { ...base, type: 'charge.overdue' };
|
|
100
241
|
case 'PAYMENT_DELETED':
|
|
101
|
-
return { type: 'charge.canceled'
|
|
242
|
+
return { ...base, type: 'charge.canceled' };
|
|
102
243
|
case 'PAYMENT_REFUNDED':
|
|
103
|
-
|
|
244
|
+
case 'PAYMENT_REVERSED':
|
|
245
|
+
return { ...base, type: 'charge.refunded' };
|
|
246
|
+
case 'PAYMENT_CHARGEBACK_REQUESTED':
|
|
247
|
+
case 'PAYMENT_CHARGEBACK_DISPUTE':
|
|
248
|
+
return { ...base, type: 'charge.chargeback' };
|
|
104
249
|
default:
|
|
105
|
-
return { type: 'unknown'
|
|
250
|
+
return { ...base, type: 'unknown' };
|
|
106
251
|
}
|
|
107
252
|
}
|
|
108
253
|
}
|
|
109
254
|
exports.AsaasProvider = AsaasProvider;
|
|
255
|
+
/**
|
|
256
|
+
* Campos cadastrais que o Asaas precisa do pagador.
|
|
257
|
+
*
|
|
258
|
+
* Uma função só, usada na criação E na atualização: se as duas montassem o
|
|
259
|
+
* payload por conta própria, um campo adicionado numa delas passaria a existir
|
|
260
|
+
* só nos clientes novos — e a diferença apareceria meses depois, como "esse
|
|
261
|
+
* cliente antigo não recebe e-mail do boleto".
|
|
262
|
+
*
|
|
263
|
+
* `notificationDisabled` é reafirmado em toda sincronização de propósito: quem
|
|
264
|
+
* fala com o cliente é o Office. Se alguém ligar a notificação pelo painel do
|
|
265
|
+
* gateway, o cliente passaria a receber DUAS cobranças pelo mesmo valor.
|
|
266
|
+
*/
|
|
267
|
+
function customerPayload(req) {
|
|
268
|
+
return {
|
|
269
|
+
name: req.name,
|
|
270
|
+
cpfCnpj: onlyDigits(req.documentNumber),
|
|
271
|
+
email: req.email ?? undefined,
|
|
272
|
+
mobilePhone: onlyDigits(req.phone) || undefined,
|
|
273
|
+
externalReference: req.referenceId,
|
|
274
|
+
notificationDisabled: true,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
function onlyDigits(v) {
|
|
278
|
+
return (v ?? '').replace(/\D/g, '');
|
|
279
|
+
}
|
|
280
|
+
/** Comparação de tempo constante, sem depender de `node:crypto` no Core. */
|
|
281
|
+
function timingSafeEqual(a, b) {
|
|
282
|
+
// O XOR roda sobre o comprimento do segredo para que a duração não revele o
|
|
283
|
+
// tamanho do que foi enviado; a diferença de comprimento entra no acumulador.
|
|
284
|
+
let diff = a.length ^ b.length;
|
|
285
|
+
for (let i = 0; i < b.length; i++) {
|
|
286
|
+
diff |= (a.charCodeAt(i) || 0) ^ b.charCodeAt(i);
|
|
287
|
+
}
|
|
288
|
+
return diff === 0;
|
|
289
|
+
}
|
|
110
290
|
function mapAsaasStatus(status) {
|
|
111
291
|
switch (status) {
|
|
112
292
|
case 'RECEIVED':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asaas.js","sourceRoot":"","sources":["../../../../src/billing/provider/asaas.ts"],"names":[],"mappings":";;;AAAA,0CAAyC;
|
|
1
|
+
{"version":3,"file":"asaas.js","sourceRoot":"","sources":["../../../../src/billing/provider/asaas.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ class ManualProvider {
|
|
|
21
21
|
// No-op — cancelamento é apenas mudança de status interno.
|
|
22
22
|
}
|
|
23
23
|
parseWebhook() {
|
|
24
|
-
return { type: 'unknown', externalId: null };
|
|
24
|
+
return { type: 'unknown', eventId: null, externalId: null };
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
exports.ManualProvider = ManualProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manual.js","sourceRoot":"","sources":["../../../../src/billing/provider/manual.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACH,MAAa,cAAc;IAChB,GAAG,GAAG,QAAQ,CAAC;IAExB,KAAK,CAAC,YAAY,CAAC,GAAkB;QACnC,6EAA6E;QAC7E,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;SACtE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,2DAA2D;IAC7D,CAAC;IAED,YAAY;QACV,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"manual.js","sourceRoot":"","sources":["../../../../src/billing/provider/manual.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACH,MAAa,cAAc;IAChB,GAAG,GAAG,QAAQ,CAAC;IAExB,KAAK,CAAC,YAAY,CAAC,GAAkB;QACnC,6EAA6E;QAC7E,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;SACtE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,2DAA2D;IAC7D,CAAC;IAED,YAAY;QACV,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC9D,CAAC;CACF;AAnBD,wCAmBC"}
|