import React, { useState, useEffect } from 'react'; import { useAppContext } from '../../context/AppContext.tsx'; import { apiClient } from '../../services/apiService.ts'; import { Kandang } from '../../types/counting.ts'; const KandangManagementPage: React.FC = () => { const { cycleData } = useAppContext(); const [kandangs, setKandangs] = useState([]); const [newName, setNewName] = useState(''); const [editingId, setEditingId] = useState(null); const [editName, setEditName] = useState(''); const [editDocInCount, setEditDocInCount] = useState(''); const [isAdding, setIsAdding] = useState(false); const [newDocInCount, setNewDocInCount] = useState(''); const loadKandangs = async () => { try { const data = await apiClient.getKandangsByCycle(cycleData.id); setKandangs(data); } catch (error) { console.error('Failed to load kandangs:', error); } }; useEffect(() => { loadKandangs(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [cycleData]); const handleAdd = async () => { if (!newName.trim()) return; try { const kandang = await apiClient.createKandang(newName.trim()); const docCount = parseInt(newDocInCount, 10); if (!isNaN(docCount) && docCount > 0) { await apiClient.setKandangDocInCount(kandang.id, cycleData.id, docCount); } setNewName(''); setNewDocInCount(''); setIsAdding(false); loadKandangs(); } catch (error) { console.error('Failed to create kandang:', error); alert('Gagal membuat kandang'); } }; const handleStartEdit = (kandang: Kandang) => { setEditingId(kandang.id); setEditName(kandang.name); setEditDocInCount((kandang.docInCount || 0).toString()); }; const handleSaveEdit = async () => { if (editingId === null || !editName.trim()) return; try { await apiClient.updateKandang(editingId, editName.trim()); const docCount = parseInt(editDocInCount, 10); if (!isNaN(docCount) && docCount >= 0) { await apiClient.setKandangDocInCount(editingId, cycleData.id, docCount); } setEditingId(null); loadKandangs(); } catch (error) { console.error('Failed to update kandang:', error); alert('Gagal mengupdate kandang'); } }; const handleDelete = async (id: number, name: string) => { if (!confirm(`Hapus "${name}"? Data mortalitas terkait juga akan terpengaruh.`)) return; try { await apiClient.deleteKandang(id); loadKandangs(); } catch (error) { console.error('Failed to delete kandang:', error); alert('Gagal menghapus kandang'); } }; const totalDocInCount = kandangs.reduce((sum, k) => sum + (k.docInCount || 0), 0); return (

Manajemen Kandang

Kelola kandang dan populasi awal (DOC In) untuk setiap siklus produksi

{/* Current Cycle Indicator */}

Siklus Produksi Saat Ini

{cycleData.id}{' '} (Hari {cycleData.currentDay} dari {cycleData.totalDays})

{/* Summary Card */}

Jumlah Kandang

{kandangs.length}

Total DOC In (Siklus {cycleData.id})

{totalDocInCount.toLocaleString()}{' '} ekor

Rata-rata per Kandang

{kandangs.length > 0 ? Math.floor(totalDocInCount / kandangs.length).toLocaleString() : 0}{' '} ekor

{/* Add button */} {!isAdding && (
)} {/* Add form */} {isAdding && (

Tambah Kandang Baru

setNewName(e.target.value)} placeholder="Contoh: Kandang 2" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-red-500 focus:border-red-500" autoFocus />
setNewDocInCount(e.target.value)} placeholder="Contoh: 10000" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-red-500 focus:border-red-500" />

Nilai ini khusus untuk siklus produksi ini

)} {/* Kandang Table */}
{kandangs.length === 0 ? ( ) : ( kandangs.map((kandang, index) => ( )) )} {kandangs.length > 0 && ( )}
# Nama Kandang DOC (Siklus Aktif) Aksi
Belum ada kandang. Tambahkan kandang baru untuk mulai.
{index + 1} {editingId === kandang.id ? ( setEditName(e.target.value)} className="px-3 py-1 border border-blue-500 rounded-lg focus:ring-2 focus:ring-blue-500" autoFocus /> ) : ( {kandang.name} )} {editingId === kandang.id ? ( setEditDocInCount(e.target.value)} className="w-32 px-3 py-1 border border-blue-500 rounded-lg text-right focus:ring-2 focus:ring-blue-500" /> ) : ( {(kandang.docInCount || 0).toLocaleString()} ekor )} {editingId === kandang.id ? (
) : (
)}
Total {totalDocInCount.toLocaleString()} ekor
{/* Info */}

Informasi Penting

  • DOC In Count diatur per kandang untuk setiap siklus - ketika membuat siklus baru, Anda perlu mengatur ulang DOC In untuk semua kandang
  • Data mortalitas di "Manajemen Data" akan dipisahkan per kandang
  • Dashboard akan menampilkan data per kandang dan total gabungan
  • Menghapus kandang akan mempengaruhi semua data historis yang terkait
); }; export default KandangManagementPage;