This commit is contained in:
Lizandro Guarnizo
2026-04-08 08:31:21 -05:00
parent 26d16b5d82
commit cbf7a8c296
4 changed files with 184 additions and 1 deletions
+72
View File
@@ -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',