up
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
<?php
|
||||
/**
|
||||
* Asignacion — Asignación de enfermera a un domicilio.
|
||||
* Solo puede haber una asignación activa por domicilio (UNIQUE KEY).
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../../classes/Database.php';
|
||||
require_once __DIR__ . '/ActividadAdmin.php';
|
||||
|
||||
class Asignacion {
|
||||
|
||||
private Database $db;
|
||||
private ActividadAdmin $log;
|
||||
|
||||
public function __construct() {
|
||||
$this->db = Database::getInstance();
|
||||
$this->log = new ActividadAdmin();
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────
|
||||
// CRUD
|
||||
// ─────────────────────────────────────────────────────────────────────────
|
||||
|
||||
/**
|
||||
* Obtener asignación por ID.
|
||||
*/
|
||||
public function obtener(int $id): ?array {
|
||||
return $this->db->fetch("
|
||||
SELECT
|
||||
a.*,
|
||||
e.nombre_completo AS enfermera_nombre,
|
||||
e.telefono AS enfermera_telefono,
|
||||
d.fecha_programada,
|
||||
d.hora_programada,
|
||||
d.estado AS domicilio_estado,
|
||||
d.direccion,
|
||||
p.nombre_completo AS paciente_nombre
|
||||
FROM lab_asignaciones a
|
||||
JOIN lab_enfermeras e ON e.id = a.enfermera_id
|
||||
JOIN lab_domicilios d ON d.id = a.domicilio_id
|
||||
JOIN lab_pacientes p ON p.id = d.paciente_id
|
||||
WHERE a.id = ?
|
||||
", [$id]) ?: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Asignar (o reasignar) enfermera a un domicilio.
|
||||
* - Si ya existía asignación la reemplaza.
|
||||
*/
|
||||
public function asignar(
|
||||
int $domicilioId,
|
||||
int $enfermeraId,
|
||||
?int $adminId = null,
|
||||
string $notas = ''
|
||||
): int {
|
||||
// ¿Ya existe?
|
||||
$existente = $this->db->fetch(
|
||||
'SELECT id FROM lab_asignaciones WHERE domicilio_id = ?',
|
||||
[$domicilioId]
|
||||
);
|
||||
|
||||
if ($existente) {
|
||||
$this->db->update('lab_asignaciones', [
|
||||
'enfermera_id' => $enfermeraId,
|
||||
'asignada_por' => $adminId,
|
||||
'estado' => 'asignada',
|
||||
'notas' => $notas,
|
||||
], 'id = ?', [$existente['id']]);
|
||||
|
||||
$id = $existente['id'];
|
||||
$accion = 'reasignar';
|
||||
} else {
|
||||
$id = $this->db->insert('lab_asignaciones', [
|
||||
'domicilio_id' => $domicilioId,
|
||||
'enfermera_id' => $enfermeraId,
|
||||
'asignada_por' => $adminId,
|
||||
'estado' => 'asignada',
|
||||
'notas' => $notas,
|
||||
]);
|
||||
$accion = 'asignar';
|
||||
}
|
||||
|
||||
$this->log->registrar($adminId, 'asignaciones', $accion, $id, [
|
||||
'domicilio_id' => $domicilioId,
|
||||
'enfermera_id' => $enfermeraId,
|
||||
]);
|
||||
|
||||
return $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Liberar asignación (sin eliminar, cambia estado a 'liberada').
|
||||
*/
|
||||
public function liberar(int $id, ?int $adminId = null, string $motivo = ''): bool {
|
||||
$ok = $this->db->update('lab_asignaciones', ['estado' => 'liberada'], 'id = ?', [$id]);
|
||||
$this->log->registrar($adminId, 'asignaciones', 'liberar', $id, ['motivo' => $motivo]);
|
||||
return $ok > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Marcar asignación como completada.
|
||||
*/
|
||||
public function completar(int $id, ?int $adminId = null): bool {
|
||||
$ok = $this->db->update('lab_asignaciones', ['estado' => 'completada'], 'id = ?', [$id]);
|
||||
$this->log->registrar($adminId, 'asignaciones', 'completar', $id);
|
||||
return $ok > 0;
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────
|
||||
// Consultas
|
||||
// ─────────────────────────────────────────────────────────────────────────
|
||||
|
||||
/**
|
||||
* Asignaciones de una fecha (para vista de agenda general).
|
||||
*/
|
||||
public function porFecha(string $fecha = ''): array {
|
||||
$fecha = $fecha ?: date('Y-m-d');
|
||||
return $this->db->fetchAll("
|
||||
SELECT
|
||||
a.*,
|
||||
e.nombre_completo AS enfermera_nombre,
|
||||
e.telefono AS enfermera_telefono,
|
||||
d.hora_programada,
|
||||
d.estado AS domicilio_estado,
|
||||
d.direccion,
|
||||
d.barrio,
|
||||
p.nombre_completo AS paciente_nombre,
|
||||
p.telefono AS paciente_telefono
|
||||
FROM lab_asignaciones a
|
||||
JOIN lab_enfermeras e ON e.id = a.enfermera_id
|
||||
JOIN lab_domicilios d ON d.id = a.domicilio_id
|
||||
JOIN lab_pacientes p ON p.id = d.paciente_id
|
||||
WHERE d.fecha_programada = ?
|
||||
ORDER BY e.nombre_completo, d.hora_programada ASC
|
||||
", [$fecha]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Carga actual del día: cuántos domicilios tiene cada enfermera hoy.
|
||||
*/
|
||||
public function cargaHoy(): array {
|
||||
return $this->db->fetchAll("
|
||||
SELECT
|
||||
e.id,
|
||||
e.nombre_completo,
|
||||
e.telefono,
|
||||
COUNT(a.id) AS total_asignaciones,
|
||||
SUM(d.estado = 'completado') AS completados
|
||||
FROM lab_enfermeras e
|
||||
JOIN lab_asignaciones a ON a.enfermera_id = e.id
|
||||
JOIN lab_domicilios d ON d.id = a.domicilio_id
|
||||
WHERE d.fecha_programada = CURDATE()
|
||||
AND a.estado NOT IN ('liberada')
|
||||
GROUP BY e.id
|
||||
ORDER BY total_asignaciones DESC
|
||||
");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user