import { useState, useEffect } from 'react'; import { Plant } from '../types'; import { Package, Edit, X, Clock, MapPin, AlertTriangle } from 'lucide-react'; import { apiService } from '../services/api'; import { processTypes } from "./HarvestProcessingModal"; interface HarvestStockManagerProps { plants: Plant[]; } export default function HarvestStockManager({ plants }: HarvestStockManagerProps) { const [stocks, setStocks] = useState([]); const [loading, setLoading] = useState(true); const [editingStock, setEditingStock] = useState(null); const [filterStatus, setFilterStatus] = useState('all'); const [filterPlant, setFilterPlant] = useState('all'); useEffect(() => { loadStocks(); }, []); const loadStocks = async () => { try { setLoading(true); const data = await apiService.getHarvestStock(); setStocks(data); } catch (error) { console.error('Error loading harvest stock:', error); } finally { setLoading(false); } }; const filteredStocks = stocks.filter(stock => { const matchesStatus = filterStatus === 'all' || stock.status === filterStatus; const matchesPlant = filterPlant === 'all' || stock.plantId.toString() === filterPlant; return matchesStatus && matchesPlant; }); const handleUpdateStock = async (stockId: number, updates: any) => { try { const updatedStock = await apiService.updateHarvestStock(stockId, updates); setStocks(stocks.map(s => s.id === stockId ? updatedStock : s)); setEditingStock(null); } catch (error) { console.error('Error updating stock:', error); } }; const getStatusColor = (status: string) => { switch (status) { case 'available': return 'bg-green-100 text-green-800'; case 'consumed': return 'bg-gray-100 text-gray-800'; case 'expired': return 'bg-red-100 text-red-800'; case 'spoiled': return 'bg-orange-100 text-orange-800'; default: return 'bg-gray-100 text-gray-800'; } }; const getProcessTypeColor = (type: string) => { switch (type) { case 'fresh': return 'bg-green-100 text-green-800'; case 'frozen': return 'bg-blue-100 text-blue-800'; case 'jam': return 'bg-purple-100 text-purple-800'; case 'dried': return 'bg-yellow-100 text-yellow-800'; case 'canned': return 'bg-orange-100 text-orange-800'; case 'juice': return 'bg-pink-100 text-pink-800'; case 'sauce': return 'bg-red-100 text-red-800'; case 'pickled': return 'bg-indigo-100 text-indigo-800'; default: return 'bg-gray-100 text-gray-800'; } }; if (loading) { return (
); } return (

Управление запасами

Отслеживайте свои запасы обработанного урожая

{/* Filters */}
{/* Stock Grid */}
{filteredStocks.map((stock) => { const plant = plants.find(p => p.id === stock.plantId); const isExpiringSoon = stock.expiryDate && new Date(stock.expiryDate) <= new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); return (

{plant?.variety}

Собрано: {new Date(stock.harvestDate).toLocaleDateString()}

Тип: {processTypes.find(t => t.value === stock.processType)?.label}
Количество: {stock.currentQuantity} {stock.unit}
Состояние: {stock.status}
{stock.storageLocation && (
{stock.storageLocation}
)} {stock.expiryDate && (
Срок годности: {new Date(stock.expiryDate).toLocaleDateString()} {isExpiringSoon && }
)}
Обновлено: {new Date(stock.lastUpdated).toLocaleDateString()}
{stock.notes && (

{stock.notes}

)}
); })}
{filteredStocks.length === 0 && (

No harvest stock found.

Process some harvests to see stock here.

)} {/* Edit Stock Modal */} {editingStock && (

Изменить запасы

{ e.preventDefault(); const formData = new FormData(e.target as HTMLFormElement); handleUpdateStock(editingStock.id, { currentQuantity: parseFloat(formData.get('currentQuantity') as string), status: formData.get('status'), notes: formData.get('notes') || undefined }); }} className="p-6 space-y-4">