import React, { useState } from 'react'; import { X, Upload, Calendar, Plus, Trash2 } from 'lucide-react'; import Toast from '../../Components/Toast'; export default function AddBranchModal({ isOpen, onClose, onRefresh }) { const [loading, setLoading] = useState(false); const [formData, setFormData] = useState({ name: '', location: '', manager_name: '', operational_start_date: '', payroll_from_day: 1, payroll_to_day: 28, salary_generation_day: 2, }); const [toast, setToast] = useState(null); const [docs, setDocs] = useState([ { name: '', file: null, document_number: '', expiry_date: '', reminder_days: 30 }, ]); const handleDocChange = (index, field, value) => { const newDocs = [...docs]; newDocs[index][field] = value; setDocs(newDocs); }; const handleAddDoc = () => { setDocs([...docs, { name: '', file: null, document_number: '', expiry_date: '', reminder_days: 30 }]); }; const handleRemoveDoc = (index) => { if (docs.length > 1) { setDocs(docs.filter((_, i) => i !== index)); } else { // Just clear the first one if it's the only one const newDocs = [...docs]; newDocs[0] = { name: '', file: null, document_number: '', expiry_date: '', reminder_days: 30 }; setDocs(newDocs); } }; const handleSubmit = async (e) => { e.preventDefault(); // Ensure at least one document is uploaded const hasFile = docs.some(doc => doc.file); if (!hasFile) { setToast({ message: 'Please upload at least one document for the branch.', type: 'error' }); return; } setLoading(true); const data = new FormData(); data.append('name', formData.name); data.append('location', formData.location); data.append('manager_name', formData.manager_name); data.append('operational_start_date', formData.operational_start_date); data.append('payroll_from_day', formData.payroll_from_day); data.append('payroll_to_day', formData.payroll_to_day); data.append('salary_generation_day', formData.salary_generation_day); docs.forEach((doc, index) => { if (doc.file) { data.append(`docs[${index}][file]`, doc.file); data.append(`docs[${index}][name]`, doc.name || `Document ${index + 1}`); data.append(`docs[${index}][document_number]`, doc.document_number || ''); data.append(`docs[${index}][expiry_date]`, doc.expiry_date); data.append(`docs[${index}][reminder_days]`, doc.reminder_days || 30); } }); try { const res = await fetch('/api/branches', { method: 'POST', headers: { 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content, }, body: data, }); if (res.ok) { setToast({ message: 'Branch added successfully!', type: 'success' }); setTimeout(() => { onRefresh(); onClose(); }, 1500); } else { const err = await res.json(); setToast({ message: err.message || 'Error creating branch', type: 'error' }); } } catch (error) { setToast({ message: 'An error occurred. Please try again.', type: 'error' }); } finally { setLoading(false); } }; if (!isOpen) return null; return (
{toast && setToast(null)} />}
{/* Header */}

Add New Branch

{/* Basic Info */}

Branch Information

setFormData({...formData, name: e.target.value})} />
setFormData({...formData, location: e.target.value})} />
setFormData({...formData, manager_name: e.target.value})} />
setFormData({...formData, operational_start_date: e.target.value})} />

PAYROLL CYCLE CONFIGURATION

setFormData({...formData, payroll_from_day: e.target.value})} />
setFormData({...formData, payroll_to_day: e.target.value})} />
setFormData({...formData, salary_generation_day: e.target.value})} />

Example: From 1 To 28, Generated on 2nd of next month.

Branch Documents

{docs.map((doc, index) => (
Document {index + 1}
handleDocChange(index, 'name', e.target.value)} required />
handleDocChange(index, 'file', e.target.files[0])} />
handleDocChange(index, 'document_number', e.target.value)} />

Doc Number

handleDocChange(index, 'expiry_date', e.target.value)} required />

Expiry Date

handleDocChange(index, 'reminder_days', e.target.value)} required />

Days Before

))}
{/* Submit */}
); }