- Shipped
- September 28, 2026 at 5:57 AM UTC
- Author
- Kamo
- Commit
- 3a5e335
KamoUniverse sells four catalogs out of the platform org's one plan table. This lands the schema and the data for the three new ones. - UniverseColumnsMigration (@Order 0): orgs.universe_type and **************** nullable INT, no default - null is BUSINESS, so nothing is backfilled and no existing row changes meaning. - UniverseCatalogMigration (@Order 50), insert-if-missing and scoped by org_id: the KamoFamily / KamoCommunity / KamoPersonal SUBSCRIPTION markets; the twelve plans (FAMILY_*, COMMUNITY_*, PERSONAL_*) with universe_type and an explicit market_id, so KamoCRMMarketBackfillLoader never absorbs them into KamoCRM; their monthly/annual/triennial per-seat prices; USERS (seat ceiling, unlimited on the negotiated plans) and STORAGE (4 GB/seat) rows; the "Add-on" mail and phone rows; compatibility for the five add-ons every plan may buy (both mail, both phone, extra storage); and Community Premium's 51-250 seat band at 15% off. - UniversePackages: which apps each new plan includes, read by both **************** (the authority, which writes the rows) and **************** so they cannot disagree. No CRM on the Family or Personal ladders; mail, the origination systems, patient records and Hosted Computers on no universe tier. - The origination/EHR/Hosted Computers add-ons are made compatible with BUSINESS negotiated plans only when first created, never the Family/Community ones. - The totality test's "commerce children sit exactly with POS" rule is the business ladder's history; it now checks business codes, and a new check keeps every universe tier from bundling a commerce child without POS.
