Add area assignment to internaciones and permission controls
- Add areaId field to Internacion type and database schema - Add area selection in NuevoIngreso, EditIngreso, and Internaciones forms - Filter out 'Fuera de area' from area selection dropdowns - Add permission controls for users to only edit internaciones in their area - Add canEdit check to hide 'Editar Ingreso' button in HistoriaClinica - Fix getInternacionAreaId to use new areaId field first, fallback to cama area - Add INSERT OR IGNORE to prevent duplicate errors
This commit is contained in:
@@ -34,6 +34,7 @@ export function EditIngreso({
|
||||
const [pacienteSeleccionado, setPacienteSeleccionado] = useState(internacion.pacienteId);
|
||||
const [busqueda, setBusqueda] = useState('');
|
||||
const [camaSeleccionada, setCamaSeleccionada] = useState(internacion.camaId);
|
||||
const [areaSeleccionada, setAreaSeleccionada] = useState(internacion.areaId);
|
||||
const [medico, setMedico] = useState(internacion.medicoIngresante);
|
||||
const [fechaIngresoHospital, setFechaIngresoHospital] = useState(internacion.fechaIngresoHospital || '');
|
||||
const [fechaIngresoClinica, setFechaIngresoClinica] = useState(internacion.fechaIngresoClinica || '');
|
||||
@@ -56,9 +57,13 @@ export function EditIngreso({
|
||||
};
|
||||
|
||||
const selectedPaciente = pacientes.find(p => p.id === pacienteSeleccionado);
|
||||
const areasDisponibles = areas.filter(a => {
|
||||
const nombre = (a.nombre || '').trim().toLowerCase();
|
||||
return nombre !== 'fuera de area';
|
||||
});
|
||||
|
||||
const handleSubmit = () => {
|
||||
if (!pacienteSeleccionado || !camaSeleccionada || !medico || !diagnosticoIngreso || !enfermedadActual) {
|
||||
if (!pacienteSeleccionado || !camaSeleccionada || !areaSeleccionada || !medico || !diagnosticoIngreso || !enfermedadActual) {
|
||||
alert('Por favor complete los campos obligatorios');
|
||||
return;
|
||||
}
|
||||
@@ -66,6 +71,7 @@ export function EditIngreso({
|
||||
onActualizarInternacion(internacion.id, {
|
||||
pacienteId: pacienteSeleccionado,
|
||||
camaId: camaSeleccionada,
|
||||
areaId: areaSeleccionada,
|
||||
medicoIngresante: medico,
|
||||
diagnosticoIngreso,
|
||||
motivoConsulta: motivoConsulta || undefined,
|
||||
@@ -180,17 +186,33 @@ export function EditIngreso({
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
{/* Columna 2: Cama */}
|
||||
{/* Columna 2: Cama y Área */}
|
||||
<div className="space-y-6">
|
||||
<Card className="min-h-[200px]">
|
||||
<CardContent className="pt-6 space-y-4">
|
||||
<h3 className="font-semibold text-gray-900 flex items-center gap-2">
|
||||
<Bed className="h-4 w-4" />
|
||||
Asignación de Cama
|
||||
Asignación de Cama y Área
|
||||
</h3>
|
||||
|
||||
<div>
|
||||
<Label>Área de Trabajo *</Label>
|
||||
<Select value={areaSeleccionada} onValueChange={setAreaSeleccionada}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="Seleccionar área" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{areasDisponibles.map(a => (
|
||||
<SelectItem key={a.id} value={a.id}>
|
||||
{a.nombre}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Label>Cama</Label>
|
||||
<Select value={camaSeleccionada} onValueChange={setCamaSeleccionada}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="Seleccionar cama" />
|
||||
|
||||
@@ -266,10 +266,12 @@ export function HistoriaClinica({
|
||||
<ArrowLeft className="h-4 w-4 mr-2" />
|
||||
Volver
|
||||
</Button>
|
||||
<Button onClick={onEditarIngreso}>
|
||||
<Pencil className="h-4 w-4 mr-2" />
|
||||
Editar Ingreso
|
||||
</Button>
|
||||
{canEdit && onEditarIngreso && (
|
||||
<Button onClick={onEditarIngreso}>
|
||||
<Pencil className="h-4 w-4 mr-2" />
|
||||
Editar Ingreso
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<Card>
|
||||
|
||||
@@ -49,6 +49,7 @@ export function Internaciones({
|
||||
const [busqueda, setBusqueda] = useState('');
|
||||
const [pacienteSeleccionado, setPacienteSeleccionado] = useState<string>('');
|
||||
const [camaSeleccionada, setCamaSeleccionada] = useState<string>('');
|
||||
const [areaSeleccionada, setAreaSeleccionada] = useState<string>('');
|
||||
const [diagnosticoIngreso, setDiagnosticoIngreso] = useState('');
|
||||
const [enfermedadActual, setEnfermedadActual] = useState('');
|
||||
const [motivoConsulta, setMotivoConsulta] = useState('');
|
||||
@@ -63,6 +64,7 @@ export function Internaciones({
|
||||
const resetFormularioNueva = () => {
|
||||
setPacienteSeleccionado('');
|
||||
setCamaSeleccionada('');
|
||||
setAreaSeleccionada('');
|
||||
setDiagnosticoIngreso('');
|
||||
setEnfermedadActual('');
|
||||
setAntecedentesEnfermedadActual('');
|
||||
@@ -77,10 +79,11 @@ export function Internaciones({
|
||||
};
|
||||
|
||||
const handleIniciarInternacion = () => {
|
||||
if (pacienteSeleccionado && camaSeleccionada && motivoConsulta && enfermedadActual && medicoIngresante) {
|
||||
if (pacienteSeleccionado && camaSeleccionada && areaSeleccionada && motivoConsulta && enfermedadActual && medicoIngresante) {
|
||||
onIniciarInternacion({
|
||||
pacienteId: pacienteSeleccionado,
|
||||
camaId: camaSeleccionada,
|
||||
areaId: areaSeleccionada,
|
||||
diagnosticoIngreso: diagnosticoIngreso || motivoConsulta,
|
||||
motivoConsulta,
|
||||
enfermedadActual,
|
||||
@@ -206,6 +209,21 @@ export function Internaciones({
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div>
|
||||
<Label>Área de Trabajo *</Label>
|
||||
<Select value={areaSeleccionada} onValueChange={setAreaSeleccionada}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="Seleccionar área" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{areas.filter(a => a.nombre !== 'Fuera de area').map(a => (
|
||||
<SelectItem key={a.id} value={a.id}>
|
||||
{a.nombre}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
<div>
|
||||
<Label>Cama *</Label>
|
||||
<Select value={camaSeleccionada} onValueChange={setCamaSeleccionada}>
|
||||
|
||||
@@ -47,6 +47,7 @@ export function MapaCamas({
|
||||
const [filtroTipo, setFiltroTipo] = useState<string>('todos');
|
||||
const [filtroEstado, setFiltroEstado] = useState<string>('todos');
|
||||
const [camaSeleccionada, setCamaSeleccionada] = useState<Cama | null>(null);
|
||||
const [areaSeleccionada, setAreaSeleccionada] = useState<string>('');
|
||||
const [pacienteSeleccionado, setPacienteSeleccionado] = useState<string>('');
|
||||
const [diagnostico, setDiagnostico] = useState('');
|
||||
const [enfermedadActual, setEnfermedadActual] = useState('');
|
||||
@@ -147,10 +148,11 @@ export function MapaCamas({
|
||||
});
|
||||
|
||||
const handleOcuparCama = () => {
|
||||
if (camaSeleccionada && pacienteSeleccionado && diagnostico && enfermedadActual && medico) {
|
||||
if (camaSeleccionada && areaSeleccionada && pacienteSeleccionado && diagnostico && enfermedadActual && medico) {
|
||||
onIniciarInternacion({
|
||||
pacienteId: pacienteSeleccionado,
|
||||
camaId: camaSeleccionada.id,
|
||||
areaId: areaSeleccionada,
|
||||
diagnosticoIngreso: diagnostico,
|
||||
enfermedadActual,
|
||||
antecedentesEnfermedadActual: antecedentesEnfermedadActual || undefined,
|
||||
@@ -158,6 +160,7 @@ export function MapaCamas({
|
||||
});
|
||||
setDialogoAbierto(false);
|
||||
setCamaSeleccionada(null);
|
||||
setAreaSeleccionada('');
|
||||
setPacienteSeleccionado('');
|
||||
setDiagnostico('');
|
||||
setEnfermedadActual('');
|
||||
@@ -360,6 +363,21 @@ export function MapaCamas({
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
<div>
|
||||
<Label>Área de Trabajo *</Label>
|
||||
<Select value={areaSeleccionada} onValueChange={setAreaSeleccionada}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="Seleccionar área" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{areas.filter(a => a.nombre !== 'Fuera de area').map(a => (
|
||||
<SelectItem key={a.id} value={a.id}>
|
||||
{a.nombre}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
<div>
|
||||
<Label>Diagnóstico de Ingreso *</Label>
|
||||
<textarea
|
||||
|
||||
@@ -23,6 +23,7 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on
|
||||
const [pacienteSeleccionado, setPacienteSeleccionado] = useState<string>('');
|
||||
const [busqueda, setBusqueda] = useState('');
|
||||
const [camaSeleccionada, setCamaSeleccionada] = useState('');
|
||||
const [areaSeleccionada, setAreaSeleccionada] = useState('');
|
||||
const [medico, setMedico] = useState('');
|
||||
const [fechaIngresoHospital, setFechaIngresoHospital] = useState('');
|
||||
const [fechaIngresoClinica, setFechaIngresoClinica] = useState('');
|
||||
@@ -37,6 +38,7 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on
|
||||
setPacienteSeleccionado('');
|
||||
setBusqueda('');
|
||||
setCamaSeleccionada('');
|
||||
setAreaSeleccionada('');
|
||||
setMedico('');
|
||||
setFechaIngresoHospital('');
|
||||
setFechaIngresoClinica('');
|
||||
@@ -48,10 +50,14 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on
|
||||
setDerivacion('');
|
||||
};
|
||||
|
||||
const areasDisponibles = areas.filter(a => {
|
||||
const nombre = (a.nombre || '').trim().toLowerCase();
|
||||
return nombre !== 'fuera de area';
|
||||
});
|
||||
const pacientesSinInternar = pacientes;
|
||||
|
||||
const handleSubmit = () => {
|
||||
if (!pacienteSeleccionado || !camaSeleccionada || !medico || !diagnosticoIngreso || !enfermedadActual) {
|
||||
if (!pacienteSeleccionado || !camaSeleccionada || !areaSeleccionada || !medico || !diagnosticoIngreso || !enfermedadActual) {
|
||||
alert('Por favor complete los campos obligatorios');
|
||||
return;
|
||||
}
|
||||
@@ -59,6 +65,7 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on
|
||||
onIniciarInternacion({
|
||||
pacienteId: pacienteSeleccionado,
|
||||
camaId: camaSeleccionada,
|
||||
areaId: areaSeleccionada,
|
||||
medicoIngresante: medico,
|
||||
diagnosticoIngreso,
|
||||
motivoConsulta: motivoConsulta || undefined,
|
||||
@@ -163,15 +170,31 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
{/* Columna 2: Cama */}
|
||||
{/* Columna 2: Cama y Área */}
|
||||
<div className="space-y-6">
|
||||
<Card className="min-h-[200px]">
|
||||
<CardContent className="pt-6 space-y-4">
|
||||
<h3 className="font-semibold text-gray-900 flex items-center gap-2">
|
||||
<Bed className="h-4 w-4" />
|
||||
Asignación de Cama
|
||||
Asignación de Cama y Área
|
||||
</h3>
|
||||
|
||||
<div>
|
||||
<Label>Área de Trabajo *</Label>
|
||||
<Select value={areaSeleccionada} onValueChange={setAreaSeleccionada}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="Seleccionar área" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{areasDisponibles.map(a => (
|
||||
<SelectItem key={a.id} value={a.id}>
|
||||
{a.nombre}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Label>Cama *</Label>
|
||||
<Select value={camaSeleccionada} onValueChange={setCamaSeleccionada}>
|
||||
|
||||
Reference in New Issue
Block a user