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:
2026-04-23 17:49:07 -03:00
parent 6611258ce9
commit 56402563fb
9 changed files with 345 additions and 47 deletions
+25 -3
View File
@@ -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" />
+6 -4
View File
@@ -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>
+19 -1
View File
@@ -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}>
+19 -1
View File
@@ -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
+26 -3
View File
@@ -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}>