@baruk/core 0.1.0 → 0.2.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 +53 -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 +27 -0
- package/dist/commercial-catalog/coupon.d.ts.map +1 -0
- package/dist/commercial-catalog/coupon.js +47 -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 +155 -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,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Seed do tenant fundador — SC Organização Contábil (tenant 0001).
|
|
5
|
+
*
|
|
6
|
+
* Princípio inegociável (01-multi-tenancy §6): a SC nasce como um tenant COMUM,
|
|
7
|
+
* SEM hardcode estrutural. Este script apenas materializa dados; nenhum `if
|
|
8
|
+
* (tenant === 'SC')` existe no código de produção.
|
|
9
|
+
*
|
|
10
|
+
* Dados legais não confirmados (CNPJ, CRC, sócios) permanecem NULOS — nunca
|
|
11
|
+
* inventados. Apenas um usuário administrador de DESENVOLVIMENTO é criado.
|
|
12
|
+
*
|
|
13
|
+
* Idempotente. Uso: `pnpm db:seed`.
|
|
14
|
+
*/
|
|
15
|
+
const index_js_1 = require("../index.js");
|
|
16
|
+
async function main() {
|
|
17
|
+
(0, index_js_1.loadEnv)();
|
|
18
|
+
const ownerUrl = process.env.DATABASE_URL;
|
|
19
|
+
if (!ownerUrl)
|
|
20
|
+
throw new Error('DATABASE_URL (papel owner) não definida.');
|
|
21
|
+
const adminPassword = process.env.SEED_ADMIN_PASSWORD;
|
|
22
|
+
if (!adminPassword)
|
|
23
|
+
throw new Error('SEED_ADMIN_PASSWORD não definida.');
|
|
24
|
+
const db = (0, index_js_1.createDb)(ownerUrl, { role: 'owner', max: 1 });
|
|
25
|
+
try {
|
|
26
|
+
// 1) Catálogos globais: RBAC + produtos do ecossistema.
|
|
27
|
+
await (0, index_js_1.ensureRbacCatalog)(db);
|
|
28
|
+
await (0, index_js_1.ensureProductCatalog)(db);
|
|
29
|
+
console.log('✓ Catálogos garantidos (RBAC + produtos do ecossistema).');
|
|
30
|
+
// 2) Tenant fundador SC — dados legais não confirmados ficam NULOS.
|
|
31
|
+
const tenantId = await (0, index_js_1.ensureTenant)(db, {
|
|
32
|
+
code: 'sc',
|
|
33
|
+
displayName: 'SC Organização Contábil',
|
|
34
|
+
legalName: null, // Razão social/CNPJ não confirmados — jamais inventar.
|
|
35
|
+
status: 'active',
|
|
36
|
+
primaryProduct: 'contabil',
|
|
37
|
+
});
|
|
38
|
+
console.log(`✓ Tenant SC garantido: ${tenantId}`);
|
|
39
|
+
// 3) Organização/unidade default + entitlement do produto Contábil.
|
|
40
|
+
await (0, index_js_1.ensureOrganization)(db, tenantId, 'Matriz');
|
|
41
|
+
await (0, index_js_1.ensureTenantProduct)(db, tenantId, 'contabil');
|
|
42
|
+
console.log('✓ Entitlement do produto Baruk Contábil concedido à SC.');
|
|
43
|
+
// 4) Usuário administrador de DESENVOLVIMENTO (não é dado real de sócio).
|
|
44
|
+
const adminEmail = 'admin@sc.baruk.dev';
|
|
45
|
+
const admin = await (0, index_js_1.upsertUserWithPassword)(db, {
|
|
46
|
+
email: adminEmail,
|
|
47
|
+
fullName: 'Administrador SC (dev)',
|
|
48
|
+
password: adminPassword,
|
|
49
|
+
userType: 'staff',
|
|
50
|
+
});
|
|
51
|
+
console.log(`✓ Usuário admin (dev) garantido: ${admin.email}`);
|
|
52
|
+
// 5) Vínculo + papel Owner.
|
|
53
|
+
await (0, index_js_1.ensureMembership)(db, tenantId, admin.id);
|
|
54
|
+
await (0, index_js_1.assignSystemRole)(db, tenantId, admin.id, 'owner');
|
|
55
|
+
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
|
+
console.log('\n✓ Seed concluído. Login dev: admin@sc.baruk.dev / (SEED_ADMIN_PASSWORD)');
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
await db.end({ timeout: 5 });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
main().catch((err) => {
|
|
66
|
+
console.error('✗ Falha no seed:', err instanceof Error ? err.message : err);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/db/seed.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;GAWG;AACH,0CAYqB;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,MAAM,IAAA,4BAAiB,EAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,IAAA,+BAAoB,EAAC,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QAExE,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,MAAM,UAAU,GAAG,oBAAoB,CAAC;QACxC,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;SAClB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAE/D,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,yDAAyD;QACzD,MAAM,IAAA,wBAAa,EAAC,EAAE,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;QAEvF,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"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ENTITLEMENTS_CONTRACT_VERSION = void 0;
|
|
4
|
+
exports.getEffectiveEntitlements = getEffectiveEntitlements;
|
|
5
|
+
exports.getLimits = getLimits;
|
|
6
|
+
exports.explainDecision = explainDecision;
|
|
7
|
+
exports.can = can;
|
|
8
|
+
const sources_js_1 = require("./sources.js");
|
|
9
|
+
const standing_js_1 = require("./standing.js");
|
|
10
|
+
/**
|
|
11
|
+
* Decision API canônica (contrato 1.0.0 — ENTITLEMENTS_CONTRACT_SPEC_2026-07-27.md
|
|
12
|
+
* §8-§10, §14). EXTENSÃO/facade sobre `deriveEntitlements`/`hasActiveEntitlement`
|
|
13
|
+
* (`derive.ts`, intactas) — pura, determinística, sem DB/rede/NestJS/mvb. Todos
|
|
14
|
+
* os fatos externos (standing, limites, uso, flag operacional) são injetados
|
|
15
|
+
* pelo consumidor via `EntitlementContext` — nunca resolvidos aqui.
|
|
16
|
+
*/
|
|
17
|
+
exports.ENTITLEMENTS_CONTRACT_VERSION = '1.0.0';
|
|
18
|
+
/** `moduleCode` normalizado para comparação (trim + lowercase) — §4. Não reescreve os dados persistidos. */
|
|
19
|
+
function normalizeModuleCodeKey(moduleCode) {
|
|
20
|
+
return moduleCode.trim().toLowerCase();
|
|
21
|
+
}
|
|
22
|
+
function isValidModuleCode(moduleCode) {
|
|
23
|
+
return /^[a-z][a-z0-9_-]{1,63}$/i.test(moduleCode.trim());
|
|
24
|
+
}
|
|
25
|
+
function isRecordActiveNow(e, now) {
|
|
26
|
+
if (!e.active)
|
|
27
|
+
return false;
|
|
28
|
+
if (e.expiresAt != null && e.expiresAt < now)
|
|
29
|
+
return false;
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
function isExplicitDeny(e) {
|
|
33
|
+
// BETA é alias legado de MANUAL (§5). O deny explícito deve ser alias-invariante:
|
|
34
|
+
// avaliar a fonte NORMALIZADA (canonical), nunca o valor bruto persistido — do
|
|
35
|
+
// contrário um grant BETA + `metadata.deny` escaparia do deny e concederia acesso.
|
|
36
|
+
return (0, sources_js_1.normalizeEntitlementSource)(e.source).canonical === 'MANUAL' && e.metadata?.deny === true;
|
|
37
|
+
}
|
|
38
|
+
/** Entitlements ativos do subject, isolados por tenant (nunca vaza entre tenants) — §7/§11. */
|
|
39
|
+
function getEffectiveEntitlements(subject, ctx) {
|
|
40
|
+
if (!subject.tenantId)
|
|
41
|
+
return [];
|
|
42
|
+
return ctx.entitlements.filter((e) => e.tenantId === subject.tenantId && isRecordActiveNow(e, ctx.now));
|
|
43
|
+
}
|
|
44
|
+
/** Composição pura de limite declarado + uso injetado — sem medir, sem enforcement (§14). */
|
|
45
|
+
function getLimits(subject, moduleCode, ctx) {
|
|
46
|
+
if (!subject.tenantId || !ctx.grantedLimits?.length)
|
|
47
|
+
return [];
|
|
48
|
+
const key = normalizeModuleCodeKey(moduleCode);
|
|
49
|
+
return ctx.grantedLimits
|
|
50
|
+
.filter((g) => normalizeModuleCodeKey(g.moduleCode) === key)
|
|
51
|
+
.map((definition) => {
|
|
52
|
+
const usage = ctx.usage?.find((u) => normalizeModuleCodeKey(u.moduleCode) === key && u.limitKey === definition.limitKey);
|
|
53
|
+
if (definition.value == null) {
|
|
54
|
+
return { definition, usage, remaining: null };
|
|
55
|
+
}
|
|
56
|
+
if (!usage) {
|
|
57
|
+
return { definition, usage: undefined, remaining: undefined };
|
|
58
|
+
}
|
|
59
|
+
return { definition, usage, remaining: definition.value - usage.consumed };
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Decisão completa e explicável (formaliza `AccessDecision{allowed,reason}` do
|
|
64
|
+
* mvb, adicionando `reasonCode` estável). Ordem de avaliação (§7/§10/§11):
|
|
65
|
+
* tenant context → deny explícito → entitlement (ativo/expirado/ausente) →
|
|
66
|
+
* standing → limite consumível esgotado → flag operacional → allow.
|
|
67
|
+
*/
|
|
68
|
+
function explainDecision(subject, moduleCode, ctx) {
|
|
69
|
+
const base = {
|
|
70
|
+
moduleCode,
|
|
71
|
+
tenantId: subject.tenantId,
|
|
72
|
+
standing: ctx.standing,
|
|
73
|
+
policyVersion: exports.ENTITLEMENTS_CONTRACT_VERSION,
|
|
74
|
+
evaluatedAt: ctx.now,
|
|
75
|
+
};
|
|
76
|
+
if (!subject.tenantId || !subject.tenantId.trim()) {
|
|
77
|
+
return {
|
|
78
|
+
...base,
|
|
79
|
+
allowed: false,
|
|
80
|
+
reasonCode: 'TENANT_CONTEXT_MISSING',
|
|
81
|
+
reason: 'tenantId ausente ou vazio — decisão fina nunca cruza tenants',
|
|
82
|
+
sources: [],
|
|
83
|
+
effectiveUntil: null,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (!isValidModuleCode(moduleCode)) {
|
|
87
|
+
return {
|
|
88
|
+
...base,
|
|
89
|
+
allowed: false,
|
|
90
|
+
reasonCode: 'ENTITLEMENT_MISSING',
|
|
91
|
+
reason: `moduleCode inválido: "${moduleCode}"`,
|
|
92
|
+
sources: [],
|
|
93
|
+
effectiveUntil: null,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Tenant isolation: só registros do próprio tenant influenciam a decisão (§11).
|
|
97
|
+
const key = normalizeModuleCodeKey(moduleCode);
|
|
98
|
+
const tenantRecords = ctx.entitlements.filter((e) => e.tenantId === subject.tenantId);
|
|
99
|
+
const matching = tenantRecords.filter((e) => normalizeModuleCodeKey(e.moduleCode) === key);
|
|
100
|
+
const deny = matching.find((e) => isExplicitDeny(e) && isRecordActiveNow(e, ctx.now));
|
|
101
|
+
if (deny) {
|
|
102
|
+
return {
|
|
103
|
+
...base,
|
|
104
|
+
allowed: false,
|
|
105
|
+
reasonCode: 'EXPLICIT_DENY',
|
|
106
|
+
reason: 'override MANUAL nega explicitamente este módulo',
|
|
107
|
+
sources: ['MANUAL'],
|
|
108
|
+
effectiveUntil: deny.expiresAt,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// FAIL_OPEN_PRIVILEGED: fato explícito injetado (nunca inferido) — ainda assim
|
|
112
|
+
// respeita um deny explícito (checado acima), mas ignora ausência/expiração.
|
|
113
|
+
if (ctx.failOpenPrivileged) {
|
|
114
|
+
return {
|
|
115
|
+
...base,
|
|
116
|
+
allowed: true,
|
|
117
|
+
reasonCode: 'FAIL_OPEN_PRIVILEGED',
|
|
118
|
+
reason: 'fail-open: subject privilegiado (fato injetado pelo consumidor)',
|
|
119
|
+
sources: [],
|
|
120
|
+
effectiveUntil: null,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const active = matching.filter((e) => isRecordActiveNow(e, ctx.now));
|
|
124
|
+
if (active.length === 0) {
|
|
125
|
+
const hadAnyRecord = matching.length > 0;
|
|
126
|
+
return {
|
|
127
|
+
...base,
|
|
128
|
+
allowed: false,
|
|
129
|
+
reasonCode: hadAnyRecord ? 'ENTITLEMENT_EXPIRED' : 'ENTITLEMENT_MISSING',
|
|
130
|
+
reason: hadAnyRecord
|
|
131
|
+
? 'entitlement encontrado mas expirado/inativo'
|
|
132
|
+
: 'nenhum entitlement para este módulo',
|
|
133
|
+
sources: [],
|
|
134
|
+
effectiveUntil: null,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const normalizedSources = active.map((e) => (0, sources_js_1.normalizeEntitlementSource)(e.source));
|
|
138
|
+
const winner = normalizedSources.reduce((best, cur) => (0, sources_js_1.sourcePrecedence)(cur) < (0, sources_js_1.sourcePrecedence)(best) ? cur : best);
|
|
139
|
+
const canonicalSources = Array.from(new Set(normalizedSources
|
|
140
|
+
.filter((s) => s.canonical != null)
|
|
141
|
+
.map((s) => s.canonical)));
|
|
142
|
+
const hasUnboundedGrant = active.some((e) => e.expiresAt == null);
|
|
143
|
+
const effectiveUntil = hasUnboundedGrant
|
|
144
|
+
? null
|
|
145
|
+
: active.reduce((min, e) => (min == null || e.expiresAt < min ? e.expiresAt : min), null);
|
|
146
|
+
if (!(0, standing_js_1.isStandingOk)(ctx.standing)) {
|
|
147
|
+
return {
|
|
148
|
+
...base,
|
|
149
|
+
allowed: false,
|
|
150
|
+
reasonCode: 'SUBSCRIPTION_BLOCKED',
|
|
151
|
+
reason: ctx.standing.reasonCode === 'SUBSCRIPTION_RESTRICTED'
|
|
152
|
+
? 'standing restrito'
|
|
153
|
+
: 'standing bloqueado',
|
|
154
|
+
sources: canonicalSources,
|
|
155
|
+
effectiveUntil,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
if (ctx.standing.accessLevel === 'RESTRICTED') {
|
|
159
|
+
return {
|
|
160
|
+
...base,
|
|
161
|
+
allowed: false,
|
|
162
|
+
reasonCode: 'SUBSCRIPTION_RESTRICTED',
|
|
163
|
+
reason: 'standing restrito: módulo bloqueado para read/core-only',
|
|
164
|
+
sources: canonicalSources,
|
|
165
|
+
effectiveUntil,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
const limits = getLimits(subject, moduleCode, ctx);
|
|
169
|
+
const exhausted = limits.find((l) => l.definition.value != null && l.remaining != null && l.remaining <= 0);
|
|
170
|
+
if (exhausted) {
|
|
171
|
+
return {
|
|
172
|
+
...base,
|
|
173
|
+
allowed: false,
|
|
174
|
+
reasonCode: 'LIMIT_REACHED',
|
|
175
|
+
reason: `limite "${exhausted.definition.limitKey}" esgotado`,
|
|
176
|
+
sources: canonicalSources,
|
|
177
|
+
effectiveUntil,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
if (ctx.operationalFlag === false) {
|
|
181
|
+
return {
|
|
182
|
+
...base,
|
|
183
|
+
allowed: false,
|
|
184
|
+
reasonCode: 'FEATURE_DISABLED_OPERATIONALLY',
|
|
185
|
+
reason: 'kill-switch operacional desabilitado para este módulo',
|
|
186
|
+
sources: canonicalSources,
|
|
187
|
+
effectiveUntil,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
...base,
|
|
192
|
+
allowed: true,
|
|
193
|
+
reasonCode: 'ENTITLEMENT_ACTIVE',
|
|
194
|
+
reason: `allowed via ${winner.canonical ?? 'unknown source'}`,
|
|
195
|
+
sources: canonicalSources,
|
|
196
|
+
effectiveUntil,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/** Facade booleana — composição de `explainDecision` (§8). */
|
|
200
|
+
function can(subject, moduleCode, ctx) {
|
|
201
|
+
return explainDecision(subject, moduleCode, ctx).allowed;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision.js","sourceRoot":"","sources":["../../../src/entitlements/decision.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deriveEntitlements = deriveEntitlements;
|
|
4
|
+
exports.hasActiveEntitlement = hasActiveEntitlement;
|
|
5
|
+
/**
|
|
6
|
+
* Resolve o próximo estado de entitlements: ativa o que está no alvo (preserva
|
|
7
|
+
* `grantedAt` original se já existia), desativa (soft-disable) o que não está
|
|
8
|
+
* mais no alvo. Concessões expiradas (`expiresAt < now`) nunca entram ativas.
|
|
9
|
+
*/
|
|
10
|
+
function deriveEntitlements(input) {
|
|
11
|
+
const { tenantId, subscriptionId, targetGrants, current, now } = input;
|
|
12
|
+
const currentByModule = new Map(current.map((e) => [e.moduleCode, e]));
|
|
13
|
+
const targetCodes = new Set(targetGrants.map((g) => g.moduleCode));
|
|
14
|
+
const next = [];
|
|
15
|
+
for (const grant of targetGrants) {
|
|
16
|
+
const isExpired = grant.expiresAt != null && grant.expiresAt < now;
|
|
17
|
+
const existing = currentByModule.get(grant.moduleCode);
|
|
18
|
+
next.push({
|
|
19
|
+
tenantId,
|
|
20
|
+
subscriptionId,
|
|
21
|
+
moduleCode: grant.moduleCode,
|
|
22
|
+
source: grant.source,
|
|
23
|
+
active: !isExpired,
|
|
24
|
+
expiresAt: grant.expiresAt,
|
|
25
|
+
grantedAt: existing?.grantedAt ?? now,
|
|
26
|
+
metadata: existing?.metadata,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
// Módulos que o tenant tinha e não estão mais no alvo → soft-disable (nunca remove o registro).
|
|
30
|
+
for (const existing of current) {
|
|
31
|
+
if (!targetCodes.has(existing.moduleCode)) {
|
|
32
|
+
next.push({ ...existing, active: false });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return next;
|
|
36
|
+
}
|
|
37
|
+
/** True se o tenant tem o módulo ativo agora (lookup rápido, mesmo padrão do `manga-verde-bi/access`). */
|
|
38
|
+
function hasActiveEntitlement(entitlements, moduleCode, now) {
|
|
39
|
+
const e = entitlements.find((x) => x.moduleCode === moduleCode);
|
|
40
|
+
if (!e || !e.active)
|
|
41
|
+
return false;
|
|
42
|
+
if (e.expiresAt != null && e.expiresAt < now)
|
|
43
|
+
return false;
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=derive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../../../src/entitlements/derive.ts"],"names":[],"mappings":";;AA8BA,gDA8BC;AAGD,oDASC;AA/CD;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,KAA8B;IAC/D,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IACvE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAEnE,MAAM,IAAI,GAAwB,EAAE,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC;QACnE,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC;YACR,QAAQ;YACR,cAAc;YACd,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,CAAC,SAAS;YAClB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;YACrC,QAAQ,EAAE,QAAQ,EAAE,QAAQ;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,gGAAgG;IAChG,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0GAA0G;AAC1G,SAAgB,oBAAoB,CAClC,YAAiC,EACjC,UAAkB,EAClB,GAAW;IAEX,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IAChE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getLimits = exports.getEffectiveEntitlements = exports.explainDecision = exports.can = exports.ENTITLEMENTS_CONTRACT_VERSION = exports.isStandingOk = exports.normalizeSubscriptionStanding = exports.sourcePrecedence = exports.normalizeEntitlementSource = exports.LEGACY_SOURCE_ALIAS = exports.CANONICAL_ENTITLEMENT_SOURCES = exports.hasActiveEntitlement = exports.deriveEntitlements = void 0;
|
|
4
|
+
var derive_js_1 = require("./derive.js");
|
|
5
|
+
Object.defineProperty(exports, "deriveEntitlements", { enumerable: true, get: function () { return derive_js_1.deriveEntitlements; } });
|
|
6
|
+
Object.defineProperty(exports, "hasActiveEntitlement", { enumerable: true, get: function () { return derive_js_1.hasActiveEntitlement; } });
|
|
7
|
+
// Contrato canônico 1.0.0 (P2 — Core Contract Alignment, ENTITLEMENTS_CONTRACT_SPEC_2026-07-27.md).
|
|
8
|
+
// Extensão aditiva: deriveEntitlements/hasActiveEntitlement acima permanecem intactas.
|
|
9
|
+
var sources_js_1 = require("./sources.js");
|
|
10
|
+
Object.defineProperty(exports, "CANONICAL_ENTITLEMENT_SOURCES", { enumerable: true, get: function () { return sources_js_1.CANONICAL_ENTITLEMENT_SOURCES; } });
|
|
11
|
+
Object.defineProperty(exports, "LEGACY_SOURCE_ALIAS", { enumerable: true, get: function () { return sources_js_1.LEGACY_SOURCE_ALIAS; } });
|
|
12
|
+
Object.defineProperty(exports, "normalizeEntitlementSource", { enumerable: true, get: function () { return sources_js_1.normalizeEntitlementSource; } });
|
|
13
|
+
Object.defineProperty(exports, "sourcePrecedence", { enumerable: true, get: function () { return sources_js_1.sourcePrecedence; } });
|
|
14
|
+
var standing_js_1 = require("./standing.js");
|
|
15
|
+
Object.defineProperty(exports, "normalizeSubscriptionStanding", { enumerable: true, get: function () { return standing_js_1.normalizeSubscriptionStanding; } });
|
|
16
|
+
Object.defineProperty(exports, "isStandingOk", { enumerable: true, get: function () { return standing_js_1.isStandingOk; } });
|
|
17
|
+
var decision_js_1 = require("./decision.js");
|
|
18
|
+
Object.defineProperty(exports, "ENTITLEMENTS_CONTRACT_VERSION", { enumerable: true, get: function () { return decision_js_1.ENTITLEMENTS_CONTRACT_VERSION; } });
|
|
19
|
+
Object.defineProperty(exports, "can", { enumerable: true, get: function () { return decision_js_1.can; } });
|
|
20
|
+
Object.defineProperty(exports, "explainDecision", { enumerable: true, get: function () { return decision_js_1.explainDecision; } });
|
|
21
|
+
Object.defineProperty(exports, "getEffectiveEntitlements", { enumerable: true, get: function () { return decision_js_1.getEffectiveEntitlements; } });
|
|
22
|
+
Object.defineProperty(exports, "getLimits", { enumerable: true, get: function () { return decision_js_1.getLimits; } });
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/entitlements/index.ts"],"names":[],"mappings":";;;AAIA,yCAAuE;AAA9D,+GAAA,kBAAkB,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AAEjD,oGAAoG;AACpG,uFAAuF;AACvF,2CAKsB;AAJpB,2HAAA,6BAA6B,OAAA;AAC7B,iHAAA,mBAAmB,OAAA;AACnB,wHAAA,0BAA0B,OAAA;AAC1B,8GAAA,gBAAgB,OAAA;AAGlB,6CAA4E;AAAnE,4HAAA,6BAA6B,OAAA;AAAE,2GAAA,YAAY,OAAA;AAEpD,6CAMuB;AALrB,4HAAA,6BAA6B,OAAA;AAC7B,kGAAA,GAAG,OAAA;AACH,8GAAA,eAAe,OAAA;AACf,uHAAA,wBAAwB,OAAA;AACxB,wGAAA,SAAS,OAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LEGACY_SOURCE_ALIAS = exports.CANONICAL_ENTITLEMENT_SOURCES = void 0;
|
|
4
|
+
exports.normalizeEntitlementSource = normalizeEntitlementSource;
|
|
5
|
+
exports.sourcePrecedence = sourcePrecedence;
|
|
6
|
+
/**
|
|
7
|
+
* Fontes canônicas (contrato 1.0.0 — ENTITLEMENTS_CONTRACT_SPEC_2026-07-27.md §5).
|
|
8
|
+
* Superset das 6 já existentes em `types.ts` — nenhuma removida, nenhuma renomeada.
|
|
9
|
+
*/
|
|
10
|
+
exports.CANONICAL_ENTITLEMENT_SOURCES = [
|
|
11
|
+
'PLAN',
|
|
12
|
+
'ADDON',
|
|
13
|
+
'COUPON',
|
|
14
|
+
'CAMPAIGN',
|
|
15
|
+
'MANUAL',
|
|
16
|
+
'FEATURE_FLAG',
|
|
17
|
+
];
|
|
18
|
+
/** Alias legado (mvb `Entitlement.source = 'BETA'`) — nunca reescrito em massa. */
|
|
19
|
+
exports.LEGACY_SOURCE_ALIAS = 'BETA';
|
|
20
|
+
/**
|
|
21
|
+
* Ordem de precedência canônica, maior→menor (§10): `MANUAL > FEATURE_FLAG >
|
|
22
|
+
* ADDON > CAMPAIGN/COUPON > PLAN`. `CAMPAIGN` e `COUPON` são o mesmo nível
|
|
23
|
+
* (grupo "CAMPAIGN/COUPON" no contrato) — nunca uma prevalece sobre a outra
|
|
24
|
+
* por precedência; ambas concedem, ambas aparecem em `sources`. Índice menor
|
|
25
|
+
* = mais forte.
|
|
26
|
+
*/
|
|
27
|
+
const PRECEDENCE_TIERS = [
|
|
28
|
+
['MANUAL'],
|
|
29
|
+
['FEATURE_FLAG'],
|
|
30
|
+
['ADDON'],
|
|
31
|
+
['CAMPAIGN', 'COUPON'],
|
|
32
|
+
['PLAN'],
|
|
33
|
+
];
|
|
34
|
+
/** Fonte desconhecida (forward-compat) recebe esta precedência — mínima, abaixo de PLAN. */
|
|
35
|
+
const UNKNOWN_SOURCE_PRECEDENCE = PRECEDENCE_TIERS.length;
|
|
36
|
+
/**
|
|
37
|
+
* Normaliza uma fonte bruta (persistida) para o conjunto canônico.
|
|
38
|
+
* - `BETA` → `MANUAL` + `legacySource: "BETA"` (compat, sem migração destrutiva).
|
|
39
|
+
* - Valor canônico → passthrough.
|
|
40
|
+
* - Valor desconhecido (forward-compat) → `canonical: null`, `isUnknown: true`; o
|
|
41
|
+
* grant continua sendo honrado se `active`, mas nunca finge ser uma fonte
|
|
42
|
+
* canônica — evita ganhar autoridade por acidente (§5/§10 da Contract Spec).
|
|
43
|
+
*/
|
|
44
|
+
function normalizeEntitlementSource(raw) {
|
|
45
|
+
if (raw === exports.LEGACY_SOURCE_ALIAS) {
|
|
46
|
+
return { raw, canonical: 'MANUAL', isUnknown: false, legacySource: exports.LEGACY_SOURCE_ALIAS };
|
|
47
|
+
}
|
|
48
|
+
if (exports.CANONICAL_ENTITLEMENT_SOURCES.includes(raw)) {
|
|
49
|
+
return { raw, canonical: raw, isUnknown: false };
|
|
50
|
+
}
|
|
51
|
+
return { raw, canonical: null, isUnknown: true };
|
|
52
|
+
}
|
|
53
|
+
/** Precedência de uma fonte normalizada — menor valor = mais forte; desconhecida = mínima. */
|
|
54
|
+
function sourcePrecedence(source) {
|
|
55
|
+
if (source.isUnknown || source.canonical == null)
|
|
56
|
+
return UNKNOWN_SOURCE_PRECEDENCE;
|
|
57
|
+
const tierIdx = PRECEDENCE_TIERS.findIndex((tier) => tier.includes(source.canonical));
|
|
58
|
+
return tierIdx === -1 ? UNKNOWN_SOURCE_PRECEDENCE : tierIdx;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../../src/entitlements/sources.ts"],"names":[],"mappings":";;;AAuDA,gEAQC;AAGD,4CAMC;AAtED;;;GAGG;AACU,QAAA,6BAA6B,GAAiC;IACzE,MAAM;IACN,OAAO;IACP,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,cAAc;CACf,CAAC;AAEF,mFAAmF;AACtE,QAAA,mBAAmB,GAAG,MAAM,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,gBAAgB,GAA8C;IAClE,CAAC,QAAQ,CAAC;IACV,CAAC,cAAc,CAAC;IAChB,CAAC,OAAO,CAAC;IACT,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,MAAM,CAAC;CACT,CAAC;AAEF,4FAA4F;AAC5F,MAAM,yBAAyB,GAAG,gBAAgB,CAAC,MAAM,CAAC;AAa1D;;;;;;;GAOG;AACH,SAAgB,0BAA0B,CAAC,GAAW;IACpD,IAAI,GAAG,KAAK,2BAAmB,EAAE,CAAC;QAChC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,2BAAmB,EAAE,CAAC;IAC3F,CAAC;IACD,IAAK,qCAAmD,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAwB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,8FAA8F;AAC9F,SAAgB,gBAAgB,CAAC,MAAwB;IACvD,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI;QAAE,OAAO,yBAAyB,CAAC;IACnF,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CACjD,IAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAmB,CAAC,CACjE,CAAC;IACF,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeSubscriptionStanding = normalizeSubscriptionStanding;
|
|
4
|
+
exports.isStandingOk = isStandingOk;
|
|
5
|
+
/**
|
|
6
|
+
* Mapeamento status → accessLevel (mvb 7 valores + core 5 valores).
|
|
7
|
+
* Desconhecido → BLOCKED (fail-closed — regra de segurança, nunca afrouxa por omissão).
|
|
8
|
+
*/
|
|
9
|
+
const STATUS_TO_STANDING = {
|
|
10
|
+
// mvb (SubscriptionStatus do Prisma) + core (subscription-billing) — case-sensitive, ambos os vocabulários.
|
|
11
|
+
TRIALING: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
|
|
12
|
+
trialing: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
|
|
13
|
+
ACTIVE: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
|
|
14
|
+
active: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
|
|
15
|
+
PAST_DUE: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
|
|
16
|
+
past_due: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
|
|
17
|
+
RESTRICTED: { accessLevel: 'RESTRICTED', reasonCode: 'SUBSCRIPTION_RESTRICTED' },
|
|
18
|
+
SUSPENDED: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
|
|
19
|
+
CANCELED: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
|
|
20
|
+
canceled: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
|
|
21
|
+
EXPIRED: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
|
|
22
|
+
paused: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
|
|
23
|
+
NONE: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Normaliza um status de assinatura (mvb ou core) para o `SubscriptionStanding`
|
|
27
|
+
* canônico. Puro — nenhuma máquina de estados, nenhum I/O. Status desconhecido
|
|
28
|
+
* (incluindo ausente/vazio) → BLOCKED (fail-closed, §6 da Contract Spec).
|
|
29
|
+
*/
|
|
30
|
+
function normalizeSubscriptionStanding(status) {
|
|
31
|
+
const key = status ?? 'NONE';
|
|
32
|
+
const mapped = STATUS_TO_STANDING[key];
|
|
33
|
+
if (!mapped) {
|
|
34
|
+
return { accessLevel: 'BLOCKED', statusCanonical: key, reasonCode: 'SUBSCRIPTION_BLOCKED' };
|
|
35
|
+
}
|
|
36
|
+
return { accessLevel: mapped.accessLevel, statusCanonical: key, reasonCode: mapped.reasonCode };
|
|
37
|
+
}
|
|
38
|
+
/** `standingOk` — mesma regra já usada pelo mvb (`accessLevel !== 'BLOCKED'`), ratificada no contrato. */
|
|
39
|
+
function isStandingOk(standing) {
|
|
40
|
+
return standing.accessLevel !== 'BLOCKED';
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=standing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standing.js","sourceRoot":"","sources":["../../../src/entitlements/standing.ts"],"names":[],"mappings":";;AA0CA,sEASC;AAGD,oCAEC;AAxCD;;;GAGG;AACH,MAAM,kBAAkB,GAAyE;IAC/F,4GAA4G;IAC5G,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACnE,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACnE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACjE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACjE,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACnE,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACnE,UAAU,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,yBAAyB,EAAE;IAChF,SAAS,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACzE,QAAQ,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACxE,QAAQ,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACxE,OAAO,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACvE,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACtE,IAAI,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;CACrE,CAAC;AAEF;;;;GAIG;AACH,SAAgB,6BAA6B,CAC3C,MAAiC;IAEjC,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC;IAC7B,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,sBAAsB,EAAE,CAAC;IAC9F,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;AAClG,CAAC;AAED,0GAA0G;AAC1G,SAAgB,YAAY,CAAC,QAA8B;IACzD,OAAO,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Entitlements (finos) — contrato canônico (Track A1, RFC-CAPABILITY-
|
|
4
|
+
* COMMERCIAL-CATALOG-001 §6). Domínio PURO — sem DB, sem `Date.now()` interno.
|
|
5
|
+
*
|
|
6
|
+
* Distinção dura (nunca confundir — achado Reality-First, §25 do modelo):
|
|
7
|
+
* - Entitlement FINO (este módulo) = "o tenant contratou o módulo X" — deriva
|
|
8
|
+
* da Offer/Subscription, é o que este pacote resolve.
|
|
9
|
+
* - Entitlement GROSSO (`product`/`tenant_product`, já em produção no
|
|
10
|
+
* `baruk-platform`, migração `0010_product_entitlements.sql`) = "o tenant
|
|
11
|
+
* pode abrir este PRODUTO" (IAM). É uma camada DIFERENTE, anterior a esta —
|
|
12
|
+
* o Hub bloqueia o produto pelo grosso; DENTRO do produto, o fino decide
|
|
13
|
+
* quais módulos/capacidades aparecem. Este módulo nunca substitui aquele.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/entitlements/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseClientsCsv = parseClientsCsv;
|
|
4
|
+
exports.planImport = planImport;
|
|
5
|
+
exports.commitImport = commitImport;
|
|
6
|
+
const repository_js_1 = require("../clients/repository.js");
|
|
7
|
+
const HEADER_ALIASES = {
|
|
8
|
+
nome: 'displayName',
|
|
9
|
+
display_name: 'displayName',
|
|
10
|
+
razao_social: 'displayName',
|
|
11
|
+
documento: 'documentNumber',
|
|
12
|
+
document_number: 'documentNumber',
|
|
13
|
+
cnpj: 'documentNumber',
|
|
14
|
+
cpf: 'documentNumber',
|
|
15
|
+
tipo: 'clientType',
|
|
16
|
+
client_type: 'clientType',
|
|
17
|
+
email: 'email',
|
|
18
|
+
telefone: 'phone',
|
|
19
|
+
phone: 'phone',
|
|
20
|
+
};
|
|
21
|
+
function parseCsvRaw(text) {
|
|
22
|
+
const rows = [];
|
|
23
|
+
let field = '';
|
|
24
|
+
let row = [];
|
|
25
|
+
let inQuotes = false;
|
|
26
|
+
const s = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
27
|
+
for (let i = 0; i < s.length; i++) {
|
|
28
|
+
const c = s[i];
|
|
29
|
+
if (inQuotes) {
|
|
30
|
+
if (c === '"') {
|
|
31
|
+
if (s[i + 1] === '"') {
|
|
32
|
+
field += '"';
|
|
33
|
+
i++;
|
|
34
|
+
}
|
|
35
|
+
else
|
|
36
|
+
inQuotes = false;
|
|
37
|
+
}
|
|
38
|
+
else
|
|
39
|
+
field += c;
|
|
40
|
+
}
|
|
41
|
+
else if (c === '"')
|
|
42
|
+
inQuotes = true;
|
|
43
|
+
else if (c === ',') {
|
|
44
|
+
row.push(field);
|
|
45
|
+
field = '';
|
|
46
|
+
}
|
|
47
|
+
else if (c === '\n') {
|
|
48
|
+
row.push(field);
|
|
49
|
+
rows.push(row);
|
|
50
|
+
row = [];
|
|
51
|
+
field = '';
|
|
52
|
+
}
|
|
53
|
+
else
|
|
54
|
+
field += c;
|
|
55
|
+
}
|
|
56
|
+
if (field.length > 0 || row.length > 0) {
|
|
57
|
+
row.push(field);
|
|
58
|
+
rows.push(row);
|
|
59
|
+
}
|
|
60
|
+
return rows.filter((r) => r.some((cell) => cell.trim() !== ''));
|
|
61
|
+
}
|
|
62
|
+
const onlyDigits = (v) => v.replace(/\D/g, '');
|
|
63
|
+
function parseClientsCsv(text) {
|
|
64
|
+
const raw = parseCsvRaw(text);
|
|
65
|
+
const errors = [];
|
|
66
|
+
if (raw.length === 0)
|
|
67
|
+
return { rows: [], errors: [{ line: 0, message: 'CSV vazio' }] };
|
|
68
|
+
const header = raw[0].map((h) => h.trim().toLowerCase());
|
|
69
|
+
const colMap = header.map((h) => HEADER_ALIASES[h]);
|
|
70
|
+
if (!colMap.includes('displayName')) {
|
|
71
|
+
return { rows: [], errors: [{ line: 1, message: 'Cabeçalho sem coluna de nome (nome/display_name)' }] };
|
|
72
|
+
}
|
|
73
|
+
const rows = [];
|
|
74
|
+
for (let i = 1; i < raw.length; i++) {
|
|
75
|
+
const cells = raw[i];
|
|
76
|
+
const rec = { line: i + 1, clientType: 'pj' };
|
|
77
|
+
colMap.forEach((key, idx) => {
|
|
78
|
+
if (!key)
|
|
79
|
+
return;
|
|
80
|
+
const value = (cells[idx] ?? '').trim();
|
|
81
|
+
if (key === 'documentNumber')
|
|
82
|
+
rec.documentNumber = value ? onlyDigits(value) : null;
|
|
83
|
+
else if (key === 'clientType')
|
|
84
|
+
rec.clientType = value.toLowerCase() === 'pf' ? 'pf' : 'pj';
|
|
85
|
+
else if (key === 'email')
|
|
86
|
+
rec.email = value || null;
|
|
87
|
+
else if (key === 'phone')
|
|
88
|
+
rec.phone = value || null;
|
|
89
|
+
else if (key === 'displayName')
|
|
90
|
+
rec.displayName = value;
|
|
91
|
+
});
|
|
92
|
+
if (!rec.displayName) {
|
|
93
|
+
errors.push({ line: i + 1, message: 'Nome obrigatório ausente' });
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (rec.documentNumber && ![11, 14].includes(rec.documentNumber.length)) {
|
|
97
|
+
errors.push({ line: i + 1, message: `Documento inválido (${rec.documentNumber.length} dígitos)` });
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
rows.push({
|
|
101
|
+
line: i + 1,
|
|
102
|
+
displayName: rec.displayName,
|
|
103
|
+
documentNumber: rec.documentNumber ?? null,
|
|
104
|
+
clientType: rec.clientType ?? 'pj',
|
|
105
|
+
email: rec.email ?? null,
|
|
106
|
+
phone: rec.phone ?? null,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return { rows, errors };
|
|
110
|
+
}
|
|
111
|
+
async function planImport(tx, text) {
|
|
112
|
+
const { rows, errors } = parseClientsCsv(text);
|
|
113
|
+
const toCreate = [];
|
|
114
|
+
const duplicates = [];
|
|
115
|
+
const seen = new Set();
|
|
116
|
+
for (const row of rows) {
|
|
117
|
+
if (row.documentNumber) {
|
|
118
|
+
if (seen.has(row.documentNumber)) {
|
|
119
|
+
duplicates.push({ line: row.line, documentNumber: row.documentNumber });
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
seen.add(row.documentNumber);
|
|
123
|
+
const existing = await (0, repository_js_1.findClientIdByDocument)(tx, row.documentNumber);
|
|
124
|
+
if (existing) {
|
|
125
|
+
duplicates.push({ line: row.line, documentNumber: row.documentNumber });
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
toCreate.push(row);
|
|
130
|
+
}
|
|
131
|
+
return { total: rows.length, toCreate, duplicates, errors };
|
|
132
|
+
}
|
|
133
|
+
async function commitImport(tx, text, createdBy) {
|
|
134
|
+
const plan = await planImport(tx, text);
|
|
135
|
+
let created = 0;
|
|
136
|
+
for (const row of plan.toCreate) {
|
|
137
|
+
await (0, repository_js_1.createClient)(tx, {
|
|
138
|
+
displayName: row.displayName,
|
|
139
|
+
clientType: row.clientType,
|
|
140
|
+
documentNumber: row.documentNumber,
|
|
141
|
+
createdBy: createdBy ?? null,
|
|
142
|
+
});
|
|
143
|
+
created++;
|
|
144
|
+
}
|
|
145
|
+
return { created, skipped: plan.duplicates.length, errors: plan.errors };
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=clients-import.js.map
|