- Shipped
- September 28, 2026 at 5:57 AM UTC
- Author
- Kamo
- Commit
- b3257c2
KamoUniverse adds Family, Community and Personal ladders beside the business one, and BillingService assumed a single catalog: "the Free plan" was the code FREE, "negotiated" was the code ENTERPRISE, and the market was the root's first one. - resolveBillingMarketId: a Family/Community/Personal org buys from its universe market (KamoFamily, ...), so the console lists that ladder only. Business unchanged. - create/update refuse a plan from another universe than the target org's, so a family cannot post the KamoCRM market id and buy the business ladder. - Free-plan checks go by plan type (FAMILY_FREE, ...) or the business FREE code; an expired trial or a lapsed plan falls back to the org universe's Free plan. - Seat ceilings: business keeps "25 on any plan, Enterprise above"; the new ladders cap each plan at its own seat count and point at the next plan up, with only the negotiated plan uncapped (Personal has none: Pro's 5 is the end). - EnterprisePlanGuard guards every plan_type CUSTOM plan on the platform org, not only the one coded ENTERPRISE. - The shared add-ons (mail, phone, storage) filed under the KamoCRM market are listed on a universe market when compatible with its plans, and a business promotion is not advertised on a universe market. Plan DTOs carry "universe". Needs kamo-shared-library's UniversePlans (pushed first).
