@baruk/core 0.1.0 → 0.3.0
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/CHANGELOG.md +59 -0
- package/dist/auth/password-reset.d.ts.map +1 -1
- package/dist/auth/password-reset.js +2 -4
- package/dist/auth/password-reset.js.map +1 -1
- package/dist/auth/password.d.ts +2 -18
- package/dist/auth/password.d.ts.map +1 -1
- package/dist/auth/password.js +12 -51
- package/dist/auth/password.js.map +1 -1
- package/dist/auth/service.d.ts +0 -12
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +3 -36
- package/dist/auth/service.js.map +1 -1
- package/dist/auth/session-token.d.ts +5 -2
- package/dist/auth/session-token.d.ts.map +1 -1
- package/dist/auth/session-token.js +7 -12
- package/dist/auth/session-token.js.map +1 -1
- package/dist/billing/dunning.d.ts +33 -0
- package/dist/billing/dunning.d.ts.map +1 -0
- package/dist/billing/dunning.js +49 -0
- package/dist/billing/dunning.js.map +1 -0
- package/dist/billing/provider/asaas.d.ts +15 -0
- package/dist/billing/provider/asaas.d.ts.map +1 -0
- package/dist/billing/provider/asaas.js +121 -0
- package/dist/billing/provider/asaas.js.map +1 -0
- package/dist/billing/provider/manual.d.ts +14 -0
- package/dist/billing/provider/manual.d.ts.map +1 -0
- package/dist/billing/provider/manual.js +24 -0
- package/dist/billing/provider/manual.js.map +1 -0
- package/dist/billing/provider/registry.d.ts +12 -0
- package/dist/billing/provider/registry.d.ts.map +1 -0
- package/dist/billing/provider/registry.js +22 -0
- package/dist/billing/provider/registry.js.map +1 -0
- package/dist/billing/provider/types.d.ts +76 -0
- package/dist/billing/provider/types.d.ts.map +1 -0
- package/dist/billing/provider/types.js +9 -0
- package/dist/billing/provider/types.js.map +1 -0
- package/dist/billing/receivable.d.ts +108 -0
- package/dist/billing/receivable.d.ts.map +1 -0
- package/dist/billing/receivable.js +2 -0
- package/dist/billing/receivable.js.map +1 -0
- package/dist/billing/repository.d.ts +97 -0
- package/dist/billing/repository.d.ts.map +1 -0
- package/dist/billing/repository.js +167 -0
- package/dist/billing/repository.js.map +1 -0
- package/dist/cjs/audit/audit.js +31 -0
- package/dist/cjs/audit/audit.js.map +1 -0
- package/dist/cjs/audit/repository.js +32 -0
- package/dist/cjs/audit/repository.js.map +1 -0
- package/dist/cjs/auth/password-reset.js +58 -0
- package/dist/cjs/auth/password-reset.js.map +1 -0
- package/dist/cjs/auth/password.js +32 -0
- package/dist/cjs/auth/password.js.map +1 -0
- package/dist/cjs/auth/service.js +191 -0
- package/dist/cjs/auth/service.js.map +1 -0
- package/dist/cjs/auth/session-token.js +18 -0
- package/dist/cjs/auth/session-token.js.map +1 -0
- package/dist/cjs/billing/dunning.js +54 -0
- package/dist/cjs/billing/dunning.js.map +1 -0
- package/dist/cjs/billing/provider/asaas.js +125 -0
- package/dist/cjs/billing/provider/asaas.js.map +1 -0
- package/dist/cjs/billing/provider/manual.js +28 -0
- package/dist/cjs/billing/provider/manual.js.map +1 -0
- package/dist/cjs/billing/provider/registry.js +27 -0
- package/dist/cjs/billing/provider/registry.js.map +1 -0
- package/dist/cjs/billing/provider/types.js +10 -0
- package/dist/cjs/billing/provider/types.js.map +1 -0
- package/dist/cjs/billing/receivable.js +3 -0
- package/dist/cjs/billing/receivable.js.map +1 -0
- package/dist/cjs/billing/repository.js +180 -0
- package/dist/cjs/billing/repository.js.map +1 -0
- package/dist/cjs/clients/repository.js +123 -0
- package/dist/cjs/clients/repository.js.map +1 -0
- package/dist/cjs/commercial-catalog/catalog.js +108 -0
- package/dist/cjs/commercial-catalog/catalog.js.map +1 -0
- package/dist/cjs/commercial-catalog/consumption-contracts.js +10 -0
- package/dist/cjs/commercial-catalog/consumption-contracts.js.map +1 -0
- package/dist/cjs/commercial-catalog/coupon.js +63 -0
- package/dist/cjs/commercial-catalog/coupon.js.map +1 -0
- package/dist/cjs/commercial-catalog/index.js +16 -0
- package/dist/cjs/commercial-catalog/index.js.map +1 -0
- package/dist/cjs/commercial-catalog/offer-application.js +53 -0
- package/dist/cjs/commercial-catalog/offer-application.js.map +1 -0
- package/dist/cjs/commercial-catalog/types.js +26 -0
- package/dist/cjs/commercial-catalog/types.js.map +1 -0
- package/dist/cjs/crm/repository.js +195 -0
- package/dist/cjs/crm/repository.js.map +1 -0
- package/dist/cjs/dashboard/repository.js +39 -0
- package/dist/cjs/dashboard/repository.js.map +1 -0
- package/dist/cjs/db/client.js +27 -0
- package/dist/cjs/db/client.js.map +1 -0
- package/dist/cjs/db/context.js +43 -0
- package/dist/cjs/db/context.js.map +1 -0
- package/dist/cjs/db/load-env.js +47 -0
- package/dist/cjs/db/load-env.js.map +1 -0
- package/dist/cjs/db/seed.js +69 -0
- package/dist/cjs/db/seed.js.map +1 -0
- package/dist/cjs/entitlements/decision.js +203 -0
- package/dist/cjs/entitlements/decision.js.map +1 -0
- package/dist/cjs/entitlements/derive.js +46 -0
- package/dist/cjs/entitlements/derive.js.map +1 -0
- package/dist/cjs/entitlements/index.js +23 -0
- package/dist/cjs/entitlements/index.js.map +1 -0
- package/dist/cjs/entitlements/sources.js +60 -0
- package/dist/cjs/entitlements/sources.js.map +1 -0
- package/dist/cjs/entitlements/standing.js +42 -0
- package/dist/cjs/entitlements/standing.js.map +1 -0
- package/dist/cjs/entitlements/types.js +16 -0
- package/dist/cjs/entitlements/types.js.map +1 -0
- package/dist/cjs/import/clients-import.js +147 -0
- package/dist/cjs/import/clients-import.js.map +1 -0
- package/dist/cjs/index.js +335 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/mail/dedup-store.js +56 -0
- package/dist/cjs/mail/dedup-store.js.map +1 -0
- package/dist/cjs/mail/index.js +24 -0
- package/dist/cjs/mail/index.js.map +1 -0
- package/dist/cjs/mail/provider.js +251 -0
- package/dist/cjs/mail/provider.js.map +1 -0
- package/dist/cjs/mail/resend-client.js +103 -0
- package/dist/cjs/mail/resend-client.js.map +1 -0
- package/dist/cjs/mail/resend.js +21 -0
- package/dist/cjs/mail/resend.js.map +1 -0
- package/dist/cjs/mail/sanitize.js +56 -0
- package/dist/cjs/mail/sanitize.js.map +1 -0
- package/dist/cjs/mail/sender-resolver.js +15 -0
- package/dist/cjs/mail/sender-resolver.js.map +1 -0
- package/dist/cjs/mail/template-renderer.js +21 -0
- package/dist/cjs/mail/template-renderer.js.map +1 -0
- package/dist/cjs/mail/types.js +38 -0
- package/dist/cjs/mail/types.js.map +1 -0
- package/dist/cjs/notifications/repository.js +49 -0
- package/dist/cjs/notifications/repository.js.map +1 -0
- package/dist/cjs/onboarding/domain.js +370 -0
- package/dist/cjs/onboarding/domain.js.map +1 -0
- package/dist/cjs/onboarding/interaction-review.js +425 -0
- package/dist/cjs/onboarding/interaction-review.js.map +1 -0
- package/dist/cjs/onboarding/persistence.js +444 -0
- package/dist/cjs/onboarding/persistence.js.map +1 -0
- package/dist/cjs/onboarding/portal-actions.js +157 -0
- package/dist/cjs/onboarding/portal-actions.js.map +1 -0
- package/dist/cjs/onboarding/portal.js +177 -0
- package/dist/cjs/onboarding/portal.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/portal/repository.js +37 -0
- package/dist/cjs/portal/repository.js.map +1 -0
- package/dist/cjs/pricing-engine/bundle.js +49 -0
- package/dist/cjs/pricing-engine/bundle.js.map +1 -0
- package/dist/cjs/pricing-engine/errors.js +48 -0
- package/dist/cjs/pricing-engine/errors.js.map +1 -0
- package/dist/cjs/pricing-engine/index.js +30 -0
- package/dist/cjs/pricing-engine/index.js.map +1 -0
- package/dist/cjs/pricing-engine/money.js +69 -0
- package/dist/cjs/pricing-engine/money.js.map +1 -0
- package/dist/cjs/pricing-engine/pipeline.js +330 -0
- package/dist/cjs/pricing-engine/pipeline.js.map +1 -0
- package/dist/cjs/pricing-engine/proration.js +53 -0
- package/dist/cjs/pricing-engine/proration.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow.js +58 -0
- package/dist/cjs/pricing-engine/shadow.js.map +1 -0
- package/dist/cjs/pricing-engine/types.js +34 -0
- package/dist/cjs/pricing-engine/types.js.map +1 -0
- package/dist/cjs/products/catalog.js +10 -0
- package/dist/cjs/products/catalog.js.map +1 -0
- package/dist/cjs/products/repository.js +61 -0
- package/dist/cjs/products/repository.js.map +1 -0
- package/dist/cjs/rbac/authorize.js +36 -0
- package/dist/cjs/rbac/authorize.js.map +1 -0
- package/dist/cjs/rbac/catalog.js +455 -0
- package/dist/cjs/rbac/catalog.js.map +1 -0
- package/dist/cjs/requests/repository.js +114 -0
- package/dist/cjs/requests/repository.js.map +1 -0
- package/dist/cjs/subscription-billing/dunning.js +26 -0
- package/dist/cjs/subscription-billing/dunning.js.map +1 -0
- package/dist/cjs/subscription-billing/events.js +45 -0
- package/dist/cjs/subscription-billing/events.js.map +1 -0
- package/dist/cjs/subscription-billing/index.js +62 -0
- package/dist/cjs/subscription-billing/index.js.map +1 -0
- package/dist/cjs/subscription-billing/plans.js +88 -0
- package/dist/cjs/subscription-billing/plans.js.map +1 -0
- package/dist/cjs/subscription-billing/product-config.js +54 -0
- package/dist/cjs/subscription-billing/product-config.js.map +1 -0
- package/dist/cjs/subscription-billing/provider/asaas.js +233 -0
- package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -0
- package/dist/cjs/subscription-billing/provider/disabled.js +46 -0
- package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -0
- package/dist/cjs/subscription-billing/provider/registry.js +29 -0
- package/dist/cjs/subscription-billing/provider/registry.js.map +1 -0
- package/dist/cjs/subscription-billing/reconcile.js +198 -0
- package/dist/cjs/subscription-billing/reconcile.js.map +1 -0
- package/dist/cjs/subscription-billing/repository.js +359 -0
- package/dist/cjs/subscription-billing/repository.js.map +1 -0
- package/dist/cjs/subscription-billing/service.js +838 -0
- package/dist/cjs/subscription-billing/service.js.map +1 -0
- package/dist/cjs/subscription-billing/types.js +28 -0
- package/dist/cjs/subscription-billing/types.js.map +1 -0
- package/dist/cjs/tenancy/provisioning.js +126 -0
- package/dist/cjs/tenancy/provisioning.js.map +1 -0
- package/dist/cjs/users/repository.js +83 -0
- package/dist/cjs/users/repository.js.map +1 -0
- package/dist/cjs/vault/crypto.js +94 -0
- package/dist/cjs/vault/crypto.js.map +1 -0
- package/dist/cjs/vault/repository.js +120 -0
- package/dist/cjs/vault/repository.js.map +1 -0
- package/dist/commercial-catalog/catalog.d.ts +27 -0
- package/dist/commercial-catalog/catalog.d.ts.map +1 -0
- package/dist/commercial-catalog/catalog.js +104 -0
- package/dist/commercial-catalog/catalog.js.map +1 -0
- package/dist/commercial-catalog/consumption-contracts.d.ts +33 -0
- package/dist/commercial-catalog/consumption-contracts.d.ts.map +1 -0
- package/dist/commercial-catalog/consumption-contracts.js +9 -0
- package/dist/commercial-catalog/consumption-contracts.js.map +1 -0
- package/dist/commercial-catalog/coupon.d.ts +43 -0
- package/dist/commercial-catalog/coupon.d.ts.map +1 -0
- package/dist/commercial-catalog/coupon.js +57 -0
- package/dist/commercial-catalog/coupon.js.map +1 -0
- package/dist/commercial-catalog/index.d.ts +10 -0
- package/dist/commercial-catalog/index.d.ts.map +1 -0
- package/dist/commercial-catalog/index.js +5 -0
- package/dist/commercial-catalog/index.js.map +1 -0
- package/dist/commercial-catalog/offer-application.d.ts +39 -0
- package/dist/commercial-catalog/offer-application.d.ts.map +1 -0
- package/dist/commercial-catalog/offer-application.js +50 -0
- package/dist/commercial-catalog/offer-application.js.map +1 -0
- package/dist/commercial-catalog/types.d.ts +175 -0
- package/dist/commercial-catalog/types.d.ts.map +1 -0
- package/dist/commercial-catalog/types.js +23 -0
- package/dist/commercial-catalog/types.js.map +1 -0
- package/dist/crm/repository.d.ts +109 -0
- package/dist/crm/repository.d.ts.map +1 -0
- package/dist/crm/repository.js +181 -0
- package/dist/crm/repository.js.map +1 -0
- package/dist/db/context.d.ts +2 -0
- package/dist/db/context.d.ts.map +1 -1
- package/dist/db/context.js +3 -0
- package/dist/db/context.js.map +1 -1
- package/dist/db/migrate.js +7 -2
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/seed.js +4 -1
- package/dist/db/seed.js.map +1 -1
- package/dist/entitlements/decision.d.ts +86 -0
- package/dist/entitlements/decision.d.ts.map +1 -0
- package/dist/entitlements/decision.js +196 -0
- package/dist/entitlements/decision.js.map +1 -0
- package/dist/entitlements/derive.d.ts +30 -0
- package/dist/entitlements/derive.d.ts.map +1 -0
- package/dist/entitlements/derive.js +42 -0
- package/dist/entitlements/derive.js.map +1 -0
- package/dist/entitlements/index.d.ts +10 -0
- package/dist/entitlements/index.d.ts.map +1 -0
- package/dist/entitlements/index.js +7 -0
- package/dist/entitlements/index.js.map +1 -0
- package/dist/entitlements/sources.d.ts +30 -0
- package/dist/entitlements/sources.d.ts.map +1 -0
- package/dist/entitlements/sources.js +55 -0
- package/dist/entitlements/sources.js.map +1 -0
- package/dist/entitlements/standing.d.ts +22 -0
- package/dist/entitlements/standing.d.ts.map +1 -0
- package/dist/entitlements/standing.js +38 -0
- package/dist/entitlements/standing.js.map +1 -0
- package/dist/entitlements/types.d.ts +26 -0
- package/dist/entitlements/types.d.ts.map +1 -0
- package/dist/entitlements/types.js +15 -0
- package/dist/entitlements/types.js.map +1 -0
- package/dist/index.d.ts +74 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -4
- package/dist/index.js.map +1 -1
- package/dist/mail/dedup-store.d.ts +25 -0
- package/dist/mail/dedup-store.d.ts.map +1 -0
- package/dist/mail/dedup-store.js +51 -0
- package/dist/mail/dedup-store.js.map +1 -0
- package/dist/mail/index.d.ts +10 -0
- package/dist/mail/index.d.ts.map +1 -0
- package/dist/mail/index.js +9 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/mail/provider.d.ts +31 -0
- package/dist/mail/provider.d.ts.map +1 -0
- package/dist/mail/provider.js +248 -0
- package/dist/mail/provider.js.map +1 -0
- package/dist/mail/resend-client.d.ts +16 -0
- package/dist/mail/resend-client.d.ts.map +1 -0
- package/dist/mail/resend-client.js +100 -0
- package/dist/mail/resend-client.js.map +1 -0
- package/dist/mail/resend.d.ts.map +1 -1
- package/dist/mail/resend.js +2 -0
- package/dist/mail/resend.js.map +1 -1
- package/dist/mail/sanitize.d.ts +17 -0
- package/dist/mail/sanitize.d.ts.map +1 -0
- package/dist/mail/sanitize.js +51 -0
- package/dist/mail/sanitize.js.map +1 -0
- package/dist/mail/sender-resolver.d.ts +8 -0
- package/dist/mail/sender-resolver.d.ts.map +1 -0
- package/dist/mail/sender-resolver.js +11 -0
- package/dist/mail/sender-resolver.js.map +1 -0
- package/dist/mail/template-renderer.d.ts +10 -0
- package/dist/mail/template-renderer.d.ts.map +1 -0
- package/dist/mail/template-renderer.js +17 -0
- package/dist/mail/template-renderer.js.map +1 -0
- package/dist/mail/types.d.ts +143 -0
- package/dist/mail/types.d.ts.map +1 -0
- package/dist/mail/types.js +34 -0
- package/dist/mail/types.js.map +1 -0
- package/dist/onboarding/domain.d.ts +146 -0
- package/dist/onboarding/domain.d.ts.map +1 -0
- package/dist/onboarding/domain.js +348 -0
- package/dist/onboarding/domain.js.map +1 -0
- package/dist/onboarding/interaction-review.d.ts +123 -0
- package/dist/onboarding/interaction-review.d.ts.map +1 -0
- package/dist/onboarding/interaction-review.js +413 -0
- package/dist/onboarding/interaction-review.js.map +1 -0
- package/dist/onboarding/persistence.d.ts +106 -0
- package/dist/onboarding/persistence.d.ts.map +1 -0
- package/dist/onboarding/persistence.js +430 -0
- package/dist/onboarding/persistence.js.map +1 -0
- package/dist/onboarding/portal-actions.d.ts +48 -0
- package/dist/onboarding/portal-actions.d.ts.map +1 -0
- package/dist/onboarding/portal-actions.js +153 -0
- package/dist/onboarding/portal-actions.js.map +1 -0
- package/dist/onboarding/portal.d.ts +58 -0
- package/dist/onboarding/portal.d.ts.map +1 -0
- package/dist/onboarding/portal.js +170 -0
- package/dist/onboarding/portal.js.map +1 -0
- package/dist/pricing-engine/bundle.d.ts +22 -0
- package/dist/pricing-engine/bundle.d.ts.map +1 -0
- package/dist/pricing-engine/bundle.js +44 -0
- package/dist/pricing-engine/bundle.js.map +1 -0
- package/dist/pricing-engine/errors.d.ts +32 -0
- package/dist/pricing-engine/errors.d.ts.map +1 -0
- package/dist/pricing-engine/errors.js +44 -0
- package/dist/pricing-engine/errors.js.map +1 -0
- package/dist/pricing-engine/index.d.ts +12 -0
- package/dist/pricing-engine/index.d.ts.map +1 -0
- package/dist/pricing-engine/index.js +8 -0
- package/dist/pricing-engine/index.js.map +1 -0
- package/dist/pricing-engine/money.d.ts +32 -0
- package/dist/pricing-engine/money.d.ts.map +1 -0
- package/dist/pricing-engine/money.js +58 -0
- package/dist/pricing-engine/money.js.map +1 -0
- package/dist/pricing-engine/pipeline.d.ts +3 -0
- package/dist/pricing-engine/pipeline.d.ts.map +1 -0
- package/dist/pricing-engine/pipeline.js +327 -0
- package/dist/pricing-engine/pipeline.js.map +1 -0
- package/dist/pricing-engine/proration.d.ts +3 -0
- package/dist/pricing-engine/proration.d.ts.map +1 -0
- package/dist/pricing-engine/proration.js +50 -0
- package/dist/pricing-engine/proration.js.map +1 -0
- package/dist/pricing-engine/shadow.d.ts +51 -0
- package/dist/pricing-engine/shadow.d.ts.map +1 -0
- package/dist/pricing-engine/shadow.js +54 -0
- package/dist/pricing-engine/shadow.js.map +1 -0
- package/dist/pricing-engine/types.d.ts +184 -0
- package/dist/pricing-engine/types.d.ts.map +1 -0
- package/dist/pricing-engine/types.js +31 -0
- package/dist/pricing-engine/types.js.map +1 -0
- package/dist/rbac/authorize.d.ts +3 -6
- package/dist/rbac/authorize.d.ts.map +1 -1
- package/dist/rbac/authorize.js +4 -8
- package/dist/rbac/authorize.js.map +1 -1
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +414 -21
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/subscription-billing/dunning.d.ts +18 -0
- package/dist/subscription-billing/dunning.d.ts.map +1 -0
- package/dist/subscription-billing/dunning.js +28 -0
- package/dist/subscription-billing/dunning.js.map +1 -0
- package/dist/subscription-billing/events.d.ts +58 -0
- package/dist/subscription-billing/events.d.ts.map +1 -0
- package/dist/subscription-billing/events.js +38 -0
- package/dist/subscription-billing/events.js.map +1 -0
- package/dist/subscription-billing/index.d.ts +18 -0
- package/dist/subscription-billing/index.d.ts.map +1 -0
- package/dist/subscription-billing/index.js +16 -0
- package/dist/subscription-billing/index.js.map +1 -0
- package/dist/subscription-billing/plans.d.ts +34 -0
- package/dist/subscription-billing/plans.d.ts.map +1 -0
- package/dist/subscription-billing/plans.js +85 -0
- package/dist/subscription-billing/plans.js.map +1 -0
- package/dist/subscription-billing/product-config.d.ts +61 -0
- package/dist/subscription-billing/product-config.d.ts.map +1 -0
- package/dist/subscription-billing/product-config.js +50 -0
- package/dist/subscription-billing/product-config.js.map +1 -0
- package/dist/subscription-billing/provider/asaas.d.ts +26 -0
- package/dist/subscription-billing/provider/asaas.d.ts.map +1 -0
- package/dist/subscription-billing/provider/asaas.js +229 -0
- package/dist/subscription-billing/provider/asaas.js.map +1 -0
- package/dist/subscription-billing/provider/disabled.d.ts +30 -0
- package/dist/subscription-billing/provider/disabled.d.ts.map +1 -0
- package/dist/subscription-billing/provider/disabled.js +42 -0
- package/dist/subscription-billing/provider/disabled.js.map +1 -0
- package/dist/subscription-billing/provider/registry.d.ts +10 -0
- package/dist/subscription-billing/provider/registry.d.ts.map +1 -0
- package/dist/subscription-billing/provider/registry.js +26 -0
- package/dist/subscription-billing/provider/registry.js.map +1 -0
- package/dist/subscription-billing/reconcile.d.ts +45 -0
- package/dist/subscription-billing/reconcile.d.ts.map +1 -0
- package/dist/subscription-billing/reconcile.js +192 -0
- package/dist/subscription-billing/reconcile.js.map +1 -0
- package/dist/subscription-billing/repository.d.ts +168 -0
- package/dist/subscription-billing/repository.d.ts.map +1 -0
- package/dist/subscription-billing/repository.js +336 -0
- package/dist/subscription-billing/repository.js.map +1 -0
- package/dist/subscription-billing/service.d.ts +175 -0
- package/dist/subscription-billing/service.d.ts.map +1 -0
- package/dist/subscription-billing/service.js +818 -0
- package/dist/subscription-billing/service.js.map +1 -0
- package/dist/subscription-billing/types.d.ts +161 -0
- package/dist/subscription-billing/types.d.ts.map +1 -0
- package/dist/subscription-billing/types.js +24 -0
- package/dist/subscription-billing/types.js.map +1 -0
- package/dist/vault/crypto.d.ts +22 -0
- package/dist/vault/crypto.d.ts.map +1 -0
- package/dist/vault/crypto.js +88 -0
- package/dist/vault/crypto.js.map +1 -0
- package/dist/vault/repository.d.ts +45 -0
- package/dist/vault/repository.d.ts.map +1 -0
- package/dist/vault/repository.js +111 -0
- package/dist/vault/repository.js.map +1 -0
- package/package.json +23 -13
- package/src/db/migrations/0012_vault.sql +51 -0
- package/src/db/migrations/0013_crm.sql +67 -0
- package/src/db/migrations/0014_billing.sql +146 -0
- package/src/db/migrations/0015_merchant_billing_ar.sql +201 -0
- package/src/db/migrations/0016_office_onboarding.sql +162 -0
- package/src/db/migrations/0017_office_onboarding_api.sql +21 -0
- package/src/db/migrations/0018_office_onboarding_portal_actions.sql +60 -0
- package/src/db/migrations/0019_office_onboarding_interaction_review.sql +134 -0
- package/src/db/migrations/0020_saas_billing.sql +157 -0
- package/src/db/migrations/0021_saas_billing_indexes.sql +23 -0
- package/src/db/migrations/0022_saas_billing_multi_product.sql +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/commercial-catalog/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Contratos de consumo — SOMENTE TIPOS (ETAPA 10 do Track A1, RFC-COMMERCIAL-
|
|
4
|
+
* MODEL-001 §8/§22). Prepara IA/WhatsApp/e-mail/storage/OCR/automações/APIs
|
|
5
|
+
* para a camada de Usage/Rating — NÃO implementa Baruk Wallet nem o Rating
|
|
6
|
+
* Engine aqui (marcos posteriores do mesmo Track A, RFC-COMMERCIAL-MODEL-001
|
|
7
|
+
* §24). Unidade comercial única: crédito (o cliente nunca vê token/provedor).
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
//# sourceMappingURL=consumption-contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumption-contracts.js","sourceRoot":"","sources":["../../../src/commercial-catalog/consumption-contracts.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateCoupon = validateCoupon;
|
|
4
|
+
exports.applyCouponToQuote = applyCouponToQuote;
|
|
5
|
+
exports.couponTrialExtensionDays = couponTrialExtensionDays;
|
|
6
|
+
exports.couponFreeModule = couponFreeModule;
|
|
7
|
+
/** Valida um cupom contra a data corrente e o alvo (plano/módulos da oferta). */
|
|
8
|
+
function validateCoupon(coupon, now, context) {
|
|
9
|
+
const errors = [];
|
|
10
|
+
if (!coupon.isActive)
|
|
11
|
+
errors.push({ code: 'coupon_inactive', message: `Cupom "${coupon.code}" está inativo.` });
|
|
12
|
+
if (now < coupon.validFrom || (coupon.validTo != null && now > coupon.validTo)) {
|
|
13
|
+
errors.push({ code: 'coupon_out_of_validity', message: `Cupom "${coupon.code}" fora da validade em ${now}.` });
|
|
14
|
+
}
|
|
15
|
+
if (coupon.maxRedemptions != null && (coupon.redemptionsCount ?? 0) >= coupon.maxRedemptions) {
|
|
16
|
+
errors.push({ code: 'coupon_redemptions_exhausted', message: `Cupom "${coupon.code}" atingiu o limite de resgates.` });
|
|
17
|
+
}
|
|
18
|
+
if (coupon.appliesToPlanCodes && coupon.appliesToPlanCodes.length > 0 && !coupon.appliesToPlanCodes.includes(context.planCode)) {
|
|
19
|
+
errors.push({ code: 'coupon_plan_not_eligible', message: `Cupom "${coupon.code}" não se aplica ao plano "${context.planCode}".` });
|
|
20
|
+
}
|
|
21
|
+
if (coupon.appliesToModuleCodes && coupon.appliesToModuleCodes.length > 0) {
|
|
22
|
+
const hasAny = coupon.appliesToModuleCodes.some((m) => context.moduleCodes.includes(m));
|
|
23
|
+
if (!hasAny) {
|
|
24
|
+
errors.push({ code: 'coupon_modules_not_eligible', message: `Cupom "${coupon.code}" não se aplica aos módulos da oferta.` });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Cadastro público é mais restrito que resgate administrativo: o operador
|
|
28
|
+
// pode aplicar um cupom interno a um cliente; um visitante, nunca.
|
|
29
|
+
if (context.publicSignup === true && (coupon.appliesAtOnboarding !== true || coupon.isInternalPromo === true)) {
|
|
30
|
+
errors.push({ code: 'coupon_not_for_public_signup', message: `Cupom "${coupon.code}" não está disponível para cadastro.` });
|
|
31
|
+
}
|
|
32
|
+
// Cupom com escopo vale só no tenant do acordo — um desconto negociado
|
|
33
|
+
// individualmente não pode vazar para os demais.
|
|
34
|
+
if (coupon.tenantScopeId != null && coupon.tenantScopeId !== context.tenantId) {
|
|
35
|
+
errors.push({ code: 'coupon_other_tenant', message: `Cupom "${coupon.code}" não está disponível para esta conta.` });
|
|
36
|
+
}
|
|
37
|
+
return errors;
|
|
38
|
+
}
|
|
39
|
+
/** Aplica o efeito monetário do cupom (percent_off/amount_off) sobre um PriceQuote já resolvido. */
|
|
40
|
+
function applyCouponToQuote(quote, coupon) {
|
|
41
|
+
if (coupon.effectType === 'percent_off' && coupon.percentOff != null) {
|
|
42
|
+
const factor = 1 - coupon.percentOff / 100;
|
|
43
|
+
return { ...quote, total: Math.round(quote.total * factor * 100) / 100 };
|
|
44
|
+
}
|
|
45
|
+
if (coupon.effectType === 'amount_off' && coupon.amountOff != null) {
|
|
46
|
+
return { ...quote, total: Math.max(0, quote.total - coupon.amountOff) };
|
|
47
|
+
}
|
|
48
|
+
// trial_extension / free_module_period / promotional_credit não alteram o
|
|
49
|
+
// preço do quote — afetam a duração do trial (ver `offer-application.ts`) ou
|
|
50
|
+
// concedem crédito/módulo (fora do escopo de preço).
|
|
51
|
+
return quote;
|
|
52
|
+
}
|
|
53
|
+
/** Dias de trial adicionais concedidos pelo cupom (0 se o efeito não for trial_extension). */
|
|
54
|
+
function couponTrialExtensionDays(coupon) {
|
|
55
|
+
return coupon?.effectType === 'trial_extension' ? (coupon.trialExtensionDays ?? 0) : 0;
|
|
56
|
+
}
|
|
57
|
+
/** Módulo liberado temporariamente pelo cupom, se houver (free_module_period). */
|
|
58
|
+
function couponFreeModule(coupon) {
|
|
59
|
+
if (coupon?.effectType !== 'free_module_period' || !coupon.freeModuleCode)
|
|
60
|
+
return null;
|
|
61
|
+
return { moduleCode: coupon.freeModuleCode, periodDays: coupon.freeModulePeriodDays ?? 30 };
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=coupon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupon.js","sourceRoot":"","sources":["../../../src/commercial-catalog/coupon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyOffer = exports.couponFreeModule = exports.couponTrialExtensionDays = exports.applyCouponToQuote = exports.validateCoupon = exports.resolvePriceQuote = exports.validateOffer = exports.KNOWN_ACTIVE_PRODUCT_LINES = void 0;
|
|
4
|
+
var types_js_1 = require("./types.js");
|
|
5
|
+
Object.defineProperty(exports, "KNOWN_ACTIVE_PRODUCT_LINES", { enumerable: true, get: function () { return types_js_1.KNOWN_ACTIVE_PRODUCT_LINES; } });
|
|
6
|
+
var catalog_js_1 = require("./catalog.js");
|
|
7
|
+
Object.defineProperty(exports, "validateOffer", { enumerable: true, get: function () { return catalog_js_1.validateOffer; } });
|
|
8
|
+
Object.defineProperty(exports, "resolvePriceQuote", { enumerable: true, get: function () { return catalog_js_1.resolvePriceQuote; } });
|
|
9
|
+
var coupon_js_1 = require("./coupon.js");
|
|
10
|
+
Object.defineProperty(exports, "validateCoupon", { enumerable: true, get: function () { return coupon_js_1.validateCoupon; } });
|
|
11
|
+
Object.defineProperty(exports, "applyCouponToQuote", { enumerable: true, get: function () { return coupon_js_1.applyCouponToQuote; } });
|
|
12
|
+
Object.defineProperty(exports, "couponTrialExtensionDays", { enumerable: true, get: function () { return coupon_js_1.couponTrialExtensionDays; } });
|
|
13
|
+
Object.defineProperty(exports, "couponFreeModule", { enumerable: true, get: function () { return coupon_js_1.couponFreeModule; } });
|
|
14
|
+
var offer_application_js_1 = require("./offer-application.js");
|
|
15
|
+
Object.defineProperty(exports, "applyOffer", { enumerable: true, get: function () { return offer_application_js_1.applyOffer; } });
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commercial-catalog/index.ts"],"names":[],"mappings":";;;AAoBA,uCAAwD;AAA/C,sHAAA,0BAA0B,OAAA;AAGnC,2CAAgE;AAAvD,2GAAA,aAAa,OAAA;AAAE,+GAAA,iBAAiB,OAAA;AAGzC,yCAA6G;AAApG,2GAAA,cAAc,OAAA;AAAE,+GAAA,kBAAkB,OAAA;AAAE,qHAAA,wBAAwB,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAGvF,+DAAoD;AAA3C,kHAAA,UAAU,OAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyOffer = applyOffer;
|
|
4
|
+
const reconcile_js_1 = require("../subscription-billing/reconcile.js");
|
|
5
|
+
const index_js_1 = require("../entitlements/index.js");
|
|
6
|
+
const catalog_js_1 = require("./catalog.js");
|
|
7
|
+
const coupon_js_1 = require("./coupon.js");
|
|
8
|
+
/** Aceita data pura (`YYYY-MM-DD`) ou datetime ISO completo (mesma normalização do subscription-billing). */
|
|
9
|
+
function parseIso(iso) {
|
|
10
|
+
return /^\d{4}-\d{2}-\d{2}$/.test(iso) ? new Date(`${iso}T00:00:00Z`) : new Date(iso);
|
|
11
|
+
}
|
|
12
|
+
function addDaysIso(iso, days) {
|
|
13
|
+
const d = parseIso(iso);
|
|
14
|
+
d.setUTCDate(d.getUTCDate() + days);
|
|
15
|
+
return d.toISOString();
|
|
16
|
+
}
|
|
17
|
+
function applyOffer(input) {
|
|
18
|
+
const { tenantId, productLine, offer, plan, modules, bundles, priceTable, coupon, currentEntitlements, now } = input;
|
|
19
|
+
const errors = (0, catalog_js_1.validateOffer)({ offer, plan, modules, bundles, productLine });
|
|
20
|
+
if (coupon) {
|
|
21
|
+
errors.push(...(0, coupon_js_1.validateCoupon)(coupon, now, { planCode: offer.planCode, moduleCodes: offer.moduleCodes }));
|
|
22
|
+
}
|
|
23
|
+
let quote = (0, catalog_js_1.resolvePriceQuote)(offer, priceTable, now);
|
|
24
|
+
if (coupon)
|
|
25
|
+
quote = (0, coupon_js_1.applyCouponToQuote)(quote, coupon);
|
|
26
|
+
// Trial é política da ASSINATURA, não do Plano (RFC §19): default do plano,
|
|
27
|
+
// sobrescrito pela Offer, estendido por cupom — nunca uma constante fixa.
|
|
28
|
+
const trialDays = (offer.trialDaysOverride ?? plan.defaultTrialDays) + (0, coupon_js_1.couponTrialExtensionDays)(coupon);
|
|
29
|
+
const trialEndsAt = addDaysIso(now, trialDays);
|
|
30
|
+
const { subscription, domainEvents } = (0, reconcile_js_1.startTrial)(tenantId, offer.planCode, trialEndsAt, now);
|
|
31
|
+
const targetGrants = offer.moduleCodes.map((moduleCode) => ({
|
|
32
|
+
moduleCode,
|
|
33
|
+
source: 'PLAN',
|
|
34
|
+
expiresAt: null,
|
|
35
|
+
}));
|
|
36
|
+
const freeModule = (0, coupon_js_1.couponFreeModule)(coupon);
|
|
37
|
+
if (freeModule && !offer.moduleCodes.includes(freeModule.moduleCode)) {
|
|
38
|
+
targetGrants.push({
|
|
39
|
+
moduleCode: freeModule.moduleCode,
|
|
40
|
+
source: 'COUPON',
|
|
41
|
+
expiresAt: addDaysIso(now, freeModule.periodDays),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
const entitlements = (0, index_js_1.deriveEntitlements)({
|
|
45
|
+
tenantId,
|
|
46
|
+
subscriptionId: subscription.subscriptionId,
|
|
47
|
+
targetGrants,
|
|
48
|
+
current: currentEntitlements,
|
|
49
|
+
now,
|
|
50
|
+
});
|
|
51
|
+
return { subscription, domainEvents, entitlements, quote, errors };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=offer-application.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offer-application.js","sourceRoot":"","sources":["../../../src/commercial-catalog/offer-application.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Commercial Catalog — contrato canônico (Track A1, derivado de
|
|
4
|
+
* RFC-CAPABILITY-COMMERCIAL-CATALOG-001 §4/§7 + RFC-COMMERCIAL-MODEL-001).
|
|
5
|
+
* Escopo: Baruk.app Representante + Indústria. Domínio PURO (sem DB, sem
|
|
6
|
+
* `Date.now()` interno) — mesmo padrão de `subscription-billing/`.
|
|
7
|
+
*
|
|
8
|
+
* Princípio transversal (nunca colapsar): Identidade (`code` estável / `name`
|
|
9
|
+
* editável) ≠ Precificação (vive na `CommercialPriceTable` versionada, NUNCA no
|
|
10
|
+
* Plan/Module) ≠ Vigência (da tabela/campanha/oferta) ≠ Elegibilidade (regras
|
|
11
|
+
* de quem pode contratar).
|
|
12
|
+
*
|
|
13
|
+
* Reconciliação Reality-First (achado do Track A1, 2026-07-22): o schema real
|
|
14
|
+
* de `manga-verde-bi` guarda `productLine` no TENANT (`tenant.productLine:
|
|
15
|
+
* 'rep' | 'ind'`, resolvido por precedência — coluna explícita > regra de
|
|
16
|
+
* founder-tenant-id), NÃO no Plan. Portanto este módulo NÃO amarra um Plan/
|
|
17
|
+
* Module a uma única linha fixa — `productLineEligibility` é uma lista
|
|
18
|
+
* OPCIONAL (undefined/vazio = elegível a todas as linhas ativas). Qual linha
|
|
19
|
+
* um tenant específico roda é resolvido pelo CONSUMIDOR (equivalente ao
|
|
20
|
+
* `product/tenant_product` do `baruk-platform`, ou ao `tenant.productLine` do
|
|
21
|
+
* mvb) — este módulo recebe a linha já resolvida, nunca a resolve sozinho.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.KNOWN_ACTIVE_PRODUCT_LINES = void 0;
|
|
25
|
+
exports.KNOWN_ACTIVE_PRODUCT_LINES = ['rep', 'ind'];
|
|
26
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commercial-catalog/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAYU,QAAA,0BAA0B,GAA+B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CRM_STAGES = void 0;
|
|
4
|
+
exports.createLead = createLead;
|
|
5
|
+
exports.listLeads = listLeads;
|
|
6
|
+
exports.getLead = getLead;
|
|
7
|
+
exports.updateLead = updateLead;
|
|
8
|
+
exports.moveLeadStage = moveLeadStage;
|
|
9
|
+
exports.linkLeadToClient = linkLeadToClient;
|
|
10
|
+
exports.softDeleteLead = softDeleteLead;
|
|
11
|
+
exports.addActivity = addActivity;
|
|
12
|
+
exports.listActivities = listActivities;
|
|
13
|
+
exports.completeTask = completeTask;
|
|
14
|
+
exports.pipelineSummary = pipelineSummary;
|
|
15
|
+
const shared_1 = require("@baruk/shared");
|
|
16
|
+
/** Estágios canônicos do funil (o front usa para colunas do Kanban). */
|
|
17
|
+
exports.CRM_STAGES = [
|
|
18
|
+
{ key: 'lead', label: 'Lead' },
|
|
19
|
+
{ key: 'contact', label: 'Contato' },
|
|
20
|
+
{ key: 'proposal', label: 'Proposta' },
|
|
21
|
+
{ key: 'won', label: 'Ganho' },
|
|
22
|
+
{ key: 'lost', label: 'Perdido' },
|
|
23
|
+
];
|
|
24
|
+
function mapLead(r) {
|
|
25
|
+
return {
|
|
26
|
+
id: r.id,
|
|
27
|
+
name: r.name,
|
|
28
|
+
company: r.company,
|
|
29
|
+
email: r.email,
|
|
30
|
+
phone: r.phone,
|
|
31
|
+
source: r.source,
|
|
32
|
+
stage: r.stage,
|
|
33
|
+
status: r.status,
|
|
34
|
+
estimatedValue: r.estimated_value === null ? null : Number(r.estimated_value),
|
|
35
|
+
probability: r.probability,
|
|
36
|
+
ownerUserId: r.owner_user_id,
|
|
37
|
+
tags: r.tags ?? [],
|
|
38
|
+
notes: r.notes,
|
|
39
|
+
lostReason: r.lost_reason,
|
|
40
|
+
clientId: r.client_id,
|
|
41
|
+
createdAt: r.created_at.toISOString(),
|
|
42
|
+
updatedAt: r.updated_at.toISOString(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const LEAD_COLS = `
|
|
46
|
+
id, name, company, email, phone, source, stage, status, estimated_value,
|
|
47
|
+
probability, owner_user_id, tags, notes, lost_reason, client_id, created_at, updated_at
|
|
48
|
+
`;
|
|
49
|
+
async function createLead(tx, input) {
|
|
50
|
+
const rows = await tx `
|
|
51
|
+
INSERT INTO lead (
|
|
52
|
+
id, tenant_id, name, company, email, phone, source, stage,
|
|
53
|
+
estimated_value, probability, owner_user_id, tags, notes, created_by
|
|
54
|
+
) VALUES (
|
|
55
|
+
${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid,
|
|
56
|
+
${input.name}, ${input.company ?? null}, ${input.email ?? null}, ${input.phone ?? null},
|
|
57
|
+
${input.source ?? null}, ${input.stage ?? 'lead'},
|
|
58
|
+
${input.estimatedValue ?? null}, ${input.probability ?? 0},
|
|
59
|
+
${input.ownerUserId ?? null}, ${tx.json((input.tags ?? []))},
|
|
60
|
+
${input.notes ?? null}, ${input.createdBy ?? null}
|
|
61
|
+
)
|
|
62
|
+
RETURNING ${tx.unsafe(LEAD_COLS)}
|
|
63
|
+
`;
|
|
64
|
+
return mapLead(rows[0]);
|
|
65
|
+
}
|
|
66
|
+
async function listLeads(tx, filter = {}) {
|
|
67
|
+
const limit = Math.min(filter.limit ?? 50, 200);
|
|
68
|
+
const offset = filter.offset ?? 0;
|
|
69
|
+
const like = filter.search ? `%${filter.search}%` : null;
|
|
70
|
+
const rows = await tx `
|
|
71
|
+
SELECT ${tx.unsafe(LEAD_COLS)}, count(*) OVER() AS total
|
|
72
|
+
FROM lead
|
|
73
|
+
WHERE deleted_at IS NULL
|
|
74
|
+
AND (${filter.stage ?? null}::text IS NULL OR stage = ${filter.stage ?? null})
|
|
75
|
+
AND (${filter.status ?? null}::text IS NULL OR status = ${filter.status ?? null})
|
|
76
|
+
AND (${filter.ownerUserId ?? null}::uuid IS NULL OR owner_user_id = ${filter.ownerUserId ?? null})
|
|
77
|
+
AND (${like}::text IS NULL OR name ILIKE ${like} OR company ILIKE ${like} OR email ILIKE ${like})
|
|
78
|
+
ORDER BY updated_at DESC
|
|
79
|
+
LIMIT ${limit} OFFSET ${offset}
|
|
80
|
+
`;
|
|
81
|
+
const total = rows[0] ? Number(rows[0].total) : 0;
|
|
82
|
+
return { items: rows.map(mapLead), total };
|
|
83
|
+
}
|
|
84
|
+
async function getLead(tx, id) {
|
|
85
|
+
const rows = await tx `
|
|
86
|
+
SELECT ${tx.unsafe(LEAD_COLS)} FROM lead WHERE id = ${id} AND deleted_at IS NULL
|
|
87
|
+
`;
|
|
88
|
+
if (!rows[0])
|
|
89
|
+
throw new shared_1.NotFoundError('Lead não encontrado');
|
|
90
|
+
return mapLead(rows[0]);
|
|
91
|
+
}
|
|
92
|
+
async function updateLead(tx, id, input) {
|
|
93
|
+
const rows = await tx `
|
|
94
|
+
UPDATE lead SET
|
|
95
|
+
name = COALESCE(${input.name ?? null}::text, name),
|
|
96
|
+
company = COALESCE(${input.company ?? null}::text, company),
|
|
97
|
+
email = COALESCE(${input.email ?? null}::citext, email),
|
|
98
|
+
phone = COALESCE(${input.phone ?? null}::text, phone),
|
|
99
|
+
source = COALESCE(${input.source ?? null}::text, source),
|
|
100
|
+
estimated_value = COALESCE(${input.estimatedValue ?? null}::numeric, estimated_value),
|
|
101
|
+
probability = COALESCE(${input.probability ?? null}::int, probability),
|
|
102
|
+
owner_user_id = COALESCE(${input.ownerUserId ?? null}::uuid, owner_user_id),
|
|
103
|
+
tags = COALESCE(${input.tags ? tx.json(input.tags) : null}::jsonb, tags),
|
|
104
|
+
notes = COALESCE(${input.notes ?? null}::text, notes),
|
|
105
|
+
updated_at = now(),
|
|
106
|
+
version = version + 1
|
|
107
|
+
WHERE id = ${id} AND deleted_at IS NULL
|
|
108
|
+
RETURNING id
|
|
109
|
+
`;
|
|
110
|
+
return rows.count;
|
|
111
|
+
}
|
|
112
|
+
/** Move o lead de estágio. `won`/`lost` também fecham o status. */
|
|
113
|
+
async function moveLeadStage(tx, id, stage, opts = {}) {
|
|
114
|
+
const status = stage === 'won' ? 'won' : stage === 'lost' ? 'lost' : 'open';
|
|
115
|
+
const rows = await tx `
|
|
116
|
+
UPDATE lead SET
|
|
117
|
+
stage = ${stage}, status = ${status},
|
|
118
|
+
lost_reason = ${stage === 'lost' ? opts.lostReason ?? null : null},
|
|
119
|
+
updated_at = now(), version = version + 1
|
|
120
|
+
WHERE id = ${id} AND deleted_at IS NULL
|
|
121
|
+
RETURNING id
|
|
122
|
+
`;
|
|
123
|
+
if (rows.count > 0) {
|
|
124
|
+
await tx `
|
|
125
|
+
INSERT INTO crm_activity (id, tenant_id, lead_id, kind, body, author_user_id)
|
|
126
|
+
VALUES (${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid, ${id},
|
|
127
|
+
'stage_change', ${`Estágio alterado para ${stage}`}, ${opts.authorUserId ?? null})
|
|
128
|
+
`;
|
|
129
|
+
}
|
|
130
|
+
return rows.count;
|
|
131
|
+
}
|
|
132
|
+
/** Marca o lead como convertido, ligando-o ao `client` criado. */
|
|
133
|
+
async function linkLeadToClient(tx, id, clientId) {
|
|
134
|
+
const rows = await tx `
|
|
135
|
+
UPDATE lead SET client_id = ${clientId}, stage = 'won', status = 'won',
|
|
136
|
+
updated_at = now(), version = version + 1
|
|
137
|
+
WHERE id = ${id} AND deleted_at IS NULL
|
|
138
|
+
RETURNING id
|
|
139
|
+
`;
|
|
140
|
+
return rows.count;
|
|
141
|
+
}
|
|
142
|
+
async function softDeleteLead(tx, id) {
|
|
143
|
+
const rows = await tx `
|
|
144
|
+
UPDATE lead SET deleted_at = now() WHERE id = ${id} AND deleted_at IS NULL RETURNING id
|
|
145
|
+
`;
|
|
146
|
+
return rows.count;
|
|
147
|
+
}
|
|
148
|
+
function mapActivity(r) {
|
|
149
|
+
return {
|
|
150
|
+
id: r.id,
|
|
151
|
+
leadId: r.lead_id,
|
|
152
|
+
kind: r.kind,
|
|
153
|
+
body: r.body,
|
|
154
|
+
dueDate: r.due_date ? r.due_date.toISOString() : null,
|
|
155
|
+
doneAt: r.done_at ? r.done_at.toISOString() : null,
|
|
156
|
+
authorUserId: r.author_user_id,
|
|
157
|
+
createdAt: r.created_at.toISOString(),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async function addActivity(tx, input) {
|
|
161
|
+
const rows = await tx `
|
|
162
|
+
INSERT INTO crm_activity (id, tenant_id, lead_id, kind, body, due_date, author_user_id)
|
|
163
|
+
VALUES (
|
|
164
|
+
${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid, ${input.leadId},
|
|
165
|
+
${input.kind ?? 'note'}, ${input.body ?? null}, ${input.dueDate ?? null}, ${input.authorUserId ?? null}
|
|
166
|
+
)
|
|
167
|
+
RETURNING id, lead_id, kind, body, due_date, done_at, author_user_id, created_at
|
|
168
|
+
`;
|
|
169
|
+
return mapActivity(rows[0]);
|
|
170
|
+
}
|
|
171
|
+
async function listActivities(tx, leadId) {
|
|
172
|
+
const rows = await tx `
|
|
173
|
+
SELECT id, lead_id, kind, body, due_date, done_at, author_user_id, created_at
|
|
174
|
+
FROM crm_activity WHERE lead_id = ${leadId}
|
|
175
|
+
ORDER BY created_at DESC
|
|
176
|
+
`;
|
|
177
|
+
return rows.map(mapActivity);
|
|
178
|
+
}
|
|
179
|
+
async function completeTask(tx, id) {
|
|
180
|
+
const rows = await tx `
|
|
181
|
+
UPDATE crm_activity SET done_at = now()
|
|
182
|
+
WHERE id = ${id} AND kind = 'task' AND done_at IS NULL RETURNING id
|
|
183
|
+
`;
|
|
184
|
+
return rows.count;
|
|
185
|
+
}
|
|
186
|
+
/** Distribuição por estágio + soma de valor esperado — KPIs do funil. */
|
|
187
|
+
async function pipelineSummary(tx) {
|
|
188
|
+
const rows = await tx `
|
|
189
|
+
SELECT stage, count(*)::int AS count, COALESCE(sum(estimated_value), 0) AS value
|
|
190
|
+
FROM lead WHERE deleted_at IS NULL AND status = 'open'
|
|
191
|
+
GROUP BY stage
|
|
192
|
+
`;
|
|
193
|
+
return rows.map((r) => ({ stage: r.stage, count: r.count, value: Number(r.value) }));
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/crm/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCoreStats = getCoreStats;
|
|
4
|
+
async function getCoreStats(tx) {
|
|
5
|
+
const [clients] = await tx `
|
|
6
|
+
SELECT count(*)::int AS n FROM client WHERE deleted_at IS NULL
|
|
7
|
+
`;
|
|
8
|
+
const [users] = await tx `
|
|
9
|
+
SELECT count(*)::int AS n FROM membership WHERE status = 'active' AND deleted_at IS NULL
|
|
10
|
+
`;
|
|
11
|
+
const [open] = await tx `
|
|
12
|
+
SELECT count(*)::int AS n FROM service_request
|
|
13
|
+
WHERE deleted_at IS NULL
|
|
14
|
+
AND status IN ('sent','viewed','awaiting_client','answered','in_review')
|
|
15
|
+
`;
|
|
16
|
+
const [overdue] = await tx `
|
|
17
|
+
SELECT count(*)::int AS n FROM service_request
|
|
18
|
+
WHERE deleted_at IS NULL
|
|
19
|
+
AND (status = 'overdue'
|
|
20
|
+
OR (due_date IS NOT NULL AND due_date < current_date
|
|
21
|
+
AND status NOT IN ('done','canceled')))
|
|
22
|
+
`;
|
|
23
|
+
const recent = await tx `
|
|
24
|
+
SELECT action, resource_type, occurred_at
|
|
25
|
+
FROM audit_log ORDER BY occurred_at DESC LIMIT 8
|
|
26
|
+
`;
|
|
27
|
+
return {
|
|
28
|
+
clients: clients?.n ?? 0,
|
|
29
|
+
activeUsers: users?.n ?? 0,
|
|
30
|
+
openRequests: open?.n ?? 0,
|
|
31
|
+
overdueRequests: overdue?.n ?? 0,
|
|
32
|
+
recentActivity: recent.map((r) => ({
|
|
33
|
+
action: r.action,
|
|
34
|
+
resourceType: r.resource_type,
|
|
35
|
+
occurredAt: r.occurred_at.toISOString(),
|
|
36
|
+
})),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/dashboard/repository.ts"],"names":[],"mappings":";;AAeA,oCAkCC;AAlCM,KAAK,UAAU,YAAY,CAAC,EAAM;IACvC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,CAAiB;;GAE1C,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAiB;;GAExC,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAiB;;;;GAIvC,CAAC;IACF,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,CAAiB;;;;;;GAM1C,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAgE;;;GAGtF,CAAC;IACF,OAAO;QACL,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC;QACxB,WAAW,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC;QAC1B,YAAY,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;QAC1B,eAAe,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,YAAY,EAAE,CAAC,CAAC,aAAa;YAC7B,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE;SACxC,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createDb = createDb;
|
|
7
|
+
const postgres_1 = __importDefault(require("postgres"));
|
|
8
|
+
/**
|
|
9
|
+
* Cria um cliente Postgres (postgres.js). Duas instâncias são usadas no
|
|
10
|
+
* ecossistema (05-security §7.1, defesa em profundidade):
|
|
11
|
+
* - OWNER: roda migrations/seed (cria schema).
|
|
12
|
+
* - APP (baruk_app): runtime da aplicação — NOSUPERUSER, NOBYPASSRLS, sujeito à RLS.
|
|
13
|
+
*/
|
|
14
|
+
function createDb(connectionString, opts = {}) {
|
|
15
|
+
// SSL obrigatório em provedores gerenciados (Render/Neon/etc.); desligado em
|
|
16
|
+
// Postgres local. Detecta pelo host/flag da URL.
|
|
17
|
+
const isLocal = /@(localhost|127\.0\.0\.1|host\.docker\.internal|\[?::1\]?)[:/]/.test(connectionString);
|
|
18
|
+
const wantsSsl = !isLocal && /sslmode=require|render\.com|neon\.tech|supabase|amazonaws|\.cloud/.test(connectionString);
|
|
19
|
+
return (0, postgres_1.default)(connectionString, {
|
|
20
|
+
max: opts.max ?? 10,
|
|
21
|
+
// UUIDs são gerados na aplicação (uuidv7); datas em UTC.
|
|
22
|
+
prepare: true,
|
|
23
|
+
ssl: wantsSsl ? { rejectUnauthorized: false } : undefined,
|
|
24
|
+
onnotice: () => { }, // silencia NOTICEs verbosos de DO-blocks/IF EXISTS
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/db/client.ts"],"names":[],"mappings":";;;;;AAoBA,4BAgBC;AApCD,wDAAgC;AAchC;;;;;GAKG;AACH,SAAgB,QAAQ,CAAC,gBAAwB,EAAE,OAAkB,EAAE;IACrE,6EAA6E;IAC7E,iDAAiD;IACjD,MAAM,OAAO,GAAG,gEAAgE,CAAC,IAAI,CACnF,gBAAgB,CACjB,CAAC;IACF,MAAM,QAAQ,GACZ,CAAC,OAAO,IAAI,mEAAmE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAEzG,OAAO,IAAA,kBAAQ,EAAC,gBAAgB,EAAE;QAChC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE;QACnB,yDAAyD;QACzD,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;QACzD,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,mDAAmD;KACxE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withContext = withContext;
|
|
4
|
+
exports.withTenant = withTenant;
|
|
5
|
+
const shared_1 = require("@baruk/shared");
|
|
6
|
+
/**
|
|
7
|
+
* Executa `fn` dentro de uma transação com as GUCs de contexto setadas via
|
|
8
|
+
* `set_config(..., is_local => true)` — ou seja, escopo de transação (equivalente
|
|
9
|
+
* a `SET LOCAL`). Toda leitura/escrita tenant-scoped DEVE passar por aqui: é o
|
|
10
|
+
* único ponto onde o `tenant_id` chega ao PostgreSQL, e ele nunca vem do cliente.
|
|
11
|
+
*/
|
|
12
|
+
async function withContext(db, ctx, fn) {
|
|
13
|
+
if (ctx.tenantId !== undefined && !(0, shared_1.isUuid)(ctx.tenantId)) {
|
|
14
|
+
throw new shared_1.TenantContextError(`tenantId inválido no contexto: ${ctx.tenantId}`);
|
|
15
|
+
}
|
|
16
|
+
if (ctx.userId !== undefined && !(0, shared_1.isUuid)(ctx.userId)) {
|
|
17
|
+
throw new shared_1.TenantContextError(`userId inválido no contexto: ${ctx.userId}`);
|
|
18
|
+
}
|
|
19
|
+
if (ctx.clientId !== undefined && !(0, shared_1.isUuid)(ctx.clientId)) {
|
|
20
|
+
throw new shared_1.TenantContextError(`clientId inválido no contexto: ${ctx.clientId}`);
|
|
21
|
+
}
|
|
22
|
+
const result = await db.begin(async (tx) => {
|
|
23
|
+
if (ctx.tenantId !== undefined) {
|
|
24
|
+
await tx `select set_config('app.current_tenant', ${ctx.tenantId}, true)`;
|
|
25
|
+
}
|
|
26
|
+
if (ctx.userId !== undefined) {
|
|
27
|
+
await tx `select set_config('app.current_user', ${ctx.userId}, true)`;
|
|
28
|
+
}
|
|
29
|
+
if (ctx.clientId !== undefined) {
|
|
30
|
+
await tx `select set_config('app.current_client', ${ctx.clientId}, true)`;
|
|
31
|
+
}
|
|
32
|
+
if (ctx.surface !== undefined) {
|
|
33
|
+
await tx `select set_config('app.current_surface', ${ctx.surface}, true)`;
|
|
34
|
+
}
|
|
35
|
+
return fn(tx);
|
|
36
|
+
});
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
/** Açúcar sintático: contexto apenas de tenant. */
|
|
40
|
+
function withTenant(db, tenantId, fn) {
|
|
41
|
+
return withContext(db, { tenantId }, fn);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/db/context.ts"],"names":[],"mappings":";;AA4BA,kCAgCC;AAGD,gCAEC;AAjED,0CAA2D;AAsB3D;;;;;GAKG;AACI,KAAK,UAAU,WAAW,CAC/B,EAAM,EACN,GAAc,EACd,EAA0B;IAE1B,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,IAAA,eAAM,EAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,2BAAkB,CAAC,kCAAkC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,IAAA,eAAM,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,2BAAkB,CAAC,gCAAgC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,IAAA,eAAM,EAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,2BAAkB,CAAC,kCAAkC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACzC,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,EAAE,CAAA,2CAA2C,GAAG,CAAC,QAAQ,SAAS,CAAC;QAC3E,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,EAAE,CAAA,yCAAyC,GAAG,CAAC,MAAM,SAAS,CAAC;QACvE,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,EAAE,CAAA,2CAA2C,GAAG,CAAC,QAAQ,SAAS,CAAC;QAC3E,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,EAAE,CAAA,4CAA4C,GAAG,CAAC,OAAO,SAAS,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,CAAC,EAAmB,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,OAAO,MAAW,CAAC;AACrB,CAAC;AAED,mDAAmD;AACnD,SAAgB,UAAU,CAAI,EAAM,EAAE,QAAgB,EAAE,EAA0B;IAChF,OAAO,WAAW,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadEnv = loadEnv;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
/**
|
|
7
|
+
* Carregador mínimo de `.env` (sem dependência externa). Procura o arquivo na
|
|
8
|
+
* raiz do monorepo e popula `process.env` sem sobrescrever variáveis já
|
|
9
|
+
* definidas (o ambiente real tem prioridade sobre o arquivo). Usado pelos
|
|
10
|
+
* scripts CLI (migrate/seed) e pela API em desenvolvimento.
|
|
11
|
+
*/
|
|
12
|
+
function loadEnv(fileName = '.env') {
|
|
13
|
+
// Sobe diretórios a partir do cwd até achar o arquivo (raiz do monorepo).
|
|
14
|
+
let dir = process.cwd();
|
|
15
|
+
for (let i = 0; i < 6; i++) {
|
|
16
|
+
const candidate = (0, node_path_1.resolve)(dir, fileName);
|
|
17
|
+
if ((0, node_fs_1.existsSync)(candidate)) {
|
|
18
|
+
applyEnvFile(candidate);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const parent = (0, node_path_1.resolve)(dir, '..');
|
|
22
|
+
if (parent === dir)
|
|
23
|
+
break;
|
|
24
|
+
dir = parent;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function applyEnvFile(path) {
|
|
28
|
+
const content = (0, node_fs_1.readFileSync)(path, 'utf8');
|
|
29
|
+
for (const rawLine of content.split('\n')) {
|
|
30
|
+
const line = rawLine.trim();
|
|
31
|
+
if (!line || line.startsWith('#'))
|
|
32
|
+
continue;
|
|
33
|
+
const eq = line.indexOf('=');
|
|
34
|
+
if (eq === -1)
|
|
35
|
+
continue;
|
|
36
|
+
const key = line.slice(0, eq).trim();
|
|
37
|
+
if (key in process.env)
|
|
38
|
+
continue;
|
|
39
|
+
let value = line.slice(eq + 1).trim();
|
|
40
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
41
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
42
|
+
value = value.slice(1, -1);
|
|
43
|
+
}
|
|
44
|
+
process.env[key] = value;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=load-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-env.js","sourceRoot":"","sources":["../../../src/db/load-env.ts"],"names":[],"mappings":";;AASA,0BAaC;AAtBD,qCAAmD;AACnD,yCAAoC;AAEpC;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,QAAQ,GAAG,MAAM;IACvC,0EAA0E;IAC1E,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACzC,IAAI,IAAA,oBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,mBAAO,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,SAAS;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,GAAG,IAAI,OAAO,CAAC,GAAG;YAAE,SAAS;QACjC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC;AACH,CAAC"}
|