diff --git a/admin/solicitud-detalle.php b/admin/solicitud-detalle.php new file mode 100644 index 0000000..28ff6f7 --- /dev/null +++ b/admin/solicitud-detalle.php @@ -0,0 +1,404 @@ + 'Visa', + 'sentri' => 'Sentri/Global', + 'pasaporte' => 'Pasaporte', + 'adelanto_cita' => 'Adelanto Cita', + 'doble_nacionalidad' => 'Doble Nacionalidad', +]; +$estadoSolicitudLabels = [ + 'nueva' => 'Nueva', + 'contactada' => 'Contactada', + 'convertida' => 'Convertida', + 'descartada' => 'Descartada', +]; +$estadoBadgeClass = [ + 'nueva' => 'primary', + 'contactada' => 'warning', + 'convertida' => 'success', + 'descartada' => 'danger', +]; + +// Must have an ID +$solicitudId = isset($_GET['id']) ? (int)$_GET['id'] : 0; +if ($solicitudId <= 0) { + header('Location: solicitudes.php'); + exit; +} + +$errors = []; +$success = ''; + +// ── Handle POST actions ───────────────────────────────────────── +if ($_SERVER['REQUEST_METHOD'] === 'POST' && csrfValidate()) { + $action = $_POST['action'] ?? ''; + + switch ($action) { + + // ── Update estado ──────────────────────────────────────── + case 'update_estado': + $nuevoEstado = trim($_POST['estado'] ?? ''); + if (!array_key_exists($nuevoEstado, $estadoSolicitudLabels)) { + $errors[] = 'El estado seleccionado no es válido.'; + } else { + $stmt = $db->prepare("UPDATE solicitudes SET estado = ? WHERE id = ?"); + $stmt->execute([$nuevoEstado, $solicitudId]); + header("Location: solicitud-detalle.php?id=$solicitudId&estado_saved=1"); + exit; + } + break; + + // ── Vincular a cliente existente ───────────────────────── + case 'vincular_cliente': + $clienteId = (int)($_POST['cliente_id'] ?? 0); + if ($clienteId <= 0) { + $errors[] = 'Debe seleccionar un cliente.'; + } else { + // Verify client exists + $stmtCheck = $db->prepare("SELECT id FROM clientes WHERE id = ?"); + $stmtCheck->execute([$clienteId]); + if (!$stmtCheck->fetch()) { + $errors[] = 'El cliente seleccionado no existe.'; + } else { + $stmt = $db->prepare("UPDATE solicitudes SET cliente_id = ?, estado = 'convertida' WHERE id = ?"); + $stmt->execute([$clienteId, $solicitudId]); + header("Location: solicitud-detalle.php?id=$solicitudId&vinculado=1"); + exit; + } + } + break; + } +} + +// ── Load solicitud data ────────────────────────────────────────── +$stmt = $db->prepare("SELECT s.*, c.nombre AS cliente_nombre + FROM solicitudes s + LEFT JOIN clientes c ON s.cliente_id = c.id + WHERE s.id = ?"); +$stmt->execute([$solicitudId]); +$solicitud = $stmt->fetch(); + +if (!$solicitud) { + header('Location: solicitudes.php'); + exit; +} + +// Decode form data +$datosFormulario = []; +if (!empty($solicitud['datos_formulario'])) { + $datosFormulario = json_decode($solicitud['datos_formulario'], true) ?: []; +} + +// Build human-readable labels for form fields from servicios-data +$campoLabels = []; +$servicio = $solicitud['servicio'] ?? ''; +if (isset($SERVICIOS[$servicio]['campos_formulario'])) { + foreach ($SERVICIOS[$servicio]['campos_formulario'] as $campo) { + $campoLabels[$campo['name']] = $campo['label']; + } +} + +// Load all clients for vincular dropdown (only if not already linked) +$allClientes = []; +if (empty($solicitud['cliente_id'])) { + $stmtClientes = $db->prepare("SELECT id, nombre FROM clientes ORDER BY nombre ASC"); + $stmtClientes->execute(); + $allClientes = $stmtClientes->fetchAll(); +} + +// Success messages from redirects +if (isset($_GET['estado_saved'])) $success = 'Estado actualizado correctamente.'; +if (isset($_GET['vinculado'])) $success = 'Solicitud vinculada al cliente y marcada como convertida.'; + +$pageTitle = 'Solicitud: ' . $solicitud['nombre']; +?> + +
+ Esta solicitud está vinculada al cliente: + + = htmlspecialchars($solicitud['cliente_nombre'] ?? 'Cliente #' . $solicitud['cliente_id']) ?> + +
+ + Crear Trámite + ++ Se creará un nuevo cliente con los datos de esta solicitud (nombre, teléfono, email). +
+ + Crear Cliente Nuevo + ++ Vincule esta solicitud a un cliente ya registrado. El estado cambiará automáticamente a “Convertida”. +
+ + + +No hay clientes registrados. Crear uno nuevo.
+ +Solicitudes recibidas desde el sitio web
+= $hasFilters ? 'No se encontraron solicitudes con ese filtro.' : 'No hay solicitudes registradas aún.' ?>
+ + Ver todas + +| Nombre | +Servicio | +Teléfono | +Estado | +Fecha | +Acción | +|
|---|---|---|---|---|---|---|
| + + = htmlspecialchars($s['nombre']) ?> + + = htmlspecialchars($s['nombre']) ?> + + | += htmlspecialchars($servicioLabels[$s['servicio']] ?? $s['servicio']) ?> | += htmlspecialchars($s['telefono'] ?: '-') ?> | += htmlspecialchars($s['email'] ?: '-') ?> | ++ + = htmlspecialchars($estadoSolicitudLabels[$s['estado']] ?? $s['estado']) ?> + + | += date('d/m/Y H:i', strtotime($s['created_at'])) ?> | ++ + Ver + + | +