From bf36fb558643acf491db7d9bd0cee8144dffe62f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Consultor=C3=ADa=20Alcaraz=20Salazar?= Date: Mon, 31 Aug 2026 06:00:04 +0000 Subject: [PATCH] POS: selector Doctor que atendio para asignar la venta completa a un doctor (comisiones) --- frontend/src/pages/Pos.tsx | 42 +++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/Pos.tsx b/frontend/src/pages/Pos.tsx index c3094e6..9d5be2d 100644 --- a/frontend/src/pages/Pos.tsx +++ b/frontend/src/pages/Pos.tsx @@ -15,7 +15,7 @@ import { Skeleton, toast, } from '../components/ui'; -import { odooApi, type Service, type Patient, type InventoryItem, type PosCheckoutResult } from '../services/odoo'; +import { odooApi, type Service, type Patient, type InventoryItem, type PosCheckoutResult, type Doctor } from '../services/odoo'; const fmtMoney = (n: number) => (n || 0).toLocaleString('es-MX', { style: 'currency', currency: 'MXN', maximumFractionDigits: 2 }); @@ -71,6 +71,11 @@ const Pos: FC = () => { const [cobrando, setCobrando] = useState(false); const [tcRate, setTcRate] = useState(null); + // Doctor que atendió/recetó: se aplica como prescribed_by_id a todas las + // líneas al cobrar (alimenta "Mis ventas" y comisiones). Opcional. + const [doctors, setDoctors] = useState([]); + const [doctorId, setDoctorId] = useState(''); + // Resultado const [resultado, setResultado] = useState(null); @@ -123,6 +128,13 @@ const Pos: FC = () => { .catch(() => {}); }, []); + // Doctores activos para el selector "Doctor que atendió" + useEffect(() => { + odooApi.getDoctors() + .then((res) => { if (res.status === 'success') setDoctors(res.doctors); }) + .catch(() => {}); + }, []); + // Tipo de cambio USD/MXN: al montar y refresco cada 5 min useEffect(() => { const fetchTc = () => { @@ -256,6 +268,8 @@ const Pos: FC = () => { ...(l.item_id ? { item_id: l.item_id } : {}), quantity: l.qty, price_unit: l.price, + // Asignación a nivel venta: el doctor seleccionado aplica a todas las líneas + ...(doctorId ? { prescribed_by_id: parseInt(doctorId, 10) } : {}), })), discount: discountNum, payment_method: metodo, @@ -280,12 +294,29 @@ const Pos: FC = () => { } }; + // Selector "Doctor que atendió": se comparte entre el ticket y el modal de cobro + const doctorBlock = ( + setMetodo(e.target.value)} /> {metodo === 'cash' && !conPuntos && ( <>