diff --git a/src/App.tsx b/src/App.tsx index 4f10fe2..1225c7a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -194,6 +194,7 @@ function AppContent() { camas={store.camas} areas={store.areas} onIniciarInternacion={store.iniciarInternacion} + onAgregarCama={store.agregarCama} onVolver={() => store.setVista('internaciones')} getAreaName={(areaId) => store.areas.find(a => a.id === areaId)?.nombre || ''} /> @@ -219,6 +220,7 @@ function AppContent() { camas={store.camas} areas={store.areas} onActualizarInternacion={store.actualizarInternacion} + onAgregarCama={store.agregarCama} onVolver={() => store.setVista('historiaclinica')} getAreaName={(areaId) => store.areas.find(a => a.id === areaId)?.nombre || ''} /> diff --git a/src/hooks/useHospitalStore.ts b/src/hooks/useHospitalStore.ts index 0d484c1..66e6689 100644 --- a/src/hooks/useHospitalStore.ts +++ b/src/hooks/useHospitalStore.ts @@ -238,10 +238,14 @@ const finalizarInternacion = useCallback((internacionId: string, datos: { diagnosticoEgreso: string; motivoEgreso: Internacion['motivoEgreso'] }) => { - setState(prev => { - const internacion = prev.internaciones.find(i => i.id === internacionId); - if (!internacion) return prev; + const internacion = state.internaciones.find(i => i.id === internacionId); + if (!internacion) return; + + const areaFueraDeArea = state.areas.find(a => (a.nombre || '').trim().toLowerCase() === 'fuera de area'); + const areaFueraDeAreaId = areaFueraDeArea?.id; + const esFueraDeArea = internacion.areaId === areaFueraDeAreaId; + setState(prev => { return { ...prev, internaciones: prev.internaciones.map(i => @@ -249,14 +253,16 @@ const finalizarInternacion = useCallback((internacionId: string, datos: { ? { ...i, ...datos, activa: false } : i ), - cams: prev.camas.map(c => - c.id === internacion.camaId - ? { ...c, estado: 'Disponible', pacienteId: undefined, internacionId: undefined } - : c - ), + cams: esFueraDeArea + ? prev.camas.filter(c => c.id !== internacion.camaId) + : prev.camas.map(c => + c.id === internacion.camaId + ? { ...c, estado: 'Disponible', pacienteId: undefined, internacionId: undefined } + : c + ), }; }); - }, []); + }, [state.areas]); const actualizarInternacion = useCallback((internacionId: string, datos: Partial) => { const internacion = state.internaciones.find(i => i.id === internacionId); diff --git a/src/sections/EditIngreso.tsx b/src/sections/EditIngreso.tsx index 45bb3da..7547821 100644 --- a/src/sections/EditIngreso.tsx +++ b/src/sections/EditIngreso.tsx @@ -16,6 +16,7 @@ interface EditIngresoProps { camas: Cama[]; areas: Area[]; onActualizarInternacion: (id: string, datos: Partial) => void; + onAgregarCama?: (cama: Omit) => string; onVolver: () => void; getAreaName: (areaId: string | undefined) => string; } @@ -28,6 +29,7 @@ export function EditIngreso({ camas, areas, onActualizarInternacion, + onAgregarCama, onVolver, getAreaName }: EditIngresoProps) { @@ -35,6 +37,8 @@ export function EditIngreso({ const [busqueda, setBusqueda] = useState(''); const [camaSeleccionada, setCamaSeleccionada] = useState(internacion.camaId); const [areaSeleccionada, setAreaSeleccionada] = useState(internacion.areaId); + const [camaInput, setCamaInput] = useState(''); + const [modoCama, setModoCama] = useState<'seleccionar' | 'escribir'>('seleccionar'); const [medico, setMedico] = useState(internacion.medicoIngresante); const [fechaIngresoHospital, setFechaIngresoHospital] = useState(internacion.fechaIngresoHospital || ''); const [fechaIngresoClinica, setFechaIngresoClinica] = useState(internacion.fechaIngresoClinica || ''); @@ -61,6 +65,8 @@ export function EditIngreso({ const nombre = (a.nombre || '').trim().toLowerCase(); return nombre !== 'fuera de area'; }); + const areaFueraDeArea = areas.find(a => (a.nombre || '').trim().toLowerCase() === 'fuera de area'); + const areaFueraDeAreaId = areaFueraDeArea?.id || ''; const parseBedNumber = (numero: string) => { const match = numero.match(/^(\d{3})-(\d+)$/); @@ -105,16 +111,60 @@ export function EditIngreso({ return oa.suborden - ob.suborden; }); - const handleSubmit = () => { - if (!pacienteSeleccionado || !camaSeleccionada || !areaSeleccionada || !medico || !diagnosticoIngreso || !enfermedadActual) { + const handleSubmit = async () => { + if (!pacienteSeleccionado || !medico || !diagnosticoIngreso || !enfermedadActual) { alert('Por favor complete los campos obligatorios'); return; } + let camaId = ''; + let newAreaId = ''; + + if (modoCama === 'escribir') { + if (!camaInput.trim()) { + alert('Ingrese el número de cama'); + return; + } + const numeroCama = camaInput.trim(); + const camaExistente = camas.find(c => c.numero === numeroCama); + if (camaExistente) { + camaId = camaExistente.id; + newAreaId = camaExistente.areaId || ''; + } else if (onAgregarCama) { + const nuevaCamaId = onAgregarCama({ + numero: numeroCama, + areaId: areaFueraDeAreaId, + tipo: 'General', + estado: 'Ocupada' + }); + camaId = nuevaCamaId; + newAreaId = areaFueraDeAreaId; + } else { + alert('No se puede agregar una nueva cama'); + return; + } + } else { + if (!camaSeleccionada) { + alert('Seleccione una cama'); + return; + } + const camaElegida = sortedCamas.find(c => c.id === camaSeleccionada); + if (!camaElegida) { + alert('Cama no encontrada'); + return; + } + newAreaId = areaSeleccionada || camaElegida.areaId || areaFueraDeAreaId; + if (!newAreaId) { + alert('Seleccione un área de trabajo'); + return; + } + camaId = camaSeleccionada; + } + onActualizarInternacion(internacion.id, { pacienteId: pacienteSeleccionado, - camaId: camaSeleccionada, - areaId: areaSeleccionada, + camaId: camaId, + areaId: newAreaId, medicoIngresante: medico, diagnosticoIngreso, motivoConsulta: motivoConsulta || undefined, @@ -237,38 +287,69 @@ export function EditIngreso({ Asignación de Cama y Área - -
- - + +
+ +
-
- - -
+ {modoCama === 'seleccionar' ? ( + <> +
+ + +
+ +
+ + +
+ + ) : ( +
+ + setCamaInput(e.target.value)} + /> +

+ Esta cama será creada como "Fuera de área" +

+
+ )}
diff --git a/src/sections/NuevoIngreso.tsx b/src/sections/NuevoIngreso.tsx index c49eb41..c80859a 100644 --- a/src/sections/NuevoIngreso.tsx +++ b/src/sections/NuevoIngreso.tsx @@ -13,17 +13,20 @@ interface NuevoIngresoProps { camas: Cama[]; areas: Area[]; onIniciarInternacion: (internacion: Omit) => void; + onAgregarCama?: (cama: Omit) => string; onAgregarPaciente?: (paciente: Omit) => void; onActualizarPaciente?: (id: string, datos: Partial) => void; onVolver: () => void; getAreaName: (areaId: string | undefined) => string; } -export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, onVolver, getAreaName }: NuevoIngresoProps) { +export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, onAgregarCama, onVolver, getAreaName }: NuevoIngresoProps) { const [pacienteSeleccionado, setPacienteSeleccionado] = useState(''); const [busqueda, setBusqueda] = useState(''); const [camaSeleccionada, setCamaSeleccionada] = useState(''); const [areaSeleccionada, setAreaSeleccionada] = useState(''); + const [camaInput, setCamaInput] = useState(''); + const [modoCama, setModoCama] = useState<'seleccionar' | 'escribir'>('seleccionar'); const [medico, setMedico] = useState(''); const [fechaIngresoHospital, setFechaIngresoHospital] = useState(''); const [fechaIngresoClinica, setFechaIngresoClinica] = useState(''); @@ -54,6 +57,9 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on const nombre = (a.nombre || '').trim().toLowerCase(); return nombre !== 'fuera de area'; }); + const areaFueraDeArea = areas.find(a => (a.nombre || '').trim().toLowerCase() === 'fuera de area'); + const areaFueraDeAreaId = areaFueraDeArea?.id || ''; + const pacientesSinInternar = pacientes; const parseBedNumber = (numero: string) => { @@ -99,16 +105,60 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on return oa.suborden - ob.suborden; }); - const handleSubmit = () => { - if (!pacienteSeleccionado || !camaSeleccionada || !areaSeleccionada || !medico || !diagnosticoIngreso || !enfermedadActual) { + const handleSubmit = async () => { + if (!pacienteSeleccionado || !medico || !diagnosticoIngreso || !enfermedadActual) { alert('Por favor complete los campos obligatorios'); return; } + let camaId = ''; + let newAreaId = ''; + + if (modoCama === 'escribir') { + if (!camaInput.trim()) { + alert('Ingrese el número de cama'); + return; + } + const numeroCama = camaInput.trim(); + const camaExistente = camas.find(c => c.numero === numeroCama); + if (camaExistente) { + camaId = camaExistente.id; + newAreaId = camaExistente.areaId || ''; + } else if (onAgregarCama) { + const nuevaCamaId = onAgregarCama({ + numero: numeroCama, + areaId: areaFueraDeAreaId, + tipo: 'General', + estado: 'Ocupada' + }); + camaId = nuevaCamaId; + newAreaId = areaFueraDeAreaId; + } else { + alert('No se puede agregar una nueva cama'); + return; + } + } else { + if (!camaSeleccionada) { + alert('Seleccione una cama'); + return; + } + const camaElegida = sortedCamas.find(c => c.id === camaSeleccionada); + if (!camaElegida) { + alert('Cama no encontrada'); + return; + } + newAreaId = camaElegida.areaId || areaFueraDeAreaId; + if (!newAreaId) { + alert('La cama no tiene un área asignada'); + return; + } + camaId = camaSeleccionada; + } + onIniciarInternacion({ pacienteId: pacienteSeleccionado, - camaId: camaSeleccionada, - areaId: areaSeleccionada, + camaId: camaId, + areaId: newAreaId, medicoIngresante: medico, diagnosticoIngreso, motivoConsulta: motivoConsulta || undefined, @@ -217,42 +267,73 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on
-

+

Asignación de Cama y Área

-
- - -
- -
- - +
+ +
+ + {modoCama === 'seleccionar' ? ( + <> +
+ + +
+ +
+ + +
+ + ) : ( +
+ + setCamaInput(e.target.value)} + /> +

+ Esta cama será creada como "Fuera de área" +

+
+ )}