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 "); } }