- Ya
- 8 Agosti 2026, 16:45 UTC
- Mwandishi
- Kamo
- Ahadi ya
- c906e8e
Entitlement resolved ServiceType.name() against **************** The catalog's codes are marketing codes (USERS, VIDEO_CONF, HR_SYSTEM, ...) and never matched, so planFeatureIncluded's missing-row default granted every app on every plan — the billing-to-app link was inert. Catalog rows now carry a typed nullable service_type and resolution goes through it, so an app can be renamed without moving entitlement. - **************** typed service_type column (persisted as the id). - **************** resolve by ServiceType; honour add-ons via the previously unread **************** jsonb; missing-row behaviour behind kamo.entitlement.fail-open (default true until the catalog matrix is seeded). - SubscriptionService: carry serviceType through create/update/DTOs, and derive feature_code from the name when omitted — the settings dialog never sent one, so every create from the UI hit the NOT NULL constraint. - CommerceType: bind each vertical to its required app (MORTGAGE->MLOS, PERSONAL_LOANS->LOS). - AppliedModelEnforcementService: getAllowedCommerceTypes intersects the security-model allow-list with entitlement; assertCommerceTypeAllowed already covers create and edit. - ServiceType: LOS -> MLOS keeping id 14 (ORG_FEATURES persists the id, not the name, so no data migration); new LOS(25) for personal loans — id 25 because reusing 14 would reassign every existing mortgage row. - RoleRightType: MLOS_* rebound, ids 139-144 unchanged; personal-loan LOS_* added at 190-195. - PhiModule.PLOS added: the rename left the personal-loan app mapped to the mortgage PHI module and mortgage unmapped, which compiled clean.