@baruk/core 0.3.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.baruk-provenance.json +10 -0
- package/CHANGELOG.md +97 -0
- package/README.md +9 -2
- package/dist/auth/password-reset.d.ts +30 -1
- package/dist/auth/password-reset.d.ts.map +1 -1
- package/dist/auth/password-reset.js +139 -11
- package/dist/auth/password-reset.js.map +1 -1
- package/dist/auth/service.d.ts +39 -2
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +75 -10
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +334 -0
- package/dist/billing/ar-repository.d.ts.map +1 -0
- package/dist/billing/ar-repository.js +707 -0
- package/dist/billing/ar-repository.js.map +1 -0
- package/dist/billing/auto-generation.d.ts +87 -0
- package/dist/billing/auto-generation.d.ts.map +1 -0
- package/dist/billing/auto-generation.js +181 -0
- package/dist/billing/auto-generation.js.map +1 -0
- package/dist/billing/live-guard.d.ts +64 -0
- package/dist/billing/live-guard.d.ts.map +1 -0
- package/dist/billing/live-guard.js +68 -0
- package/dist/billing/live-guard.js.map +1 -0
- package/dist/billing/payment-means-catalog.d.ts +17 -0
- package/dist/billing/payment-means-catalog.d.ts.map +1 -0
- package/dist/billing/payment-means-catalog.js +21 -0
- package/dist/billing/payment-means-catalog.js.map +1 -0
- package/dist/billing/payment-means.d.ts +38 -0
- package/dist/billing/payment-means.d.ts.map +1 -0
- package/dist/billing/payment-means.js +29 -0
- package/dist/billing/payment-means.js.map +1 -0
- package/dist/billing/payment-rail.d.ts +118 -0
- package/dist/billing/payment-rail.d.ts.map +1 -0
- package/dist/billing/payment-rail.js +295 -0
- package/dist/billing/payment-rail.js.map +1 -0
- package/dist/billing/provider/asaas.d.ts +46 -1
- package/dist/billing/provider/asaas.d.ts.map +1 -1
- package/dist/billing/provider/asaas.js +194 -14
- package/dist/billing/provider/asaas.js.map +1 -1
- package/dist/billing/provider/manual.js +1 -1
- package/dist/billing/provider/manual.js.map +1 -1
- package/dist/billing/provider/types.d.ts +115 -8
- package/dist/billing/provider/types.d.ts.map +1 -1
- package/dist/billing/provider-account.d.ts +89 -0
- package/dist/billing/provider-account.d.ts.map +1 -0
- package/dist/billing/provider-account.js +161 -0
- package/dist/billing/provider-account.js.map +1 -0
- package/dist/billing/provider-onboarding.d.ts +67 -0
- package/dist/billing/provider-onboarding.d.ts.map +1 -0
- package/dist/billing/provider-onboarding.js +234 -0
- package/dist/billing/provider-onboarding.js.map +1 -0
- package/dist/billing/receivable.d.ts +5 -1
- package/dist/billing/receivable.d.ts.map +1 -1
- package/dist/billing/reconcile.d.ts +58 -0
- package/dist/billing/reconcile.d.ts.map +1 -0
- package/dist/billing/reconcile.js +138 -0
- package/dist/billing/reconcile.js.map +1 -0
- package/dist/billing/repository.d.ts +90 -1
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +148 -19
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/auth/password-reset.js +141 -11
- package/dist/cjs/auth/password-reset.js.map +1 -1
- package/dist/cjs/auth/service.js +75 -9
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +728 -0
- package/dist/cjs/billing/ar-repository.js.map +1 -0
- package/dist/cjs/billing/auto-generation.js +186 -0
- package/dist/cjs/billing/auto-generation.js.map +1 -0
- package/dist/cjs/billing/live-guard.js +72 -0
- package/dist/cjs/billing/live-guard.js.map +1 -0
- package/dist/cjs/billing/payment-means-catalog.js +25 -0
- package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
- package/dist/cjs/billing/payment-means.js +33 -0
- package/dist/cjs/billing/payment-means.js.map +1 -0
- package/dist/cjs/billing/payment-rail.js +301 -0
- package/dist/cjs/billing/payment-rail.js.map +1 -0
- package/dist/cjs/billing/provider/asaas.js +194 -14
- package/dist/cjs/billing/provider/asaas.js.map +1 -1
- package/dist/cjs/billing/provider/manual.js +1 -1
- package/dist/cjs/billing/provider/manual.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +170 -0
- package/dist/cjs/billing/provider-account.js.map +1 -0
- package/dist/cjs/billing/provider-onboarding.js +239 -0
- package/dist/cjs/billing/provider-onboarding.js.map +1 -0
- package/dist/cjs/billing/reconcile.js +143 -0
- package/dist/cjs/billing/reconcile.js.map +1 -0
- package/dist/cjs/billing/repository.js +150 -18
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/repository.js +96 -20
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +140 -0
- package/dist/cjs/collection/branding.js.map +1 -0
- package/dist/cjs/collection/channel-accounts.js +137 -0
- package/dist/cjs/collection/channel-accounts.js.map +1 -0
- package/dist/cjs/collection/channel.js +17 -0
- package/dist/cjs/collection/channel.js.map +1 -0
- package/dist/cjs/collection/communication-bridge.js +140 -0
- package/dist/cjs/collection/communication-bridge.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +193 -0
- package/dist/cjs/collection/communication-runtime.js.map +1 -0
- package/dist/cjs/collection/consent-repository.js +84 -0
- package/dist/cjs/collection/consent-repository.js.map +1 -0
- package/dist/cjs/collection/copy.js +125 -0
- package/dist/cjs/collection/copy.js.map +1 -0
- package/dist/cjs/collection/delivery-callback.js +151 -0
- package/dist/cjs/collection/delivery-callback.js.map +1 -0
- package/dist/cjs/collection/email-layout.js +252 -0
- package/dist/cjs/collection/email-layout.js.map +1 -0
- package/dist/cjs/collection/engine.js +414 -0
- package/dist/cjs/collection/engine.js.map +1 -0
- package/dist/cjs/collection/format.js +76 -0
- package/dist/cjs/collection/format.js.map +1 -0
- package/dist/cjs/collection/payment-block.js +3 -0
- package/dist/cjs/collection/payment-block.js.map +1 -0
- package/dist/cjs/collection/policy.js +147 -0
- package/dist/cjs/collection/policy.js.map +1 -0
- package/dist/cjs/collection/repository.js +260 -0
- package/dist/cjs/collection/repository.js.map +1 -0
- package/dist/cjs/collection/subject.js +104 -0
- package/dist/cjs/collection/subject.js.map +1 -0
- package/dist/cjs/collection/template-catalog.js +165 -0
- package/dist/cjs/collection/template-catalog.js.map +1 -0
- package/dist/cjs/collection/template.js +78 -0
- package/dist/cjs/collection/template.js.map +1 -0
- package/dist/cjs/communication/adapters/email.js +132 -0
- package/dist/cjs/communication/adapters/email.js.map +1 -0
- package/dist/cjs/communication/adapters/sms.js +127 -0
- package/dist/cjs/communication/adapters/sms.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp.js +213 -0
- package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
- package/dist/cjs/communication/audit.js +61 -0
- package/dist/cjs/communication/audit.js.map +1 -0
- package/dist/cjs/communication/capabilities.js +76 -0
- package/dist/cjs/communication/capabilities.js.map +1 -0
- package/dist/cjs/communication/channel.js +53 -0
- package/dist/cjs/communication/channel.js.map +1 -0
- package/dist/cjs/communication/claim.js +228 -0
- package/dist/cjs/communication/claim.js.map +1 -0
- package/dist/cjs/communication/consent.js +43 -0
- package/dist/cjs/communication/consent.js.map +1 -0
- package/dist/cjs/communication/context.js +45 -0
- package/dist/cjs/communication/context.js.map +1 -0
- package/dist/cjs/communication/credentials.js +121 -0
- package/dist/cjs/communication/credentials.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +161 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
- package/dist/cjs/communication/dry-run.js +97 -0
- package/dist/cjs/communication/dry-run.js.map +1 -0
- package/dist/cjs/communication/engine.js +483 -0
- package/dist/cjs/communication/engine.js.map +1 -0
- package/dist/cjs/communication/graph.js +50 -0
- package/dist/cjs/communication/graph.js.map +1 -0
- package/dist/cjs/communication/idempotency.js +26 -0
- package/dist/cjs/communication/idempotency.js.map +1 -0
- package/dist/cjs/communication/identity.js +110 -0
- package/dist/cjs/communication/identity.js.map +1 -0
- package/dist/cjs/communication/index.js +135 -0
- package/dist/cjs/communication/index.js.map +1 -0
- package/dist/cjs/communication/onboarding.js +297 -0
- package/dist/cjs/communication/onboarding.js.map +1 -0
- package/dist/cjs/communication/policy.js +16 -0
- package/dist/cjs/communication/policy.js.map +1 -0
- package/dist/cjs/communication/routing.js +77 -0
- package/dist/cjs/communication/routing.js.map +1 -0
- package/dist/cjs/communication/sender-profile.js +128 -0
- package/dist/cjs/communication/sender-profile.js.map +1 -0
- package/dist/cjs/communication/status.js +86 -0
- package/dist/cjs/communication/status.js.map +1 -0
- package/dist/cjs/communication/stores/onboarding.js +135 -0
- package/dist/cjs/communication/stores/onboarding.js.map +1 -0
- package/dist/cjs/communication/stores/postgres.js +458 -0
- package/dist/cjs/communication/stores/postgres.js.map +1 -0
- package/dist/cjs/communication/stores/routing.js +334 -0
- package/dist/cjs/communication/stores/routing.js.map +1 -0
- package/dist/cjs/communication/stores/secrets.js +126 -0
- package/dist/cjs/communication/stores/secrets.js.map +1 -0
- package/dist/cjs/communication/template-provider.js +22 -0
- package/dist/cjs/communication/template-provider.js.map +1 -0
- package/dist/cjs/communication/template.js +63 -0
- package/dist/cjs/communication/template.js.map +1 -0
- package/dist/cjs/communication/webhook-subscription.js +258 -0
- package/dist/cjs/communication/webhook-subscription.js.map +1 -0
- package/dist/cjs/communication/webhook.js +292 -0
- package/dist/cjs/communication/webhook.js.map +1 -0
- package/dist/cjs/competence/repository.js +309 -0
- package/dist/cjs/competence/repository.js.map +1 -0
- package/dist/cjs/contacts/phone.js +192 -0
- package/dist/cjs/contacts/phone.js.map +1 -0
- package/dist/cjs/db/seed-catalog.js +48 -0
- package/dist/cjs/db/seed-catalog.js.map +1 -0
- package/dist/cjs/db/seed.js +15 -7
- package/dist/cjs/db/seed.js.map +1 -1
- package/dist/cjs/documents/repository.js +244 -0
- package/dist/cjs/documents/repository.js.map +1 -0
- package/dist/cjs/documents/requests.js +136 -0
- package/dist/cjs/documents/requests.js.map +1 -0
- package/dist/cjs/index.js +427 -48
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/company.js +36 -0
- package/dist/cjs/legal/company.js.map +1 -0
- package/dist/cjs/legal/documents.js +671 -0
- package/dist/cjs/legal/documents.js.map +1 -0
- package/dist/cjs/legal/index.js +15 -0
- package/dist/cjs/legal/index.js.map +1 -0
- package/dist/cjs/legal/types.js +34 -0
- package/dist/cjs/legal/types.js.map +1 -0
- package/dist/cjs/mail/auth-templates.js +29 -0
- package/dist/cjs/mail/auth-templates.js.map +1 -0
- package/dist/cjs/mail/dedup-store.js +12 -51
- package/dist/cjs/mail/dedup-store.js.map +1 -1
- package/dist/cjs/mail/index.js +16 -4
- package/dist/cjs/mail/index.js.map +1 -1
- package/dist/cjs/mail/provider.js +12 -247
- package/dist/cjs/mail/provider.js.map +1 -1
- package/dist/cjs/mail/resend.js +14 -18
- package/dist/cjs/mail/resend.js.map +1 -1
- package/dist/cjs/mail/sender-resolver.js +12 -11
- package/dist/cjs/mail/sender-resolver.js.map +1 -1
- package/dist/cjs/mail/template-renderer.js +11 -16
- package/dist/cjs/mail/template-renderer.js.map +1 -1
- package/dist/cjs/mail/transactional-outbound.js +117 -0
- package/dist/cjs/mail/transactional-outbound.js.map +1 -0
- package/dist/cjs/mail/types.js +8 -35
- package/dist/cjs/mail/types.js.map +1 -1
- package/dist/cjs/portal/provisioning.js +144 -0
- package/dist/cjs/portal/provisioning.js.map +1 -0
- package/dist/cjs/pricing-engine/canonical.js +42 -0
- package/dist/cjs/pricing-engine/canonical.js.map +1 -0
- package/dist/cjs/pricing-engine/errors.js +6 -1
- package/dist/cjs/pricing-engine/errors.js.map +1 -1
- package/dist/cjs/pricing-engine/index.js +12 -1
- package/dist/cjs/pricing-engine/index.js.map +1 -1
- package/dist/cjs/pricing-engine/pipeline.js +200 -26
- package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
- package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
- package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
- package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
- package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/cjs/rbac/authorize.js +28 -0
- package/dist/cjs/rbac/authorize.js.map +1 -1
- package/dist/cjs/rbac/catalog.js +67 -1
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/rbac/workload-provisioning.js +160 -0
- package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
- package/dist/cjs/rbac/workload.js +191 -0
- package/dist/cjs/rbac/workload.js.map +1 -0
- package/dist/cjs/storage/checksum.js +15 -0
- package/dist/cjs/storage/checksum.js.map +1 -0
- package/dist/cjs/storage/key.js +72 -0
- package/dist/cjs/storage/key.js.map +1 -0
- package/dist/cjs/storage/local.js +100 -0
- package/dist/cjs/storage/local.js.map +1 -0
- package/dist/cjs/storage/r2.js +181 -0
- package/dist/cjs/storage/r2.js.map +1 -0
- package/dist/cjs/storage/registry.js +41 -0
- package/dist/cjs/storage/registry.js.map +1 -0
- package/dist/cjs/storage/types.js +50 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
- package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
- package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/registry.js +17 -0
- package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
- package/dist/cjs/subscription-billing/service.js +57 -8
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/subscription-billing/types.js.map +1 -1
- package/dist/cjs/tenancy/provisioning.js +32 -8
- package/dist/cjs/tenancy/provisioning.js.map +1 -1
- package/dist/cjs/users/repository.js +119 -2
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +81 -0
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/repository.d.ts +42 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +94 -21
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +72 -0
- package/dist/collection/branding.d.ts.map +1 -0
- package/dist/collection/branding.js +136 -0
- package/dist/collection/branding.js.map +1 -0
- package/dist/collection/channel-accounts.d.ts +57 -0
- package/dist/collection/channel-accounts.d.ts.map +1 -0
- package/dist/collection/channel-accounts.js +133 -0
- package/dist/collection/channel-accounts.js.map +1 -0
- package/dist/collection/channel.d.ts +24 -0
- package/dist/collection/channel.d.ts.map +1 -0
- package/dist/collection/channel.js +16 -0
- package/dist/collection/channel.js.map +1 -0
- package/dist/collection/communication-bridge.d.ts +66 -0
- package/dist/collection/communication-bridge.d.ts.map +1 -0
- package/dist/collection/communication-bridge.js +134 -0
- package/dist/collection/communication-bridge.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +95 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -0
- package/dist/collection/communication-runtime.js +187 -0
- package/dist/collection/communication-runtime.js.map +1 -0
- package/dist/collection/consent-repository.d.ts +32 -0
- package/dist/collection/consent-repository.d.ts.map +1 -0
- package/dist/collection/consent-repository.js +79 -0
- package/dist/collection/consent-repository.js.map +1 -0
- package/dist/collection/copy.d.ts +50 -0
- package/dist/collection/copy.d.ts.map +1 -0
- package/dist/collection/copy.js +122 -0
- package/dist/collection/copy.js.map +1 -0
- package/dist/collection/delivery-callback.d.ts +49 -0
- package/dist/collection/delivery-callback.d.ts.map +1 -0
- package/dist/collection/delivery-callback.js +147 -0
- package/dist/collection/delivery-callback.js.map +1 -0
- package/dist/collection/email-layout.d.ts +45 -0
- package/dist/collection/email-layout.d.ts.map +1 -0
- package/dist/collection/email-layout.js +247 -0
- package/dist/collection/email-layout.js.map +1 -0
- package/dist/collection/engine.d.ts +177 -0
- package/dist/collection/engine.d.ts.map +1 -0
- package/dist/collection/engine.js +407 -0
- package/dist/collection/engine.js.map +1 -0
- package/dist/collection/format.d.ts +32 -0
- package/dist/collection/format.d.ts.map +1 -0
- package/dist/collection/format.js +70 -0
- package/dist/collection/format.js.map +1 -0
- package/dist/collection/payment-block.d.ts +24 -0
- package/dist/collection/payment-block.d.ts.map +1 -0
- package/dist/collection/payment-block.js +2 -0
- package/dist/collection/payment-block.js.map +1 -0
- package/dist/collection/policy.d.ts +53 -0
- package/dist/collection/policy.d.ts.map +1 -0
- package/dist/collection/policy.js +141 -0
- package/dist/collection/policy.js.map +1 -0
- package/dist/collection/repository.d.ts +129 -0
- package/dist/collection/repository.d.ts.map +1 -0
- package/dist/collection/repository.js +246 -0
- package/dist/collection/repository.js.map +1 -0
- package/dist/collection/subject.d.ts +66 -0
- package/dist/collection/subject.d.ts.map +1 -0
- package/dist/collection/subject.js +99 -0
- package/dist/collection/subject.js.map +1 -0
- package/dist/collection/template-catalog.d.ts +16 -0
- package/dist/collection/template-catalog.d.ts.map +1 -0
- package/dist/collection/template-catalog.js +162 -0
- package/dist/collection/template-catalog.js.map +1 -0
- package/dist/collection/template.d.ts +37 -0
- package/dist/collection/template.d.ts.map +1 -0
- package/dist/collection/template.js +73 -0
- package/dist/collection/template.js.map +1 -0
- package/dist/communication/adapters/email.d.ts +28 -0
- package/dist/communication/adapters/email.d.ts.map +1 -0
- package/dist/communication/adapters/email.js +129 -0
- package/dist/communication/adapters/email.js.map +1 -0
- package/dist/communication/adapters/sms.d.ts +95 -0
- package/dist/communication/adapters/sms.d.ts.map +1 -0
- package/dist/communication/adapters/sms.js +121 -0
- package/dist/communication/adapters/sms.js.map +1 -0
- package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
- package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-language.js +36 -0
- package/dist/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.js +97 -0
- package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/communication/adapters/whatsapp.d.ts +29 -0
- package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp.js +210 -0
- package/dist/communication/adapters/whatsapp.js.map +1 -0
- package/dist/communication/audit.d.ts +105 -0
- package/dist/communication/audit.d.ts.map +1 -0
- package/dist/communication/audit.js +56 -0
- package/dist/communication/audit.js.map +1 -0
- package/dist/communication/capabilities.d.ts +88 -0
- package/dist/communication/capabilities.d.ts.map +1 -0
- package/dist/communication/capabilities.js +72 -0
- package/dist/communication/capabilities.js.map +1 -0
- package/dist/communication/channel.d.ts +125 -0
- package/dist/communication/channel.d.ts.map +1 -0
- package/dist/communication/channel.js +47 -0
- package/dist/communication/channel.js.map +1 -0
- package/dist/communication/claim.d.ts +368 -0
- package/dist/communication/claim.d.ts.map +1 -0
- package/dist/communication/claim.js +224 -0
- package/dist/communication/claim.js.map +1 -0
- package/dist/communication/consent.d.ts +65 -0
- package/dist/communication/consent.d.ts.map +1 -0
- package/dist/communication/consent.js +40 -0
- package/dist/communication/consent.js.map +1 -0
- package/dist/communication/context.d.ts +48 -0
- package/dist/communication/context.d.ts.map +1 -0
- package/dist/communication/context.js +41 -0
- package/dist/communication/context.js.map +1 -0
- package/dist/communication/credentials.d.ts +74 -0
- package/dist/communication/credentials.d.ts.map +1 -0
- package/dist/communication/credentials.js +115 -0
- package/dist/communication/credentials.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts +37 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -0
- package/dist/communication/dry-run-scenario.js +158 -0
- package/dist/communication/dry-run-scenario.js.map +1 -0
- package/dist/communication/dry-run.d.ts +40 -0
- package/dist/communication/dry-run.d.ts.map +1 -0
- package/dist/communication/dry-run.js +92 -0
- package/dist/communication/dry-run.js.map +1 -0
- package/dist/communication/engine.d.ts +153 -0
- package/dist/communication/engine.d.ts.map +1 -0
- package/dist/communication/engine.js +480 -0
- package/dist/communication/engine.js.map +1 -0
- package/dist/communication/graph.d.ts +38 -0
- package/dist/communication/graph.d.ts.map +1 -0
- package/dist/communication/graph.js +45 -0
- package/dist/communication/graph.js.map +1 -0
- package/dist/communication/idempotency.d.ts +33 -0
- package/dist/communication/idempotency.d.ts.map +1 -0
- package/dist/communication/idempotency.js +23 -0
- package/dist/communication/idempotency.js.map +1 -0
- package/dist/communication/identity.d.ts +127 -0
- package/dist/communication/identity.d.ts.map +1 -0
- package/dist/communication/identity.js +105 -0
- package/dist/communication/identity.js.map +1 -0
- package/dist/communication/index.d.ts +66 -0
- package/dist/communication/index.d.ts.map +1 -0
- package/dist/communication/index.js +42 -0
- package/dist/communication/index.js.map +1 -0
- package/dist/communication/onboarding.d.ts +223 -0
- package/dist/communication/onboarding.d.ts.map +1 -0
- package/dist/communication/onboarding.js +287 -0
- package/dist/communication/onboarding.js.map +1 -0
- package/dist/communication/policy.d.ts +99 -0
- package/dist/communication/policy.d.ts.map +1 -0
- package/dist/communication/policy.js +13 -0
- package/dist/communication/policy.js.map +1 -0
- package/dist/communication/routing.d.ts +99 -0
- package/dist/communication/routing.d.ts.map +1 -0
- package/dist/communication/routing.js +73 -0
- package/dist/communication/routing.js.map +1 -0
- package/dist/communication/sender-profile.d.ts +100 -0
- package/dist/communication/sender-profile.d.ts.map +1 -0
- package/dist/communication/sender-profile.js +123 -0
- package/dist/communication/sender-profile.js.map +1 -0
- package/dist/communication/status.d.ts +48 -0
- package/dist/communication/status.d.ts.map +1 -0
- package/dist/communication/status.js +79 -0
- package/dist/communication/status.js.map +1 -0
- package/dist/communication/stores/onboarding.d.ts +88 -0
- package/dist/communication/stores/onboarding.d.ts.map +1 -0
- package/dist/communication/stores/onboarding.js +127 -0
- package/dist/communication/stores/onboarding.js.map +1 -0
- package/dist/communication/stores/postgres.d.ts +81 -0
- package/dist/communication/stores/postgres.d.ts.map +1 -0
- package/dist/communication/stores/postgres.js +453 -0
- package/dist/communication/stores/postgres.js.map +1 -0
- package/dist/communication/stores/routing.d.ts +169 -0
- package/dist/communication/stores/routing.d.ts.map +1 -0
- package/dist/communication/stores/routing.js +324 -0
- package/dist/communication/stores/routing.js.map +1 -0
- package/dist/communication/stores/secrets.d.ts +89 -0
- package/dist/communication/stores/secrets.d.ts.map +1 -0
- package/dist/communication/stores/secrets.js +122 -0
- package/dist/communication/stores/secrets.js.map +1 -0
- package/dist/communication/template-provider.d.ts +85 -0
- package/dist/communication/template-provider.d.ts.map +1 -0
- package/dist/communication/template-provider.js +21 -0
- package/dist/communication/template-provider.js.map +1 -0
- package/dist/communication/template.d.ts +87 -0
- package/dist/communication/template.d.ts.map +1 -0
- package/dist/communication/template.js +59 -0
- package/dist/communication/template.js.map +1 -0
- package/dist/communication/webhook-subscription.d.ts +156 -0
- package/dist/communication/webhook-subscription.d.ts.map +1 -0
- package/dist/communication/webhook-subscription.js +252 -0
- package/dist/communication/webhook-subscription.js.map +1 -0
- package/dist/communication/webhook.d.ts +121 -0
- package/dist/communication/webhook.d.ts.map +1 -0
- package/dist/communication/webhook.js +283 -0
- package/dist/communication/webhook.js.map +1 -0
- package/dist/competence/repository.d.ts +147 -0
- package/dist/competence/repository.d.ts.map +1 -0
- package/dist/competence/repository.js +294 -0
- package/dist/competence/repository.js.map +1 -0
- package/dist/contacts/phone.d.ts +70 -0
- package/dist/contacts/phone.d.ts.map +1 -0
- package/dist/contacts/phone.js +186 -0
- package/dist/contacts/phone.js.map +1 -0
- package/dist/db/migrate.js +17 -11
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/seed-catalog.d.ts +18 -0
- package/dist/db/seed-catalog.d.ts.map +1 -0
- package/dist/db/seed-catalog.js +45 -0
- package/dist/db/seed-catalog.js.map +1 -0
- package/dist/db/seed.js +16 -8
- package/dist/db/seed.js.map +1 -1
- package/dist/documents/repository.d.ts +97 -0
- package/dist/documents/repository.d.ts.map +1 -0
- package/dist/documents/repository.js +236 -0
- package/dist/documents/repository.js.map +1 -0
- package/dist/documents/requests.d.ts +73 -0
- package/dist/documents/requests.d.ts.map +1 -0
- package/dist/documents/requests.js +127 -0
- package/dist/documents/requests.js.map +1 -0
- package/dist/index.d.ts +113 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +104 -8
- package/dist/index.js.map +1 -1
- package/dist/legal/company.d.ts +32 -0
- package/dist/legal/company.d.ts.map +1 -0
- package/dist/legal/company.js +33 -0
- package/dist/legal/company.js.map +1 -0
- package/dist/legal/documents.d.ts +30 -0
- package/dist/legal/documents.d.ts.map +1 -0
- package/dist/legal/documents.js +666 -0
- package/dist/legal/documents.js.map +1 -0
- package/dist/legal/index.d.ts +5 -0
- package/dist/legal/index.d.ts.map +1 -0
- package/dist/legal/index.js +4 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/legal/types.d.ts +145 -0
- package/dist/legal/types.d.ts.map +1 -0
- package/dist/legal/types.js +31 -0
- package/dist/legal/types.js.map +1 -0
- package/dist/mail/auth-templates.d.ts +15 -0
- package/dist/mail/auth-templates.d.ts.map +1 -0
- package/dist/mail/auth-templates.js +26 -0
- package/dist/mail/auth-templates.js.map +1 -0
- package/dist/mail/dedup-store.d.ts +1 -24
- package/dist/mail/dedup-store.d.ts.map +1 -1
- package/dist/mail/dedup-store.js +9 -48
- package/dist/mail/dedup-store.js.map +1 -1
- package/dist/mail/index.d.ts +2 -1
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +13 -2
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/provider.d.ts +2 -30
- package/dist/mail/provider.d.ts.map +1 -1
- package/dist/mail/provider.js +10 -246
- package/dist/mail/provider.js.map +1 -1
- package/dist/mail/resend.d.ts +2 -12
- package/dist/mail/resend.d.ts.map +1 -1
- package/dist/mail/resend.js +11 -17
- package/dist/mail/resend.js.map +1 -1
- package/dist/mail/sender-resolver.d.ts +1 -7
- package/dist/mail/sender-resolver.d.ts.map +1 -1
- package/dist/mail/sender-resolver.js +11 -10
- package/dist/mail/sender-resolver.js.map +1 -1
- package/dist/mail/template-renderer.d.ts +1 -9
- package/dist/mail/template-renderer.d.ts.map +1 -1
- package/dist/mail/template-renderer.js +10 -15
- package/dist/mail/template-renderer.js.map +1 -1
- package/dist/mail/transactional-outbound.d.ts +115 -0
- package/dist/mail/transactional-outbound.d.ts.map +1 -0
- package/dist/mail/transactional-outbound.js +113 -0
- package/dist/mail/transactional-outbound.js.map +1 -0
- package/dist/mail/types.d.ts +2 -142
- package/dist/mail/types.d.ts.map +1 -1
- package/dist/mail/types.js +1 -33
- package/dist/mail/types.js.map +1 -1
- package/dist/portal/provisioning.d.ts +58 -0
- package/dist/portal/provisioning.d.ts.map +1 -0
- package/dist/portal/provisioning.js +139 -0
- package/dist/portal/provisioning.js.map +1 -0
- package/dist/pricing-engine/canonical.d.ts +14 -0
- package/dist/pricing-engine/canonical.d.ts.map +1 -0
- package/dist/pricing-engine/canonical.js +39 -0
- package/dist/pricing-engine/canonical.js.map +1 -0
- package/dist/pricing-engine/errors.d.ts.map +1 -1
- package/dist/pricing-engine/errors.js +6 -1
- package/dist/pricing-engine/errors.js.map +1 -1
- package/dist/pricing-engine/index.d.ts +12 -2
- package/dist/pricing-engine/index.d.ts.map +1 -1
- package/dist/pricing-engine/index.js +6 -1
- package/dist/pricing-engine/index.js.map +1 -1
- package/dist/pricing-engine/pipeline.d.ts.map +1 -1
- package/dist/pricing-engine/pipeline.js +202 -28
- package/dist/pricing-engine/pipeline.js.map +1 -1
- package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
- package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-adapter.js +75 -0
- package/dist/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/pricing-engine/shadow-diff.d.ts +26 -0
- package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-diff.js +52 -0
- package/dist/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/pricing-engine/shadow-facade.d.ts +42 -0
- package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-facade.js +82 -0
- package/dist/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.js +18 -0
- package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
- package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-metrics.js +31 -0
- package/dist/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.js +39 -0
- package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/pricing-engine/types.d.ts +2 -0
- package/dist/pricing-engine/types.d.ts.map +1 -1
- package/dist/rbac/authorize.d.ts +12 -0
- package/dist/rbac/authorize.d.ts.map +1 -1
- package/dist/rbac/authorize.js +27 -0
- package/dist/rbac/authorize.js.map +1 -1
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +67 -1
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/rbac/workload-provisioning.d.ts +66 -0
- package/dist/rbac/workload-provisioning.d.ts.map +1 -0
- package/dist/rbac/workload-provisioning.js +153 -0
- package/dist/rbac/workload-provisioning.js.map +1 -0
- package/dist/rbac/workload.d.ts +124 -0
- package/dist/rbac/workload.d.ts.map +1 -0
- package/dist/rbac/workload.js +184 -0
- package/dist/rbac/workload.js.map +1 -0
- package/dist/storage/checksum.d.ts +9 -0
- package/dist/storage/checksum.d.ts.map +1 -0
- package/dist/storage/checksum.js +12 -0
- package/dist/storage/checksum.js.map +1 -0
- package/dist/storage/key.d.ts +37 -0
- package/dist/storage/key.d.ts.map +1 -0
- package/dist/storage/key.js +67 -0
- package/dist/storage/key.js.map +1 -0
- package/dist/storage/local.d.ts +40 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +96 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/r2.d.ts +43 -0
- package/dist/storage/r2.d.ts.map +1 -0
- package/dist/storage/r2.js +177 -0
- package/dist/storage/r2.js.map +1 -0
- package/dist/storage/registry.d.ts +23 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +37 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/types.d.ts +67 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +45 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/subscription-billing/provider/asaas.d.ts +14 -0
- package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
- package/dist/subscription-billing/provider/asaas.js +32 -7
- package/dist/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/subscription-billing/provider/disabled.d.ts +9 -0
- package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
- package/dist/subscription-billing/provider/disabled.js +8 -0
- package/dist/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/subscription-billing/provider/registry.d.ts +10 -0
- package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
- package/dist/subscription-billing/provider/registry.js +17 -0
- package/dist/subscription-billing/provider/registry.js.map +1 -1
- package/dist/subscription-billing/service.d.ts +17 -1
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +57 -8
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/subscription-billing/types.d.ts +13 -0
- package/dist/subscription-billing/types.d.ts.map +1 -1
- package/dist/subscription-billing/types.js.map +1 -1
- package/dist/tenancy/provisioning.d.ts.map +1 -1
- package/dist/tenancy/provisioning.js +32 -8
- package/dist/tenancy/provisioning.js.map +1 -1
- package/dist/users/repository.d.ts +38 -0
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +118 -3
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +67 -0
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +78 -0
- package/dist/vault/repository.js.map +1 -1
- package/package.json +19 -4
- package/src/db/migrations/0023_user_invite_activation.sql +15 -0
- package/src/db/migrations/0024_set_user_password_function.sql +32 -0
- package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
- package/src/db/migrations/0026_documents_and_competence.sql +353 -0
- package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
- package/src/db/migrations/0028_collection_engine.sql +94 -0
- package/src/db/migrations/0029_payment_rail.sql +107 -0
- package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
- package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
- package/src/db/migrations/0032_settlement_reversal.sql +76 -0
- package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
- package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
- package/src/db/migrations/0035_payment_account_environments.sql +61 -0
- package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
- package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
- package/src/db/migrations/0038_notification_channels.sql +175 -0
- package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
- package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
- package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
- package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
- package/src/db/migrations/0043_workload_identity.sql +105 -0
- package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
- package/dist/cjs/mail/resend-client.js +0 -103
- package/dist/cjs/mail/resend-client.js.map +0 -1
- package/dist/mail/resend-client.d.ts +0 -16
- package/dist/mail/resend-client.d.ts.map +0 -1
- package/dist/mail/resend-client.js +0 -100
- package/dist/mail/resend-client.js.map +0 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getActiveProviderAccount = getActiveProviderAccount;
|
|
4
|
+
exports.listProviderAccounts = listProviderAccounts;
|
|
5
|
+
exports.getProviderAccountByEnvironment = getProviderAccountByEnvironment;
|
|
6
|
+
exports.setPrimaryProviderAccount = setPrimaryProviderAccount;
|
|
7
|
+
exports.getProviderAccountById = getProviderAccountById;
|
|
8
|
+
exports.providerBaseUrl = providerBaseUrl;
|
|
9
|
+
exports.resolveProviderForTenant = resolveProviderForTenant;
|
|
10
|
+
const shared_1 = require("@baruk/shared");
|
|
11
|
+
const live_guard_js_1 = require("./live-guard.js");
|
|
12
|
+
const repository_js_1 = require("../vault/repository.js");
|
|
13
|
+
const registry_js_1 = require("./provider/registry.js");
|
|
14
|
+
const toAccount = (r) => ({
|
|
15
|
+
id: r.id,
|
|
16
|
+
provider: r.provider,
|
|
17
|
+
accountReference: r.account_reference,
|
|
18
|
+
environment: r.environment,
|
|
19
|
+
isPrimary: r.is_primary ?? false,
|
|
20
|
+
capabilities: Array.isArray(r.supported_capabilities)
|
|
21
|
+
? r.supported_capabilities
|
|
22
|
+
: [],
|
|
23
|
+
credentialRef: r.credential_ref,
|
|
24
|
+
webhookCredentialRef: r.webhook_credential_ref,
|
|
25
|
+
status: r.status,
|
|
26
|
+
});
|
|
27
|
+
/** Conta ativa do tenant. `null` quando o escritório ainda não conectou nenhuma. */
|
|
28
|
+
/**
|
|
29
|
+
* A conta pela qual o escritório OPERA.
|
|
30
|
+
*
|
|
31
|
+
* Antes era "a primeira conta ativa por data de criação". Isso funcionava
|
|
32
|
+
* enquanto só podia existir uma; com sandbox e produção coexistindo, viraria a
|
|
33
|
+
* pior forma de escolher para onde vai o dinheiro — implícita e dependente de
|
|
34
|
+
* ordem de inserção.
|
|
35
|
+
*
|
|
36
|
+
* Agora a escolha é uma MARCA explícita, e o banco garante que só há uma:
|
|
37
|
+
* `payment_provider_account_primary_uq`. Sem `LIMIT`, de propósito — se algum
|
|
38
|
+
* dia houvesse duas, o certo é o erro aparecer, não o sistema escolher sozinho.
|
|
39
|
+
*/
|
|
40
|
+
async function getActiveProviderAccount(tx) {
|
|
41
|
+
const rows = await tx `
|
|
42
|
+
SELECT id, provider, account_reference, environment, supported_capabilities,
|
|
43
|
+
credential_ref, webhook_credential_ref, status, is_primary
|
|
44
|
+
FROM payment_provider_account
|
|
45
|
+
WHERE status = 'active' AND is_primary
|
|
46
|
+
`;
|
|
47
|
+
return rows[0] ? toAccount(rows[0]) : null;
|
|
48
|
+
}
|
|
49
|
+
/** Todas as contas vivas do escritório — o laboratório e a operação. */
|
|
50
|
+
async function listProviderAccounts(tx) {
|
|
51
|
+
const rows = await tx `
|
|
52
|
+
SELECT id, provider, account_reference, environment, supported_capabilities,
|
|
53
|
+
credential_ref, webhook_credential_ref, status, is_primary
|
|
54
|
+
FROM payment_provider_account
|
|
55
|
+
WHERE status <> 'revoked'
|
|
56
|
+
ORDER BY environment, created_at
|
|
57
|
+
`;
|
|
58
|
+
return rows.map(toAccount);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Conta ativa de um AMBIENTE específico.
|
|
62
|
+
*
|
|
63
|
+
* Existe para quem sabe o que quer — um ensaio pede `sandbox` mesmo que a
|
|
64
|
+
* operação já esteja em produção. Nunca cai em outro ambiente por falta do
|
|
65
|
+
* pedido: sem conta naquele ambiente, devolve nulo.
|
|
66
|
+
*/
|
|
67
|
+
async function getProviderAccountByEnvironment(tx, environment) {
|
|
68
|
+
const rows = await tx `
|
|
69
|
+
SELECT id, provider, account_reference, environment, supported_capabilities,
|
|
70
|
+
credential_ref, webhook_credential_ref, status, is_primary
|
|
71
|
+
FROM payment_provider_account
|
|
72
|
+
WHERE status = 'active' AND environment = ${environment}
|
|
73
|
+
`;
|
|
74
|
+
return rows[0] ? toAccount(rows[0]) : null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Promove uma conta a operacional — o ato de "entrar em produção".
|
|
78
|
+
*
|
|
79
|
+
* Explícito e reversível, em vez de efeito colateral de revogar o laboratório.
|
|
80
|
+
* A despromoção da anterior acontece na MESMA transação: entre um UPDATE e o
|
|
81
|
+
* outro existiria um instante com duas contas operacionais, e é justamente
|
|
82
|
+
* nesse instante que uma emissão escolheria errado.
|
|
83
|
+
*/
|
|
84
|
+
async function setPrimaryProviderAccount(tx, id) {
|
|
85
|
+
const alvo = await tx `
|
|
86
|
+
SELECT provider FROM payment_provider_account
|
|
87
|
+
WHERE id = ${id} AND status = 'active'
|
|
88
|
+
`;
|
|
89
|
+
if (!alvo[0])
|
|
90
|
+
throw new shared_1.NotFoundError('Conta de pagamento ativa não encontrada');
|
|
91
|
+
await tx `
|
|
92
|
+
UPDATE payment_provider_account SET is_primary = false, updated_at = now()
|
|
93
|
+
WHERE provider = ${alvo[0].provider} AND is_primary AND status <> 'revoked'
|
|
94
|
+
`;
|
|
95
|
+
await tx `
|
|
96
|
+
UPDATE payment_provider_account SET is_primary = true, updated_at = now()
|
|
97
|
+
WHERE id = ${id}
|
|
98
|
+
`;
|
|
99
|
+
const conta = await getProviderAccountById(tx, id);
|
|
100
|
+
if (!conta)
|
|
101
|
+
throw new shared_1.NotFoundError('Conta de pagamento não encontrada');
|
|
102
|
+
return conta;
|
|
103
|
+
}
|
|
104
|
+
/** Conta por id — usada pelo webhook, que descobre o tenant pela URL. */
|
|
105
|
+
async function getProviderAccountById(tx, id) {
|
|
106
|
+
const rows = await tx `
|
|
107
|
+
SELECT id, provider, account_reference, environment, supported_capabilities,
|
|
108
|
+
credential_ref, webhook_credential_ref, status, is_primary
|
|
109
|
+
FROM payment_provider_account WHERE id = ${id}
|
|
110
|
+
`;
|
|
111
|
+
return rows[0] ? toAccount(rows[0]) : null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* URL base do gateway conforme o ambiente declarado NA CONTA.
|
|
115
|
+
*
|
|
116
|
+
* A escolha não pode vir de env var do processo: dois tenants podem estar em
|
|
117
|
+
* ambientes diferentes na mesma instância — um escritório em homologação
|
|
118
|
+
* enquanto outro já cobra de verdade. Ambiente é atributo da conta.
|
|
119
|
+
*/
|
|
120
|
+
const BASE_URL = {
|
|
121
|
+
asaas: {
|
|
122
|
+
live: 'https://api.asaas.com/v3',
|
|
123
|
+
sandbox: 'https://api-sandbox.asaas.com/v3',
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Base do gateway para um par (provider, ambiente).
|
|
128
|
+
*
|
|
129
|
+
* Exportada porque a CONEXÃO da conta também precisa dela, e uma segunda cópia
|
|
130
|
+
* divergiria: foi assim que uma chave de sandbox chegou a ser validada contra
|
|
131
|
+
* produção — o adapter caía no default `live` e devolvia 401 com a credencial
|
|
132
|
+
* correta na mão.
|
|
133
|
+
*/
|
|
134
|
+
function providerBaseUrl(provider, environment) {
|
|
135
|
+
return BASE_URL[provider]?.[environment];
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Monta o adapter já apontado para a conta do tenant.
|
|
139
|
+
*
|
|
140
|
+
* `revealSecret` é a única forma de a credencial sair do Vault, e ela sai
|
|
141
|
+
* direto para dentro do adapter — não é devolvida, logada nem guardada em
|
|
142
|
+
* variável de módulo.
|
|
143
|
+
*/
|
|
144
|
+
async function resolveProviderForTenant(tx, keyring, tenantId, opts = {}) {
|
|
145
|
+
const account = opts.account ?? (await getActiveProviderAccount(tx));
|
|
146
|
+
if (!account)
|
|
147
|
+
return null;
|
|
148
|
+
// Antes de a credencial sair do Vault: uma aplicação que não é produção não
|
|
149
|
+
// deve nem abrir conexão com a conta live — inclusive para receber webhook.
|
|
150
|
+
(0, live_guard_js_1.assertLiveProviderAllowed)(account.environment, (0, live_guard_js_1.readLiveRuntime)(), 'resolve');
|
|
151
|
+
if (!account.credentialRef) {
|
|
152
|
+
throw new shared_1.ValidationError(`A conta de pagamento do escritório não tem credencial associada (provider "${account.provider}").`);
|
|
153
|
+
}
|
|
154
|
+
const { secret } = await (0, repository_js_1.revealSecret)(tx, keyring, tenantId, account.credentialRef);
|
|
155
|
+
// O token de webhook é opcional na emissão e obrigatório na recepção: dá para
|
|
156
|
+
// emitir cobrança sem ele, mas a rota pública recusa tudo enquanto faltar.
|
|
157
|
+
const webhookSecret = account.webhookCredentialRef
|
|
158
|
+
? (await (0, repository_js_1.revealSecret)(tx, keyring, tenantId, account.webhookCredentialRef)).secret
|
|
159
|
+
: undefined;
|
|
160
|
+
return {
|
|
161
|
+
account,
|
|
162
|
+
provider: (0, registry_js_1.resolveBillingProvider)(account.provider, {
|
|
163
|
+
apiKey: secret,
|
|
164
|
+
baseUrl: providerBaseUrl(account.provider, account.environment),
|
|
165
|
+
webhookSecret,
|
|
166
|
+
fetchImpl: opts.fetchImpl,
|
|
167
|
+
}),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=provider-account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-account.js","sourceRoot":"","sources":["../../../src/billing/provider-account.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.connectProviderAccount = connectProviderAccount;
|
|
4
|
+
exports.revokeProviderAccount = revokeProviderAccount;
|
|
5
|
+
exports.revalidateProviderAccount = revalidateProviderAccount;
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const shared_1 = require("@baruk/shared");
|
|
8
|
+
const repository_js_1 = require("../vault/repository.js");
|
|
9
|
+
const registry_js_1 = require("./provider/registry.js");
|
|
10
|
+
const provider_account_js_1 = require("./provider-account.js");
|
|
11
|
+
async function connectProviderAccount(tx, keyring, tenantId, input, platform = {}) {
|
|
12
|
+
const apiKey = input.apiKey.trim();
|
|
13
|
+
if (!apiKey)
|
|
14
|
+
throw new shared_1.ValidationError('Credencial vazia.');
|
|
15
|
+
const provider = (0, registry_js_1.resolveBillingProvider)(input.provider, {
|
|
16
|
+
apiKey,
|
|
17
|
+
// A base vem do AMBIENTE declarado, não do default do adapter. Sem isto,
|
|
18
|
+
// uma chave de sandbox é validada contra produção e volta 401 — o operador
|
|
19
|
+
// lê "credencial inválida" com a credencial certa na mão.
|
|
20
|
+
baseUrl: input.baseUrl ?? (0, provider_account_js_1.providerBaseUrl)(input.provider, input.environment),
|
|
21
|
+
fetchImpl: input.fetchImpl,
|
|
22
|
+
});
|
|
23
|
+
if (!provider.describeAccount) {
|
|
24
|
+
throw new shared_1.ValidationError(`O provider "${input.provider}" não sabe identificar a própria conta — conectar às cegas não é aceitável para dinheiro.`);
|
|
25
|
+
}
|
|
26
|
+
// A credencial é EXERCIDA aqui. Guardar sem usar significaria descobrir que
|
|
27
|
+
// ela não funciona na primeira cobrança de um cliente real.
|
|
28
|
+
const identity = await provider.describeAccount();
|
|
29
|
+
assertNotPlatformAccount(identity, platform);
|
|
30
|
+
// Conta do PRÓPRIO escritório: a RLS deixa ver, então dá para recusar com uma
|
|
31
|
+
// consulta limpa, sem provocar violação. Só o caso cross-tenant precisa do
|
|
32
|
+
// banco para ser detectado — e ele vem depois, isolado num savepoint.
|
|
33
|
+
// Por AMBIENTE, e não por provedor: duas contas do mesmo gateway em ambientes
|
|
34
|
+
// diferentes não são a mesma conta — têm credencial, endpoint e dinheiro
|
|
35
|
+
// distintos. Enquanto a checagem era por provedor, ativar produção exigia
|
|
36
|
+
// revogar o laboratório, e a decisão "vou cobrar de verdade" ficava amarrada a
|
|
37
|
+
// "vou perder onde ensaio".
|
|
38
|
+
const jaTem = await tx `
|
|
39
|
+
SELECT id FROM payment_provider_account
|
|
40
|
+
WHERE provider = ${input.provider} AND environment = ${input.environment}
|
|
41
|
+
AND status <> 'revoked' LIMIT 1
|
|
42
|
+
`;
|
|
43
|
+
if (jaTem[0]) {
|
|
44
|
+
throw new shared_1.ConflictError(`Este escritório já tem uma conta ${input.provider} em ${input.environment}. ` +
|
|
45
|
+
'Revogue a atual antes de conectar outra neste ambiente.');
|
|
46
|
+
}
|
|
47
|
+
// A primeira conta do escritório nasce operacional; as seguintes nascem como
|
|
48
|
+
// laboratório. Promover é ato explícito — conectar produção não pode, sozinho,
|
|
49
|
+
// redirecionar o dinheiro.
|
|
50
|
+
const jaTemPrimaria = await tx `
|
|
51
|
+
SELECT id FROM payment_provider_account
|
|
52
|
+
WHERE provider = ${input.provider} AND is_primary AND status <> 'revoked' LIMIT 1
|
|
53
|
+
`;
|
|
54
|
+
const nasceOperacional = !jaTemPrimaria[0];
|
|
55
|
+
// A garantia de que nenhuma outra organização já usa esta conta é do BANCO
|
|
56
|
+
// (índice único em `provider, account_reference`), não de uma consulta aqui.
|
|
57
|
+
// Uma consulta não serviria: com RLS FORCE, `WHERE tenant_id <> atual`
|
|
58
|
+
// devolve sempre zero — a política esconde justamente a linha que a checagem
|
|
59
|
+
// precisaria encontrar. O guard pareceria proteger sem proteger.
|
|
60
|
+
const apiRef = await (0, repository_js_1.createCredential)(tx, keyring, tenantId, {
|
|
61
|
+
name: credentialName(input.provider, input.environment, 'api'),
|
|
62
|
+
category: 'api_key',
|
|
63
|
+
secret: apiKey,
|
|
64
|
+
provider: input.provider,
|
|
65
|
+
// O metadata guarda de quem é a conta, para auditoria futura conseguir
|
|
66
|
+
// responder "esta chave abria qual conta?" sem precisar decifrá-la.
|
|
67
|
+
metadata: {
|
|
68
|
+
purpose: 'payment_provider_api_key',
|
|
69
|
+
accountName: identity.name,
|
|
70
|
+
accountReference: identity.reference,
|
|
71
|
+
environment: input.environment,
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
const webhookRef = input.webhookToken?.trim()
|
|
75
|
+
? await (0, repository_js_1.createCredential)(tx, keyring, tenantId, {
|
|
76
|
+
name: credentialName(input.provider, input.environment, 'webhook'),
|
|
77
|
+
category: 'api_key',
|
|
78
|
+
secret: input.webhookToken.trim(),
|
|
79
|
+
provider: input.provider,
|
|
80
|
+
metadata: { purpose: 'payment_provider_webhook_token', environment: input.environment },
|
|
81
|
+
})
|
|
82
|
+
: null;
|
|
83
|
+
const id = (0, node_crypto_1.randomUUID)();
|
|
84
|
+
await insertAccount(tx, id, input, identity, apiRef.id, webhookRef?.id ?? null, nasceOperacional);
|
|
85
|
+
return {
|
|
86
|
+
identity,
|
|
87
|
+
account: {
|
|
88
|
+
id,
|
|
89
|
+
provider: input.provider,
|
|
90
|
+
accountReference: identity.reference,
|
|
91
|
+
environment: input.environment,
|
|
92
|
+
capabilities: input.capabilities ?? ['pix', 'boleto'],
|
|
93
|
+
credentialRef: apiRef.id,
|
|
94
|
+
webhookCredentialRef: webhookRef?.id ?? null,
|
|
95
|
+
isPrimary: nasceOperacional,
|
|
96
|
+
status: 'active',
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Insere a conta dentro de um SAVEPOINT.
|
|
102
|
+
*
|
|
103
|
+
* O savepoint não é zelo excessivo: uma violação de unicidade aborta a
|
|
104
|
+
* transação inteira, e a partir daí qualquer comando falha — inclusive os que o
|
|
105
|
+
* driver roda ao desfazer. O erro que chegaria ao usuário seria o do rollback,
|
|
106
|
+
* não o meu, e a rota devolveria 500 no lugar de uma explicação. Com o
|
|
107
|
+
* savepoint, só a tentativa de INSERT é desfeita e a mensagem certa sobrevive.
|
|
108
|
+
*
|
|
109
|
+
* O que se detecta aqui é o caso **cross-tenant**: a RLS esconde a conta de
|
|
110
|
+
* outro escritório, então nenhuma consulta encontraria o conflito — só o índice.
|
|
111
|
+
*/
|
|
112
|
+
async function insertAccount(tx, id, input, identity, credentialRef, webhookRef, nasceOperacional) {
|
|
113
|
+
try {
|
|
114
|
+
await tx.savepoint(async (sp) => {
|
|
115
|
+
await sp `
|
|
116
|
+
INSERT INTO payment_provider_account (
|
|
117
|
+
id, tenant_id, provider, account_reference, environment,
|
|
118
|
+
supported_capabilities, status, credential_ref, webhook_credential_ref,
|
|
119
|
+
last_validated_at, is_primary
|
|
120
|
+
) VALUES (
|
|
121
|
+
${id},
|
|
122
|
+
NULLIF(current_setting('app.current_tenant', true), '')::uuid,
|
|
123
|
+
${input.provider}, ${identity.reference}, ${input.environment},
|
|
124
|
+
${tx.json((input.capabilities ?? ['pix', 'boleto']))},
|
|
125
|
+
'active', ${credentialRef}, ${webhookRef}, now(), ${nasceOperacional}
|
|
126
|
+
)
|
|
127
|
+
RETURNING id
|
|
128
|
+
`;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
if (constraintOf(err) === 'payment_provider_account_reference_uq') {
|
|
133
|
+
throw new shared_1.ConflictError('Esta conta de pagamento já está conectada a outra organização. ' +
|
|
134
|
+
'Duas organizações não podem receber na mesma conta.');
|
|
135
|
+
}
|
|
136
|
+
if (constraintOf(err) === 'payment_provider_account_provider_uq') {
|
|
137
|
+
throw new shared_1.ConflictError(`Este escritório já tem uma conta ${input.provider} conectada. Revogue a atual antes de conectar outra.`);
|
|
138
|
+
}
|
|
139
|
+
throw err;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function constraintOf(err) {
|
|
143
|
+
const e = err;
|
|
144
|
+
return e?.constraint_name ?? e?.constraint ?? null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Recusa a conta da plataforma.
|
|
148
|
+
*
|
|
149
|
+
* Comparação por documento E por referência: o mesmo CNPJ pode ter mais de uma
|
|
150
|
+
* conta, e a mesma conta pode aparecer com referências diferentes conforme o
|
|
151
|
+
* endpoint. Bater em qualquer um dos dois basta para recusar — aqui, falso
|
|
152
|
+
* positivo custa um pedido de esclarecimento, e falso negativo custa o dinheiro
|
|
153
|
+
* de um escritório caindo na conta da Baruk.
|
|
154
|
+
*/
|
|
155
|
+
function assertNotPlatformAccount(identity, platform) {
|
|
156
|
+
const mesmoDoc = platform.documentNumber &&
|
|
157
|
+
identity.documentNumber &&
|
|
158
|
+
onlyDigits(platform.documentNumber) === onlyDigits(identity.documentNumber);
|
|
159
|
+
const mesmaRef = platform.reference && identity.reference && platform.reference === identity.reference;
|
|
160
|
+
if (mesmoDoc || mesmaRef) {
|
|
161
|
+
throw new shared_1.ValidationError('Esta credencial abre a conta da plataforma, não a do escritório. ' +
|
|
162
|
+
'O dinheiro cobrado pelo escritório precisa cair na conta dele — ' +
|
|
163
|
+
'use uma credencial da conta do próprio escritório.');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Nome da credencial no Vault.
|
|
168
|
+
*
|
|
169
|
+
* O prefixo é canônico e legível; o sufixo é o que torna o nome **único**. O
|
|
170
|
+
* Vault exige nome único por tenant, e um nome fixo impediria o caso legítimo
|
|
171
|
+
* de desconectar uma conta e conectar outra — a credencial antiga continua
|
|
172
|
+
* existindo, marcada, porque histórico de credencial não se apaga.
|
|
173
|
+
*
|
|
174
|
+
* Quem procura por semântica não usa o nome: `provider` e `metadata.purpose`
|
|
175
|
+
* são os campos indexáveis para isso.
|
|
176
|
+
*/
|
|
177
|
+
function credentialName(provider, environment, kind) {
|
|
178
|
+
return `baruk-office-${provider}-${environment}-${kind}-${(0, node_crypto_1.randomUUID)().slice(0, 8)}`;
|
|
179
|
+
}
|
|
180
|
+
function onlyDigits(v) {
|
|
181
|
+
return v.replace(/\D/g, '');
|
|
182
|
+
}
|
|
183
|
+
/** Revoga a conta. A credencial fica no Vault, marcada — histórico não se apaga. */
|
|
184
|
+
async function revokeProviderAccount(tx, accountId) {
|
|
185
|
+
const rows = await tx `
|
|
186
|
+
UPDATE payment_provider_account
|
|
187
|
+
SET status = 'revoked', revoked_at = now(), updated_at = now()
|
|
188
|
+
WHERE id = ${accountId} AND status <> 'revoked'
|
|
189
|
+
RETURNING id
|
|
190
|
+
`;
|
|
191
|
+
return rows.length;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Reconsulta a identidade da conta e atualiza o que estiver defasado.
|
|
195
|
+
*
|
|
196
|
+
* Existe por dois motivos concretos, os dois observados na conta da SC:
|
|
197
|
+
*
|
|
198
|
+
* - **a referência pode ter nascido nula** (o gateway não expunha id na época),
|
|
199
|
+
* e sem ela o guard que impede duas organizações de receberem na mesma conta
|
|
200
|
+
* fica inativo — o índice de unicidade é parcial;
|
|
201
|
+
* - **a credencial pode ter sido revogada do lado do gateway** sem ninguém
|
|
202
|
+
* avisar, e `last_validated_at` é a única forma de saber quando foi a última
|
|
203
|
+
* vez que ela comprovadamente funcionou.
|
|
204
|
+
*
|
|
205
|
+
* Não troca a credencial: só confirma de quem é a conta que ela abre.
|
|
206
|
+
*/
|
|
207
|
+
async function revalidateProviderAccount(tx, keyring, tenantId, account, opts = {}) {
|
|
208
|
+
if (!account.credentialRef) {
|
|
209
|
+
throw new shared_1.ValidationError('A conta não tem credencial associada.');
|
|
210
|
+
}
|
|
211
|
+
const { secret } = await (0, repository_js_1.revealSecret)(tx, keyring, tenantId, account.credentialRef);
|
|
212
|
+
const provider = (0, registry_js_1.resolveBillingProvider)(account.provider, {
|
|
213
|
+
apiKey: secret,
|
|
214
|
+
baseUrl: (0, provider_account_js_1.providerBaseUrl)(account.provider, account.environment),
|
|
215
|
+
fetchImpl: opts.fetchImpl,
|
|
216
|
+
});
|
|
217
|
+
if (!provider.describeAccount) {
|
|
218
|
+
throw new shared_1.ValidationError(`O provider "${account.provider}" não sabe identificar a própria conta.`);
|
|
219
|
+
}
|
|
220
|
+
const identity = await provider.describeAccount();
|
|
221
|
+
// A referência só é gravada quando falta. Sobrescrever uma referência
|
|
222
|
+
// existente com outra silenciosamente mudaria a identidade da conta que já
|
|
223
|
+
// está recebendo dinheiro — se divergir, é caso para o humano olhar.
|
|
224
|
+
if (!account.accountReference && identity.reference) {
|
|
225
|
+
await tx `
|
|
226
|
+
UPDATE payment_provider_account
|
|
227
|
+
SET account_reference = ${identity.reference}, last_validated_at = now(), updated_at = now()
|
|
228
|
+
WHERE id = ${account.id}
|
|
229
|
+
`;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
await tx `
|
|
233
|
+
UPDATE payment_provider_account
|
|
234
|
+
SET last_validated_at = now(), updated_at = now() WHERE id = ${account.id}
|
|
235
|
+
`;
|
|
236
|
+
}
|
|
237
|
+
return identity;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=provider-onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-onboarding.js","sourceRoot":"","sources":["../../../src/billing/provider-onboarding.ts"],"names":[],"mappings":";;AAwDA,wDA4GC;AA8GD,sDAQC;AAgBD,8DAyCC;AAnVD,6CAAyC;AACzC,0CAA+D;AAG/D,0DAAwE;AACxE,wDAAgE;AAEhE,+DAAwD;AAiDjD,KAAK,UAAU,sBAAsB,CAC1C,EAAM,EACN,OAAgB,EAChB,QAAgB,EAChB,KAAkC,EAClC,WAAiC,EAAE;IAEnC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,wBAAe,CAAC,mBAAmB,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAG,IAAA,oCAAsB,EAAC,KAAK,CAAC,QAAQ,EAAE;QACtD,MAAM;QACN,yEAAyE;QACzE,2EAA2E;QAC3E,0DAA0D;QAC1D,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAA,qCAAe,EAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC;QAC5E,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC9B,MAAM,IAAI,wBAAe,CACvB,eAAe,KAAK,CAAC,QAAQ,2FAA2F,CACzH,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAC;IAElD,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE7C,8EAA8E;IAC9E,2EAA2E;IAC3E,sEAAsE;IACtE,8EAA8E;IAC9E,yEAAyE;IACzE,0EAA0E;IAC1E,+EAA+E;IAC/E,4BAA4B;IAC5B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAkB;;uBAEnB,KAAK,CAAC,QAAQ,sBAAsB,KAAK,CAAC,WAAW;;GAEzE,CAAC;IACF,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACb,MAAM,IAAI,sBAAa,CACrB,oCAAoC,KAAK,CAAC,QAAQ,OAAO,KAAK,CAAC,WAAW,IAAI;YAC5E,yDAAyD,CAC5D,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,+EAA+E;IAC/E,2BAA2B;IAC3B,MAAM,aAAa,GAAG,MAAM,EAAE,CAAkB;;uBAE3B,KAAK,CAAC,QAAQ;GAClC,CAAC;IACF,MAAM,gBAAgB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAE3C,2EAA2E;IAC3E,6EAA6E;IAC7E,uEAAuE;IACvE,6EAA6E;IAC7E,iEAAiE;IAEjE,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAgB,EAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC3D,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC;QAC9D,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,uEAAuE;QACvE,oEAAoE;QACpE,QAAQ,EAAE;YACR,OAAO,EAAE,0BAA0B;YACnC,WAAW,EAAE,QAAQ,CAAC,IAAI;YAC1B,gBAAgB,EAAE,QAAQ,CAAC,SAAS;YACpC,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B;KACF,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE;QAC3C,CAAC,CAAC,MAAM,IAAA,gCAAgB,EAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;YAC5C,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC;YAClE,QAAQ,EAAE,SAAS;YACnB,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE;YACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,EAAE,OAAO,EAAE,gCAAgC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE;SACxF,CAAC;QACJ,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,EAAE,GAAG,IAAA,wBAAU,GAAE,CAAC;IACxB,MAAM,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAElG,OAAO;QACL,QAAQ;QACR,OAAO,EAAE;YACP,EAAE;YACF,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,gBAAgB,EAAE,QAAQ,CAAC,SAAS;YACpC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC;YACrD,aAAa,EAAE,MAAM,CAAC,EAAE;YACxB,oBAAoB,EAAE,UAAU,EAAE,EAAE,IAAI,IAAI;YAC5C,SAAS,EAAE,gBAAgB;YAC3B,MAAM,EAAE,QAAQ;SACjB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,aAAa,CAC1B,EAAM,EACN,EAAU,EACV,KAAkC,EAClC,QAAiC,EACjC,aAAqB,EACrB,UAAyB,EACzB,gBAAyB;IAEzB,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC9B,MAAM,EAAE,CAAkB;;;;;;QAMxB,EAAE;;QAEF,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,SAAS,KAAK,KAAK,CAAC,WAAW;QAC3D,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAU,CAAC;kBACjD,aAAa,KAAK,UAAU,YAAY,gBAAgB;;;OAGnE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,uCAAuC,EAAE,CAAC;YAClE,MAAM,IAAI,sBAAa,CACrB,iEAAiE;gBAC/D,qDAAqD,CACxD,CAAC;QACJ,CAAC;QACD,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,sCAAsC,EAAE,CAAC;YACjE,MAAM,IAAI,sBAAa,CACrB,oCAAoC,KAAK,CAAC,QAAQ,sDAAsD,CACzG,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IAChC,MAAM,CAAC,GAAG,GAAwD,CAAC;IACnE,OAAO,CAAC,EAAE,eAAe,IAAI,CAAC,EAAE,UAAU,IAAI,IAAI,CAAC;AACrD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,wBAAwB,CAC/B,QAAiC,EACjC,QAA8B;IAE9B,MAAM,QAAQ,GACZ,QAAQ,CAAC,cAAc;QACvB,QAAQ,CAAC,cAAc;QACvB,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC9E,MAAM,QAAQ,GACZ,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,CAAC;IAExF,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,wBAAe,CACvB,mEAAmE;YACjE,kEAAkE;YAClE,oDAAoD,CACvD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,cAAc,CAAC,QAAgB,EAAE,WAAmB,EAAE,IAAuB;IACpF,OAAO,gBAAgB,QAAQ,IAAI,WAAW,IAAI,IAAI,IAAI,IAAA,wBAAU,GAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,oFAAoF;AAC7E,KAAK,UAAU,qBAAqB,CAAC,EAAM,EAAE,SAAiB;IACnE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAkB;;;iBAGxB,SAAS;;GAEvB,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACI,KAAK,UAAU,yBAAyB,CAC7C,EAAM,EACN,OAAgB,EAChB,QAAgB,EAChB,OAAwB,EACxB,OAAqC,EAAE;IAEvC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,wBAAe,CAAC,uCAAuC,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,4BAAY,EAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,IAAA,oCAAsB,EAAC,OAAO,CAAC,QAAQ,EAAE;QACxD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,IAAA,qCAAe,EAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC;QAC/D,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC9B,MAAM,IAAI,wBAAe,CACvB,eAAe,OAAO,CAAC,QAAQ,yCAAyC,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAC;IAElD,sEAAsE;IACtE,2EAA2E;IAC3E,qEAAqE;IACrE,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACpD,MAAM,EAAE,CAAA;;gCAEoB,QAAQ,CAAC,SAAS;mBAC/B,OAAO,CAAC,EAAE;KACxB,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,CAAA;;qEAEyD,OAAO,CAAC,EAAE;KAC1E,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.recordWebhookEvent = recordWebhookEvent;
|
|
4
|
+
exports.markWebhookProcessed = markWebhookProcessed;
|
|
5
|
+
exports.applyWebhookEvent = applyWebhookEvent;
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const ar_repository_js_1 = require("./ar-repository.js");
|
|
8
|
+
/**
|
|
9
|
+
* Grava o evento e diz se ele é novo.
|
|
10
|
+
*
|
|
11
|
+
* O INSERT é a trava: quem consegue inserir processa, quem colide já foi
|
|
12
|
+
* processado por outro. Fazer `SELECT` antes e `INSERT` depois deixaria uma
|
|
13
|
+
* janela entre os dois — e webhook duplicado chega em rajada, exatamente dentro
|
|
14
|
+
* dessa janela.
|
|
15
|
+
*/
|
|
16
|
+
async function recordWebhookEvent(tx, input) {
|
|
17
|
+
const id = (0, node_crypto_1.randomUUID)();
|
|
18
|
+
const rows = await tx `
|
|
19
|
+
INSERT INTO webhook_event (
|
|
20
|
+
id, tenant_id, provider_account_id, provider, external_event_id, event_type, payload
|
|
21
|
+
) VALUES (
|
|
22
|
+
${id}, ${input.tenantId}, ${input.providerAccountId}, ${input.provider},
|
|
23
|
+
${input.eventId}, ${input.eventType}, ${tx.json(input.payload)}
|
|
24
|
+
)
|
|
25
|
+
ON CONFLICT DO NOTHING
|
|
26
|
+
RETURNING id
|
|
27
|
+
`;
|
|
28
|
+
return { id: rows[0]?.id ?? id, isNew: Boolean(rows[0]) };
|
|
29
|
+
}
|
|
30
|
+
async function markWebhookProcessed(tx, id, status) {
|
|
31
|
+
await tx `
|
|
32
|
+
UPDATE webhook_event SET status = ${status}, processed_at = now() WHERE id = ${id}
|
|
33
|
+
`;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Aplica o evento normalizado ao recebível.
|
|
37
|
+
*
|
|
38
|
+
* Chamada DEPOIS de `recordWebhookEvent` ter dito que o evento é novo. Ainda
|
|
39
|
+
* assim confere o estado do recebível antes de baixar: dois eventos distintos
|
|
40
|
+
* (`CONFIRMED` e `RECEIVED`) descrevem o mesmo pagamento, passam os dois pelo
|
|
41
|
+
* dedup por serem eventos diferentes, e baixariam duas vezes o mesmo dinheiro.
|
|
42
|
+
*/
|
|
43
|
+
async function applyWebhookEvent(tx, event) {
|
|
44
|
+
if (!event.externalId)
|
|
45
|
+
return { outcome: 'ignored', receivableId: null, chargeId: null };
|
|
46
|
+
const rows = await tx `
|
|
47
|
+
SELECT id, receivable_id, method, amount, status
|
|
48
|
+
FROM charge WHERE external_id = ${event.externalId} AND deleted_at IS NULL
|
|
49
|
+
LIMIT 1
|
|
50
|
+
`;
|
|
51
|
+
const charge = rows[0];
|
|
52
|
+
if (!charge)
|
|
53
|
+
return { outcome: 'charge_not_found', receivableId: null, chargeId: null };
|
|
54
|
+
const ref = { receivableId: charge.receivable_id, chargeId: charge.id };
|
|
55
|
+
switch (event.type) {
|
|
56
|
+
case 'charge.paid':
|
|
57
|
+
return { ...ref, outcome: await applyPayment(tx, charge, event) };
|
|
58
|
+
case 'charge.overdue':
|
|
59
|
+
await setChargeStatus(tx, charge.id, 'overdue');
|
|
60
|
+
return { ...ref, outcome: 'overdue' };
|
|
61
|
+
case 'charge.canceled':
|
|
62
|
+
await setChargeStatus(tx, charge.id, 'canceled');
|
|
63
|
+
return { ...ref, outcome: 'canceled' };
|
|
64
|
+
// Estorno e chargeback marcam a COBRANÇA, e não desfazem a baixa.
|
|
65
|
+
//
|
|
66
|
+
// Reverter o recebível automaticamente ressuscitaria a dívida e religaria a
|
|
67
|
+
// régua contra alguém que pode estar em disputa legítima — uma cobrança
|
|
68
|
+
// automática nesse momento é o pior desfecho possível. O escritório vê o
|
|
69
|
+
// estado e decide.
|
|
70
|
+
case 'charge.refunded':
|
|
71
|
+
case 'charge.chargeback':
|
|
72
|
+
await setChargeStatus(tx, charge.id, 'refunded');
|
|
73
|
+
return { ...ref, outcome: 'refunded' };
|
|
74
|
+
/**
|
|
75
|
+
* Baixa anulada na origem — e aqui a diferença para o estorno é financeira,
|
|
76
|
+
* não de nomenclatura.
|
|
77
|
+
*
|
|
78
|
+
* No estorno o dinheiro **entrou e saiu**: a dívida foi quitada e reabri-la
|
|
79
|
+
* cobraria de novo algo que foi pago. Na anulação o dinheiro **nunca
|
|
80
|
+
* entrou**: manter o recebível quitado seria o sistema afirmando um
|
|
81
|
+
* recebimento que a própria origem já negou. Por isso este é o único dos
|
|
82
|
+
* três que reverte estado.
|
|
83
|
+
*/
|
|
84
|
+
case 'charge.settlement_undone': {
|
|
85
|
+
const reversal = await (0, ar_repository_js_1.reverseSettlementForCharge)(tx, charge.id, 'settlement_undone');
|
|
86
|
+
return {
|
|
87
|
+
receivableId: reversal.receivableId ?? charge.receivable_id,
|
|
88
|
+
chargeId: charge.id,
|
|
89
|
+
outcome: reversal.reversedPayments > 0 ? 'reversed' : 'already_reversed',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
default:
|
|
93
|
+
return { ...ref, outcome: 'ignored' };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function applyPayment(tx, charge, event) {
|
|
97
|
+
if (!charge.receivable_id) {
|
|
98
|
+
// Cobrança avulsa, anterior ao Payment Rail: marca a cobrança e para. Não
|
|
99
|
+
// há recebível a baixar, e inventar um seria criar dívida que não existia.
|
|
100
|
+
await setChargeStatus(tx, charge.id, 'paid');
|
|
101
|
+
return 'paid';
|
|
102
|
+
}
|
|
103
|
+
const receivable = await (0, ar_repository_js_1.getReceivable)(tx, charge.receivable_id);
|
|
104
|
+
if (receivable.status === 'paid' || receivable.outstandingAmount <= 0)
|
|
105
|
+
return 'already_paid';
|
|
106
|
+
// O gateway manda o valor creditado. Ele pode ser MENOR que a cobrança
|
|
107
|
+
// (desconto, pagamento parcial de boleto) — e nesse caso a baixa é parcial, o
|
|
108
|
+
// recebível continua aberto pelo saldo, e a régua segue. Tratar todo evento
|
|
109
|
+
// de pagamento como quitação total perdoaria a diferença em silêncio.
|
|
110
|
+
const announced = event.paidAmount ?? Number(charge.amount);
|
|
111
|
+
const amount = Math.min(announced, receivable.outstandingAmount);
|
|
112
|
+
if (amount <= 0)
|
|
113
|
+
return 'already_paid';
|
|
114
|
+
await (0, ar_repository_js_1.registerPayment)(tx, {
|
|
115
|
+
receivableId: charge.receivable_id,
|
|
116
|
+
chargeId: charge.id,
|
|
117
|
+
amount,
|
|
118
|
+
method: charge.method,
|
|
119
|
+
paidAt: event.paidAt ?? new Date().toISOString(),
|
|
120
|
+
});
|
|
121
|
+
// `reversed_at` é zerado junto: uma cobrança revertida continua pagável no
|
|
122
|
+
// gateway, e quando o cliente de fato paga, ela volta a ser simplesmente paga.
|
|
123
|
+
// Deixar a marca de reversão numa cobrança `paid` reproduziria, ao contrário,
|
|
124
|
+
// o mesmo defeito que esta onda corrige — estado que afirma duas coisas
|
|
125
|
+
// incompatíveis ao mesmo tempo.
|
|
126
|
+
await tx `
|
|
127
|
+
UPDATE charge
|
|
128
|
+
SET status = 'paid', paid_at = ${event.paidAt ?? new Date().toISOString()},
|
|
129
|
+
reversed_at = NULL, updated_at = now()
|
|
130
|
+
WHERE id = ${charge.id}
|
|
131
|
+
`;
|
|
132
|
+
await tx `
|
|
133
|
+
UPDATE payment
|
|
134
|
+
SET provider = (SELECT provider FROM charge WHERE id = ${charge.id}),
|
|
135
|
+
provider_payment_id = ${event.externalId}
|
|
136
|
+
WHERE charge_id = ${charge.id} AND provider_payment_id IS NULL
|
|
137
|
+
`;
|
|
138
|
+
return 'paid';
|
|
139
|
+
}
|
|
140
|
+
async function setChargeStatus(tx, id, status) {
|
|
141
|
+
await tx `UPDATE charge SET status = ${status}, updated_at = now() WHERE id = ${id}`;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=reconcile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../../src/billing/reconcile.ts"],"names":[],"mappings":"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"}
|