import React, { useState, useEffect } from 'react'; import { Package, Plus, Minus, Edit, Search, Menu, X, Save, ArrowLeft } from 'lucide-react'; const InventoryApp = () => { const [currentScreen, setCurrentScreen] = useState('main'); const [searchTerm, setSearchTerm] = useState(''); const [selectedCategory, setSelectedCategory] = useState(''); const [editingProduct, setEditingProduct] = useState(null); const [showCategoryModal, setShowCategoryModal] = useState(false); const [newCategoryName, setNewCategoryName] = useState(''); // 初期商品データ(CSVから) const initialProducts = [ { id: 1, name: 'RUF-E2406SAW', category: '給湯器', stock: 0, minStock: 5, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 2, name: 'RUF-E240ESAW', category: '給湯器', stock: 0, minStock: 5, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 3, name: 'GT-C2462SAWX-2', category: '給湯器', stock: 0, minStock: 5, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 4, name: 'DKDU-A20W', category: '給湯器', stock: 0, minStock: 5, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 5, name: 'RVD-E2405SAW2-1', category: '給湯器', stock: 0, minStock: 5, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 6, name: 'RT-64JH6S2-GL', category: 'コンロ', stock: 0, minStock: 3, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 7, name: 'RT-64JH6S2-GR', category: 'コンロ', stock: 0, minStock: 3, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 8, name: 'PD-N36', category: 'コンロ', stock: 0, minStock: 3, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 9, name: 'STG-25MT1M', category: 'メーター', stock: 0, minStock: 10, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 10, name: 'SA-25MTI-6', category: 'メーター', stock: 0, minStock: 10, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 11, name: 'EY-25MTP-YL', category: 'メーター', stock: 0, minStock: 10, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 12, name: 'AXS-8C-2TH', category: '空調機器', stock: 0, minStock: 2, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 13, name: 'AS-8ZA-L650', category: '空調機器', stock: 0, minStock: 2, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 14, name: 'MUBIY-15(W)', category: '空調機器', stock: 0, minStock: 2, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 15, name: 'YF-433F-S', category: '換気扇', stock: 0, minStock: 5, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 16, name: 'CF-626ポL', category: '換気扇', stock: 0, minStock: 5, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 17, name: 'APH-40N', category: '換気扇', stock: 0, minStock: 5, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 18, name: 'ガスコード 1m', category: 'ガスコード', stock: 0, minStock: 20, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 19, name: 'ガスコード 2m', category: 'ガスコード', stock: 0, minStock: 15, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 20, name: 'ガスコード 3m', category: 'ガスコード', stock: 0, minStock: 10, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 21, name: 'ガスコード 5m', category: 'ガスコード', stock: 0, minStock: 5, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 22, name: 'VL-SE30X-L', category: 'ドアホン', stock: 0, minStock: 3, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 23, name: '22タイプ', category: 'エアコン', stock: 0, minStock: 2, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 24, name: '25タイプ', category: 'エアコン', stock: 0, minStock: 2, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 25, name: '28タイプ', category: 'エアコン', stock: 0, minStock: 2, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }, { id: 26, name: '40タイプ', category: 'エアコン', stock: 0, minStock: 1, note: '', lastInDate: '', lastOutDate: '', lastUser: '' } ]; const [products, setProducts] = useState(initialProducts); const [formData, setFormData] = useState({ productId: '', quantity: '', user: '', note: '' }); const [categories, setCategories] = useState(['給湯器', 'コンロ', 'メーター', '空調機器', '換気扇', 'ガスコード', 'ドアホン', 'エアコン']); const formatDate = (date) => { return new Date(date).toLocaleDateString('ja-JP', { year: 'numeric', month: '2-digit', day: '2-digit' }); }; const getCurrentDate = () => { return new Date().toISOString().split('T')[0]; }; const filteredProducts = products.filter(product => { const matchesSearch = product.name.toLowerCase().includes(searchTerm.toLowerCase()) || product.category.toLowerCase().includes(searchTerm.toLowerCase()); const matchesCategory = !selectedCategory || product.category === selectedCategory; return matchesSearch && matchesCategory; }); const handleStockIn = () => { if (!formData.productId || !formData.quantity || !formData.user) { alert('商品、数量、担当者を入力してください'); return; } const quantity = parseInt(formData.quantity); if (quantity <= 0) { alert('数量は1以上を入力してください'); return; } setProducts(prev => prev.map(product => product.id === parseInt(formData.productId) ? { ...product, stock: product.stock + quantity, lastInDate: getCurrentDate(), lastUser: formData.user, note: formData.note || product.note } : product )); setFormData({ productId: '', quantity: '', user: '', note: '' }); alert('入庫が完了しました'); setCurrentScreen('main'); }; const handleStockOut = () => { if (!formData.productId || !formData.quantity || !formData.user) { alert('商品、数量、担当者を入力してください'); return; } const quantity = parseInt(formData.quantity); const product = products.find(p => p.id === parseInt(formData.productId)); if (quantity <= 0) { alert('数量は1以上を入力してください'); return; } if (product.stock < quantity) { alert('在庫が不足しています'); return; } setProducts(prev => prev.map(p => p.id === parseInt(formData.productId) ? { ...p, stock: p.stock - quantity, lastOutDate: getCurrentDate(), lastUser: formData.user, note: formData.note || p.note } : p )); setFormData({ productId: '', quantity: '', user: '', note: '' }); alert('出庫が完了しました'); setCurrentScreen('main'); }; const handleProductEdit = (product) => { setEditingProduct({...product}); }; const handleProductSave = () => { if (!editingProduct.name || !editingProduct.category) { alert('商品名とカテゴリーを入力してください'); return; } if (editingProduct.id > Math.max(...products.map(p => p.id))) { // 新商品の追加 setProducts(prev => [...prev, editingProduct]); } else { // 既存商品の更新 setProducts(prev => prev.map(p => p.id === editingProduct.id ? editingProduct : p )); } setEditingProduct(null); alert('商品情報を更新しました'); }; const handleAddCategory = () => { if (!newCategoryName.trim()) { alert('カテゴリー名を入力してください'); return; } if (categories.includes(newCategoryName.trim())) { alert('既に存在するカテゴリー名です'); return; } setCategories(prev => [...prev, newCategoryName.trim()]); setNewCategoryName(''); alert('カテゴリーを追加しました'); }; const handleDeleteCategory = (categoryName) => { console.log(`削除対象カテゴリー: ${categoryName}`); console.log('現在の商品一覧:', products); const productsInCategory = products.filter(p => p.category === categoryName); console.log(`カテゴリー「${categoryName}」の商品:`, productsInCategory); console.log(`商品数: ${productsInCategory.length}`); if (productsInCategory.length > 0) { alert(`このカテゴリーには${productsInCategory.length}個の商品が登録されています。先に商品を削除するか、他のカテゴリーに移動してください。`); return; } const confirmDelete = confirm(`カテゴリー「${categoryName}」を削除しますか?`); console.log(`削除確認結果: ${confirmDelete}`); if (confirmDelete) { console.log(`カテゴリー「${categoryName}」を削除中...`); console.log('削除前のカテゴリー:', categories); setCategories(prev => { const newCategories = prev.filter(cat => cat !== categoryName); console.log('削除後のカテゴリー:', newCategories); return newCategories; }); // 選択中のカテゴリーが削除された場合、フィルターをリセット if (selectedCategory === categoryName) { setSelectedCategory(''); console.log('選択中のカテゴリーフィルターをリセット'); } console.log('削除処理完了'); alert('カテゴリーを削除しました'); } }; const handleAddProduct = () => { const newProduct = { id: Math.max(...products.map(p => p.id)) + 1, name: '', category: categories[0], stock: 0, minStock: 5, note: '', lastInDate: '', lastOutDate: '', lastUser: '' }; setEditingProduct(newProduct); }; const handleDeleteProduct = (productId) => { if (confirm('この商品を削除しますか?')) { setProducts(prev => prev.filter(p => p.id !== productId)); } }; const renderMainScreen = () => (
{/* Header */}

在庫管理システム

{/* Search and Filter */}
setSearchTerm(e.target.value)} />
{/* Action Buttons */}
{/* Product List */}
{filteredProducts.map(product => (

{product.name}

{product.category}

在庫: {product.stock}個 適正: {product.minStock}個
{product.note && (

備考: {product.note}

)}
{product.lastInDate &&
最新入庫: {formatDate(product.lastInDate)}
} {product.lastOutDate &&
最新出庫: {formatDate(product.lastOutDate)}
} {product.lastUser &&
担当者: {product.lastUser}
}
{product.stock === 0 ? '欠品' : product.stock <= product.minStock ? '少' : '在庫有'}
))}
); const renderStockInScreen = () => (

入庫処理

setFormData({...formData, quantity: e.target.value})} />
setFormData({...formData, user: e.target.value})} />