diff --git a/api/lab/save_domicilio.php b/api/lab/save_domicilio.php index 777c7fb..59aefe4 100644 --- a/api/lab/save_domicilio.php +++ b/api/lab/save_domicilio.php @@ -17,6 +17,17 @@ try { $dom = new Domicilio(); $admin = adminId(); + // ── Reprogramar ── + if (!empty($datos['id']) && !empty($datos['reprogramar'])) { + $id = (int)$datos['id']; + $nuevaFecha = trim($datos['nueva_fecha'] ?? ''); + $nuevaHora = trim($datos['nueva_hora'] ?? ''); + $motivo = trim($datos['motivo'] ?? ''); + if (!$nuevaFecha) jsonError('nueva_fecha es obligatoria'); + $nuevoId = $dom->reprogramar($id, $nuevaFecha, $nuevaHora, $motivo, $admin); + jsonOk(['id_origen' => $id, 'id_nuevo' => $nuevoId], 'Domicilio reprogramado correctamente'); + } + // Solo cambio de estado if (!empty($datos['id']) && !empty($datos['solo_estado'])) { $id = (int)$datos['id']; diff --git a/classes/lab/Domicilio.php b/classes/lab/Domicilio.php index 5680e82..39d7240 100644 --- a/classes/lab/Domicilio.php +++ b/classes/lab/Domicilio.php @@ -163,6 +163,20 @@ class Domicilio { [$id] ); + // Vínculo: domicilio origen (este fue reprogramado desde otro) + if (!empty($dom['domicilio_origen_id'])) { + $dom['origen_info'] = $this->db->fetch( + "SELECT id, fecha_programada, hora_programada, estado FROM lab_domicilios WHERE id = ?", + [(int)$dom['domicilio_origen_id']] + ); + } + + // Vínculo: domicilio(s) reprogramado(s) desde este + $dom['reprogramaciones'] = $this->db->fetchAll( + "SELECT id, fecha_programada, hora_programada, estado FROM lab_domicilios WHERE domicilio_origen_id = ? ORDER BY id ASC", + [$id] + ); + return $dom; } @@ -217,6 +231,63 @@ class Domicilio { return $ok > 0; } + /** + * Reprogramar un domicilio: + * 1. Marca el original como 'reprogramado' con fecha_reprogramada. + * 2. Clona el domicilio para la nueva fecha/hora. + * 3. Vincula el clon con domicilio_origen_id. + * + * @return int ID del nuevo domicilio creado. + */ + public function reprogramar( + int $idOrigen, + string $nuevaFecha, + string $nuevaHora = '', + string $motivo = '', + ?int $adminId = null + ): int { + // 1. Obtener datos del original + $origen = $this->db->fetch( + 'SELECT * FROM lab_domicilios WHERE id = ?', [$idOrigen] + ); + if (!$origen) { + throw new \RuntimeException('Domicilio no encontrado'); + } + + // 2. Marcar original como reprogramado + $extrasOrigen = [ + 'fecha_reprogramada' => $nuevaFecha, + ]; + if ($motivo) $extrasOrigen['motivo_cancelacion'] = $motivo; + $this->cambiarEstado($idOrigen, 'reprogramado', $adminId, $extrasOrigen); + + // 3. Clonar campos relevantes para el nuevo domicilio + $campos = $this->filtrarCampos($origen); + // Resetear campos operativos del original + unset( + $campos['estado'], $campos['motivo_cancelacion'], + $campos['fecha_reprogramada'], $campos['hora_llegada'], + $campos['hora_salida'], $campos['observaciones'], + $campos['muestras_tomadas'], $campos['pago_estado'], + $campos['pago_modo'], $campos['pago_monto'], + $campos['pago_fecha'], $campos['pago_notas'], + $campos['pago_registrado_por'], $campos['temperatura_inicio'], + $campos['temperatura_salida'], $campos['domicilio_origen_id'] + ); + $campos['fecha_programada'] = $nuevaFecha; + $campos['hora_programada'] = $nuevaHora ?: null; + $campos['estado'] = 'programado'; + $campos['domicilio_origen_id']= $idOrigen; + $campos['creado_por'] = $adminId; + + $nuevoId = (int)$this->db->insert('lab_domicilios', $campos); + $this->log->registrar($adminId, 'domicilios', 'reprogramar', $nuevoId, [ + 'origen_id' => $idOrigen, + 'nueva_fecha' => $nuevaFecha, + ]); + return $nuevoId; + } + // ───────────────────────────────────────────────────────────────────────── // Agenda del día // ───────────────────────────────────────────────────────────────────────── @@ -279,6 +350,7 @@ class Domicilio { 'observaciones', 'muestras_tomadas', 'notas_admin', 'seguro_nombre', 'autorizacion', 'copago_laboratorio', 'valor_domicilio', 'valor_copago', + 'domicilio_origen_id', // pago 'pago_estado', 'pago_modo', 'pago_monto', 'pago_fecha', 'pago_notas', 'pago_registrado_por', diff --git a/lab_domicilios.php b/lab_domicilios.php index d2eaca8..7dfdd0b 100644 --- a/lab_domicilios.php +++ b/lab_domicilios.php @@ -520,6 +520,41 @@ $domIdParam = (int)($_GET['id'] ?? 0); + +