import type { FC } from 'react'; import { useEffect, useMemo, useState } from 'react'; import { Mail, Phone, Stethoscope, Briefcase, Save, Percent } from 'lucide-react'; import Layout from '../components/Layout'; import { Card, Badge, EmptyState, PageHeader, Skeleton, MobileCard, Input, Button, toast } from '../components/ui'; import { odooApi, type Doctor } from '../services/odoo'; const medicalTerms = ['doctor', 'dra', 'médico', 'medico', 'especialista', 'dermatólogo', 'dermatologo', 'skin', 'clínico', 'clinico']; const isMedicalTitle = (jobTitle?: string) => { if (!jobTitle) return false; const normalized = jobTitle.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, ''); return medicalTerms.some((term) => normalized.includes(term)); }; const Medicos: FC = () => { const [employees, setEmployees] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const load = async () => { try { setLoading(true); setError(null); const res = await odooApi.getDoctors(); if (res.status === 'success') setEmployees(res.doctors); } catch (err) { setError('Error al cargar médicos'); toast.error('Error al cargar médicos'); console.error(err); } finally { setLoading(false); } }; load(); }, []); const doctors = useMemo(() => { const medical = employees.filter((d) => isMedicalTitle(d.job_title)); return medical.length > 0 ? medical : employees; }, [employees]); const [pctDraft, setPctDraft] = useState>({}); const [savingPct, setSavingPct] = useState(null); const pctValue = (d: Doctor) => (pctDraft[d.id] ?? String(d.commission_pct ?? 0)); const savePct = async (d: Doctor) => { const raw = pctDraft[d.id]; const pct = parseFloat(raw ?? String(d.commission_pct ?? 0)); if (Number.isNaN(pct) || pct < 0 || pct > 100) { toast.error('Porcentaje inválido (0-100)'); return; } setSavingPct(d.id); try { await odooApi.updateDoctor(d.id, { commission_pct: pct }); setEmployees((prev) => prev.map((e) => (e.id === d.id ? { ...e, commission_pct: pct } : e))); setPctDraft((prev) => { const n = { ...prev }; delete n[d.id]; return n; }); toast.success(`Comisión de ${d.name}: ${pct}%`); } catch { toast.error('No se pudo guardar la comisión'); } finally { setSavingPct(null); } }; return ( {error &&

{error}

} {loading ? ( ) : doctors.length === 0 ? ( } /> ) : ( <>
{doctors.map((d) => ( ))}
Nombre Puesto Teléfono Email % Comisión
{d.name} {d.job_title || 'Sin puesto'} {d.work_phone || '-'} {d.work_email ? ( {d.work_email} ) : ( '-' )}
setPctDraft((prev) => ({ ...prev, [d.id]: e.target.value }))} className="max-w-[92px]" />
{doctors.map((d) => ( {d.job_title || 'Sin puesto'} } rows={[ { label: 'Teléfono', value: d.work_phone || '-' }, { label: 'Email', value: d.work_email || '-' }, { label: '% Comisión', value: `${d.commission_pct ?? 0}%` }, ]} /> ))}
)}
); }; export default Medicos;