Implement supplier product/price association & unify onboarding UI
MAJOR FEATURES IMPLEMENTED: 1. ✅ CRITICAL: Supplier Product/Price Association - Created SupplierProductManager component (438 lines) - Multi-select product picker from inventory - Price entry with unit of measure and min quantity - Expandable UI per supplier (collapsed by default) - Full CRUD operations via existing API hooks - Required for automatic Purchase Order (PO) creation - Warning shown if supplier has no products 2. ✅ Step Re-Ordering: Inventory Before Suppliers - Manual path: inventory-setup now comes BEFORE suppliers-setup - AI path: Already has inventory from sales data upload - Ensures products exist before supplier association - Critical workflow fix identified by user 3. ✅ UI/UX Unification - Unified badge styles across AI suggestions - Changed hardcoded colors to CSS variables - Consistent rounded-full badge design - Added flex-wrap for responsive badges IMPLEMENTATION DETAILS: SupplierProductManager.tsx (NEW - 438 lines): - useSupplierPriceLists() - Fetch existing products for supplier - useIngredients() - Fetch all available inventory items - useCreate/Update/DeleteSupplierPriceList() mutations - Expandable UI: Collapsed shows count, expanded shows management - Product selection: Checkboxes with inline price forms - Form fields: unit_price (required), unit_of_measure, min_order_quantity - Validation: Price must be > 0, unit required - Warning: Shows if no products added (blocks PO creation) UnifiedOnboardingWizard.tsx: - inventory-setup moved before suppliers-setup - inventory-setup condition: dataSource === 'manual' - suppliers-setup condition: Inventory exists (AI stockEntryCompleted OR manual inventoryCompleted) - Ensures products always exist before supplier association SuppliersSetupStep.tsx: - Added SupplierProductManager import - Changed supplier card layout from flex items-center to block - Integrated ProductManager component into each supplier card - Product management appears below contact info, above edit/delete UploadSalesDataStep.tsx: - Updated badge colors: blue-100/blue-800 → CSS variables - Changed bg-[var(--bg-tertiary)] → bg-[var(--bg-primary)] - Added flex-wrap to badge container - Consistent rounded-full design FLOW IMPROVEMENTS: AI-Assisted Path: Registration → Bakery Type → Data Source → Tenant Setup → Upload Sales → Categorize → Enter Stock → **Suppliers (with products)** → ML Training → Complete Manual Path: Registration → Bakery Type → Data Source → Tenant Setup → **Inventory Setup → Suppliers (with products)** → Recipes → Processes → ML Training → Complete BENEFITS: ✅ Automatic PO creation now possible ✅ System knows supplier-product relationships ✅ Prices tracked for cost analysis ✅ Logical workflow (products before suppliers) ✅ Unified, consistent UI across onboarding ✅ Critical missing feature implemented Build: Successful (21.73s) Files: 4 changed (3 modified, 1 new) Lines: +438 new component, ~50 lines modified
This commit is contained in:
@@ -108,22 +108,28 @@ const OnboardingWizardContent: React.FC = () => {
|
||||
isConditional: true,
|
||||
condition: (ctx) => ctx.state.dataSource === 'ai-assisted' && ctx.state.categorizationCompleted,
|
||||
},
|
||||
// Phase 2b: Core Data Entry
|
||||
{
|
||||
id: 'suppliers-setup',
|
||||
title: t('onboarding:steps.suppliers.title', 'Proveedores'),
|
||||
description: t('onboarding:steps.suppliers.description', 'Configura tus proveedores'),
|
||||
component: SuppliersSetupStep,
|
||||
isConditional: true,
|
||||
condition: (ctx) => ctx.state.dataSource !== null,
|
||||
},
|
||||
// Phase 2b: Core Data Entry (Manual Path)
|
||||
// IMPORTANT: Inventory must come BEFORE suppliers so suppliers can associate products
|
||||
{
|
||||
id: 'inventory-setup',
|
||||
title: t('onboarding:steps.inventory.title', 'Inventario'),
|
||||
description: t('onboarding:steps.inventory.description', 'Productos e ingredientes'),
|
||||
component: InventorySetupStep,
|
||||
isConditional: true,
|
||||
condition: (ctx) => ctx.state.dataSource !== null,
|
||||
condition: (ctx) =>
|
||||
// Only show for manual path (AI path creates inventory earlier)
|
||||
ctx.state.dataSource === 'manual',
|
||||
},
|
||||
{
|
||||
id: 'suppliers-setup',
|
||||
title: t('onboarding:steps.suppliers.title', 'Proveedores'),
|
||||
description: t('onboarding:steps.suppliers.description', 'Configura tus proveedores'),
|
||||
component: SuppliersSetupStep,
|
||||
isConditional: true,
|
||||
condition: (ctx) =>
|
||||
// Show after inventory exists (either from AI or manual path)
|
||||
(ctx.state.dataSource === 'ai-assisted' && ctx.state.stockEntryCompleted) ||
|
||||
(ctx.state.dataSource === 'manual' && ctx.state.inventoryCompleted),
|
||||
},
|
||||
{
|
||||
id: 'recipes-setup',
|
||||
|
||||
Reference in New Issue
Block a user