@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,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolução pura do Commercial Catalog — sem DB, sem `Date.now()` interno (o
|
|
3
|
+
* instante e a `productLine` já resolvida do tenant são sempre injetados pelo
|
|
4
|
+
* consumidor). Espelha o papel de `reconcile.ts` no subscription-billing.
|
|
5
|
+
*/
|
|
6
|
+
function isEligible(eligibility, productLine) {
|
|
7
|
+
return !eligibility || eligibility.length === 0 || eligibility.includes(productLine);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Valida uma Offer contra o catálogo: elegibilidade de linha (plano/módulos),
|
|
11
|
+
* dependências reais de módulo (nunca artificiais — só o que o próprio
|
|
12
|
+
* `ModuleRecord.requiredModuleCodes` declarar), e que módulos de bundle
|
|
13
|
+
* referenciados existam entre os módulos da oferta.
|
|
14
|
+
*/
|
|
15
|
+
export function validateOffer(input) {
|
|
16
|
+
const { offer, plan, modules, bundles, productLine } = input;
|
|
17
|
+
const errors = [];
|
|
18
|
+
const moduleByCode = new Map(modules.map((m) => [m.code, m]));
|
|
19
|
+
if (!isEligible(plan.productLineEligibility, productLine)) {
|
|
20
|
+
errors.push({ code: 'plan_not_eligible', message: `Plano "${plan.code}" não elegível para a linha "${productLine}".` });
|
|
21
|
+
}
|
|
22
|
+
if (!isEligible(offer.productLineEligibility, productLine)) {
|
|
23
|
+
errors.push({ code: 'offer_not_eligible', message: `Oferta "${offer.code}" não elegível para a linha "${productLine}".` });
|
|
24
|
+
}
|
|
25
|
+
for (const moduleCode of offer.moduleCodes) {
|
|
26
|
+
const mod = moduleByCode.get(moduleCode);
|
|
27
|
+
if (!mod) {
|
|
28
|
+
errors.push({ code: 'module_not_found', message: `Módulo "${moduleCode}" não existe no catálogo.` });
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (!mod.isActive) {
|
|
32
|
+
errors.push({ code: 'module_inactive', message: `Módulo "${moduleCode}" está inativo.` });
|
|
33
|
+
}
|
|
34
|
+
if (!isEligible(mod.productLineEligibility, productLine)) {
|
|
35
|
+
errors.push({ code: 'module_not_eligible', message: `Módulo "${moduleCode}" não elegível para a linha "${productLine}".` });
|
|
36
|
+
}
|
|
37
|
+
for (const req of mod.requiredModuleCodes) {
|
|
38
|
+
if (!offer.moduleCodes.includes(req)) {
|
|
39
|
+
errors.push({
|
|
40
|
+
code: 'module_dependency_missing',
|
|
41
|
+
message: `Módulo "${moduleCode}" requer "${req}", que não está na oferta.`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
for (const bundleCode of offer.bundleCodes) {
|
|
47
|
+
const bundle = bundles.find((b) => b.code === bundleCode);
|
|
48
|
+
if (!bundle) {
|
|
49
|
+
errors.push({ code: 'bundle_not_found', message: `Bundle "${bundleCode}" não existe no catálogo.` });
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
for (const moduleCode of bundle.moduleCodes) {
|
|
53
|
+
if (!offer.moduleCodes.includes(moduleCode)) {
|
|
54
|
+
errors.push({
|
|
55
|
+
code: 'bundle_module_missing',
|
|
56
|
+
message: `Bundle "${bundleCode}" exige o módulo "${moduleCode}", que não está na oferta.`,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return errors;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resolve o `PriceQuote` de uma Offer contra uma `CommercialPriceTable` vigente
|
|
65
|
+
* na data `now`. Não aplica cupom (isso é `coupon.ts`, sobre o quote resolvido).
|
|
66
|
+
* Precedência de escopo: maior `priority` primeiro; sem escopo casando, usa o
|
|
67
|
+
* item sem filtro de escopo (ALL implícito).
|
|
68
|
+
*/
|
|
69
|
+
export function resolvePriceQuote(offer, table, now) {
|
|
70
|
+
if (table.code !== offer.priceTableCode) {
|
|
71
|
+
throw new Error(`Offer "${offer.code}" referencia a tabela "${offer.priceTableCode}", recebida "${table.code}".`);
|
|
72
|
+
}
|
|
73
|
+
if (table.status !== 'active') {
|
|
74
|
+
throw new Error(`Tabela "${table.code}" não está ativa (status="${table.status}").`);
|
|
75
|
+
}
|
|
76
|
+
if (now < table.effectiveFrom || (table.effectiveTo != null && now > table.effectiveTo)) {
|
|
77
|
+
throw new Error(`Tabela "${table.code}" fora de vigência em ${now}.`);
|
|
78
|
+
}
|
|
79
|
+
// Bundle NÃO é alvo precificável aqui (RFC §4.4: "não calcula, só declara a
|
|
80
|
+
// combinação e a intenção de desconto"). O desconto de bundle é resolvido
|
|
81
|
+
// pelo Pricing Engine (regra sobre os módulos já precificados), fora deste
|
|
82
|
+
// MVP — por isso `bundleCodes` não entra na lista de alvos obrigatórios.
|
|
83
|
+
const targets = [
|
|
84
|
+
{ targetType: 'PLAN', targetCode: offer.planCode },
|
|
85
|
+
...offer.moduleCodes.map((code) => ({ targetType: 'MODULE', targetCode: code })),
|
|
86
|
+
...offer.addonCodes.map((code) => ({ targetType: 'ADDON', targetCode: code })),
|
|
87
|
+
];
|
|
88
|
+
const items = targets.map(({ targetType, targetCode }) => {
|
|
89
|
+
const found = table.items.find((i) => i.targetType === targetType && i.targetCode === targetCode);
|
|
90
|
+
if (!found) {
|
|
91
|
+
throw new Error(`Sem preço para ${targetType}:${targetCode} na tabela "${table.code}" v${table.version}.`);
|
|
92
|
+
}
|
|
93
|
+
return { targetType, targetCode, amount: found.amount };
|
|
94
|
+
});
|
|
95
|
+
const total = items.reduce((sum, i) => sum + i.amount, 0);
|
|
96
|
+
return {
|
|
97
|
+
currency: table.currency,
|
|
98
|
+
items,
|
|
99
|
+
total,
|
|
100
|
+
priceTableCode: table.code,
|
|
101
|
+
priceTableVersion: table.version,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -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,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contratos de consumo — SOMENTE TIPOS (ETAPA 10 do Track A1, RFC-COMMERCIAL-
|
|
3
|
+
* MODEL-001 §8/§22). Prepara IA/WhatsApp/e-mail/storage/OCR/automações/APIs
|
|
4
|
+
* para a camada de Usage/Rating — NÃO implementa Baruk Wallet nem o Rating
|
|
5
|
+
* Engine aqui (marcos posteriores do mesmo Track A, RFC-COMMERCIAL-MODEL-001
|
|
6
|
+
* §24). Unidade comercial única: crédito (o cliente nunca vê token/provedor).
|
|
7
|
+
*/
|
|
8
|
+
/** As famílias de consumo já evidenciadas (RFC §28.9) — cada uma um `usageType`. */
|
|
9
|
+
export type ConsumptionUsageType = 'ai.email_generation' | 'ai.whatsapp_generation' | 'ai.customer_summary' | 'ai.commercial_assistant' | 'voice.call_center_ai_per_min' | 'ocr.per_page' | 'image.processing' | 'comm.whatsapp_conversation' | 'comm.sms' | 'comm.bulk_email_per_1k' | 'automation.run' | 'api.external_call';
|
|
10
|
+
/**
|
|
11
|
+
* O fato de consumo — o que o Usage Metering (marco posterior) vai emitir.
|
|
12
|
+
* `provider`/`model` nunca chegam ao cliente (unidade comercial = crédito).
|
|
13
|
+
*/
|
|
14
|
+
export interface ConsumptionEventContract {
|
|
15
|
+
usageType: ConsumptionUsageType;
|
|
16
|
+
tenantId: string;
|
|
17
|
+
quantity: number;
|
|
18
|
+
/** Instante do fato — injetado (mesma disciplina do subscription-billing). */
|
|
19
|
+
occurredAt: string;
|
|
20
|
+
/** Idempotência — obrigatória quando o Rating Engine existir (marco posterior). */
|
|
21
|
+
idempotencyKey: string;
|
|
22
|
+
}
|
|
23
|
+
/** Franquia incluída por ciclo — resolvida do Plan (§ commercial-catalog types.ts). */
|
|
24
|
+
export interface ConsumptionFranchise {
|
|
25
|
+
usageType: ConsumptionUsageType | 'storage_bytes' | 'credits_generic';
|
|
26
|
+
includedPerCycle: number;
|
|
27
|
+
}
|
|
28
|
+
export type ExcessPolicy = 'block' | 'metered';
|
|
29
|
+
export interface ConsumptionExcessRule {
|
|
30
|
+
usageType: ConsumptionUsageType | 'storage_bytes' | 'credits_generic';
|
|
31
|
+
policy: ExcessPolicy;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=consumption-contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumption-contracts.d.ts","sourceRoot":"","sources":["../../src/commercial-catalog/consumption-contracts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oFAAoF;AACpF,MAAM,MAAM,oBAAoB,GAC5B,qBAAqB,GACrB,wBAAwB,GACxB,qBAAqB,GACrB,yBAAyB,GACzB,8BAA8B,GAC9B,cAAc,GACd,kBAAkB,GAClB,4BAA4B,GAC5B,UAAU,GACV,wBAAwB,GACxB,gBAAgB,GAChB,mBAAmB,CAAC;AAExB;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,oBAAoB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,uFAAuF;AACvF,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,oBAAoB,GAAG,eAAe,GAAG,iBAAiB,CAAC;IACtE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/C,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,oBAAoB,GAAG,eAAe,GAAG,iBAAiB,CAAC;IACtE,MAAM,EAAE,YAAY,CAAC;CACtB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contratos de consumo — SOMENTE TIPOS (ETAPA 10 do Track A1, RFC-COMMERCIAL-
|
|
3
|
+
* MODEL-001 §8/§22). Prepara IA/WhatsApp/e-mail/storage/OCR/automações/APIs
|
|
4
|
+
* para a camada de Usage/Rating — NÃO implementa Baruk Wallet nem o Rating
|
|
5
|
+
* Engine aqui (marcos posteriores do mesmo Track A, RFC-COMMERCIAL-MODEL-001
|
|
6
|
+
* §24). Unidade comercial única: crédito (o cliente nunca vê token/provedor).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# 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,27 @@
|
|
|
1
|
+
import type { CouponRecord, PriceQuote } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Cupons — MVP (RFC-COMMERCIAL-MODEL-001 §18/§29.8): apenas os 5 efeitos já
|
|
4
|
+
* cobertos pelo `CouponRecord` (percent_off, amount_off, trial_extension,
|
|
5
|
+
* free_module_period, promotional_credit). Generalização para "Campaign" fica
|
|
6
|
+
* para quando houver variedade real de campanha (Framework Evolution Policy) —
|
|
7
|
+
* não construído aqui.
|
|
8
|
+
*/
|
|
9
|
+
export interface CouponApplicationError {
|
|
10
|
+
code: string;
|
|
11
|
+
message: string;
|
|
12
|
+
}
|
|
13
|
+
/** Valida um cupom contra a data corrente e o alvo (plano/módulos da oferta). */
|
|
14
|
+
export declare function validateCoupon(coupon: CouponRecord, now: string, context: {
|
|
15
|
+
planCode: string;
|
|
16
|
+
moduleCodes: string[];
|
|
17
|
+
}): CouponApplicationError[];
|
|
18
|
+
/** Aplica o efeito monetário do cupom (percent_off/amount_off) sobre um PriceQuote já resolvido. */
|
|
19
|
+
export declare function applyCouponToQuote(quote: PriceQuote, coupon: CouponRecord): PriceQuote;
|
|
20
|
+
/** Dias de trial adicionais concedidos pelo cupom (0 se o efeito não for trial_extension). */
|
|
21
|
+
export declare function couponTrialExtensionDays(coupon: CouponRecord | undefined): number;
|
|
22
|
+
/** Módulo liberado temporariamente pelo cupom, se houver (free_module_period). */
|
|
23
|
+
export declare function couponFreeModule(coupon: CouponRecord | undefined): {
|
|
24
|
+
moduleCode: string;
|
|
25
|
+
periodDays: number;
|
|
26
|
+
} | null;
|
|
27
|
+
//# sourceMappingURL=coupon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupon.d.ts","sourceRoot":"","sources":["../../src/commercial-catalog/coupon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;;GAMG;AAEH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GACnD,sBAAsB,EAAE,CAmB1B;AAED,oGAAoG;AACpG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,GAAG,UAAU,CAYtF;AAED,8FAA8F;AAC9F,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,CAEjF;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGpH"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** Valida um cupom contra a data corrente e o alvo (plano/módulos da oferta). */
|
|
2
|
+
export function validateCoupon(coupon, now, context) {
|
|
3
|
+
const errors = [];
|
|
4
|
+
if (!coupon.isActive)
|
|
5
|
+
errors.push({ code: 'coupon_inactive', message: `Cupom "${coupon.code}" está inativo.` });
|
|
6
|
+
if (now < coupon.validFrom || (coupon.validTo != null && now > coupon.validTo)) {
|
|
7
|
+
errors.push({ code: 'coupon_out_of_validity', message: `Cupom "${coupon.code}" fora da validade em ${now}.` });
|
|
8
|
+
}
|
|
9
|
+
if (coupon.maxRedemptions != null && (coupon.redemptionsCount ?? 0) >= coupon.maxRedemptions) {
|
|
10
|
+
errors.push({ code: 'coupon_redemptions_exhausted', message: `Cupom "${coupon.code}" atingiu o limite de resgates.` });
|
|
11
|
+
}
|
|
12
|
+
if (coupon.appliesToPlanCodes && coupon.appliesToPlanCodes.length > 0 && !coupon.appliesToPlanCodes.includes(context.planCode)) {
|
|
13
|
+
errors.push({ code: 'coupon_plan_not_eligible', message: `Cupom "${coupon.code}" não se aplica ao plano "${context.planCode}".` });
|
|
14
|
+
}
|
|
15
|
+
if (coupon.appliesToModuleCodes && coupon.appliesToModuleCodes.length > 0) {
|
|
16
|
+
const hasAny = coupon.appliesToModuleCodes.some((m) => context.moduleCodes.includes(m));
|
|
17
|
+
if (!hasAny) {
|
|
18
|
+
errors.push({ code: 'coupon_modules_not_eligible', message: `Cupom "${coupon.code}" não se aplica aos módulos da oferta.` });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return errors;
|
|
22
|
+
}
|
|
23
|
+
/** Aplica o efeito monetário do cupom (percent_off/amount_off) sobre um PriceQuote já resolvido. */
|
|
24
|
+
export function applyCouponToQuote(quote, coupon) {
|
|
25
|
+
if (coupon.effectType === 'percent_off' && coupon.percentOff != null) {
|
|
26
|
+
const factor = 1 - coupon.percentOff / 100;
|
|
27
|
+
return { ...quote, total: Math.round(quote.total * factor * 100) / 100 };
|
|
28
|
+
}
|
|
29
|
+
if (coupon.effectType === 'amount_off' && coupon.amountOff != null) {
|
|
30
|
+
return { ...quote, total: Math.max(0, quote.total - coupon.amountOff) };
|
|
31
|
+
}
|
|
32
|
+
// trial_extension / free_module_period / promotional_credit não alteram o
|
|
33
|
+
// preço do quote — afetam a duração do trial (ver `offer-application.ts`) ou
|
|
34
|
+
// concedem crédito/módulo (fora do escopo de preço).
|
|
35
|
+
return quote;
|
|
36
|
+
}
|
|
37
|
+
/** Dias de trial adicionais concedidos pelo cupom (0 se o efeito não for trial_extension). */
|
|
38
|
+
export function couponTrialExtensionDays(coupon) {
|
|
39
|
+
return coupon?.effectType === 'trial_extension' ? (coupon.trialExtensionDays ?? 0) : 0;
|
|
40
|
+
}
|
|
41
|
+
/** Módulo liberado temporariamente pelo cupom, se houver (free_module_period). */
|
|
42
|
+
export function couponFreeModule(coupon) {
|
|
43
|
+
if (coupon?.effectType !== 'free_module_period' || !coupon.freeModuleCode)
|
|
44
|
+
return null;
|
|
45
|
+
return { moduleCode: coupon.freeModuleCode, periodDays: coupon.freeModulePeriodDays ?? 30 };
|
|
46
|
+
}
|
|
47
|
+
//# 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,10 @@
|
|
|
1
|
+
export type { ProductLineCode, ProductLineStatus, ProductLineRecord, PlanFranchises, CommercialPlan, ModuleClass, ModuleRecord, BundleRecord, CouponEffectType, CouponRecord, CommercialPriceTableStatus, CommercialPriceTargetType, CommercialPriceItem, CommercialPriceScope, CommercialPriceTable, OfferRecord, PriceQuote, } from './types.js';
|
|
2
|
+
export { KNOWN_ACTIVE_PRODUCT_LINES } from './types.js';
|
|
3
|
+
export type { CatalogValidationError, OfferValidationInput } from './catalog.js';
|
|
4
|
+
export { validateOffer, resolvePriceQuote } from './catalog.js';
|
|
5
|
+
export type { CouponApplicationError } from './coupon.js';
|
|
6
|
+
export { validateCoupon, applyCouponToQuote, couponTrialExtensionDays, couponFreeModule } from './coupon.js';
|
|
7
|
+
export type { ApplyOfferInput, ApplyOfferResult } from './offer-application.js';
|
|
8
|
+
export { applyOffer } from './offer-application.js';
|
|
9
|
+
export type { ConsumptionUsageType, ConsumptionEventContract, ConsumptionFranchise, ExcessPolicy, ConsumptionExcessRule, } from './consumption-contracts.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commercial-catalog/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAExD,YAAY,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEhE,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE7G,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,YAAY,EACV,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,GACtB,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { KNOWN_ACTIVE_PRODUCT_LINES } from './types.js';
|
|
2
|
+
export { validateOffer, resolvePriceQuote } from './catalog.js';
|
|
3
|
+
export { validateCoupon, applyCouponToQuote, couponTrialExtensionDays, couponFreeModule } from './coupon.js';
|
|
4
|
+
export { applyOffer } from './offer-application.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commercial-catalog/index.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGhE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG7G,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type ReconcileResult } from '../subscription-billing/reconcile.js';
|
|
2
|
+
import type { Subscription } from '../subscription-billing/types.js';
|
|
3
|
+
import { type EntitlementRecord } from '../entitlements/index.js';
|
|
4
|
+
import { type CatalogValidationError } from './catalog.js';
|
|
5
|
+
import type { BundleRecord, CommercialPlan, CommercialPriceTable, CouponRecord, ModuleRecord, OfferRecord, PriceQuote, ProductLineCode } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Orquestração de "aceitar uma Offer" — o seam central do Track A1
|
|
8
|
+
* (RFC-CAPABILITY-COMMERCIAL-CATALOG-001 §8): Offer compõe, cada domínio
|
|
9
|
+
* calcula a sua parte, nenhum duplica regra do outro.
|
|
10
|
+
*
|
|
11
|
+
* Catálogo (valida elegibilidade/dependências + resolve preço)
|
|
12
|
+
* → Cupom (ajusta preço/trial/módulo grátis, se houver)
|
|
13
|
+
* → Subscription Billing CERTIFICADO (`startTrial` — não reimplementado aqui)
|
|
14
|
+
* → Entitlements (deriva o que fica habilitado)
|
|
15
|
+
*/
|
|
16
|
+
export interface ApplyOfferInput {
|
|
17
|
+
tenantId: string;
|
|
18
|
+
/** A linha já resolvida pelo consumidor (equivalente a `tenant.productLine`/`product_tenant` — nunca resolvida aqui). */
|
|
19
|
+
productLine: ProductLineCode;
|
|
20
|
+
offer: OfferRecord;
|
|
21
|
+
plan: CommercialPlan;
|
|
22
|
+
modules: ModuleRecord[];
|
|
23
|
+
bundles: BundleRecord[];
|
|
24
|
+
priceTable: CommercialPriceTable;
|
|
25
|
+
coupon?: CouponRecord;
|
|
26
|
+
currentEntitlements: EntitlementRecord[];
|
|
27
|
+
/** Instante do fato, ISO — injetado (nunca `Date.now()` aqui, mesma disciplina do subscription-billing). */
|
|
28
|
+
now: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ApplyOfferResult {
|
|
31
|
+
subscription: Subscription;
|
|
32
|
+
domainEvents: ReconcileResult['domainEvents'];
|
|
33
|
+
entitlements: EntitlementRecord[];
|
|
34
|
+
quote: PriceQuote;
|
|
35
|
+
/** Não-vazio → o consumidor NÃO deve persistir subscription/entitlements (aceitação inválida). */
|
|
36
|
+
errors: CatalogValidationError[];
|
|
37
|
+
}
|
|
38
|
+
export declare function applyOffer(input: ApplyOfferInput): ApplyOfferResult;
|
|
39
|
+
//# sourceMappingURL=offer-application.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offer-application.d.ts","sourceRoot":"","sources":["../../src/commercial-catalog/offer-application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAsB,KAAK,iBAAiB,EAA0B,MAAM,0BAA0B,CAAC;AAC9G,OAAO,EAAoC,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE7F,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;GASG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,yHAAyH;IACzH,WAAW,EAAE,eAAe,CAAC;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,oBAAoB,CAAC;IACjC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;IACzC,4GAA4G;IAC5G,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IAC9C,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,KAAK,EAAE,UAAU,CAAC;IAClB,kGAAkG;IAClG,MAAM,EAAE,sBAAsB,EAAE,CAAC;CAClC;AAaD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAyCnE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { startTrial } from '../subscription-billing/reconcile.js';
|
|
2
|
+
import { deriveEntitlements } from '../entitlements/index.js';
|
|
3
|
+
import { resolvePriceQuote, validateOffer } from './catalog.js';
|
|
4
|
+
import { validateCoupon, applyCouponToQuote, couponTrialExtensionDays, couponFreeModule } from './coupon.js';
|
|
5
|
+
/** Aceita data pura (`YYYY-MM-DD`) ou datetime ISO completo (mesma normalização do subscription-billing). */
|
|
6
|
+
function parseIso(iso) {
|
|
7
|
+
return /^\d{4}-\d{2}-\d{2}$/.test(iso) ? new Date(`${iso}T00:00:00Z`) : new Date(iso);
|
|
8
|
+
}
|
|
9
|
+
function addDaysIso(iso, days) {
|
|
10
|
+
const d = parseIso(iso);
|
|
11
|
+
d.setUTCDate(d.getUTCDate() + days);
|
|
12
|
+
return d.toISOString();
|
|
13
|
+
}
|
|
14
|
+
export function applyOffer(input) {
|
|
15
|
+
const { tenantId, productLine, offer, plan, modules, bundles, priceTable, coupon, currentEntitlements, now } = input;
|
|
16
|
+
const errors = validateOffer({ offer, plan, modules, bundles, productLine });
|
|
17
|
+
if (coupon) {
|
|
18
|
+
errors.push(...validateCoupon(coupon, now, { planCode: offer.planCode, moduleCodes: offer.moduleCodes }));
|
|
19
|
+
}
|
|
20
|
+
let quote = resolvePriceQuote(offer, priceTable, now);
|
|
21
|
+
if (coupon)
|
|
22
|
+
quote = applyCouponToQuote(quote, coupon);
|
|
23
|
+
// Trial é política da ASSINATURA, não do Plano (RFC §19): default do plano,
|
|
24
|
+
// sobrescrito pela Offer, estendido por cupom — nunca uma constante fixa.
|
|
25
|
+
const trialDays = (offer.trialDaysOverride ?? plan.defaultTrialDays) + couponTrialExtensionDays(coupon);
|
|
26
|
+
const trialEndsAt = addDaysIso(now, trialDays);
|
|
27
|
+
const { subscription, domainEvents } = startTrial(tenantId, offer.planCode, trialEndsAt, now);
|
|
28
|
+
const targetGrants = offer.moduleCodes.map((moduleCode) => ({
|
|
29
|
+
moduleCode,
|
|
30
|
+
source: 'PLAN',
|
|
31
|
+
expiresAt: null,
|
|
32
|
+
}));
|
|
33
|
+
const freeModule = couponFreeModule(coupon);
|
|
34
|
+
if (freeModule && !offer.moduleCodes.includes(freeModule.moduleCode)) {
|
|
35
|
+
targetGrants.push({
|
|
36
|
+
moduleCode: freeModule.moduleCode,
|
|
37
|
+
source: 'COUPON',
|
|
38
|
+
expiresAt: addDaysIso(now, freeModule.periodDays),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const entitlements = deriveEntitlements({
|
|
42
|
+
tenantId,
|
|
43
|
+
subscriptionId: subscription.subscriptionId,
|
|
44
|
+
targetGrants,
|
|
45
|
+
current: currentEntitlements,
|
|
46
|
+
now,
|
|
47
|
+
});
|
|
48
|
+
return { subscription, domainEvents, entitlements, quote, errors };
|
|
49
|
+
}
|
|
50
|
+
//# 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":"AAAA,OAAO,EAAE,UAAU,EAAwB,MAAM,sCAAsC,CAAC;AAExF,OAAO,EAAE,kBAAkB,EAAkD,MAAM,0BAA0B,CAAC;AAC9G,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAA+B,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA+C7G,6GAA6G;AAC7G,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,IAAY;IAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;IACpC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAErH,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAC7E,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC5G,CAAC;IAED,IAAI,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IACtD,IAAI,MAAM;QAAE,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEtD,4EAA4E;IAC5E,0EAA0E;IAC1E,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACxG,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAE/C,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;IAE9F,MAAM,YAAY,GAAwB,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC/E,UAAU;QACV,MAAM,EAAE,MAAe;QACvB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC,CAAC;IACJ,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,UAAU,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACrE,YAAY,CAAC,IAAI,CAAC;YAChB,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,MAAM,EAAE,QAAiB;YACzB,SAAS,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,UAAU,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,CAAC;QACtC,QAAQ;QACR,cAAc,EAAE,YAAY,CAAC,cAAc;QAC3C,YAAY;QACZ,OAAO,EAAE,mBAAmB;QAC5B,GAAG;KACJ,CAAC,CAAC;IAEH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commercial Catalog — contrato canônico (Track A1, derivado de
|
|
3
|
+
* RFC-CAPABILITY-COMMERCIAL-CATALOG-001 §4/§7 + RFC-COMMERCIAL-MODEL-001).
|
|
4
|
+
* Escopo: Baruk.app Representante + Indústria. Domínio PURO (sem DB, sem
|
|
5
|
+
* `Date.now()` interno) — mesmo padrão de `subscription-billing/`.
|
|
6
|
+
*
|
|
7
|
+
* Princípio transversal (nunca colapsar): Identidade (`code` estável / `name`
|
|
8
|
+
* editável) ≠ Precificação (vive na `CommercialPriceTable` versionada, NUNCA no
|
|
9
|
+
* Plan/Module) ≠ Vigência (da tabela/campanha/oferta) ≠ Elegibilidade (regras
|
|
10
|
+
* de quem pode contratar).
|
|
11
|
+
*
|
|
12
|
+
* Reconciliação Reality-First (achado do Track A1, 2026-07-22): o schema real
|
|
13
|
+
* de `manga-verde-bi` guarda `productLine` no TENANT (`tenant.productLine:
|
|
14
|
+
* 'rep' | 'ind'`, resolvido por precedência — coluna explícita > regra de
|
|
15
|
+
* founder-tenant-id), NÃO no Plan. Portanto este módulo NÃO amarra um Plan/
|
|
16
|
+
* Module a uma única linha fixa — `productLineEligibility` é uma lista
|
|
17
|
+
* OPCIONAL (undefined/vazio = elegível a todas as linhas ativas). Qual linha
|
|
18
|
+
* um tenant específico roda é resolvido pelo CONSUMIDOR (equivalente ao
|
|
19
|
+
* `product/tenant_product` do `baruk-platform`, ou ao `tenant.productLine` do
|
|
20
|
+
* mvb) — este módulo recebe a linha já resolvida, nunca a resolve sozinho.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Linhas ATIVAS hoje (evidência real: `product-line.ts` do mvb só implementa
|
|
24
|
+
* 'rep'|'ind'). 'varejo' e futuras (contabilidade/saúde/agro/educação) entram
|
|
25
|
+
* como REGISTRO NOVO — nunca exigem união de tipo nova no domínio, por isso o
|
|
26
|
+
* tipo abaixo é `string` com as ativas apenas documentadas, não um union fechado.
|
|
27
|
+
*/
|
|
28
|
+
export type ProductLineCode = string;
|
|
29
|
+
export declare const KNOWN_ACTIVE_PRODUCT_LINES: readonly ProductLineCode[];
|
|
30
|
+
export type ProductLineStatus = 'active' | 'reserved';
|
|
31
|
+
export interface ProductLineRecord {
|
|
32
|
+
code: ProductLineCode;
|
|
33
|
+
name: string;
|
|
34
|
+
status: ProductLineStatus;
|
|
35
|
+
metadata?: Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
export interface PlanFranchises {
|
|
38
|
+
includedUsers: number;
|
|
39
|
+
storageIncludedBytes: number;
|
|
40
|
+
includedCreditsPerCycle: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Envelope comercial. `code` é a identidade ESTÁVEL (persistida em
|
|
44
|
+
* `Subscription.items[].planKey` do subscription-billing); `name` é dado
|
|
45
|
+
* editável (Pricing Studio) — nunca usar `name` como chave.
|
|
46
|
+
*/
|
|
47
|
+
export interface CommercialPlan {
|
|
48
|
+
code: string;
|
|
49
|
+
name: string;
|
|
50
|
+
tier: number;
|
|
51
|
+
franchises: PlanFranchises;
|
|
52
|
+
/** Duração padrão de trial (dias) — política, sobrescrita por Coupon/campanha (§ trial). */
|
|
53
|
+
defaultTrialDays: number;
|
|
54
|
+
/** Undefined/vazio = elegível a qualquer ProductLine ativa. */
|
|
55
|
+
productLineEligibility?: ProductLineCode[];
|
|
56
|
+
isPublic: boolean;
|
|
57
|
+
isActive: boolean;
|
|
58
|
+
metadata?: Record<string, unknown>;
|
|
59
|
+
}
|
|
60
|
+
export type ModuleClass = 'CORE' | 'ADD_ON' | 'PREMIUM' | 'ENTERPRISE';
|
|
61
|
+
export interface ModuleRecord {
|
|
62
|
+
code: string;
|
|
63
|
+
name: string;
|
|
64
|
+
class: ModuleClass;
|
|
65
|
+
/** Ex.: 'communication' — o rótulo organizador "Communication Hub" (RFC §29.4). */
|
|
66
|
+
category?: string;
|
|
67
|
+
/** Dependências reais — nunca artificiais (restrição explícita). */
|
|
68
|
+
requiredModuleCodes: string[];
|
|
69
|
+
productLineEligibility?: ProductLineCode[];
|
|
70
|
+
marketplaceVisible: boolean;
|
|
71
|
+
isActive: boolean;
|
|
72
|
+
}
|
|
73
|
+
export interface BundleRecord {
|
|
74
|
+
code: string;
|
|
75
|
+
name: string;
|
|
76
|
+
moduleCodes: string[];
|
|
77
|
+
/** Referência à regra de desconto resolvida pelo Pricing Engine (não aqui). */
|
|
78
|
+
discountRuleRef?: string;
|
|
79
|
+
isActive: boolean;
|
|
80
|
+
}
|
|
81
|
+
export type CouponEffectType = 'percent_off' | 'amount_off' | 'trial_extension' | 'free_module_period' | 'promotional_credit';
|
|
82
|
+
export interface CouponRecord {
|
|
83
|
+
code: string;
|
|
84
|
+
effectType: CouponEffectType;
|
|
85
|
+
/** 0-100, só para percent_off. */
|
|
86
|
+
percentOff?: number;
|
|
87
|
+
/** Valor absoluto, só para amount_off (mesma unidade da CommercialPriceTable). */
|
|
88
|
+
amountOff?: number;
|
|
89
|
+
/** Dias adicionais de trial, só para trial_extension. */
|
|
90
|
+
trialExtensionDays?: number;
|
|
91
|
+
/** Módulo liberado temporariamente, só para free_module_period. */
|
|
92
|
+
freeModuleCode?: string;
|
|
93
|
+
freeModulePeriodDays?: number;
|
|
94
|
+
/** Créditos promocionais concedidos, só para promotional_credit. */
|
|
95
|
+
promotionalCredits?: number;
|
|
96
|
+
appliesToPlanCodes?: string[];
|
|
97
|
+
appliesToModuleCodes?: string[];
|
|
98
|
+
maxRedemptions?: number | null;
|
|
99
|
+
/** Contagem de resgates já feitos — injetada pelo consumidor (persistência fora deste domínio). */
|
|
100
|
+
redemptionsCount?: number;
|
|
101
|
+
validFrom: string;
|
|
102
|
+
validTo: string | null;
|
|
103
|
+
isActive: boolean;
|
|
104
|
+
}
|
|
105
|
+
export type CommercialPriceTableStatus = 'draft' | 'scheduled' | 'active' | 'superseded' | 'archived';
|
|
106
|
+
export type CommercialPriceTargetType = 'PLAN' | 'MODULE' | 'BUNDLE' | 'ADDON' | 'CREDIT_PACKAGE' | 'SEAT';
|
|
107
|
+
export interface CommercialPriceItem {
|
|
108
|
+
targetType: CommercialPriceTargetType;
|
|
109
|
+
targetCode: string;
|
|
110
|
+
amount: number;
|
|
111
|
+
interval: 'monthly' | 'yearly' | 'one_time';
|
|
112
|
+
}
|
|
113
|
+
export interface CommercialPriceScope {
|
|
114
|
+
/** Ex.: productLine, segment, tenantId — precedência por `priority` (maior vence). */
|
|
115
|
+
scopeType: 'PRODUCT_LINE' | 'SEGMENT' | 'TENANT' | 'ALL';
|
|
116
|
+
matchValue?: string;
|
|
117
|
+
priority: number;
|
|
118
|
+
}
|
|
119
|
+
export interface CommercialPriceTable {
|
|
120
|
+
code: string;
|
|
121
|
+
currency: string;
|
|
122
|
+
status: CommercialPriceTableStatus;
|
|
123
|
+
version: number;
|
|
124
|
+
effectiveFrom: string;
|
|
125
|
+
effectiveTo: string | null;
|
|
126
|
+
scopes: CommercialPriceScope[];
|
|
127
|
+
items: CommercialPriceItem[];
|
|
128
|
+
}
|
|
129
|
+
export interface OfferRecord {
|
|
130
|
+
code: string;
|
|
131
|
+
name: string;
|
|
132
|
+
planCode: string;
|
|
133
|
+
moduleCodes: string[];
|
|
134
|
+
bundleCodes: string[];
|
|
135
|
+
addonCodes: string[];
|
|
136
|
+
couponCode?: string;
|
|
137
|
+
/** Sobrescreve `CommercialPlan.defaultTrialDays` quando definido (trial é política da Offer/Subscription). */
|
|
138
|
+
trialDaysOverride?: number;
|
|
139
|
+
priceTableCode: string;
|
|
140
|
+
productLineEligibility?: ProductLineCode[];
|
|
141
|
+
isActive: boolean;
|
|
142
|
+
}
|
|
143
|
+
/** Resultado de resolução de preço — o `PriceQuote` referenciado pela RFC. */
|
|
144
|
+
export interface PriceQuote {
|
|
145
|
+
currency: string;
|
|
146
|
+
items: Array<{
|
|
147
|
+
targetType: CommercialPriceTargetType;
|
|
148
|
+
targetCode: string;
|
|
149
|
+
amount: number;
|
|
150
|
+
}>;
|
|
151
|
+
total: number;
|
|
152
|
+
priceTableCode: string;
|
|
153
|
+
priceTableVersion: number;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commercial-catalog/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commercial Catalog — contrato canônico (Track A1, derivado de
|
|
3
|
+
* RFC-CAPABILITY-COMMERCIAL-CATALOG-001 §4/§7 + RFC-COMMERCIAL-MODEL-001).
|
|
4
|
+
* Escopo: Baruk.app Representante + Indústria. Domínio PURO (sem DB, sem
|
|
5
|
+
* `Date.now()` interno) — mesmo padrão de `subscription-billing/`.
|
|
6
|
+
*
|
|
7
|
+
* Princípio transversal (nunca colapsar): Identidade (`code` estável / `name`
|
|
8
|
+
* editável) ≠ Precificação (vive na `CommercialPriceTable` versionada, NUNCA no
|
|
9
|
+
* Plan/Module) ≠ Vigência (da tabela/campanha/oferta) ≠ Elegibilidade (regras
|
|
10
|
+
* de quem pode contratar).
|
|
11
|
+
*
|
|
12
|
+
* Reconciliação Reality-First (achado do Track A1, 2026-07-22): o schema real
|
|
13
|
+
* de `manga-verde-bi` guarda `productLine` no TENANT (`tenant.productLine:
|
|
14
|
+
* 'rep' | 'ind'`, resolvido por precedência — coluna explícita > regra de
|
|
15
|
+
* founder-tenant-id), NÃO no Plan. Portanto este módulo NÃO amarra um Plan/
|
|
16
|
+
* Module a uma única linha fixa — `productLineEligibility` é uma lista
|
|
17
|
+
* OPCIONAL (undefined/vazio = elegível a todas as linhas ativas). Qual linha
|
|
18
|
+
* um tenant específico roda é resolvido pelo CONSUMIDOR (equivalente ao
|
|
19
|
+
* `product/tenant_product` do `baruk-platform`, ou ao `tenant.productLine` do
|
|
20
|
+
* mvb) — este módulo recebe a linha já resolvida, nunca a resolve sozinho.
|
|
21
|
+
*/
|
|
22
|
+
export const KNOWN_ACTIVE_PRODUCT_LINES = ['rep', 'ind'];
|
|
23
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commercial-catalog/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAYH,MAAM,CAAC,MAAM,0BAA0B,GAA+B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC"}
|