@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,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.COMPETENCE_LABEL_RE = void 0;
|
|
4
|
+
exports.assertCompetenceLabel = assertCompetenceLabel;
|
|
5
|
+
exports.openCompetence = openCompetence;
|
|
6
|
+
exports.getCompetence = getCompetence;
|
|
7
|
+
exports.listCompetences = listCompetences;
|
|
8
|
+
exports.closeCompetence = closeCompetence;
|
|
9
|
+
exports.reopenCompetence = reopenCompetence;
|
|
10
|
+
exports.listRecurringItemTypes = listRecurringItemTypes;
|
|
11
|
+
exports.createRecurringItemType = createRecurringItemType;
|
|
12
|
+
exports.generateInstancesForCompetence = generateInstancesForCompetence;
|
|
13
|
+
exports.computeDueDate = computeDueDate;
|
|
14
|
+
exports.listInstances = listInstances;
|
|
15
|
+
exports.completeInstance = completeInstance;
|
|
16
|
+
const shared_1 = require("@baruk/shared");
|
|
17
|
+
/**
|
|
18
|
+
* Competência e itens recorrentes (ADR 0008).
|
|
19
|
+
*
|
|
20
|
+
* Tenant-scoped por RLS: nenhum método filtra `tenant_id`, exatamente como os
|
|
21
|
+
* demais repositórios do core. O `tenant_id` chega por `current_setting`.
|
|
22
|
+
*/
|
|
23
|
+
exports.COMPETENCE_LABEL_RE = /^\d{4}-(0[1-9]|1[0-2])$/;
|
|
24
|
+
function mapCompetence(row) {
|
|
25
|
+
return {
|
|
26
|
+
id: row.id,
|
|
27
|
+
tenantId: row.tenant_id,
|
|
28
|
+
clientId: row.client_id,
|
|
29
|
+
label: row.label,
|
|
30
|
+
status: row.status,
|
|
31
|
+
openedAt: row.opened_at.toISOString(),
|
|
32
|
+
closedAt: row.closed_at ? row.closed_at.toISOString() : null,
|
|
33
|
+
version: row.version,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Valida o rótulo antes de chegar ao banco. O CHECK da migration é a garantia
|
|
38
|
+
* final, mas devolver 422 é melhor que devolver 500 com erro de constraint.
|
|
39
|
+
*
|
|
40
|
+
* Repare que o regex daqui é mais estrito que o do schema: rejeita `2026-13`.
|
|
41
|
+
* Nunca relaxe um sem relaxar o outro — a divergência é deliberada e sempre no
|
|
42
|
+
* sentido seguro (aplicação mais rígida que banco).
|
|
43
|
+
*/
|
|
44
|
+
function assertCompetenceLabel(label) {
|
|
45
|
+
if (!exports.COMPETENCE_LABEL_RE.test(label)) {
|
|
46
|
+
throw new shared_1.ValidationError('competência deve estar no formato YYYY-MM, com mês entre 01 e 12');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Abre a competência, ou devolve a existente. Idempotente por desenho: chamar
|
|
51
|
+
* duas vezes para o mesmo (cliente, mês) devolve a mesma linha, e é o índice
|
|
52
|
+
* único que garante isso sob concorrência — não o `SELECT` prévio.
|
|
53
|
+
*/
|
|
54
|
+
async function openCompetence(tx, input) {
|
|
55
|
+
assertCompetenceLabel(input.label);
|
|
56
|
+
const inserted = await tx `
|
|
57
|
+
INSERT INTO competence (id, tenant_id, client_id, label)
|
|
58
|
+
VALUES (
|
|
59
|
+
${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid,
|
|
60
|
+
${input.clientId}, ${input.label}
|
|
61
|
+
)
|
|
62
|
+
ON CONFLICT DO NOTHING
|
|
63
|
+
RETURNING id, tenant_id, client_id, label, status, opened_at, closed_at, version
|
|
64
|
+
`;
|
|
65
|
+
if (inserted[0])
|
|
66
|
+
return { competence: mapCompetence(inserted[0]), created: true };
|
|
67
|
+
const existing = await tx `
|
|
68
|
+
SELECT id, tenant_id, client_id, label, status, opened_at, closed_at, version
|
|
69
|
+
FROM competence
|
|
70
|
+
WHERE client_id = ${input.clientId} AND label = ${input.label} AND deleted_at IS NULL
|
|
71
|
+
`;
|
|
72
|
+
if (!existing[0])
|
|
73
|
+
throw new shared_1.ConflictError('não foi possível abrir a competência');
|
|
74
|
+
return { competence: mapCompetence(existing[0]), created: false };
|
|
75
|
+
}
|
|
76
|
+
async function getCompetence(tx, id) {
|
|
77
|
+
const rows = await tx `
|
|
78
|
+
SELECT id, tenant_id, client_id, label, status, opened_at, closed_at, version
|
|
79
|
+
FROM competence WHERE id = ${id} AND deleted_at IS NULL
|
|
80
|
+
`;
|
|
81
|
+
if (!rows[0])
|
|
82
|
+
throw new shared_1.NotFoundError('Competência não encontrada');
|
|
83
|
+
return mapCompetence(rows[0]);
|
|
84
|
+
}
|
|
85
|
+
async function listCompetences(tx, filter = {}) {
|
|
86
|
+
const limit = Math.min(filter.limit ?? 50, 100);
|
|
87
|
+
const offset = filter.offset ?? 0;
|
|
88
|
+
const rows = await tx `
|
|
89
|
+
SELECT id, tenant_id, client_id, label, status, opened_at, closed_at, version,
|
|
90
|
+
count(*) OVER() AS total
|
|
91
|
+
FROM competence
|
|
92
|
+
WHERE deleted_at IS NULL
|
|
93
|
+
AND (${filter.clientId ?? null}::uuid IS NULL OR client_id = ${filter.clientId ?? null})
|
|
94
|
+
AND (${filter.status ?? null}::text IS NULL OR status = ${filter.status ?? null})
|
|
95
|
+
ORDER BY label DESC, created_at DESC
|
|
96
|
+
LIMIT ${limit} OFFSET ${offset}
|
|
97
|
+
`;
|
|
98
|
+
return {
|
|
99
|
+
total: rows[0] ? Number(rows[0].total) : 0,
|
|
100
|
+
items: rows.map(mapCompetence),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const CLOSEABLE = [
|
|
104
|
+
'open',
|
|
105
|
+
'in_progress',
|
|
106
|
+
'awaiting_client',
|
|
107
|
+
'review',
|
|
108
|
+
'reopened',
|
|
109
|
+
];
|
|
110
|
+
/**
|
|
111
|
+
* Fechar é evento, não flag: exige que não reste pendência obrigatória aberta.
|
|
112
|
+
* A checagem é feita aqui, e não por trigger, porque a regra é de negócio e
|
|
113
|
+
* precisa produzir uma mensagem que o usuário entenda.
|
|
114
|
+
*/
|
|
115
|
+
async function closeCompetence(tx, input) {
|
|
116
|
+
const current = await getCompetence(tx, input.id);
|
|
117
|
+
if (current.status === 'closed')
|
|
118
|
+
throw new shared_1.ConflictError('Competência já está fechada');
|
|
119
|
+
if (!CLOSEABLE.includes(current.status)) {
|
|
120
|
+
throw new shared_1.ConflictError(`Competência em ${current.status} não pode ser fechada`);
|
|
121
|
+
}
|
|
122
|
+
if (!input.force) {
|
|
123
|
+
const pending = await tx `
|
|
124
|
+
SELECT count(*)::int AS n FROM recurring_instance
|
|
125
|
+
WHERE competence_id = ${input.id} AND deleted_at IS NULL
|
|
126
|
+
AND status NOT IN ('done', 'not_applicable', 'canceled')
|
|
127
|
+
`;
|
|
128
|
+
if ((pending[0]?.n ?? 0) > 0) {
|
|
129
|
+
throw new shared_1.ConflictError(`Competência tem ${pending[0].n} item(ns) em aberto. Conclua ou marque como não aplicável antes de fechar.`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const rows = await tx `
|
|
133
|
+
UPDATE competence
|
|
134
|
+
SET status = 'closed', closed_at = now(), closed_by = ${input.closedBy},
|
|
135
|
+
version = version + 1, updated_at = now()
|
|
136
|
+
WHERE id = ${input.id} AND deleted_at IS NULL
|
|
137
|
+
RETURNING id, tenant_id, client_id, label, status, opened_at, closed_at, version
|
|
138
|
+
`;
|
|
139
|
+
if (!rows[0])
|
|
140
|
+
throw new shared_1.NotFoundError('Competência não encontrada');
|
|
141
|
+
return mapCompetence(rows[0]);
|
|
142
|
+
}
|
|
143
|
+
async function reopenCompetence(tx, input) {
|
|
144
|
+
const rows = await tx `
|
|
145
|
+
UPDATE competence
|
|
146
|
+
SET status = 'reopened', closed_at = NULL, closed_by = NULL,
|
|
147
|
+
reopened_at = now(), reopened_by = ${input.reopenedBy},
|
|
148
|
+
version = version + 1, updated_at = now()
|
|
149
|
+
WHERE id = ${input.id} AND status = 'closed' AND deleted_at IS NULL
|
|
150
|
+
RETURNING id, tenant_id, client_id, label, status, opened_at, closed_at, version
|
|
151
|
+
`;
|
|
152
|
+
if (!rows[0])
|
|
153
|
+
throw new shared_1.NotFoundError('Competência fechada não encontrada');
|
|
154
|
+
return mapCompetence(rows[0]);
|
|
155
|
+
}
|
|
156
|
+
function mapItemType(row) {
|
|
157
|
+
return {
|
|
158
|
+
id: row.id,
|
|
159
|
+
tenantId: row.tenant_id,
|
|
160
|
+
key: row.key,
|
|
161
|
+
label: row.label,
|
|
162
|
+
nature: row.nature,
|
|
163
|
+
sphere: row.sphere,
|
|
164
|
+
periodicity: row.periodicity,
|
|
165
|
+
dueRule: row.due_rule ?? {},
|
|
166
|
+
appliesToRegime: Array.isArray(row.applies_to_regime) ? row.applies_to_regime : [],
|
|
167
|
+
requiresDocument: row.requires_document,
|
|
168
|
+
active: row.active,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Lista o catálogo efetivo: override do tenant vence o template do sistema
|
|
173
|
+
* quando as duas linhas têm a mesma `key`. O `DISTINCT ON` com `ORDER BY
|
|
174
|
+
* tenant_id NULLS LAST` é o que implementa essa precedência em uma passada.
|
|
175
|
+
*/
|
|
176
|
+
async function listRecurringItemTypes(tx, filter = {}) {
|
|
177
|
+
const rows = await tx `
|
|
178
|
+
SELECT DISTINCT ON (key)
|
|
179
|
+
id, tenant_id, key, label, nature, sphere, periodicity,
|
|
180
|
+
due_rule, applies_to_regime, requires_document, active
|
|
181
|
+
FROM recurring_item_type
|
|
182
|
+
WHERE deleted_at IS NULL
|
|
183
|
+
AND (${filter.nature ?? null}::text IS NULL OR nature = ${filter.nature ?? null})
|
|
184
|
+
AND (${filter.activeOnly ?? true} = false OR active = true)
|
|
185
|
+
ORDER BY key, tenant_id NULLS LAST
|
|
186
|
+
`;
|
|
187
|
+
return rows.map(mapItemType);
|
|
188
|
+
}
|
|
189
|
+
async function createRecurringItemType(tx, input) {
|
|
190
|
+
const rows = await tx `
|
|
191
|
+
INSERT INTO recurring_item_type
|
|
192
|
+
(id, tenant_id, key, label, nature, sphere, periodicity, due_rule,
|
|
193
|
+
applies_to_regime, requires_document)
|
|
194
|
+
VALUES (
|
|
195
|
+
${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid,
|
|
196
|
+
${input.key}, ${input.label}, ${input.nature}, ${input.sphere ?? null},
|
|
197
|
+
${input.periodicity ?? 'monthly'}, ${tx.json((input.dueRule ?? {}))},
|
|
198
|
+
${tx.json((input.appliesToRegime ?? []))}, ${input.requiresDocument ?? false}
|
|
199
|
+
)
|
|
200
|
+
RETURNING id, tenant_id, key, label, nature, sphere, periodicity,
|
|
201
|
+
due_rule, applies_to_regime, requires_document, active
|
|
202
|
+
`;
|
|
203
|
+
return mapItemType(rows[0]);
|
|
204
|
+
}
|
|
205
|
+
function mapInstance(row) {
|
|
206
|
+
return {
|
|
207
|
+
id: row.id,
|
|
208
|
+
clientId: row.client_id,
|
|
209
|
+
competenceId: row.competence_id,
|
|
210
|
+
itemTypeId: row.item_type_id,
|
|
211
|
+
label: row.label,
|
|
212
|
+
nature: row.nature,
|
|
213
|
+
dueDate: row.due_date,
|
|
214
|
+
status: row.status,
|
|
215
|
+
responsibleUserId: row.responsible_user_id,
|
|
216
|
+
completedAt: row.completed_at ? row.completed_at.toISOString() : null,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Gera as instâncias de uma competência a partir do catálogo.
|
|
221
|
+
*
|
|
222
|
+
* **Idempotente pelo schema, não pelo código.** O `ON CONFLICT DO NOTHING` bate
|
|
223
|
+
* no índice único `(tenant, client, competence, item_type)`; rodar N vezes
|
|
224
|
+
* produz exatamente uma instância por tipo. É o que hoje falta e permite lançar
|
|
225
|
+
* a mesma DAS de julho três vezes.
|
|
226
|
+
*
|
|
227
|
+
* Devolve quantas foram criadas de fato — o operador precisa distinguir "gerei
|
|
228
|
+
* 8" de "já estava tudo lá".
|
|
229
|
+
*/
|
|
230
|
+
async function generateInstancesForCompetence(tx, input) {
|
|
231
|
+
const competence = await getCompetence(tx, input.competenceId);
|
|
232
|
+
const types = await listRecurringItemTypes(tx, { activeOnly: true });
|
|
233
|
+
const applicable = types.filter((t) => t.appliesToRegime.length === 0 ||
|
|
234
|
+
(input.regime != null && t.appliesToRegime.includes(input.regime)));
|
|
235
|
+
const created = [];
|
|
236
|
+
for (const type of applicable) {
|
|
237
|
+
const dueDate = computeDueDate(competence.label, type.dueRule);
|
|
238
|
+
const rows = await tx `
|
|
239
|
+
INSERT INTO recurring_instance
|
|
240
|
+
(id, tenant_id, client_id, competence_id, item_type_id, label, nature, due_date)
|
|
241
|
+
VALUES (
|
|
242
|
+
${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid,
|
|
243
|
+
${competence.clientId}, ${competence.id}, ${type.id},
|
|
244
|
+
${type.label}, ${type.nature}, ${dueDate}
|
|
245
|
+
)
|
|
246
|
+
ON CONFLICT DO NOTHING
|
|
247
|
+
RETURNING id, client_id, competence_id, item_type_id, label, nature,
|
|
248
|
+
due_date, status, responsible_user_id, completed_at
|
|
249
|
+
`;
|
|
250
|
+
if (rows[0])
|
|
251
|
+
created.push(mapInstance(rows[0]));
|
|
252
|
+
}
|
|
253
|
+
return { created, skipped: applicable.length - created.length };
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Aplica a regra de vencimento sobre a competência.
|
|
257
|
+
*
|
|
258
|
+
* Hoje entende `{kind:'day_of_next_month', day:N}` e `{kind:'day_of_month', day:N}`.
|
|
259
|
+
* Regra desconhecida devolve `null` em vez de chutar uma data — um vencimento
|
|
260
|
+
* inventado é pior que vencimento ausente, porque o alerta dispararia no dia
|
|
261
|
+
* errado e o usuário confiaria nele.
|
|
262
|
+
*/
|
|
263
|
+
function computeDueDate(competenceLabel, rule) {
|
|
264
|
+
const kind = typeof rule['kind'] === 'string' ? rule['kind'] : null;
|
|
265
|
+
const day = typeof rule['day'] === 'number' ? rule['day'] : null;
|
|
266
|
+
if (!kind || day == null || day < 1 || day > 28)
|
|
267
|
+
return null;
|
|
268
|
+
const [yearStr, monthStr] = competenceLabel.split('-');
|
|
269
|
+
let year = Number(yearStr);
|
|
270
|
+
let month = Number(monthStr);
|
|
271
|
+
if (kind === 'day_of_next_month') {
|
|
272
|
+
month += 1;
|
|
273
|
+
if (month > 12) {
|
|
274
|
+
month = 1;
|
|
275
|
+
year += 1;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else if (kind !== 'day_of_month') {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
|
|
282
|
+
}
|
|
283
|
+
async function listInstances(tx, filter = {}) {
|
|
284
|
+
const rows = await tx `
|
|
285
|
+
SELECT id, client_id, competence_id, item_type_id, label, nature,
|
|
286
|
+
due_date, status, responsible_user_id, completed_at
|
|
287
|
+
FROM recurring_instance
|
|
288
|
+
WHERE deleted_at IS NULL
|
|
289
|
+
AND (${filter.competenceId ?? null}::uuid IS NULL OR competence_id = ${filter.competenceId ?? null})
|
|
290
|
+
AND (${filter.clientId ?? null}::uuid IS NULL OR client_id = ${filter.clientId ?? null})
|
|
291
|
+
AND (${filter.status ?? null}::text IS NULL OR status = ${filter.status ?? null})
|
|
292
|
+
ORDER BY due_date NULLS LAST, label
|
|
293
|
+
`;
|
|
294
|
+
return rows.map(mapInstance);
|
|
295
|
+
}
|
|
296
|
+
async function completeInstance(tx, input) {
|
|
297
|
+
const rows = await tx `
|
|
298
|
+
UPDATE recurring_instance
|
|
299
|
+
SET status = 'done', completed_at = now(), completed_by = ${input.completedBy},
|
|
300
|
+
version = version + 1, updated_at = now()
|
|
301
|
+
WHERE id = ${input.id} AND deleted_at IS NULL AND status <> 'done'
|
|
302
|
+
RETURNING id, client_id, competence_id, item_type_id, label, nature,
|
|
303
|
+
due_date, status, responsible_user_id, completed_at
|
|
304
|
+
`;
|
|
305
|
+
if (!rows[0])
|
|
306
|
+
throw new shared_1.NotFoundError('Item não encontrado ou já concluído');
|
|
307
|
+
return mapInstance(rows[0]);
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/competence/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Telefone brasileiro em formato canônico.
|
|
4
|
+
*
|
|
5
|
+
* Existe UMA vez, e não uma por canal, porque WhatsApp e SMS discordariam no
|
|
6
|
+
* primeiro caso de borda — e discordar aqui significa uma mensagem chegar e a
|
|
7
|
+
* outra não, para o mesmo cliente, sem que nada no sistema explique por quê.
|
|
8
|
+
*
|
|
9
|
+
* O que este módulo NÃO faz: dizer se o número existe, se está ativo, ou se tem
|
|
10
|
+
* WhatsApp. Nada disso é derivável do formato. Ele responde uma pergunta só —
|
|
11
|
+
* "isto tem a FORMA de um número brasileiro discável?" — e a resposta negativa
|
|
12
|
+
* é confiável, enquanto a positiva é apenas necessária, nunca suficiente.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.parseBrazilPhone = parseBrazilPhone;
|
|
16
|
+
exports.isMessagingCapable = isMessagingCapable;
|
|
17
|
+
exports.toE164OrNull = toE164OrNull;
|
|
18
|
+
exports.maskPhone = maskPhone;
|
|
19
|
+
/**
|
|
20
|
+
* DDDs válidos no Plano Nacional de Numeração.
|
|
21
|
+
*
|
|
22
|
+
* Lista explícita, e não `[1-9][1-9]`, porque a faixa admite combinações que não
|
|
23
|
+
* existem (20, 23, 25, 26, 29, 30, 36, 39, 40, 50, 52, 56, 57, 58, 59, 60, 70,
|
|
24
|
+
* 72, 76, 78, 80, 90). Aceitar um DDD inexistente produz um E.164 bem formado
|
|
25
|
+
* que o provider aceita, cobra e nunca entrega — a pior combinação possível,
|
|
26
|
+
* porque falha silenciosa custa dinheiro e parece sucesso.
|
|
27
|
+
*/
|
|
28
|
+
const VALID_AREA_CODES = new Set([
|
|
29
|
+
'11',
|
|
30
|
+
'12',
|
|
31
|
+
'13',
|
|
32
|
+
'14',
|
|
33
|
+
'15',
|
|
34
|
+
'16',
|
|
35
|
+
'17',
|
|
36
|
+
'18',
|
|
37
|
+
'19',
|
|
38
|
+
'21',
|
|
39
|
+
'22',
|
|
40
|
+
'24',
|
|
41
|
+
'27',
|
|
42
|
+
'28',
|
|
43
|
+
'31',
|
|
44
|
+
'32',
|
|
45
|
+
'33',
|
|
46
|
+
'34',
|
|
47
|
+
'35',
|
|
48
|
+
'37',
|
|
49
|
+
'38',
|
|
50
|
+
'41',
|
|
51
|
+
'42',
|
|
52
|
+
'43',
|
|
53
|
+
'44',
|
|
54
|
+
'45',
|
|
55
|
+
'46',
|
|
56
|
+
'47',
|
|
57
|
+
'48',
|
|
58
|
+
'49',
|
|
59
|
+
'51',
|
|
60
|
+
'53',
|
|
61
|
+
'54',
|
|
62
|
+
'55',
|
|
63
|
+
'61',
|
|
64
|
+
'62',
|
|
65
|
+
'63',
|
|
66
|
+
'64',
|
|
67
|
+
'65',
|
|
68
|
+
'66',
|
|
69
|
+
'67',
|
|
70
|
+
'68',
|
|
71
|
+
'69',
|
|
72
|
+
'71',
|
|
73
|
+
'73',
|
|
74
|
+
'74',
|
|
75
|
+
'75',
|
|
76
|
+
'77',
|
|
77
|
+
'79',
|
|
78
|
+
'81',
|
|
79
|
+
'82',
|
|
80
|
+
'83',
|
|
81
|
+
'84',
|
|
82
|
+
'85',
|
|
83
|
+
'86',
|
|
84
|
+
'87',
|
|
85
|
+
'88',
|
|
86
|
+
'89',
|
|
87
|
+
'91',
|
|
88
|
+
'92',
|
|
89
|
+
'93',
|
|
90
|
+
'94',
|
|
91
|
+
'95',
|
|
92
|
+
'96',
|
|
93
|
+
'97',
|
|
94
|
+
'98',
|
|
95
|
+
'99',
|
|
96
|
+
]);
|
|
97
|
+
/**
|
|
98
|
+
* Normaliza um telefone digitado por gente.
|
|
99
|
+
*
|
|
100
|
+
* Aceita o que o operador realmente digita: `(62) 99999-8888`, `62999998888`,
|
|
101
|
+
* `+55 62 99999 8888`, `55 62 9999-8888`, com espaço, ponto, barra ou traço.
|
|
102
|
+
*
|
|
103
|
+
* A ambiguidade real é o `55`: ele é DDI (Brasil) e também DDD (Rio Grande do
|
|
104
|
+
* Sul). `5551999998888` tem 13 dígitos e é `+55 51 99999-8888`; `5599998888`
|
|
105
|
+
* tem 10 e é `(55) 9999-8888`, um fixo gaúcho. O tamanho resolve — e é por isso
|
|
106
|
+
* que a decisão é tomada pelo COMPRIMENTO antes de olhar o prefixo, nunca ao
|
|
107
|
+
* contrário.
|
|
108
|
+
*/
|
|
109
|
+
function parseBrazilPhone(raw) {
|
|
110
|
+
if (!raw)
|
|
111
|
+
return { ok: false, reason: 'empty' };
|
|
112
|
+
// Um `+` em qualquer posição só importa no começo; o resto é ruído de
|
|
113
|
+
// digitação. Guardamos a intenção de DDI antes de descartar tudo que não é
|
|
114
|
+
// dígito, porque depois disso `+55…` e `55…` seriam indistinguíveis.
|
|
115
|
+
const trimmed = raw.trim();
|
|
116
|
+
const hadPlus = trimmed.startsWith('+');
|
|
117
|
+
const digits = trimmed.replace(/\D/g, '');
|
|
118
|
+
if (!digits)
|
|
119
|
+
return { ok: false, reason: 'empty' };
|
|
120
|
+
// Com `+` explícito, o DDI é o que veio. `+1` não é problema nosso: recusar é
|
|
121
|
+
// honesto, adivinhar seria inventar um número.
|
|
122
|
+
if (hadPlus && !digits.startsWith('55'))
|
|
123
|
+
return { ok: false, reason: 'foreign' };
|
|
124
|
+
let national;
|
|
125
|
+
if (digits.length === 12 || digits.length === 13) {
|
|
126
|
+
// DDI + DDD + 8 ou 9 dígitos.
|
|
127
|
+
if (!digits.startsWith('55'))
|
|
128
|
+
return { ok: false, reason: 'foreign' };
|
|
129
|
+
national = digits.slice(2);
|
|
130
|
+
}
|
|
131
|
+
else if (digits.length === 10 || digits.length === 11) {
|
|
132
|
+
// DDD + 8 ou 9 dígitos, sem DDI.
|
|
133
|
+
national = digits;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
return { ok: false, reason: 'length' };
|
|
137
|
+
}
|
|
138
|
+
const areaCode = national.slice(0, 2);
|
|
139
|
+
if (!VALID_AREA_CODES.has(areaCode))
|
|
140
|
+
return { ok: false, reason: 'ddd' };
|
|
141
|
+
const subscriber = national.slice(2);
|
|
142
|
+
if (subscriber.length === 9) {
|
|
143
|
+
// Celular: nono dígito é sempre 9, e o dígito seguinte nunca é 0 nem 1.
|
|
144
|
+
if (subscriber[0] !== '9')
|
|
145
|
+
return { ok: false, reason: 'not_dialable' };
|
|
146
|
+
if (subscriber[1] === '0' || subscriber[1] === '1') {
|
|
147
|
+
return { ok: false, reason: 'not_dialable' };
|
|
148
|
+
}
|
|
149
|
+
return { ok: true, e164: `+55${national}`, kind: 'mobile', areaCode, national };
|
|
150
|
+
}
|
|
151
|
+
// Oito dígitos: fixo. Celular de 8 dígitos não existe mais desde a
|
|
152
|
+
// implantação do nono dígito, e RECUSAR é melhor do que completar com um `9`
|
|
153
|
+
// — completar significa mandar mensagem para um número que o escritório nunca
|
|
154
|
+
// digitou, e que pode pertencer a outra pessoa.
|
|
155
|
+
const first = subscriber[0];
|
|
156
|
+
if (first === '0' || first === '1')
|
|
157
|
+
return { ok: false, reason: 'not_dialable' };
|
|
158
|
+
return { ok: true, e164: `+55${national}`, kind: 'landline', areaCode, national };
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* O número serve para WhatsApp/SMS?
|
|
162
|
+
*
|
|
163
|
+
* Só celular. Fixo é discável e válido — e é exatamente por isso que precisa de
|
|
164
|
+
* uma checagem própria: ele passa em `parseBrazilPhone`, o provider aceita a
|
|
165
|
+
* requisição, e a mensagem nunca chega. Um "erro" que não aparece em lugar
|
|
166
|
+
* nenhum, mês após mês.
|
|
167
|
+
*/
|
|
168
|
+
function isMessagingCapable(parsed) {
|
|
169
|
+
return parsed.ok && parsed.kind === 'mobile';
|
|
170
|
+
}
|
|
171
|
+
/** Conveniência para gravar em `client.phone_e164`. `null` quando não dá. */
|
|
172
|
+
function toE164OrNull(raw) {
|
|
173
|
+
const parsed = parseBrazilPhone(raw);
|
|
174
|
+
return parsed.ok ? parsed.e164 : null;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Versão para log e tela: `+55 (62) 9****-**88`.
|
|
178
|
+
*
|
|
179
|
+
* A trilha precisa provar PARA ONDE foi, e um telefone inteiro em log é PII que
|
|
180
|
+
* vaza em screenshot, exportação e print de suporte. Os quatro caracteres
|
|
181
|
+
* visíveis bastam para o operador reconhecer o número que ele mesmo cadastrou,
|
|
182
|
+
* e não bastam para discar.
|
|
183
|
+
*/
|
|
184
|
+
function maskPhone(e164) {
|
|
185
|
+
const digits = e164.replace(/\D/g, '');
|
|
186
|
+
if (digits.length < 6)
|
|
187
|
+
return '***';
|
|
188
|
+
const tail = digits.slice(-2);
|
|
189
|
+
const areaCode = digits.startsWith('55') ? digits.slice(2, 4) : digits.slice(0, 2);
|
|
190
|
+
return `+55 (${areaCode}) *****-**${tail}`;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=phone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phone.js","sourceRoot":"","sources":["../../../src/contacts/phone.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AAkHH,4CAiDC;AAUD,gDAEC;AAGD,oCAGC;AAUD,8BAMC;AA9KD;;;;;;;;GAQG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;CACL,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,SAAgB,gBAAgB,CAAC,GAA8B;IAC7D,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAEhD,sEAAsE;IACtE,2EAA2E;IAC3E,qEAAqE;IACrE,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE1C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAEnD,8EAA8E;IAC9E,+CAA+C;IAC/C,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAEjF,IAAI,QAAgB,CAAC;IACrB,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACjD,8BAA8B;QAC9B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACtE,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACxD,iCAAiC;QACjC,QAAQ,GAAG,MAAM,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAEzE,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAErC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,wEAAwE;QACxE,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QACxE,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAClF,CAAC;IAED,mEAAmE;IACnE,6EAA6E;IAC7E,8EAA8E;IAC9E,gDAAgD;IAChD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;IAC7B,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACjF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACpF,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,MAAkB;IACnD,OAAO,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC/C,CAAC;AAED,6EAA6E;AAC7E,SAAgB,YAAY,CAAC,GAA8B;IACzD,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAC,IAAY;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnF,OAAO,QAAQ,QAAQ,aAAa,IAAI,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.seedCatalogs = seedCatalogs;
|
|
4
|
+
/**
|
|
5
|
+
* Catálogos globais — RBAC, produtos do ecossistema e planos do SaaS.
|
|
6
|
+
*
|
|
7
|
+
* Isto NÃO é seed de dados de exemplo. São tabelas de configuração sem as quais
|
|
8
|
+
* o produto não opera: sem o catálogo de planos, `GET /v1/plans` responde uma
|
|
9
|
+
* lista vazia e ninguém consegue assinar. É schema lógico, não fixture.
|
|
10
|
+
*
|
|
11
|
+
* Por isso vive separado de `seed.ts`, que materializa o tenant fundador e um
|
|
12
|
+
* usuário administrador de desenvolvimento. Aquele seed usa
|
|
13
|
+
* `upsertUserWithPassword`, que faz `ON CONFLICT DO UPDATE SET password_hash` —
|
|
14
|
+
* rodá-lo contra um banco em uso redefine a senha de quem já existe. Este aqui
|
|
15
|
+
* não toca em `user`, `user_credential`, `tenant` nem `membership`.
|
|
16
|
+
*
|
|
17
|
+
* Idempotente e seguro para rodar a cada boot. Uso: `pnpm db:seed:catalog`.
|
|
18
|
+
*/
|
|
19
|
+
const index_js_1 = require("../index.js");
|
|
20
|
+
const client_js_1 = require("./client.js");
|
|
21
|
+
const load_env_js_1 = require("./load-env.js");
|
|
22
|
+
async function seedCatalogs(db) {
|
|
23
|
+
await (0, index_js_1.ensureRbacCatalog)(db);
|
|
24
|
+
await (0, index_js_1.ensureProductCatalog)(db);
|
|
25
|
+
await (0, index_js_1.seedSaasPlans)(db);
|
|
26
|
+
}
|
|
27
|
+
async function main() {
|
|
28
|
+
(0, load_env_js_1.loadEnv)();
|
|
29
|
+
const ownerUrl = process.env.DATABASE_URL;
|
|
30
|
+
if (!ownerUrl)
|
|
31
|
+
throw new Error('DATABASE_URL (papel owner) não definida.');
|
|
32
|
+
const db = (0, client_js_1.createDb)(ownerUrl, { role: 'owner', max: 1 });
|
|
33
|
+
try {
|
|
34
|
+
await seedCatalogs(db);
|
|
35
|
+
console.log('✓ Catálogos garantidos: RBAC, produtos do ecossistema e planos SaaS.');
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
await db.end({ timeout: 5 });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Só executa quando chamado direto — permite importar `seedCatalogs` de outro seed.
|
|
42
|
+
if (process.argv[1]?.endsWith('seed-catalog.ts') || process.argv[1]?.endsWith('seed-catalog.js')) {
|
|
43
|
+
main().catch((error) => {
|
|
44
|
+
console.error('✗ Falha ao garantir os catálogos:', error instanceof Error ? error.message : error);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=seed-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-catalog.js","sourceRoot":"","sources":["../../../src/db/seed-catalog.ts"],"names":[],"mappings":";;AAmBA,oCAIC;AAvBD;;;;;;;;;;;;;;GAcG;AACH,0CAAqF;AACrF,2CAAuC;AACvC,+CAAwC;AAEjC,KAAK,UAAU,YAAY,CAAC,EAA2C;IAC5E,MAAM,IAAA,4BAAiB,EAAC,EAAE,CAAC,CAAC;IAC5B,MAAM,IAAA,+BAAoB,EAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,IAAA,wBAAa,EAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAA,qBAAO,GAAE,CAAC;IACV,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC1C,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAE3E,MAAM,EAAE,GAAG,IAAA,oBAAQ,EAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACtF,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;IACjG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,OAAO,CAAC,KAAK,CACX,mCAAmC,EACnC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/cjs/db/seed.js
CHANGED
|
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
*
|
|
13
13
|
* Idempotente. Uso: `pnpm db:seed`.
|
|
14
14
|
*/
|
|
15
|
+
const seed_catalog_js_1 = require("./seed-catalog.js");
|
|
15
16
|
const index_js_1 = require("../index.js");
|
|
16
17
|
async function main() {
|
|
17
18
|
(0, index_js_1.loadEnv)();
|
|
@@ -24,9 +25,9 @@ async function main() {
|
|
|
24
25
|
const db = (0, index_js_1.createDb)(ownerUrl, { role: 'owner', max: 1 });
|
|
25
26
|
try {
|
|
26
27
|
// 1) Catálogos globais: RBAC + produtos do ecossistema.
|
|
27
|
-
|
|
28
|
-
await (0,
|
|
29
|
-
console.log('✓ Catálogos garantidos (RBAC
|
|
28
|
+
// Delegado a seed-catalog.ts — mesma fonte usada no boot da API.
|
|
29
|
+
await (0, seed_catalog_js_1.seedCatalogs)(db);
|
|
30
|
+
console.log('✓ Catálogos garantidos (RBAC, produtos e planos SaaS).');
|
|
30
31
|
// 2) Tenant fundador SC — dados legais não confirmados ficam NULOS.
|
|
31
32
|
const tenantId = await (0, index_js_1.ensureTenant)(db, {
|
|
32
33
|
code: 'sc',
|
|
@@ -41,21 +42,28 @@ async function main() {
|
|
|
41
42
|
await (0, index_js_1.ensureTenantProduct)(db, tenantId, 'contabil');
|
|
42
43
|
console.log('✓ Entitlement do produto Baruk Contábil concedido à SC.');
|
|
43
44
|
// 4) Usuário administrador de DESENVOLVIMENTO (não é dado real de sócio).
|
|
45
|
+
//
|
|
46
|
+
// A senha só é gravada se a conta ainda não tiver credencial. Rodar este
|
|
47
|
+
// seed contra um ambiente já inicializado NÃO troca a senha de quem
|
|
48
|
+
// administra — ver a nota em `upsertUserWithPassword`. Para redefinir de
|
|
49
|
+
// propósito, use `SEED_OVERWRITE_ADMIN_PASSWORD=1`, que obriga quem executa
|
|
50
|
+
// a declarar a intenção no comando.
|
|
44
51
|
const adminEmail = 'admin@sc.baruk.dev';
|
|
52
|
+
const overwritePassword = process.env.SEED_OVERWRITE_ADMIN_PASSWORD === '1';
|
|
45
53
|
const admin = await (0, index_js_1.upsertUserWithPassword)(db, {
|
|
46
54
|
email: adminEmail,
|
|
47
55
|
fullName: 'Administrador SC (dev)',
|
|
48
56
|
password: adminPassword,
|
|
49
57
|
userType: 'staff',
|
|
58
|
+
overwritePassword,
|
|
50
59
|
});
|
|
51
|
-
console.log(
|
|
60
|
+
console.log(admin.passwordWasSet
|
|
61
|
+
? `✓ Usuário admin (dev) garantido: ${admin.email} (senha ${overwritePassword ? 'REDEFINIDA' : 'definida'})`
|
|
62
|
+
: `✓ Usuário admin (dev) já existia: ${admin.email} (senha PRESERVADA — use SEED_OVERWRITE_ADMIN_PASSWORD=1 para redefinir)`);
|
|
52
63
|
// 5) Vínculo + papel Owner.
|
|
53
64
|
await (0, index_js_1.ensureMembership)(db, tenantId, admin.id);
|
|
54
65
|
await (0, index_js_1.assignSystemRole)(db, tenantId, admin.id, 'owner');
|
|
55
66
|
console.log('✓ Membership + papel Owner atribuídos ao admin no tenant SC.');
|
|
56
|
-
// 6) Catálogo de planos do SaaS (BILL-01) — idempotente.
|
|
57
|
-
await (0, index_js_1.seedSaasPlans)(db);
|
|
58
|
-
console.log('✓ Catálogo de planos SaaS garantido (starter/pro/enterprise/pro-anual).');
|
|
59
67
|
console.log('\n✓ Seed concluído. Login dev: admin@sc.baruk.dev / (SEED_ADMIN_PASSWORD)');
|
|
60
68
|
}
|
|
61
69
|
finally {
|
package/dist/cjs/db/seed.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/db/seed.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;GAWG;AACH,
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/db/seed.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;GAWG;AACH,uDAAiD;AACjD,0CASqB;AAErB,KAAK,UAAU,IAAI;IACjB,IAAA,kBAAO,GAAE,CAAC;IACV,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC1C,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC3E,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACtD,IAAI,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAEzE,MAAM,EAAE,GAAG,IAAA,mBAAQ,EAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,wDAAwD;QACxD,iEAAiE;QACjE,MAAM,IAAA,8BAAY,EAAC,EAAE,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QAEtE,oEAAoE;QACpE,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAY,EAAC,EAAE,EAAE;YACtC,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,yBAAyB;YACtC,SAAS,EAAE,IAAI,EAAE,uDAAuD;YACxE,MAAM,EAAE,QAAQ;YAChB,cAAc,EAAE,UAAU;SAC3B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QAElD,oEAAoE;QACpE,MAAM,IAAA,6BAAkB,EAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,IAAA,8BAAmB,EAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QAEvE,0EAA0E;QAC1E,EAAE;QACF,yEAAyE;QACzE,oEAAoE;QACpE,yEAAyE;QACzE,4EAA4E;QAC5E,oCAAoC;QACpC,MAAM,UAAU,GAAG,oBAAoB,CAAC;QACxC,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,GAAG,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,IAAA,iCAAsB,EAAC,EAAE,EAAE;YAC7C,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,wBAAwB;YAClC,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,OAAO;YACjB,iBAAiB;SAClB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,cAAc;YAClB,CAAC,CAAC,oCAAoC,KAAK,CAAC,KAAK,WAAW,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,GAAG;YAC5G,CAAC,CAAC,qCAAqC,KAAK,CAAC,KAAK,0EAA0E,CAC/H,CAAC;QAEF,4BAA4B;QAC5B,MAAM,IAAA,2BAAgB,EAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAA,2BAAgB,EAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAE5E,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IAC3F,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|