From 0edfb1b4399e2370c815155ad945dfe6e68b6dfd Mon Sep 17 00:00:00 2001 From: Diego Madero Islas Date: Wed, 10 Jun 2026 14:11:32 -0600 Subject: [PATCH] Split setup read models for MWP stabilization --- app/admin/setup/page.tsx | 107 +++++++++++++++-------------- docs/mwp-stabilization-status.md | 44 ++++++++++++ docs/roadmap.md | 6 ++ lib/server/demo-data.ts | 114 ++++++++++++++++++++++++++----- 4 files changed, 204 insertions(+), 67 deletions(-) create mode 100644 docs/mwp-stabilization-status.md diff --git a/app/admin/setup/page.tsx b/app/admin/setup/page.tsx index eb643d1..43994a3 100644 --- a/app/admin/setup/page.tsx +++ b/app/admin/setup/page.tsx @@ -177,31 +177,36 @@ export default async function SetupPage({ const today = new Date().toISOString().slice(0, 10); const runtimeMode = getRuntimeMode(); const canResetDemoWorkspace = isNonProductionMode(); + const identitySetup = data.identitySetup; + const customerSetup = data.customerSetup; + const businessSetup = data.businessSetup; + const procurementSetup = data.procurementSetup; + const catalogSetup = data.catalogSetup; const editingSupplier = params?.supplier - ? (data.suppliers.find((supplier) => supplier.id === params.supplier) ?? + ? (procurementSetup.suppliers.find((supplier) => supplier.id === params.supplier) ?? null) : null; const editingMaterial = params?.material - ? (data.rawMaterials.find((material) => material.id === params.material) ?? + ? (procurementSetup.rawMaterials.find((material) => material.id === params.material) ?? null) : null; const selectedProduct = params?.product - ? (data.products.find((product) => product.id === params.product) ?? null) + ? (catalogSetup.products.find((product) => product.id === params.product) ?? null) : null; const editingRecipe = params?.recipe - ? (data.recipes.find((recipe) => recipe.id === params.recipe) ?? null) + ? (catalogSetup.recipes.find((recipe) => recipe.id === params.recipe) ?? null) : null; const editingUser = params?.user - ? (data.users.find((user) => user.id === params.user) ?? null) + ? (identitySetup.users.find((user) => user.id === params.user) ?? null) : null; const historySupplier = params?.historySupplier - ? (data.suppliers.find( + ? (procurementSetup.suppliers.find( (supplier) => supplier.id === params.historySupplier, ) ?? null) : null; const historyMaterial = params?.historyMaterial - ? (data.rawMaterials.find( + ? (procurementSetup.rawMaterials.find( (material) => material.id === params.historyMaterial, ) ?? null) : null; @@ -221,7 +226,7 @@ export default async function SetupPage({ const supplierPriceCounts = new Map(); const materialPriceCounts = new Map(); - for (const entry of data.supplierPriceEntries) { + for (const entry of procurementSetup.supplierPriceEntries) { supplierPriceCounts.set( entry.supplierId, (supplierPriceCounts.get(entry.supplierId) ?? 0) + 1, @@ -232,7 +237,7 @@ export default async function SetupPage({ ); } - const filteredPriceEntries = data.supplierPriceEntries.filter((entry) => { + const filteredPriceEntries = procurementSetup.supplierPriceEntries.filter((entry) => { if (historySupplier && entry.supplierId !== historySupplier.id) { return false; } @@ -265,21 +270,21 @@ export default async function SetupPage({ const recipeLineRows = buildRecipeLineRows(editingRecipe); const recipeProductId = editingRecipe?.productId ?? selectedProduct?.id ?? ''; const editingRecipeCost = editingRecipe - ? (data.recipeCostById.get(editingRecipe.id) ?? null) + ? (catalogSetup.recipeCostById.get(editingRecipe.id) ?? null) : null; - const activeRecipes = data.recipes.filter((recipe) => recipe.active).length; + const activeRecipes = catalogSetup.recipes.filter((recipe) => recipe.active).length; const linkedProductCount = new Set( - data.recipes.map((recipe) => recipe.productVariantId ?? recipe.productId), + catalogSetup.recipes.map((recipe) => recipe.productVariantId ?? recipe.productId), ).size; const recipesByProduct = new Map(); - for (const recipe of data.recipes) { + for (const recipe of catalogSetup.recipes) { const existingRecipes = recipesByProduct.get(recipe.productId) ?? []; recipesByProduct.set(recipe.productId, [...existingRecipes, recipe]); } const costingItems = buildCostingSnapshotItems( - data.products, - data.recipes, - data.recipeCostById, + catalogSetup.products, + catalogSetup.recipes, + catalogSetup.recipeCostById, ); const costingStatusFilter = params?.costingStatus ?? 'all'; const filteredCostingItems = costingItems.filter( @@ -349,7 +354,7 @@ export default async function SetupPage({ query: { section }, hash: section, }); - const onboardingProgress = data.instance.onboardingProgress; + const onboardingProgress = identitySetup.instance.onboardingProgress; const guidedChecklist = [ { label: 'Admin account', done: onboardingProgress.adminAccount }, { label: 'Workspace basics', done: onboardingProgress.workspaceBasics }, @@ -464,12 +469,12 @@ export default async function SetupPage({

{t('setup.customerMemoryHelp')}

- {data.customers.length} {t('common.customers')} + {customerSetup.customers.length} {t('common.customers')} - {data.customers.length > 0 ? ( + {customerSetup.customers.length > 0 ? (