/* ============================================ Admin Modules — Empleados, Cheques ============================================ */ /* ============================================ EMPLEADOS ============================================ */ function Empleados() { const D = window.DATA; const [empleados, setEmpleados] = useState([]); const [sel, setSel] = useState(null); const [maquinariaOptions, setMaquinariaOptions] = useState(["—"]); const [loteOptions, setLoteOptions] = useState(["—", "Galpón A", "Galpón B", "Galpón C", "Galpón D", "Taller propio", "Oficina", "Ruta — entregas"]); useEffect(() => { window.API.get("/empleados").then(r => { if (r.data && r.data.length > 0) { const mapped = r.data.map(window.API_MAP.empleado); setEmpleados(mapped); setSel(mapped[0].id); } }); window.API.get("/maquinas").then(r => { if (r.data) setMaquinariaOptions(["—", ...r.data.map(m => m.nombre)]); }); window.API.get("/lotes").then(r => { if (r.data) setLoteOptions(["—", ...r.data.map(l => "Lote " + l.nombre), "Galpón A", "Galpón B", "Galpón C", "Galpón D", "Taller propio", "Oficina", "Ruta — entregas"]); }); }, []); const [payFor, setPayFor] = useState(null); const [addTaskFor, setAddTaskFor] = useState(null); const [editTask, setEditTask] = useState(null); const [showNuevo, setShowNuevo] = useState(false); const cur = empleados.find(e => e.id === sel) || null; const ultimoPagoTotal = empleados.reduce((s, e) => s + (e.ultimoPago || 0), 0); // maquinariaOptions y loteOptions se cargan desde la API en useEffect /* Acciones */ const registrarPago = (empId, monto, fecha, concepto) => { setEmpleados(emps => emps.map(e => e.id === empId ? { ...e, ultimoPago: monto, ultimoPagoFecha: fecha, ultimoConcepto: concepto } : e )); }; const agregarTarea = (empId, tarea) => { setEmpleados(emps => emps.map(e => e.id === empId ? { ...e, tareas: [...e.tareas, tarea] } : e )); }; const editarTarea = (empId, idx, tarea) => { setEmpleados(emps => emps.map(e => e.id === empId ? { ...e, tareas: e.tareas.map((t, i) => i === idx ? tarea : t) } : e )); }; const eliminarTarea = (empId, idx) => { setEmpleados(emps => emps.map(e => e.id === empId ? { ...e, tareas: e.tareas.filter((_, i) => i !== idx) } : e )); }; if (empleados.length === 0 && sel === null) { return (
Empleados
Sin empleados cargados
No hay empleados cargados. Usá "Agregar primer empleado" para comenzar.
{showNuevo && setShowNuevo(false)} onSave={(emp) => { setEmpleados(emps => [...emps, emp]); setSel(emp.id); setShowNuevo(false); }} />}
); } return (
Empleados
{empleados.length} empleados activos · pagos según modalidad de cada uno
s + e.tareas.length, 0))} delta="esta semana" deltaDir="info" hint="distribuidas entre los 3" />
{/* Lista de empleados */}
Plantilla
Tocá un empleado para ver detalle
{empleados.map(e => ( ))}
{/* Detalle */}
{cur.avatar}
{cur.nombre}
{cur.rol}
Ingreso {cur.ingreso} {cur.ciudad} {cur.edad} años
{/* Pago block — sólo último pago + modalidad */}
Último pago registrado
{D.fmtARS(cur.ultimoPago || 0)}
Modalidad
{cur.modalidadPago}
Fecha último pago
{cur.ultimoPagoFecha}
Cuenta de depósito
{cur.cuenta}
{/* Tareas + add */}
Tareas asignadas · {cur.tareas.length}
{cur.tareas.map((t, i) => (
{t.descripcion}
{t.maquinaria && t.maquinaria !== "—" && ( {t.maquinaria} )} {t.lote && t.lote !== "—" && ( {t.lote} )}
))} {cur.tareas.length === 0 && (
Sin tareas asignadas. Tocá "Agregar tarea" para crear una.
)}
{cur.telefono}
{payFor && ( setPayFor(null)} onSave={(monto, fecha, concepto) => { registrarPago(payFor.id, monto, fecha, concepto); setPayFor(null); }} /> )} {addTaskFor && ( setAddTaskFor(null)} onSave={(tarea) => { agregarTarea(addTaskFor.id, tarea); setAddTaskFor(null); }} /> )} {editTask && ( e.id === editTask.empId)} tarea={empleados.find(e => e.id === editTask.empId).tareas[editTask.taskIdx]} maquinariaOptions={maquinariaOptions} loteOptions={loteOptions} onClose={() => setEditTask(null)} onSave={(tarea) => { editarTarea(editTask.empId, editTask.taskIdx, tarea); setEditTask(null); }} /> )} {showNuevo && ( setShowNuevo(false)} onSave={(emp) => { setEmpleados(emps => [...emps, emp]); setSel(emp.id); setShowNuevo(false); }} /> )}
); } /* Modal: registrar pago — abierto, sin "sueldo fijo" */ function PagoModal({ empleado, onClose, onSave }) { const D = window.DATA; const [monto, setMonto] = useState(empleado.ultimoPago || 0); const [fecha, setFecha] = useState("15/05/2026"); const [concepto, setConcepto] = useState(""); const [done, setDone] = useState(false); const submit = (e) => { e.preventDefault(); onSave(+monto, fecha, concepto); setDone(true); }; return (
e.stopPropagation()}>
Registrar pago
{empleado.nombre}
Modalidad de pago acordada
{empleado.modalidadPago}
$ setMonto(e.target.value)} required style={{ paddingLeft: 28, fontSize: 18, fontWeight: 600 }} />
Ingresá el monto exacto que le pagás este período (fijo, porcentaje, comisión o lo que corresponda).
setFecha(e.target.value)} />
setConcepto(e.target.value)} placeholder="Ej: Quincena mayo · porcentaje sobre 8 lotes" />
{done && (
Pago registrado. {D.fmtARS(+monto)} a {empleado.nombre}.
)}
); } /* Modal: agregar / editar tarea */ function TareaModal({ empleado, tarea, maquinariaOptions, loteOptions, onClose, onSave }) { const [descripcion, setDescripcion] = useState(tarea?.descripcion || ""); const [maquinaria, setMaquinaria] = useState(tarea?.maquinaria || "—"); const [lote, setLote] = useState(tarea?.lote || "—"); const submit = (e) => { e.preventDefault(); if (!descripcion.trim()) return; onSave({ descripcion: descripcion.trim(), maquinaria, lote }); }; return (
e.stopPropagation()}>
{tarea ? "Editar tarea" : "Nueva tarea"}
{empleado.nombre}