CRM для виробництва косметикиСтруктура бази даних та потік роботиЕТАП 1: Довідники (створюються один раз)Suppliers (Постачальники) id name phone link● createdAtПриклад: ТОВ "Хімпром"Materials (Сировина/Комплектуючі) id name type: 'raw' | 'component' unit: 'мл' | 'г' | 'шт'● minStock commentПриклад: Гліцерин, 'raw', 'мл'Баночка 30мл, 'component', 'шт'Recipes (Тех-карти) id baseProductName baseQuantity: 100 unit: 'мл' | 'г' ingredients: [](materialId, quantity, unit) descriptionПриклад: Крем для обличчябазова рецептура на 100млГліцерин: 10мл, Олія: 5млвикористовуєЕТАП 2: Закупівля сировиниMaterialBatches (Партії сировини) id materialId → Materials supplierId → Suppliers quantity (загальна кількість) currentStock (поточний залишок) cost (вартість партії) arrivalDate manufactureDate expiryDate supplierDocNumber receiptPhoto expiryHistory: []⚠️ FIFO: використовуються найстарішінадходитьвід постачальникаЕТАП 3: Виробництво товарівProductions (Виробництво) id recipeId → Recipes productVariant: (volume, unit)● coefficient (volume / baseQuantity) plannedQuantity (планували) producedQuantity (вийшло) productionDate batchNumber (унікальний номер) expiryDate (готового товару) usedMaterials: [](materialId, materialBatchId) usedQuantity, unitCost ● totalCost (собівартість партії)● costPerUnit (собівартість 1шт)● status: 'completed'Приклад: Зробили 50шт кремів 30млProductBatches (Склад готової продукції) id productId → Products productionId → Productions batchNumber quantity (виготовлено) currentStock (поточний залишок)● soldQuantity (продано) manufactureDate expiryDate costPerUnit (собівартість) location (де зберігається)● status: 'available'⚠️ Партійний облік готових товарів!⚠️ FIFO: продаються найстарішівикористовує рецептсписує сировину (FIFO)створюєЕТАП 4: Каталог товарів (E-commerce)Products (Товари в каталозі) id name recipeId → Recipes volume, unit● coefficient price (ціна продажу)● images, description● inventory:totalStock (сума всіх ProductBatches)availableStock (доступно для продажу)reservedStock (зарезервовано)batches: [] (список партій)nearestExpiry (найближчий термін)averageCost (середня собівартість)Приклад: Крем для обличчя 30млЦіна: 250₴, В наявності: 85штагрегує дані з партійпосилання на рецептЕТАП 5: Продажі та списанняOrders (Замовлення) id customerId items: [](productId, quantity, price) allocatedBatches: [] ● status, totalAmount⚠️ Автоматично списує з найстаріших партій (FIFO)купує товарисписує з партій📋 ЛЕГЕНДАПозначення полів: Обов'язкове поле Опціональне полеКольори блоків:ПостачальникиСировина та партіїТех-карти (рецепти)ВиробництвоСклад готової продукціїКаталог товарівЗамовлення⚠️ Ключові принципи:• FIFO - First In, First OutНайстаріші партії використовуються першими• Партійний облік на всіх рівнях:MaterialBatches - партії сировиниProductBatches - партії готових товарів• Автоматичний розрахунок:Собівартість фіксується при виробництвіЗалишки оновлюються автоматично