@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,153 @@
|
|
|
1
|
+
import { ConflictError, NotFoundError, ValidationError, uuidv7 } from '@baruk/shared';
|
|
2
|
+
import { appendAudit } from '../audit/audit.js';
|
|
3
|
+
import { createNotification } from '../notifications/repository.js';
|
|
4
|
+
function map(row) {
|
|
5
|
+
const status = row.status;
|
|
6
|
+
return {
|
|
7
|
+
id: String(row.id),
|
|
8
|
+
kind: row.kind,
|
|
9
|
+
status,
|
|
10
|
+
text: row.body ? String(row.body) : null,
|
|
11
|
+
channel: row.external_channel ? row.external_channel : null,
|
|
12
|
+
deliveredAt: row.external_delivered_at ? String(row.external_delivered_at) : null,
|
|
13
|
+
createdAt: new Date(String(row.created_at)).toISOString(),
|
|
14
|
+
updatedAt: new Date(String(row.updated_at)).toISOString(),
|
|
15
|
+
publicAuthorLabel: row.public_author_label ? String(row.public_author_label) : 'Você',
|
|
16
|
+
relatedItemId: row.item_id ? String(row.item_id) : null,
|
|
17
|
+
relatedRequirementId: row.document_requirement_id ? String(row.document_requirement_id) : null,
|
|
18
|
+
allowedActions: status === 'submitted' || status === 'needs_clarification' ? ['supplement'] : [],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function cleanText(value) {
|
|
22
|
+
return Array.from(value.replace(/<[^>]*>/g, ''))
|
|
23
|
+
.filter((character) => {
|
|
24
|
+
const code = character.charCodeAt(0);
|
|
25
|
+
return code > 31 && code !== 127;
|
|
26
|
+
})
|
|
27
|
+
.join('')
|
|
28
|
+
.trim();
|
|
29
|
+
}
|
|
30
|
+
async function target(tx, ctx, onboardingId, itemId, requirementId) {
|
|
31
|
+
const rows = await tx `
|
|
32
|
+
SELECT oi.owner_id
|
|
33
|
+
FROM onboarding_instance oi
|
|
34
|
+
WHERE oi.id = ${onboardingId}
|
|
35
|
+
AND oi.tenant_id = ${ctx.tenantId}
|
|
36
|
+
AND oi.client_id = ${ctx.clientId}
|
|
37
|
+
`;
|
|
38
|
+
if (!rows[0])
|
|
39
|
+
throw new NotFoundError('Onboarding não encontrado');
|
|
40
|
+
if (itemId) {
|
|
41
|
+
const items = await tx `
|
|
42
|
+
SELECT id FROM onboarding_item
|
|
43
|
+
WHERE id = ${itemId} AND onboarding_id = ${onboardingId}
|
|
44
|
+
AND tenant_id = ${ctx.tenantId} AND client_id = ${ctx.clientId} AND visibility = 'portal'
|
|
45
|
+
`;
|
|
46
|
+
if (!items[0])
|
|
47
|
+
throw new NotFoundError('Pendência não encontrada');
|
|
48
|
+
}
|
|
49
|
+
if (requirementId) {
|
|
50
|
+
const docs = await tx `
|
|
51
|
+
SELECT id, status FROM onboarding_document_requirement
|
|
52
|
+
WHERE id = ${requirementId} AND onboarding_id = ${onboardingId}
|
|
53
|
+
AND tenant_id = ${ctx.tenantId} AND client_id = ${ctx.clientId}
|
|
54
|
+
`;
|
|
55
|
+
if (!docs[0])
|
|
56
|
+
throw new NotFoundError('Requisito documental não encontrado');
|
|
57
|
+
if (String(docs[0].status) === 'validated')
|
|
58
|
+
throw new ConflictError('Este requisito já foi validado');
|
|
59
|
+
}
|
|
60
|
+
return { ownerId: rows[0].owner_id };
|
|
61
|
+
}
|
|
62
|
+
async function notifyOwner(tx, ownerId, onboardingId, kind) {
|
|
63
|
+
if (!ownerId)
|
|
64
|
+
return;
|
|
65
|
+
await createNotification(tx, {
|
|
66
|
+
userId: ownerId,
|
|
67
|
+
type: 'action_required',
|
|
68
|
+
title: kind === 'external_delivery_confirmation'
|
|
69
|
+
? 'Cliente informou envio externo'
|
|
70
|
+
: 'Cliente enviou nova informação',
|
|
71
|
+
body: 'Há uma nova interação pública aguardando revisão.',
|
|
72
|
+
linkRef: { type: 'office_onboarding', id: onboardingId },
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
export async function createPortalInteraction(tx, ctx, input) {
|
|
76
|
+
const text = 'text' in input
|
|
77
|
+
? cleanText(input.text)
|
|
78
|
+
: 'note' in input
|
|
79
|
+
? cleanText(input.note ?? '') || null
|
|
80
|
+
: null;
|
|
81
|
+
if (text !== null && (!text || text.length > 2000))
|
|
82
|
+
throw new ValidationError('A informação deve ter entre 1 e 2.000 caracteres');
|
|
83
|
+
const owner = await target(tx, ctx, input.onboardingId, input.kind === 'response' ? input.itemId : undefined, input.kind === 'external_delivery_confirmation' ? input.requirementId : undefined);
|
|
84
|
+
if (input.kind === 'response' && input.supersedesId) {
|
|
85
|
+
const previous = await tx `
|
|
86
|
+
SELECT status FROM onboarding_portal_interaction
|
|
87
|
+
WHERE id = ${input.supersedesId} AND onboarding_id = ${input.onboardingId}
|
|
88
|
+
AND client_id = ${ctx.clientId} AND tenant_id = ${ctx.tenantId} AND author_user_id = ${ctx.actorId}
|
|
89
|
+
`;
|
|
90
|
+
if (!previous[0] || !['submitted', 'needs_clarification'].includes(previous[0].status))
|
|
91
|
+
throw new ConflictError('Esta resposta não aceita complemento');
|
|
92
|
+
await tx `UPDATE onboarding_portal_interaction SET status = 'superseded', updated_at = now() WHERE id = ${input.supersedesId}`;
|
|
93
|
+
}
|
|
94
|
+
const id = uuidv7();
|
|
95
|
+
const row = await tx `
|
|
96
|
+
INSERT INTO onboarding_portal_interaction
|
|
97
|
+
(id, tenant_id, onboarding_id, client_id, item_id, document_requirement_id, author_user_id, kind, status, visibility, body, external_channel, external_delivered_at, supersedes_id)
|
|
98
|
+
VALUES
|
|
99
|
+
(${id}, ${ctx.tenantId}, ${input.onboardingId}, ${ctx.clientId},
|
|
100
|
+
${input.kind === 'response' ? input.itemId : null},
|
|
101
|
+
${input.kind === 'external_delivery_confirmation' ? input.requirementId : null},
|
|
102
|
+
${ctx.actorId}, ${input.kind}, 'submitted', 'public_to_client', ${text},
|
|
103
|
+
${input.kind === 'external_delivery_confirmation' ? input.channel : null},
|
|
104
|
+
${input.kind === 'external_delivery_confirmation' ? input.deliveredAt : null},
|
|
105
|
+
${input.kind === 'response' ? (input.supersedesId ?? null) : null})
|
|
106
|
+
RETURNING id, kind, status, body, external_channel, external_delivered_at, created_at, updated_at, item_id, document_requirement_id
|
|
107
|
+
`;
|
|
108
|
+
await appendAudit(tx, {
|
|
109
|
+
actorId: ctx.actorId,
|
|
110
|
+
action: `portal_onboarding_${input.kind}`,
|
|
111
|
+
resourceType: 'onboarding_portal_interaction',
|
|
112
|
+
resourceId: id,
|
|
113
|
+
metadata: {
|
|
114
|
+
onboardingId: input.onboardingId,
|
|
115
|
+
correlationId: ctx.correlationId,
|
|
116
|
+
requestId: ctx.requestId ?? null,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
await tx `
|
|
120
|
+
INSERT INTO onboarding_event
|
|
121
|
+
(event_id, tenant_id, onboarding_id, client_id, actor_id, event_type, event_version, occurred_at, correlation_id, causation_id, entity_type, entity_id, payload, metadata)
|
|
122
|
+
VALUES (${uuidv7()}, ${ctx.tenantId}, ${input.onboardingId}, ${ctx.clientId}, ${ctx.actorId},
|
|
123
|
+
${input.kind === 'response' ? (input.supersedesId ? 'onboarding.portal_response_supplemented' : 'onboarding.portal_response_submitted') : input.kind === 'comment' ? 'onboarding.portal_comment_created' : 'onboarding.external_delivery_confirmed'},
|
|
124
|
+
1, now(), ${ctx.correlationId}, null, 'onboarding', ${input.onboardingId},
|
|
125
|
+
${tx.json({ interactionId: id, kind: input.kind })}, ${tx.json({ visibility: 'public_to_client' })})
|
|
126
|
+
`;
|
|
127
|
+
await notifyOwner(tx, owner.ownerId, input.onboardingId, input.kind);
|
|
128
|
+
return map(row[0]);
|
|
129
|
+
}
|
|
130
|
+
export async function listPortalInteractions(tx, ctx, onboardingId, limit = 50, offset = 0) {
|
|
131
|
+
await target(tx, ctx, onboardingId);
|
|
132
|
+
const rows = await tx `
|
|
133
|
+
SELECT id, kind, status, body, external_channel, external_delivered_at, created_at, updated_at, item_id, document_requirement_id, count(*) OVER() AS total, 'Você' AS public_author_label
|
|
134
|
+
FROM onboarding_portal_interaction
|
|
135
|
+
WHERE tenant_id = ${ctx.tenantId} AND client_id = ${ctx.clientId} AND onboarding_id = ${onboardingId}
|
|
136
|
+
ORDER BY created_at ASC, id ASC LIMIT ${Math.min(limit, 100)} OFFSET ${Math.max(offset, 0)}
|
|
137
|
+
`;
|
|
138
|
+
const replies = await tx `
|
|
139
|
+
SELECT id, 'office_public_reply' AS kind, 'submitted' AS status, body,
|
|
140
|
+
NULL::text AS external_channel, NULL::date AS external_delivered_at,
|
|
141
|
+
created_at, created_at AS updated_at, NULL::uuid AS item_id,
|
|
142
|
+
NULL::uuid AS document_requirement_id, 'Escritório' AS public_author_label
|
|
143
|
+
FROM onboarding_interaction_public_reply
|
|
144
|
+
WHERE tenant_id = ${ctx.tenantId} AND client_id = ${ctx.clientId} AND onboarding_id = ${onboardingId}
|
|
145
|
+
ORDER BY created_at ASC, id ASC
|
|
146
|
+
`;
|
|
147
|
+
const items = [...rows.map(map), ...replies.map(map)].sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
148
|
+
return {
|
|
149
|
+
items: items.slice(0, Math.min(limit, 100)),
|
|
150
|
+
total: Number(rows[0]?.total ?? 0) + replies.length,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=portal-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portal-actions.js","sourceRoot":"","sources":["../../src/onboarding/portal-actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { AppError } from '@baruk/shared';
|
|
2
|
+
import type { Tx } from '../db/client.js';
|
|
3
|
+
export declare class PortalOnboardingFeatureDisabledError extends AppError {
|
|
4
|
+
constructor();
|
|
5
|
+
}
|
|
6
|
+
export interface PortalOnboardingListItem {
|
|
7
|
+
id: string;
|
|
8
|
+
clientDisplayName: string;
|
|
9
|
+
status: 'preparing' | 'in_progress' | 'waiting_for_information' | 'completed' | 'closed';
|
|
10
|
+
progress: {
|
|
11
|
+
completed: number;
|
|
12
|
+
total: number;
|
|
13
|
+
percentage: number;
|
|
14
|
+
};
|
|
15
|
+
dueAt: string | null;
|
|
16
|
+
overdue: boolean;
|
|
17
|
+
pendingItemsCount: number;
|
|
18
|
+
pendingDocumentRequirementsCount: number;
|
|
19
|
+
lastPublicUpdateAt: string;
|
|
20
|
+
}
|
|
21
|
+
export interface PortalOnboardingItem {
|
|
22
|
+
id: string;
|
|
23
|
+
title: string;
|
|
24
|
+
description: string | null;
|
|
25
|
+
status: 'pending' | 'in_progress' | 'completed' | 'rejected' | 'not_applicable';
|
|
26
|
+
required: boolean;
|
|
27
|
+
dueAt: string | null;
|
|
28
|
+
completedAt: string | null;
|
|
29
|
+
}
|
|
30
|
+
export interface PortalDocumentRequirement {
|
|
31
|
+
id: string;
|
|
32
|
+
label: string;
|
|
33
|
+
status: 'requested' | 'received' | 'validated' | 'rejected';
|
|
34
|
+
requestedAt: string;
|
|
35
|
+
receivedAt: string | null;
|
|
36
|
+
validatedAt: string | null;
|
|
37
|
+
expiresAt: string | null;
|
|
38
|
+
}
|
|
39
|
+
export interface PortalTimelineEvent {
|
|
40
|
+
eventType: string;
|
|
41
|
+
summary: string;
|
|
42
|
+
occurredAt: string;
|
|
43
|
+
}
|
|
44
|
+
export interface PortalOnboardingDetail extends PortalOnboardingListItem {
|
|
45
|
+
items: PortalOnboardingItem[];
|
|
46
|
+
documentRequirements: PortalDocumentRequirement[];
|
|
47
|
+
timeline: PortalTimelineEvent[];
|
|
48
|
+
}
|
|
49
|
+
export declare function listPortalOnboardings(tx: Tx, limit?: number, offset?: number): Promise<{
|
|
50
|
+
items: PortalOnboardingListItem[];
|
|
51
|
+
total: number;
|
|
52
|
+
}>;
|
|
53
|
+
export declare function getPortalOnboarding(tx: Tx, id: string): Promise<PortalOnboardingDetail | null>;
|
|
54
|
+
export declare function listPortalTimeline(tx: Tx, id: string, limit?: number, offset?: number): Promise<{
|
|
55
|
+
items: PortalTimelineEvent[];
|
|
56
|
+
total: number;
|
|
57
|
+
}>;
|
|
58
|
+
//# sourceMappingURL=portal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../src/onboarding/portal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C,qBAAa,oCAAqC,SAAQ,QAAQ;;CAOjE;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,WAAW,GAAG,aAAa,GAAG,yBAAyB,GAAG,WAAW,GAAG,QAAQ,CAAC;IACzF,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gCAAgC,EAAE,MAAM,CAAC;IACzC,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,gBAAgB,CAAC;IAChF,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAuB,SAAQ,wBAAwB;IACtE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,oBAAoB,EAAE,yBAAyB,EAAE,CAAC;IAClD,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAkFD,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,KAAK,SAAK,EACV,MAAM,SAAI,GACT,OAAO,CAAC;IAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB/D;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CA+CxC;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,MAAM,EACV,KAAK,SAAK,EACV,MAAM,SAAI,GACT,OAAO,CAAC;IAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB1D"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { AppError } from '@baruk/shared';
|
|
2
|
+
export class PortalOnboardingFeatureDisabledError extends AppError {
|
|
3
|
+
constructor() {
|
|
4
|
+
super('O onboarding do Portal está indisponível', {
|
|
5
|
+
status: 404,
|
|
6
|
+
code: 'PORTAL_ONBOARDING_FEATURE_DISABLED',
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const PUBLIC_EVENT_SUMMARY = {
|
|
11
|
+
'onboarding.created': 'Seu onboarding foi criado',
|
|
12
|
+
'onboarding.active': 'O onboarding foi iniciado',
|
|
13
|
+
'onboarding.blocked': 'O onboarding aguarda informações',
|
|
14
|
+
'onboarding.cancelled': 'O onboarding foi encerrado',
|
|
15
|
+
'onboarding.item.created': 'Uma pendência foi adicionada',
|
|
16
|
+
'onboarding.item.started': 'Uma pendência foi iniciada',
|
|
17
|
+
'onboarding.item.completed': 'Uma pendência foi concluída',
|
|
18
|
+
'onboarding.item.not_applicable': 'Uma pendência não se aplica',
|
|
19
|
+
'onboarding.document.requested': 'Um documento foi solicitado',
|
|
20
|
+
'onboarding.document.received': 'Um documento foi recebido',
|
|
21
|
+
'onboarding.document.validated': 'Um documento foi validado',
|
|
22
|
+
'onboarding.document.rejected': 'Um documento precisa de atenção',
|
|
23
|
+
'onboarding.completed': 'O onboarding foi concluído',
|
|
24
|
+
'onboarding.portal_response_submitted': 'Sua resposta foi enviada e aguarda análise do escritório',
|
|
25
|
+
'onboarding.portal_response_supplemented': 'Sua informação complementar foi enviada e aguarda análise',
|
|
26
|
+
'onboarding.portal_comment_created': 'Sua mensagem foi enviada ao escritório',
|
|
27
|
+
'onboarding.external_delivery_confirmed': 'Você informou que enviou um documento por outro canal',
|
|
28
|
+
};
|
|
29
|
+
const PUBLIC_EVENT_TYPES = new Set(Object.keys(PUBLIC_EVENT_SUMMARY));
|
|
30
|
+
function publicStatus(status) {
|
|
31
|
+
if (status === 'draft')
|
|
32
|
+
return 'preparing';
|
|
33
|
+
if (status === 'active')
|
|
34
|
+
return 'in_progress';
|
|
35
|
+
if (status === 'blocked')
|
|
36
|
+
return 'waiting_for_information';
|
|
37
|
+
if (status === 'completed')
|
|
38
|
+
return 'completed';
|
|
39
|
+
return 'closed';
|
|
40
|
+
}
|
|
41
|
+
function iso(value) {
|
|
42
|
+
return value ? new Date(String(value)).toISOString() : null;
|
|
43
|
+
}
|
|
44
|
+
function percentage(completed, total) {
|
|
45
|
+
return total === 0 ? 0 : Math.round((completed / total) * 100);
|
|
46
|
+
}
|
|
47
|
+
async function baseRow(tx, id) {
|
|
48
|
+
const rows = await tx `
|
|
49
|
+
SELECT oi.id, oi.status, oi.due_at, oi.updated_at, oi.created_at,
|
|
50
|
+
c.display_name,
|
|
51
|
+
count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal') AS item_total,
|
|
52
|
+
count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal' AND item.status IN ('completed', 'not_applicable')) AS item_completed,
|
|
53
|
+
count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal' AND item.status NOT IN ('completed', 'not_applicable')) AS item_pending,
|
|
54
|
+
count(DISTINCT dr.id) AS document_total,
|
|
55
|
+
count(DISTINCT dr.id) FILTER (WHERE dr.status NOT IN ('validated')) AS document_pending
|
|
56
|
+
FROM onboarding_instance oi
|
|
57
|
+
JOIN client c ON c.id = oi.client_id AND c.deleted_at IS NULL
|
|
58
|
+
LEFT JOIN onboarding_item item ON item.onboarding_id = oi.id AND item.visibility = 'portal'
|
|
59
|
+
LEFT JOIN onboarding_document_requirement dr ON dr.onboarding_id = oi.id
|
|
60
|
+
WHERE oi.id = ${id ?? null}::uuid
|
|
61
|
+
GROUP BY oi.id, c.display_name
|
|
62
|
+
`;
|
|
63
|
+
return rows[0] ?? null;
|
|
64
|
+
}
|
|
65
|
+
function mapBase(row) {
|
|
66
|
+
const total = Number(row.item_total ?? 0);
|
|
67
|
+
const completed = Number(row.item_completed ?? 0);
|
|
68
|
+
const dueAt = iso(row.due_at);
|
|
69
|
+
const status = publicStatus(String(row.status));
|
|
70
|
+
return {
|
|
71
|
+
id: String(row.id),
|
|
72
|
+
clientDisplayName: String(row.display_name),
|
|
73
|
+
status,
|
|
74
|
+
progress: { completed, total, percentage: percentage(completed, total) },
|
|
75
|
+
dueAt,
|
|
76
|
+
overdue: !!dueAt &&
|
|
77
|
+
new Date(dueAt).getTime() < Date.now() &&
|
|
78
|
+
!['completed', 'closed'].includes(status),
|
|
79
|
+
pendingItemsCount: Number(row.item_pending ?? 0),
|
|
80
|
+
pendingDocumentRequirementsCount: Number(row.document_pending ?? 0),
|
|
81
|
+
lastPublicUpdateAt: iso(row.updated_at) ?? iso(row.created_at),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export async function listPortalOnboardings(tx, limit = 20, offset = 0) {
|
|
85
|
+
const rows = await tx `
|
|
86
|
+
SELECT oi.id, oi.status, oi.due_at, oi.updated_at, oi.created_at,
|
|
87
|
+
c.display_name,
|
|
88
|
+
count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal') AS item_total,
|
|
89
|
+
count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal' AND item.status IN ('completed', 'not_applicable')) AS item_completed,
|
|
90
|
+
count(DISTINCT item.id) FILTER (WHERE item.visibility = 'portal' AND item.status NOT IN ('completed', 'not_applicable')) AS item_pending,
|
|
91
|
+
count(DISTINCT dr.id) AS document_total,
|
|
92
|
+
count(DISTINCT dr.id) FILTER (WHERE dr.status NOT IN ('validated')) AS document_pending,
|
|
93
|
+
count(*) OVER() AS total
|
|
94
|
+
FROM onboarding_instance oi
|
|
95
|
+
JOIN client c ON c.id = oi.client_id AND c.deleted_at IS NULL
|
|
96
|
+
LEFT JOIN onboarding_item item ON item.onboarding_id = oi.id AND item.visibility = 'portal'
|
|
97
|
+
LEFT JOIN onboarding_document_requirement dr ON dr.onboarding_id = oi.id
|
|
98
|
+
GROUP BY oi.id, c.display_name
|
|
99
|
+
ORDER BY oi.updated_at DESC, oi.id
|
|
100
|
+
LIMIT ${Math.min(Math.max(limit, 1), 50)} OFFSET ${Math.max(offset, 0)}
|
|
101
|
+
`;
|
|
102
|
+
return { items: rows.map(mapBase), total: rows[0] ? Number(rows[0].total) : 0 };
|
|
103
|
+
}
|
|
104
|
+
export async function getPortalOnboarding(tx, id) {
|
|
105
|
+
const row = await baseRow(tx, id);
|
|
106
|
+
if (!row)
|
|
107
|
+
return null;
|
|
108
|
+
const items = await tx `
|
|
109
|
+
SELECT id, title, description, status, required, due_at, completed_at
|
|
110
|
+
FROM onboarding_item
|
|
111
|
+
WHERE onboarding_id = ${id} AND visibility = 'portal'
|
|
112
|
+
ORDER BY item_order, created_at
|
|
113
|
+
`;
|
|
114
|
+
const documents = await tx `
|
|
115
|
+
SELECT id, label, status, requested_at, received_at, validated_at, expires_at
|
|
116
|
+
FROM onboarding_document_requirement
|
|
117
|
+
WHERE onboarding_id = ${id}
|
|
118
|
+
ORDER BY requested_at
|
|
119
|
+
`;
|
|
120
|
+
const events = await tx `
|
|
121
|
+
SELECT event_type, occurred_at
|
|
122
|
+
FROM onboarding_event
|
|
123
|
+
WHERE onboarding_id = ${id} AND event_type = ANY(${Array.from(PUBLIC_EVENT_TYPES)})
|
|
124
|
+
ORDER BY occurred_at ASC, event_id ASC
|
|
125
|
+
`;
|
|
126
|
+
return {
|
|
127
|
+
...mapBase(row),
|
|
128
|
+
items: items.map((item) => ({
|
|
129
|
+
id: String(item.id),
|
|
130
|
+
title: String(item.title),
|
|
131
|
+
description: item.description ? String(item.description) : null,
|
|
132
|
+
status: item.status,
|
|
133
|
+
required: Boolean(item.required),
|
|
134
|
+
dueAt: iso(item.due_at),
|
|
135
|
+
completedAt: iso(item.completed_at),
|
|
136
|
+
})),
|
|
137
|
+
documentRequirements: documents.map((document) => ({
|
|
138
|
+
id: String(document.id),
|
|
139
|
+
label: String(document.label),
|
|
140
|
+
status: document.status,
|
|
141
|
+
requestedAt: iso(document.requested_at),
|
|
142
|
+
receivedAt: iso(document.received_at),
|
|
143
|
+
validatedAt: iso(document.validated_at),
|
|
144
|
+
expiresAt: iso(document.expires_at),
|
|
145
|
+
})),
|
|
146
|
+
timeline: events.map((event) => ({
|
|
147
|
+
eventType: String(event.event_type),
|
|
148
|
+
summary: PUBLIC_EVENT_SUMMARY[String(event.event_type)],
|
|
149
|
+
occurredAt: iso(event.occurred_at),
|
|
150
|
+
})),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export async function listPortalTimeline(tx, id, limit = 20, offset = 0) {
|
|
154
|
+
const rows = await tx `
|
|
155
|
+
SELECT event_type, occurred_at, count(*) OVER() AS total
|
|
156
|
+
FROM onboarding_event
|
|
157
|
+
WHERE onboarding_id = ${id} AND event_type = ANY(${Array.from(PUBLIC_EVENT_TYPES)})
|
|
158
|
+
ORDER BY occurred_at ASC, event_id ASC
|
|
159
|
+
LIMIT ${Math.min(Math.max(limit, 1), 50)} OFFSET ${Math.max(offset, 0)}
|
|
160
|
+
`;
|
|
161
|
+
return {
|
|
162
|
+
items: rows.map((event) => ({
|
|
163
|
+
eventType: String(event.event_type),
|
|
164
|
+
summary: PUBLIC_EVENT_SUMMARY[String(event.event_type)],
|
|
165
|
+
occurredAt: iso(event.occurred_at),
|
|
166
|
+
})),
|
|
167
|
+
total: rows[0] ? Number(rows[0].total) : 0,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
//# 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,22 @@
|
|
|
1
|
+
import type { BundleRecord } from '../commercial-catalog/types.js';
|
|
2
|
+
import { type Cents } from './money.js';
|
|
3
|
+
import type { BundlePricingRule, PricingQuoteItem } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Bundle (RFC §8 passo 5 / ETAPA 6) — NUNCA dupla cobrança: os módulos já
|
|
6
|
+
* foram precificados 1× cada em `MODULE_PRICE`; o bundle só declara a
|
|
7
|
+
* combinação (`BundleRecord`, em `commercial-catalog/`) e aplica um desconto
|
|
8
|
+
* ou zera o preço de um módulo incluído gratuitamente — nunca soma um novo
|
|
9
|
+
* item cobrável. `BundleRecord.discountRuleRef` é apenas uma referência
|
|
10
|
+
* (Catalog não resolve a regra); `BundlePricingRule` é a regra RESOLVIDA que
|
|
11
|
+
* o consumidor injeta para este cálculo (Catalog permanece intocado).
|
|
12
|
+
*/
|
|
13
|
+
export declare function assertBundleModulesCovered(bundle: BundleRecord, chargedModuleCodes: Set<string>): void;
|
|
14
|
+
/** Módulos do bundle marcados `free_module` — usado por `pipeline.ts` para zerar o preço ANTES de somar o subtotal. */
|
|
15
|
+
export declare function freeModuleCodesForBundle(bundle: BundleRecord, rule: BundlePricingRule | undefined): Set<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Desconto (percent/fixed) do bundle sobre o subtotal JÁ precificado dos seus
|
|
18
|
+
* módulos (excluindo os já zerados por `free_module`, que não têm o que
|
|
19
|
+
* descontar de novo). Retorna `null` quando não há regra percent/fixed.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveBundleDiscount(bundle: BundleRecord, rule: BundlePricingRule | undefined, items: PricingQuoteItem[]): Cents | null;
|
|
22
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/pricing-engine/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAwC,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtE;;;;;;;;GAQG;AAEH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAQtG;AAED,uHAAuH;AACvH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAS/G;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,KAAK,EAAE,gBAAgB,EAAE,GACxB,KAAK,GAAG,IAAI,CAWd"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { addCents, applyPercent, reaisToCents } from './money.js';
|
|
2
|
+
import { PricingEngineError } from './errors.js';
|
|
3
|
+
/**
|
|
4
|
+
* Bundle (RFC §8 passo 5 / ETAPA 6) — NUNCA dupla cobrança: os módulos já
|
|
5
|
+
* foram precificados 1× cada em `MODULE_PRICE`; o bundle só declara a
|
|
6
|
+
* combinação (`BundleRecord`, em `commercial-catalog/`) e aplica um desconto
|
|
7
|
+
* ou zera o preço de um módulo incluído gratuitamente — nunca soma um novo
|
|
8
|
+
* item cobrável. `BundleRecord.discountRuleRef` é apenas uma referência
|
|
9
|
+
* (Catalog não resolve a regra); `BundlePricingRule` é a regra RESOLVIDA que
|
|
10
|
+
* o consumidor injeta para este cálculo (Catalog permanece intocado).
|
|
11
|
+
*/
|
|
12
|
+
export function assertBundleModulesCovered(bundle, chargedModuleCodes) {
|
|
13
|
+
const missing = bundle.moduleCodes.filter((m) => !chargedModuleCodes.has(m));
|
|
14
|
+
if (missing.length > 0) {
|
|
15
|
+
throw new PricingEngineError('invalid-bundle', `Bundle "${bundle.code}" exige módulos ausentes na oferta: ${missing.join(', ')}.`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** Módulos do bundle marcados `free_module` — usado por `pipeline.ts` para zerar o preço ANTES de somar o subtotal. */
|
|
19
|
+
export function freeModuleCodesForBundle(bundle, rule) {
|
|
20
|
+
if (!rule || rule.kind !== 'free_module' || !rule.freeModuleCode)
|
|
21
|
+
return new Set();
|
|
22
|
+
if (!bundle.moduleCodes.includes(rule.freeModuleCode)) {
|
|
23
|
+
throw new PricingEngineError('invalid-bundle', `Bundle "${bundle.code}": free_module "${rule.freeModuleCode}" não pertence ao bundle.`);
|
|
24
|
+
}
|
|
25
|
+
return new Set([rule.freeModuleCode]);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Desconto (percent/fixed) do bundle sobre o subtotal JÁ precificado dos seus
|
|
29
|
+
* módulos (excluindo os já zerados por `free_module`, que não têm o que
|
|
30
|
+
* descontar de novo). Retorna `null` quando não há regra percent/fixed.
|
|
31
|
+
*/
|
|
32
|
+
export function resolveBundleDiscount(bundle, rule, items) {
|
|
33
|
+
if (!rule || rule.kind === 'free_module')
|
|
34
|
+
return null;
|
|
35
|
+
if (rule.value == null)
|
|
36
|
+
return null;
|
|
37
|
+
const coveredSubtotal = addCents(...items.filter((i) => i.origin === 'module' && bundle.moduleCodes.includes(i.targetCode)).map((i) => i.subtotalCents));
|
|
38
|
+
if (coveredSubtotal <= 0)
|
|
39
|
+
return null;
|
|
40
|
+
if (rule.kind === 'percent')
|
|
41
|
+
return applyPercent(coveredSubtotal, rule.value);
|
|
42
|
+
return Math.min(coveredSubtotal, reaisToCents(rule.value));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/pricing-engine/bundle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGjD;;;;;;;;GAQG;AAEH,MAAM,UAAU,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,kBAAkB,CAC1B,gBAAgB,EAChB,WAAW,MAAM,CAAC,IAAI,uCAAuC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACnF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,uHAAuH;AACvH,MAAM,UAAU,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,kBAAkB,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,MAAM,UAAU,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,QAAQ,CAC9B,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,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taxonomia de erros do Pricing Engine (RFC-CAPABILITY-PRICING-ENGINE-001 §2/
|
|
3
|
+
* §8, ETAPA 15). Invariante herdada das Capabilities certificadas: um erro de
|
|
4
|
+
* contrato é RETORNADO como dado (`EngineResult`, ver types.ts), nunca
|
|
5
|
+
* lançado silenciosamente para o consumidor — o motor puro não deve expor
|
|
6
|
+
* `throw` na sua fronteira pública. Internamente, helpers podem lançar
|
|
7
|
+
* `PricingEngineError` — `pipeline.ts` captura na borda e converte em
|
|
8
|
+
* `{ ok: false, error }`.
|
|
9
|
+
*/
|
|
10
|
+
export type PricingErrorCode = 'catalog-version-not-found' | 'offer-not-found' | 'offer-ineligible' | 'currency-mismatch' | 'conflicting-rules' | 'invalid-bundle' | 'duplicate-charge-item' | 'coupon-invalid' | 'coupon-expired' | 'coupon-not-eligible' | 'campaign-conflict' | 'proration-invalid' | 'negotiated-contract-invalid' | 'price-rule-missing' | 'arithmetic-overflow' | 'invalid-effective-date';
|
|
11
|
+
/**
|
|
12
|
+
* Classificação (ETAPA 15): orienta o consumidor sobre corrigibilidade —
|
|
13
|
+
* `validation`/`operator-correctable` são esperados em uso normal (ex.: cupom
|
|
14
|
+
* expirado); `conflict` exige decisão humana (regras concorrentes); `configuration`
|
|
15
|
+
* e `permanent` indicam dado de catálogo/tabela incoerente, nunca escolha do
|
|
16
|
+
* usuário final.
|
|
17
|
+
*/
|
|
18
|
+
export type PricingErrorClass = 'validation' | 'conflict' | 'configuration' | 'permanent' | 'operator-correctable';
|
|
19
|
+
export declare class PricingEngineError extends Error {
|
|
20
|
+
readonly code: PricingErrorCode;
|
|
21
|
+
readonly errorClass: PricingErrorClass;
|
|
22
|
+
/** `ruleId`s envolvidos num conflito (§8) — vazio quando não aplicável. */
|
|
23
|
+
readonly ruleIds: string[];
|
|
24
|
+
constructor(code: PricingErrorCode, message: string, ruleIds?: string[]);
|
|
25
|
+
toJSON(): {
|
|
26
|
+
code: PricingErrorCode;
|
|
27
|
+
errorClass: PricingErrorClass;
|
|
28
|
+
message: string;
|
|
29
|
+
ruleIds: string[];
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/pricing-engine/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,gBAAgB,GACxB,2BAA2B,GAC3B,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,GACnB,mBAAmB,GACnB,gBAAgB,GAChB,uBAAuB,GACvB,gBAAgB,GAChB,gBAAgB,GAChB,qBAAqB,GACrB,mBAAmB,GACnB,mBAAmB,GACnB,6BAA6B,GAC7B,oBAAoB,GACpB,qBAAqB,GACrB,wBAAwB,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,UAAU,GAAG,eAAe,GAAG,WAAW,GAAG,sBAAsB,CAAC;AAqBnH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEf,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAO;IAQ3E,MAAM,IAAI;QAAE,IAAI,EAAE,gBAAgB,CAAC;QAAC,UAAU,EAAE,iBAAiB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;CAGxG"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taxonomia de erros do Pricing Engine (RFC-CAPABILITY-PRICING-ENGINE-001 §2/
|
|
3
|
+
* §8, ETAPA 15). Invariante herdada das Capabilities certificadas: um erro de
|
|
4
|
+
* contrato é RETORNADO como dado (`EngineResult`, ver types.ts), nunca
|
|
5
|
+
* lançado silenciosamente para o consumidor — o motor puro não deve expor
|
|
6
|
+
* `throw` na sua fronteira pública. Internamente, helpers podem lançar
|
|
7
|
+
* `PricingEngineError` — `pipeline.ts` captura na borda e converte em
|
|
8
|
+
* `{ ok: false, error }`.
|
|
9
|
+
*/
|
|
10
|
+
const ERROR_CLASS = {
|
|
11
|
+
'catalog-version-not-found': 'configuration',
|
|
12
|
+
'offer-not-found': 'validation',
|
|
13
|
+
'offer-ineligible': 'validation',
|
|
14
|
+
'currency-mismatch': 'permanent',
|
|
15
|
+
'conflicting-rules': 'conflict',
|
|
16
|
+
'invalid-bundle': 'configuration',
|
|
17
|
+
'duplicate-charge-item': 'permanent',
|
|
18
|
+
'coupon-invalid': 'validation',
|
|
19
|
+
'coupon-expired': 'operator-correctable',
|
|
20
|
+
'coupon-not-eligible': 'validation',
|
|
21
|
+
'campaign-conflict': 'conflict',
|
|
22
|
+
'proration-invalid': 'validation',
|
|
23
|
+
'negotiated-contract-invalid': 'configuration',
|
|
24
|
+
'price-rule-missing': 'configuration',
|
|
25
|
+
'arithmetic-overflow': 'permanent',
|
|
26
|
+
'invalid-effective-date': 'validation',
|
|
27
|
+
};
|
|
28
|
+
export class PricingEngineError extends Error {
|
|
29
|
+
code;
|
|
30
|
+
errorClass;
|
|
31
|
+
/** `ruleId`s envolvidos num conflito (§8) — vazio quando não aplicável. */
|
|
32
|
+
ruleIds;
|
|
33
|
+
constructor(code, message, ruleIds = []) {
|
|
34
|
+
super(message);
|
|
35
|
+
this.name = 'PricingEngineError';
|
|
36
|
+
this.code = code;
|
|
37
|
+
this.errorClass = ERROR_CLASS[code];
|
|
38
|
+
this.ruleIds = ruleIds;
|
|
39
|
+
}
|
|
40
|
+
toJSON() {
|
|
41
|
+
return { code: this.code, errorClass: this.errorClass, message: this.message, ruleIds: this.ruleIds };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# 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,MAAM,OAAO,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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type { Cents } from './money.js';
|
|
2
|
+
export { roundHalfEven, reaisToCents, centsToReais, addCents, subtractCents, multiplyByQuantity, applyPercent, prorateByDays, clampNonNegative, } from './money.js';
|
|
3
|
+
export type { PricingErrorCode, PricingErrorClass } from './errors.js';
|
|
4
|
+
export { PricingEngineError } from './errors.js';
|
|
5
|
+
export type { EngineResult, PricingRuleStep, ItemOrigin, PricingQuoteItem, PricingQuoteDiscount, PricingQuoteTax, TrialContext, NegotiatedContract, BundlePricingRuleKind, BundlePricingRule, PricingCouponRule, PricingCampaignRule, ProrationReason, ProrationTiming, ProrationInput, ProrationResult, PricingRequest, PricingQuote, } from './types.js';
|
|
6
|
+
export { PRICING_ENGINE_VERSION, PRICING_RULE_STEPS_IN_ORDER } from './types.js';
|
|
7
|
+
export { assertBundleModulesCovered, freeModuleCodesForBundle, resolveBundleDiscount } from './bundle.js';
|
|
8
|
+
export { computeProration } from './proration.js';
|
|
9
|
+
export { computePricingQuote } from './pipeline.js';
|
|
10
|
+
export type { ShadowComparisonStatus, NormalizedQuoteForComparison, QuoteItemDiff, ShadowComparisonResult } from './shadow.js';
|
|
11
|
+
export { normalizeCanonicalQuote, compareQuotes } from './shadow.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pricing-engine/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,YAAY,EACV,YAAY,EACZ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,cAAc,EACd,eAAe,EACf,cAAc,EACd,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAEjF,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,YAAY,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC/H,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { roundHalfEven, reaisToCents, centsToReais, addCents, subtractCents, multiplyByQuantity, applyPercent, prorateByDays, clampNonNegative, } from './money.js';
|
|
2
|
+
export { PricingEngineError } from './errors.js';
|
|
3
|
+
export { PRICING_ENGINE_VERSION, PRICING_RULE_STEPS_IN_ORDER } from './types.js';
|
|
4
|
+
export { assertBundleModulesCovered, freeModuleCodesForBundle, resolveBundleDiscount } from './bundle.js';
|
|
5
|
+
export { computeProration } from './proration.js';
|
|
6
|
+
export { computePricingQuote } from './pipeline.js';
|
|
7
|
+
export { normalizeCanonicalQuote, compareQuotes } from './shadow.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pricing-engine/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAsBjD,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAEjF,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|