import type { FC } from 'react'; import { useEffect, useState, useCallback } from 'react'; import { Stethoscope } from 'lucide-react'; import { Card, Input, EmptyState, Skeleton, toast } from '../ui'; import { ExportButton } from '../ui/ExportButton'; import { exportToExcel } from '../../lib/exporter'; import { odooApi, type ComisionRow } from '../../services/odoo'; import { useReportRange } from '../../lib/reportRange'; const formatCurrency = (value: number) => new Intl.NumberFormat('es-MX', { style: 'currency', currency: 'MXN', maximumFractionDigits: 0 }).format(value); const ComisionesReport: FC = () => { // Rango global de Reportes; los campos Inicio/Fin fijan uno propio const { start, end, setStart, setEnd } = useReportRange('comisiones'); const [rows, setRows] = useState([]); const [totales, setTotales] = useState({ vendido: 0, comision: 0 }); const [loading, setLoading] = useState(true); const load = useCallback(async () => { try { setLoading(true); const res = await odooApi.getComisiones(start, end); if (res.status === 'success') { setRows(res.comisiones); setTotales({ vendido: res.total_vendido, comision: res.total_comision }); } } catch (err) { toast.error('Error al cargar comisiones'); console.error(err); } finally { setLoading(false); } }, [start, end]); useEffect(() => { load(); }, [load]); const [exporting, setExporting] = useState(false); const exportar = async () => { try { setExporting(true); await exportToExcel({ filename: `comisiones-${start}_${end}`, sheetName: 'Comisiones', title: 'Comisiones por médico', subtitle: `Del ${start} al ${end}`, columns: [ { header: 'Médico', key: 'doctor' }, { header: 'Puesto', key: 'job_title' }, { header: 'Citas completadas', key: 'citas_done', format: 'number' }, { header: 'Líneas', key: 'items', format: 'number' }, { header: 'Ventas', key: 'sales', format: 'number' }, { header: 'Total vendido', key: 'total_vendido', format: 'currency' }, { header: '% Comisión', key: 'commission_pct', format: 'number' }, { header: 'Comisión estimada', key: 'comision', format: 'currency' }, ], rows: rows.map((r) => ({ ...r })), totals: { doctor: '', total_vendido: totales.vendido, comision: totales.comision }, }); toast.success('Excel descargado'); } catch (err) { toast.error('Error al exportar'); console.error(err); } finally { setExporting(false); } }; return (
setStart(e.target.value)} className="sm:max-w-[160px]" /> setEnd(e.target.value)} className="sm:max-w-[160px]" />

Vendido: {formatCurrency(totales.vendido)} {' · '}Comisiones: {formatCurrency(totales.comision)}

{loading ? ( ) : rows.length === 0 ? ( } /> ) : (
{rows.map((r) => ( ))}
Médico Citas completadas Líneas Ventas Total vendido % Comisión Comisión estimada

{r.doctor}

{r.job_title || '—'}

{r.citas_done} {r.items} {r.sales} {formatCurrency(r.total_vendido)} {r.commission_pct}% {formatCurrency(r.comision)}
)}
); }; export default ComisionesReport;