@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,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PortalOnboardingFeatureDisabledError = void 0;
|
|
4
|
+
exports.listPortalOnboardings = listPortalOnboardings;
|
|
5
|
+
exports.getPortalOnboarding = getPortalOnboarding;
|
|
6
|
+
exports.listPortalTimeline = listPortalTimeline;
|
|
7
|
+
const shared_1 = require("@baruk/shared");
|
|
8
|
+
class PortalOnboardingFeatureDisabledError extends shared_1.AppError {
|
|
9
|
+
constructor() {
|
|
10
|
+
super('O onboarding do Portal está indisponível', {
|
|
11
|
+
status: 404,
|
|
12
|
+
code: 'PORTAL_ONBOARDING_FEATURE_DISABLED',
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.PortalOnboardingFeatureDisabledError = PortalOnboardingFeatureDisabledError;
|
|
17
|
+
const PUBLIC_EVENT_SUMMARY = {
|
|
18
|
+
'onboarding.created': 'Seu onboarding foi criado',
|
|
19
|
+
'onboarding.active': 'O onboarding foi iniciado',
|
|
20
|
+
'onboarding.blocked': 'O onboarding aguarda informações',
|
|
21
|
+
'onboarding.cancelled': 'O onboarding foi encerrado',
|
|
22
|
+
'onboarding.item.created': 'Uma pendência foi adicionada',
|
|
23
|
+
'onboarding.item.started': 'Uma pendência foi iniciada',
|
|
24
|
+
'onboarding.item.completed': 'Uma pendência foi concluída',
|
|
25
|
+
'onboarding.item.not_applicable': 'Uma pendência não se aplica',
|
|
26
|
+
'onboarding.document.requested': 'Um documento foi solicitado',
|
|
27
|
+
'onboarding.document.received': 'Um documento foi recebido',
|
|
28
|
+
'onboarding.document.validated': 'Um documento foi validado',
|
|
29
|
+
'onboarding.document.rejected': 'Um documento precisa de atenção',
|
|
30
|
+
'onboarding.completed': 'O onboarding foi concluído',
|
|
31
|
+
'onboarding.portal_response_submitted': 'Sua resposta foi enviada e aguarda análise do escritório',
|
|
32
|
+
'onboarding.portal_response_supplemented': 'Sua informação complementar foi enviada e aguarda análise',
|
|
33
|
+
'onboarding.portal_comment_created': 'Sua mensagem foi enviada ao escritório',
|
|
34
|
+
'onboarding.external_delivery_confirmed': 'Você informou que enviou um documento por outro canal',
|
|
35
|
+
};
|
|
36
|
+
const PUBLIC_EVENT_TYPES = new Set(Object.keys(PUBLIC_EVENT_SUMMARY));
|
|
37
|
+
function publicStatus(status) {
|
|
38
|
+
if (status === 'draft')
|
|
39
|
+
return 'preparing';
|
|
40
|
+
if (status === 'active')
|
|
41
|
+
return 'in_progress';
|
|
42
|
+
if (status === 'blocked')
|
|
43
|
+
return 'waiting_for_information';
|
|
44
|
+
if (status === 'completed')
|
|
45
|
+
return 'completed';
|
|
46
|
+
return 'closed';
|
|
47
|
+
}
|
|
48
|
+
function iso(value) {
|
|
49
|
+
return value ? new Date(String(value)).toISOString() : null;
|
|
50
|
+
}
|
|
51
|
+
function percentage(completed, total) {
|
|
52
|
+
return total === 0 ? 0 : Math.round((completed / total) * 100);
|
|
53
|
+
}
|
|
54
|
+
async function baseRow(tx, id) {
|
|
55
|
+
const rows = await tx `
|
|
56
|
+
SELECT oi.id, oi.status, oi.due_at, oi.updated_at, oi.created_at,
|
|
57
|
+
c.display_name,
|
|
58
|
+
count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal') AS item_total,
|
|
59
|
+
count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal' AND item.status IN ('completed', 'not_applicable')) AS item_completed,
|
|
60
|
+
count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal' AND item.status NOT IN ('completed', 'not_applicable')) AS item_pending,
|
|
61
|
+
count(DISTINCT dr.id) AS document_total,
|
|
62
|
+
count(DISTINCT dr.id) FILTER (WHERE dr.status NOT IN ('validated')) AS document_pending
|
|
63
|
+
FROM onboarding_instance oi
|
|
64
|
+
JOIN client c ON c.id = oi.client_id AND c.deleted_at IS NULL
|
|
65
|
+
LEFT JOIN onboarding_item item ON item.onboarding_id = oi.id AND item.visibility = 'portal'
|
|
66
|
+
LEFT JOIN onboarding_document_requirement dr ON dr.onboarding_id = oi.id
|
|
67
|
+
WHERE oi.id = ${id ?? null}::uuid
|
|
68
|
+
GROUP BY oi.id, c.display_name
|
|
69
|
+
`;
|
|
70
|
+
return rows[0] ?? null;
|
|
71
|
+
}
|
|
72
|
+
function mapBase(row) {
|
|
73
|
+
const total = Number(row.item_total ?? 0);
|
|
74
|
+
const completed = Number(row.item_completed ?? 0);
|
|
75
|
+
const dueAt = iso(row.due_at);
|
|
76
|
+
const status = publicStatus(String(row.status));
|
|
77
|
+
return {
|
|
78
|
+
id: String(row.id),
|
|
79
|
+
clientDisplayName: String(row.display_name),
|
|
80
|
+
status,
|
|
81
|
+
progress: { completed, total, percentage: percentage(completed, total) },
|
|
82
|
+
dueAt,
|
|
83
|
+
overdue: !!dueAt &&
|
|
84
|
+
new Date(dueAt).getTime() < Date.now() &&
|
|
85
|
+
!['completed', 'closed'].includes(status),
|
|
86
|
+
pendingItemsCount: Number(row.item_pending ?? 0),
|
|
87
|
+
pendingDocumentRequirementsCount: Number(row.document_pending ?? 0),
|
|
88
|
+
lastPublicUpdateAt: iso(row.updated_at) ?? iso(row.created_at),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async function listPortalOnboardings(tx, limit = 20, offset = 0) {
|
|
92
|
+
const rows = await tx `
|
|
93
|
+
SELECT oi.id, oi.status, oi.due_at, oi.updated_at, oi.created_at,
|
|
94
|
+
c.display_name,
|
|
95
|
+
count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal') AS item_total,
|
|
96
|
+
count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal' AND item.status IN ('completed', 'not_applicable')) AS item_completed,
|
|
97
|
+
count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal' AND item.status NOT IN ('completed', 'not_applicable')) AS item_pending,
|
|
98
|
+
count(DISTINCT dr.id) AS document_total,
|
|
99
|
+
count(DISTINCT dr.id) FILTER (WHERE dr.status NOT IN ('validated')) AS document_pending,
|
|
100
|
+
count(*) OVER() AS total
|
|
101
|
+
FROM onboarding_instance oi
|
|
102
|
+
JOIN client c ON c.id = oi.client_id AND c.deleted_at IS NULL
|
|
103
|
+
LEFT JOIN onboarding_item item ON item.onboarding_id = oi.id AND item.visibility = 'portal'
|
|
104
|
+
LEFT JOIN onboarding_document_requirement dr ON dr.onboarding_id = oi.id
|
|
105
|
+
GROUP BY oi.id, c.display_name
|
|
106
|
+
ORDER BY oi.updated_at DESC, oi.id
|
|
107
|
+
LIMIT ${Math.min(Math.max(limit, 1), 50)} OFFSET ${Math.max(offset, 0)}
|
|
108
|
+
`;
|
|
109
|
+
return { items: rows.map(mapBase), total: rows[0] ? Number(rows[0].total) : 0 };
|
|
110
|
+
}
|
|
111
|
+
async function getPortalOnboarding(tx, id) {
|
|
112
|
+
const row = await baseRow(tx, id);
|
|
113
|
+
if (!row)
|
|
114
|
+
return null;
|
|
115
|
+
const items = await tx `
|
|
116
|
+
SELECT id, title, description, status, required, due_at, completed_at
|
|
117
|
+
FROM onboarding_item
|
|
118
|
+
WHERE onboarding_id = ${id} AND visibility = 'portal'
|
|
119
|
+
ORDER BY item_order, created_at
|
|
120
|
+
`;
|
|
121
|
+
const documents = await tx `
|
|
122
|
+
SELECT id, label, status, requested_at, received_at, validated_at, expires_at
|
|
123
|
+
FROM onboarding_document_requirement
|
|
124
|
+
WHERE onboarding_id = ${id}
|
|
125
|
+
ORDER BY requested_at
|
|
126
|
+
`;
|
|
127
|
+
const events = await tx `
|
|
128
|
+
SELECT event_type, occurred_at
|
|
129
|
+
FROM onboarding_event
|
|
130
|
+
WHERE onboarding_id = ${id} AND event_type = ANY(${Array.from(PUBLIC_EVENT_TYPES)})
|
|
131
|
+
ORDER BY occurred_at ASC, event_id ASC
|
|
132
|
+
`;
|
|
133
|
+
return {
|
|
134
|
+
...mapBase(row),
|
|
135
|
+
items: items.map((item) => ({
|
|
136
|
+
id: String(item.id),
|
|
137
|
+
title: String(item.title),
|
|
138
|
+
description: item.description ? String(item.description) : null,
|
|
139
|
+
status: item.status,
|
|
140
|
+
required: Boolean(item.required),
|
|
141
|
+
dueAt: iso(item.due_at),
|
|
142
|
+
completedAt: iso(item.completed_at),
|
|
143
|
+
})),
|
|
144
|
+
documentRequirements: documents.map((document) => ({
|
|
145
|
+
id: String(document.id),
|
|
146
|
+
label: String(document.label),
|
|
147
|
+
status: document.status,
|
|
148
|
+
requestedAt: iso(document.requested_at),
|
|
149
|
+
receivedAt: iso(document.received_at),
|
|
150
|
+
validatedAt: iso(document.validated_at),
|
|
151
|
+
expiresAt: iso(document.expires_at),
|
|
152
|
+
})),
|
|
153
|
+
timeline: events.map((event) => ({
|
|
154
|
+
eventType: String(event.event_type),
|
|
155
|
+
summary: PUBLIC_EVENT_SUMMARY[String(event.event_type)],
|
|
156
|
+
occurredAt: iso(event.occurred_at),
|
|
157
|
+
})),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async function listPortalTimeline(tx, id, limit = 20, offset = 0) {
|
|
161
|
+
const rows = await tx `
|
|
162
|
+
SELECT event_type, occurred_at, count(*) OVER() AS total
|
|
163
|
+
FROM onboarding_event
|
|
164
|
+
WHERE onboarding_id = ${id} AND event_type = ANY(${Array.from(PUBLIC_EVENT_TYPES)})
|
|
165
|
+
ORDER BY occurred_at ASC, event_id ASC
|
|
166
|
+
LIMIT ${Math.min(Math.max(limit, 1), 50)} OFFSET ${Math.max(offset, 0)}
|
|
167
|
+
`;
|
|
168
|
+
return {
|
|
169
|
+
items: rows.map((event) => ({
|
|
170
|
+
eventType: String(event.event_type),
|
|
171
|
+
summary: PUBLIC_EVENT_SUMMARY[String(event.event_type)],
|
|
172
|
+
occurredAt: iso(event.occurred_at),
|
|
173
|
+
})),
|
|
174
|
+
total: rows[0] ? Number(rows[0].total) : 0,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=portal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portal.js","sourceRoot":"","sources":["../../../src/onboarding/portal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPortalClientId = getPortalClientId;
|
|
4
|
+
exports.listPortalUserIds = listPortalUserIds;
|
|
5
|
+
exports.ensurePortalAccess = ensurePortalAccess;
|
|
6
|
+
const shared_1 = require("@baruk/shared");
|
|
7
|
+
/**
|
|
8
|
+
* Acesso de portal: liga um usuário `client_portal` a um `client` específico.
|
|
9
|
+
* O portal restringe TODA leitura ao `clientId` resolvido aqui — um cliente
|
|
10
|
+
* nunca vê outro cliente do mesmo tenant.
|
|
11
|
+
*/
|
|
12
|
+
async function getPortalClientId(tx, userId) {
|
|
13
|
+
const rows = await tx `
|
|
14
|
+
SELECT client_id FROM client_portal_access
|
|
15
|
+
WHERE user_id = ${userId} AND status = 'active'
|
|
16
|
+
ORDER BY created_at ASC LIMIT 1
|
|
17
|
+
`;
|
|
18
|
+
if (!rows[0])
|
|
19
|
+
throw new shared_1.ForbiddenError('Usuário de portal sem cliente vinculado');
|
|
20
|
+
return rows[0].client_id;
|
|
21
|
+
}
|
|
22
|
+
/** IDs dos usuários de portal ativos vinculados a um client (fan-out de notificações). */
|
|
23
|
+
async function listPortalUserIds(tx, clientId) {
|
|
24
|
+
const rows = await tx `
|
|
25
|
+
SELECT user_id FROM client_portal_access
|
|
26
|
+
WHERE client_id = ${clientId} AND status = 'active'
|
|
27
|
+
`;
|
|
28
|
+
return rows.map((r) => r.user_id);
|
|
29
|
+
}
|
|
30
|
+
async function ensurePortalAccess(tx, userId, clientId) {
|
|
31
|
+
await tx `
|
|
32
|
+
INSERT INTO client_portal_access (id, tenant_id, user_id, client_id)
|
|
33
|
+
VALUES (${(0, shared_1.uuidv7)()}, current_setting('app.current_tenant')::uuid, ${userId}, ${clientId})
|
|
34
|
+
ON CONFLICT (tenant_id, user_id, client_id) DO NOTHING
|
|
35
|
+
`;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/portal/repository.ts"],"names":[],"mappings":";;AAQA,8CAQC;AAGD,8CAMC;AAED,gDAMC;AAjCD,0CAAuD;AAGvD;;;;GAIG;AACI,KAAK,UAAU,iBAAiB,CAAC,EAAM,EAAE,MAAc;IAC5D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAyB;;sBAE1B,MAAM;;GAEzB,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,uBAAc,CAAC,yCAAyC,CAAC,CAAC;IAClF,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3B,CAAC;AAED,0FAA0F;AACnF,KAAK,UAAU,iBAAiB,CAAC,EAAM,EAAE,QAAgB;IAC9D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAuB;;wBAEtB,QAAQ;GAC7B,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,EAAM,EAAE,MAAc,EAAE,QAAgB;IAC/E,MAAM,EAAE,CAAA;;cAEI,IAAA,eAAM,GAAE,kDAAkD,MAAM,KAAK,QAAQ;;GAExF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assertBundleModulesCovered = assertBundleModulesCovered;
|
|
4
|
+
exports.freeModuleCodesForBundle = freeModuleCodesForBundle;
|
|
5
|
+
exports.resolveBundleDiscount = resolveBundleDiscount;
|
|
6
|
+
const money_js_1 = require("./money.js");
|
|
7
|
+
const errors_js_1 = require("./errors.js");
|
|
8
|
+
/**
|
|
9
|
+
* Bundle (RFC §8 passo 5 / ETAPA 6) — NUNCA dupla cobrança: os módulos já
|
|
10
|
+
* foram precificados 1× cada em `MODULE_PRICE`; o bundle só declara a
|
|
11
|
+
* combinação (`BundleRecord`, em `commercial-catalog/`) e aplica um desconto
|
|
12
|
+
* ou zera o preço de um módulo incluído gratuitamente — nunca soma um novo
|
|
13
|
+
* item cobrável. `BundleRecord.discountRuleRef` é apenas uma referência
|
|
14
|
+
* (Catalog não resolve a regra); `BundlePricingRule` é a regra RESOLVIDA que
|
|
15
|
+
* o consumidor injeta para este cálculo (Catalog permanece intocado).
|
|
16
|
+
*/
|
|
17
|
+
function assertBundleModulesCovered(bundle, chargedModuleCodes) {
|
|
18
|
+
const missing = bundle.moduleCodes.filter((m) => !chargedModuleCodes.has(m));
|
|
19
|
+
if (missing.length > 0) {
|
|
20
|
+
throw new errors_js_1.PricingEngineError('invalid-bundle', `Bundle "${bundle.code}" exige módulos ausentes na oferta: ${missing.join(', ')}.`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Módulos do bundle marcados `free_module` — usado por `pipeline.ts` para zerar o preço ANTES de somar o subtotal. */
|
|
24
|
+
function freeModuleCodesForBundle(bundle, rule) {
|
|
25
|
+
if (!rule || rule.kind !== 'free_module' || !rule.freeModuleCode)
|
|
26
|
+
return new Set();
|
|
27
|
+
if (!bundle.moduleCodes.includes(rule.freeModuleCode)) {
|
|
28
|
+
throw new errors_js_1.PricingEngineError('invalid-bundle', `Bundle "${bundle.code}": free_module "${rule.freeModuleCode}" não pertence ao bundle.`);
|
|
29
|
+
}
|
|
30
|
+
return new Set([rule.freeModuleCode]);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Desconto (percent/fixed) do bundle sobre o subtotal JÁ precificado dos seus
|
|
34
|
+
* módulos (excluindo os já zerados por `free_module`, que não têm o que
|
|
35
|
+
* descontar de novo). Retorna `null` quando não há regra percent/fixed.
|
|
36
|
+
*/
|
|
37
|
+
function resolveBundleDiscount(bundle, rule, items) {
|
|
38
|
+
if (!rule || rule.kind === 'free_module')
|
|
39
|
+
return null;
|
|
40
|
+
if (rule.value == null)
|
|
41
|
+
return null;
|
|
42
|
+
const coveredSubtotal = (0, money_js_1.addCents)(...items.filter((i) => i.origin === 'module' && bundle.moduleCodes.includes(i.targetCode)).map((i) => i.subtotalCents));
|
|
43
|
+
if (coveredSubtotal <= 0)
|
|
44
|
+
return null;
|
|
45
|
+
if (rule.kind === 'percent')
|
|
46
|
+
return (0, money_js_1.applyPercent)(coveredSubtotal, rule.value);
|
|
47
|
+
return Math.min(coveredSubtotal, (0, money_js_1.reaisToCents)(rule.value));
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../../src/pricing-engine/bundle.ts"],"names":[],"mappings":";;AAeA,gEAQC;AAGD,4DASC;AAOD,sDAeC;AAxDD,yCAA8E;AAC9E,2CAAiD;AAGjD;;;;;;;;GAQG;AAEH,SAAgB,0BAA0B,CAAC,MAAoB,EAAE,kBAA+B;IAC9F,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,8BAAkB,CAC1B,gBAAgB,EAChB,WAAW,MAAM,CAAC,IAAI,uCAAuC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACnF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,uHAAuH;AACvH,SAAgB,wBAAwB,CAAC,MAAoB,EAAE,IAAmC;IAChG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IACnF,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,8BAAkB,CAC1B,gBAAgB,EAChB,WAAW,MAAM,CAAC,IAAI,mBAAmB,IAAI,CAAC,cAAc,2BAA2B,CACxF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CACnC,MAAoB,EACpB,IAAmC,EACnC,KAAyB;IAEzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IACtD,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,eAAe,GAAG,IAAA,mBAAQ,EAC9B,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CACvH,CAAC;IACF,IAAI,eAAe,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAA,uBAAY,EAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,IAAA,uBAAY,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Taxonomia de erros do Pricing Engine (RFC-CAPABILITY-PRICING-ENGINE-001 §2/
|
|
4
|
+
* §8, ETAPA 15). Invariante herdada das Capabilities certificadas: um erro de
|
|
5
|
+
* contrato é RETORNADO como dado (`EngineResult`, ver types.ts), nunca
|
|
6
|
+
* lançado silenciosamente para o consumidor — o motor puro não deve expor
|
|
7
|
+
* `throw` na sua fronteira pública. Internamente, helpers podem lançar
|
|
8
|
+
* `PricingEngineError` — `pipeline.ts` captura na borda e converte em
|
|
9
|
+
* `{ ok: false, error }`.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PricingEngineError = void 0;
|
|
13
|
+
const ERROR_CLASS = {
|
|
14
|
+
'catalog-version-not-found': 'configuration',
|
|
15
|
+
'offer-not-found': 'validation',
|
|
16
|
+
'offer-ineligible': 'validation',
|
|
17
|
+
'currency-mismatch': 'permanent',
|
|
18
|
+
'conflicting-rules': 'conflict',
|
|
19
|
+
'invalid-bundle': 'configuration',
|
|
20
|
+
'duplicate-charge-item': 'permanent',
|
|
21
|
+
'coupon-invalid': 'validation',
|
|
22
|
+
'coupon-expired': 'operator-correctable',
|
|
23
|
+
'coupon-not-eligible': 'validation',
|
|
24
|
+
'campaign-conflict': 'conflict',
|
|
25
|
+
'proration-invalid': 'validation',
|
|
26
|
+
'negotiated-contract-invalid': 'configuration',
|
|
27
|
+
'price-rule-missing': 'configuration',
|
|
28
|
+
'arithmetic-overflow': 'permanent',
|
|
29
|
+
'invalid-effective-date': 'validation',
|
|
30
|
+
};
|
|
31
|
+
class PricingEngineError extends Error {
|
|
32
|
+
code;
|
|
33
|
+
errorClass;
|
|
34
|
+
/** `ruleId`s envolvidos num conflito (§8) — vazio quando não aplicável. */
|
|
35
|
+
ruleIds;
|
|
36
|
+
constructor(code, message, ruleIds = []) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.name = 'PricingEngineError';
|
|
39
|
+
this.code = code;
|
|
40
|
+
this.errorClass = ERROR_CLASS[code];
|
|
41
|
+
this.ruleIds = ruleIds;
|
|
42
|
+
}
|
|
43
|
+
toJSON() {
|
|
44
|
+
return { code: this.code, errorClass: this.errorClass, message: this.message, ruleIds: this.ruleIds };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.PricingEngineError = PricingEngineError;
|
|
48
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/pricing-engine/errors.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AA6BH,MAAM,WAAW,GAAgD;IAC/D,2BAA2B,EAAE,eAAe;IAC5C,iBAAiB,EAAE,YAAY;IAC/B,kBAAkB,EAAE,YAAY;IAChC,mBAAmB,EAAE,WAAW;IAChC,mBAAmB,EAAE,UAAU;IAC/B,gBAAgB,EAAE,eAAe;IACjC,uBAAuB,EAAE,WAAW;IACpC,gBAAgB,EAAE,YAAY;IAC9B,gBAAgB,EAAE,sBAAsB;IACxC,qBAAqB,EAAE,YAAY;IACnC,mBAAmB,EAAE,UAAU;IAC/B,mBAAmB,EAAE,YAAY;IACjC,6BAA6B,EAAE,eAAe;IAC9C,oBAAoB,EAAE,eAAe;IACrC,qBAAqB,EAAE,WAAW;IAClC,wBAAwB,EAAE,YAAY;CACvC,CAAC;AAEF,MAAa,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAmB;IACvB,UAAU,CAAoB;IACvC,2EAA2E;IAClE,OAAO,CAAW;IAE3B,YAAY,IAAsB,EAAE,OAAe,EAAE,UAAoB,EAAE;QACzE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACxG,CAAC;CACF;AAjBD,gDAiBC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compareQuotes = exports.normalizeCanonicalQuote = exports.computePricingQuote = exports.computeProration = exports.resolveBundleDiscount = exports.freeModuleCodesForBundle = exports.assertBundleModulesCovered = exports.PRICING_RULE_STEPS_IN_ORDER = exports.PRICING_ENGINE_VERSION = exports.PricingEngineError = exports.clampNonNegative = exports.prorateByDays = exports.applyPercent = exports.multiplyByQuantity = exports.subtractCents = exports.addCents = exports.centsToReais = exports.reaisToCents = exports.roundHalfEven = void 0;
|
|
4
|
+
var money_js_1 = require("./money.js");
|
|
5
|
+
Object.defineProperty(exports, "roundHalfEven", { enumerable: true, get: function () { return money_js_1.roundHalfEven; } });
|
|
6
|
+
Object.defineProperty(exports, "reaisToCents", { enumerable: true, get: function () { return money_js_1.reaisToCents; } });
|
|
7
|
+
Object.defineProperty(exports, "centsToReais", { enumerable: true, get: function () { return money_js_1.centsToReais; } });
|
|
8
|
+
Object.defineProperty(exports, "addCents", { enumerable: true, get: function () { return money_js_1.addCents; } });
|
|
9
|
+
Object.defineProperty(exports, "subtractCents", { enumerable: true, get: function () { return money_js_1.subtractCents; } });
|
|
10
|
+
Object.defineProperty(exports, "multiplyByQuantity", { enumerable: true, get: function () { return money_js_1.multiplyByQuantity; } });
|
|
11
|
+
Object.defineProperty(exports, "applyPercent", { enumerable: true, get: function () { return money_js_1.applyPercent; } });
|
|
12
|
+
Object.defineProperty(exports, "prorateByDays", { enumerable: true, get: function () { return money_js_1.prorateByDays; } });
|
|
13
|
+
Object.defineProperty(exports, "clampNonNegative", { enumerable: true, get: function () { return money_js_1.clampNonNegative; } });
|
|
14
|
+
var errors_js_1 = require("./errors.js");
|
|
15
|
+
Object.defineProperty(exports, "PricingEngineError", { enumerable: true, get: function () { return errors_js_1.PricingEngineError; } });
|
|
16
|
+
var types_js_1 = require("./types.js");
|
|
17
|
+
Object.defineProperty(exports, "PRICING_ENGINE_VERSION", { enumerable: true, get: function () { return types_js_1.PRICING_ENGINE_VERSION; } });
|
|
18
|
+
Object.defineProperty(exports, "PRICING_RULE_STEPS_IN_ORDER", { enumerable: true, get: function () { return types_js_1.PRICING_RULE_STEPS_IN_ORDER; } });
|
|
19
|
+
var bundle_js_1 = require("./bundle.js");
|
|
20
|
+
Object.defineProperty(exports, "assertBundleModulesCovered", { enumerable: true, get: function () { return bundle_js_1.assertBundleModulesCovered; } });
|
|
21
|
+
Object.defineProperty(exports, "freeModuleCodesForBundle", { enumerable: true, get: function () { return bundle_js_1.freeModuleCodesForBundle; } });
|
|
22
|
+
Object.defineProperty(exports, "resolveBundleDiscount", { enumerable: true, get: function () { return bundle_js_1.resolveBundleDiscount; } });
|
|
23
|
+
var proration_js_1 = require("./proration.js");
|
|
24
|
+
Object.defineProperty(exports, "computeProration", { enumerable: true, get: function () { return proration_js_1.computeProration; } });
|
|
25
|
+
var pipeline_js_1 = require("./pipeline.js");
|
|
26
|
+
Object.defineProperty(exports, "computePricingQuote", { enumerable: true, get: function () { return pipeline_js_1.computePricingQuote; } });
|
|
27
|
+
var shadow_js_1 = require("./shadow.js");
|
|
28
|
+
Object.defineProperty(exports, "normalizeCanonicalQuote", { enumerable: true, get: function () { return shadow_js_1.normalizeCanonicalQuote; } });
|
|
29
|
+
Object.defineProperty(exports, "compareQuotes", { enumerable: true, get: function () { return shadow_js_1.compareQuotes; } });
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pricing-engine/index.ts"],"names":[],"mappings":";;;AACA,uCAUoB;AATlB,yGAAA,aAAa,OAAA;AACb,wGAAA,YAAY,OAAA;AACZ,wGAAA,YAAY,OAAA;AACZ,oGAAA,QAAQ,OAAA;AACR,yGAAA,aAAa,OAAA;AACb,8GAAA,kBAAkB,OAAA;AAClB,wGAAA,YAAY,OAAA;AACZ,yGAAA,aAAa,OAAA;AACb,4GAAA,gBAAgB,OAAA;AAIlB,yCAAiD;AAAxC,+GAAA,kBAAkB,OAAA;AAsB3B,uCAAiF;AAAxE,kHAAA,sBAAsB,OAAA;AAAE,uHAAA,2BAA2B,OAAA;AAE5D,yCAA0G;AAAjG,uHAAA,0BAA0B,OAAA;AAAE,qHAAA,wBAAwB,OAAA;AAAE,kHAAA,qBAAqB,OAAA;AACpF,+CAAkD;AAAzC,gHAAA,gBAAgB,OAAA;AACzB,6CAAoD;AAA3C,kHAAA,mBAAmB,OAAA;AAG5B,yCAAqE;AAA5D,oHAAA,uBAAuB,OAAA;AAAE,0GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Money — contrato monetário seguro do Pricing Engine (RFC-CAPABILITY-PRICING-
|
|
4
|
+
* ENGINE-001 §4, herdado de RFC-CAPABILITY-MERCHANT-BILLING-CORE-001 §5).
|
|
5
|
+
*
|
|
6
|
+
* Unidade mínima: CENTAVOS, sempre inteiro. Nenhuma fração é acumulada sem
|
|
7
|
+
* arredondar — cada operação que introduz fração (percentual, prorata por
|
|
8
|
+
* dias) arredonda IMEDIATAMENTE por half-even (bankers') no ponto de uso.
|
|
9
|
+
* Isto é o que garante "arredondamento uma vez, no fim" nas somas finais: as
|
|
10
|
+
* frações já foram eliminadas antes de somar.
|
|
11
|
+
*
|
|
12
|
+
* Reutilizado por bundle.ts, coupon.ts, proration.ts e pipeline.ts — nenhum
|
|
13
|
+
* outro Money é criado em `@baruk/core` (nem o `ChargeRecord.amount`/
|
|
14
|
+
* `CommercialPriceItem.amount` existentes, que guardam REAIS como
|
|
15
|
+
* conveniência de schema, nem um terceiro tipo). Este módulo é o único que
|
|
16
|
+
* precisa de aritmética encadeada (percentual → prorata → soma), por isso é
|
|
17
|
+
* o único ponto onde a disciplina de centavos inteiros se paga.
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.roundHalfEven = roundHalfEven;
|
|
21
|
+
exports.reaisToCents = reaisToCents;
|
|
22
|
+
exports.centsToReais = centsToReais;
|
|
23
|
+
exports.addCents = addCents;
|
|
24
|
+
exports.subtractCents = subtractCents;
|
|
25
|
+
exports.multiplyByQuantity = multiplyByQuantity;
|
|
26
|
+
exports.applyPercent = applyPercent;
|
|
27
|
+
exports.prorateByDays = prorateByDays;
|
|
28
|
+
exports.clampNonNegative = clampNonNegative;
|
|
29
|
+
/** Arredondamento half-even (bankers') — determinístico, não depende de ordem de chamadas. */
|
|
30
|
+
function roundHalfEven(value) {
|
|
31
|
+
const floor = Math.floor(value);
|
|
32
|
+
const diff = value - floor;
|
|
33
|
+
if (diff < 0.5)
|
|
34
|
+
return floor;
|
|
35
|
+
if (diff > 0.5)
|
|
36
|
+
return floor + 1;
|
|
37
|
+
return floor % 2 === 0 ? floor : floor + 1;
|
|
38
|
+
}
|
|
39
|
+
function reaisToCents(reais) {
|
|
40
|
+
return roundHalfEven(reais * 100);
|
|
41
|
+
}
|
|
42
|
+
function centsToReais(cents) {
|
|
43
|
+
return cents / 100;
|
|
44
|
+
}
|
|
45
|
+
function addCents(...values) {
|
|
46
|
+
return values.reduce((sum, v) => sum + v, 0);
|
|
47
|
+
}
|
|
48
|
+
function subtractCents(a, b) {
|
|
49
|
+
return a - b;
|
|
50
|
+
}
|
|
51
|
+
/** Multiplica por uma quantidade inteira (assentos, unidades) — sem fração, nada a arredondar. */
|
|
52
|
+
function multiplyByQuantity(cents, quantity) {
|
|
53
|
+
return cents * quantity;
|
|
54
|
+
}
|
|
55
|
+
/** Aplica um percentual (0-100) com arredondamento half-even no ponto de aplicação. */
|
|
56
|
+
function applyPercent(cents, percent) {
|
|
57
|
+
return roundHalfEven((cents * percent) / 100);
|
|
58
|
+
}
|
|
59
|
+
/** Prorata por fração de dias — arredondamento half-even no ponto de aplicação. */
|
|
60
|
+
function prorateByDays(cents, daysNumerator, daysDenominator) {
|
|
61
|
+
if (daysDenominator <= 0) {
|
|
62
|
+
throw new Error('prorateByDays: daysDenominator deve ser positivo.');
|
|
63
|
+
}
|
|
64
|
+
return roundHalfEven((cents * daysNumerator) / daysDenominator);
|
|
65
|
+
}
|
|
66
|
+
function clampNonNegative(cents) {
|
|
67
|
+
return Math.max(0, cents);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=money.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"money.js","sourceRoot":"","sources":["../../../src/pricing-engine/money.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;AAKH,sCAMC;AAED,oCAEC;AAED,oCAEC;AAED,4BAEC;AAED,sCAEC;AAGD,gDAEC;AAGD,oCAEC;AAGD,sCAKC;AAED,4CAEC;AA7CD,8FAA8F;AAC9F,SAAgB,aAAa,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;IAC3B,IAAI,IAAI,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,IAAI,GAAG,GAAG;QAAE,OAAO,KAAK,GAAG,CAAC,CAAC;IACjC,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,YAAY,CAAC,KAAa;IACxC,OAAO,aAAa,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,SAAgB,YAAY,CAAC,KAAY;IACvC,OAAO,KAAK,GAAG,GAAG,CAAC;AACrB,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAG,MAAe;IACzC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,aAAa,CAAC,CAAQ,EAAE,CAAQ;IAC9C,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,kGAAkG;AAClG,SAAgB,kBAAkB,CAAC,KAAY,EAAE,QAAgB;IAC/D,OAAO,KAAK,GAAG,QAAQ,CAAC;AAC1B,CAAC;AAED,uFAAuF;AACvF,SAAgB,YAAY,CAAC,KAAY,EAAE,OAAe;IACxD,OAAO,aAAa,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,mFAAmF;AACnF,SAAgB,aAAa,CAAC,KAAY,EAAE,aAAqB,EAAE,eAAuB;IACxF,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,aAAa,CAAC,CAAC,KAAK,GAAG,aAAa,CAAC,GAAG,eAAe,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAY;IAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC"}
|