prepare("SELECT nombre, direccion, telefono FROM negocios WHERE rut = :rut");
$stmt->bindParam(':rut', $negocio_rut, PDO::PARAM_STR);
$stmt->execute();
$datos_negocio = $stmt->fetch(PDO::FETCH_ASSOC);
if ($datos_negocio) {
$negocio_nombre = $datos_negocio['nombre'] ?? 'No disponible';
$negocio_direccion = $datos_negocio['direccion'] ?? 'No disponible';
$negocio_telefono = $datos_negocio['telefono'] ?? 'No disponible';
}
$conn = null; // Cerrar conexión
} catch (Exception $e) {
error_log("Error al obtener datos del negocio para ticket soporte: " . $e->getMessage());
// Los valores por defecto 'No disponible' se mantendrán
}
}
// --- FIN OBTENER DATOS DEL NEGOCIO ---
function obtener_siguiente_ticket($file) {
$numero_ticket = 1;
$handle = fopen($file, 'c+');
if ($handle) {
if (flock($handle, LOCK_EX)) {
$contenido = fread($handle, filesize($file) > 0 ? filesize($file) : 1);
$numero_actual = intval($contenido);
$numero_ticket = $numero_actual + 1;
ftruncate($handle, 0);
rewind($handle);
fwrite($handle, (string)$numero_ticket);
fflush($handle);
flock($handle, LOCK_UN);
}
fclose($handle);
} else {
error_log("Error: No se pudo abrir o crear el archivo contador de tickets: " . $file);
return false;
}
return $numero_ticket;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$asunto_usuario = trim($_POST['asunto_usuario'] ?? '');
$descripcion_problema = trim($_POST['descripcion_problema'] ?? '');
// Validaciones básicas
if (empty($asunto_usuario)) {
$mensaje_usuario = 'Por favor, ingresa un asunto para tu ticket.';
$mensaje_tipo = 'danger';
} elseif (empty($descripcion_problema)) {
$mensaje_usuario = 'Por favor, describe tu problema.';
$mensaje_tipo = 'danger';
} else {
// Todo válido, proceder a generar ticket y enviar correo
$ticket_id = obtener_siguiente_ticket($contador_file);
if ($ticket_id === false) {
$mensaje_usuario = 'Error interno al generar el número de ticket.';
$mensaje_tipo = 'danger';
} else {
// --- INSERTAR TICKET EN LA BASE DE DATOS ---
$ticket_insertado_db = false;
try {
$conn_insert = conectarDB();
$sql_insert = "INSERT INTO soporte_tickets (ticket_correlativo, negocio_rut, negocio_nombre, negocio_direccion, negocio_telefono, asunto, descripcion, estado) VALUES (:ticket_correlativo, :negocio_rut, :negocio_nombre, :negocio_direccion, :negocio_telefono, :asunto, :descripcion, :estado)";
$stmt_insert = $conn_insert->prepare($sql_insert);
$estado_inicial = 'Pendiente'; // Estado por defecto
$stmt_insert->bindParam(':ticket_correlativo', $ticket_id, PDO::PARAM_INT);
$stmt_insert->bindParam(':negocio_rut', $negocio_rut, PDO::PARAM_STR);
$stmt_insert->bindParam(':negocio_nombre', $negocio_nombre, PDO::PARAM_STR);
$stmt_insert->bindParam(':negocio_direccion', $negocio_direccion, PDO::PARAM_STR);
$stmt_insert->bindParam(':negocio_telefono', $negocio_telefono, PDO::PARAM_STR);
$stmt_insert->bindParam(':asunto', $asunto_usuario, PDO::PARAM_STR);
$stmt_insert->bindParam(':descripcion', $descripcion_problema, PDO::PARAM_STR);
$stmt_insert->bindParam(':estado', $estado_inicial, PDO::PARAM_STR);
if ($stmt_insert->execute()) {
$ticket_insertado_db = true;
} else {
$error_info = $stmt_insert->errorInfo();
$error_mensaje = "Error al ejecutar insert para ticket #{$ticket_id}: " . implode(" | ", $error_info);
error_log($error_mensaje);
$mensaje_usuario = "Error al guardar el ticket en la base de datos. Código: " . $error_info[1];
$mensaje_tipo = 'danger';
}
$conn_insert = null;
} catch (Exception $e) {
$error_mensaje = "Error de BD al insertar ticket #{$ticket_id}: " . $e->getMessage();
error_log($error_mensaje);
$mensaje_usuario = "Error de base de datos al crear el ticket: " . $e->getMessage();
$mensaje_tipo = 'danger';
$ticket_insertado_db = false;
}
// --- FIN INSERTAR TICKET EN BD ---
// Solo proceder con el envío del correo si la inserción en BD fue exitosa
if ($ticket_insertado_db) {
// Continuar con el envío del correo...
$destinatario = "sistemadenegociodebarriosgb@gmail.com";
$asunto_correo = "[SGB Ticket #" . $ticket_id . "] " . $asunto_usuario . " - RUT: " . $negocio_rut;
// --- Preparación del cuerpo del correo (HTML y Texto Plano) ---
$cuerpo_mensaje_html = "
Nuevo Ticket de Soporte SGB (#{$ticket_id})
";
$cuerpo_mensaje_html .= "Asunto: " . htmlspecialchars($asunto_usuario) . "
";
$cuerpo_mensaje_html .= "
";
$cuerpo_mensaje_html .= "Datos del Negocio:
";
$cuerpo_mensaje_html .= "";
$cuerpo_mensaje_html .= "- RUT: " . htmlspecialchars($negocio_rut) . "
";
$cuerpo_mensaje_html .= "- Nombre: " . htmlspecialchars($negocio_nombre) . "
";
$cuerpo_mensaje_html .= "- Dirección: " . htmlspecialchars($negocio_direccion) . "
";
$cuerpo_mensaje_html .= "- Teléfono: " . htmlspecialchars($negocio_telefono) . "
";
$cuerpo_mensaje_html .= "
";
$cuerpo_mensaje_html .= "Fecha y Hora: " . date('Y-m-d H:i:s') . "
";
$cuerpo_mensaje_html .= "
";
$cuerpo_mensaje_html .= "Descripción del Problema:
";
$cuerpo_mensaje_html .= "" . nl2br(htmlspecialchars($descripcion_problema)) . "
";
$cuerpo_mensaje_html .= "
";
$cuerpo_mensaje_html .= "Por favor, revisar y contactar al usuario si es necesario.
";
$cuerpo_mensaje_plain = "Nuevo Ticket de Soporte SGB (#{$ticket_id})
";
$cuerpo_mensaje_plain .= "=========================================
";
$cuerpo_mensaje_plain .= "Asunto: " . $asunto_usuario . "
";
$cuerpo_mensaje_plain .= "\n--- Datos del Negocio ---\n";
$cuerpo_mensaje_plain .= "RUT: " . $negocio_rut . "
";
$cuerpo_mensaje_plain .= "Nombre: " . $negocio_nombre . "
";
$cuerpo_mensaje_plain .= "Dirección: " . $negocio_direccion . "
";
$cuerpo_mensaje_plain .= "Teléfono: " . $negocio_telefono . "
";
$cuerpo_mensaje_plain .= "--------------------------
";
$cuerpo_mensaje_plain .= "Fecha y Hora: " . date('Y-m-d H:i:s') . "
";
$cuerpo_mensaje_plain .= "-----------------------------------------
";
$cuerpo_mensaje_plain .= "Descripción del Problema:
";
$cuerpo_mensaje_plain .= $descripcion_problema . "
";
$cuerpo_mensaje_plain .= "-----------------------------------------
";
$cuerpo_mensaje_plain .= "
Por favor, revisar y contactar al usuario si es necesario.";
// --- Fin preparación cuerpo ---
$mail = new PHPMailer(true);
try {
// Configuración SMTP (igual que antes)
// $mail->SMTPDebug = SMTP::DEBUG_SERVER;
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'sistemadenegociodebarriosgb@gmail.com';
$mail->Password = 'plsrqpfznggdcfuy'; // Contraseña de Aplicación
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 465;
$mail->CharSet = 'UTF-8';
// Remitente y Destinatario
$mail->setFrom('sistemadenegociodebarriosgb@gmail.com', 'Soporte SGB');
$mail->addAddress($destinatario);
// Contenido
$mail->isHTML(true);
$mail->Subject = $asunto_correo;
$mail->Body = $cuerpo_mensaje_html;
$mail->AltBody = $cuerpo_mensaje_plain;
$mail->send();
$mensaje_usuario = 'Tu solicitud de soporte (Ticket #' . $ticket_id . ') ha sido enviada correctamente.';
$mensaje_tipo = 'success';
} catch (Exception $e) {
$mensaje_usuario = "Error al enviar la solicitud: {$mail->ErrorInfo}.";
$mensaje_tipo = 'danger';
error_log("Error de PHPMailer al enviar ticket #{$ticket_id}: {$mail->ErrorInfo}");
}
} // Cierre del if ($ticket_insertado_db)
}
}
}
// Construir el mensaje de WhatsApp pre-rellenado
$whatsapp_mensaje = "Hola, necesito soporte para SGB. Mi negocio es " . ($negocio_nombre ?? 'Nombre no disponible') . " (RUT: " . ($negocio_rut ?? 'RUT no disponible') . ").";
$whatsapp_numero = "56951180040"; // Número sin +, espacios ni guiones
$whatsapp_url = "https://web.whatsapp.com/send?phone=" . $whatsapp_numero . "&text=" . urlencode($whatsapp_mensaje);
// --- OBTENER TICKETS ANTERIORES DEL NEGOCIO ---
$tickets_anteriores = [];
if ($negocio_rut !== 'No identificado') {
try {
$conn_select = conectarDB();
$sql_select = "SELECT id, ticket_correlativo, asunto, fecha_creacion, estado, respuesta, fecha_respuesta
FROM soporte_tickets
WHERE negocio_rut = :rut
ORDER BY fecha_creacion DESC";
$stmt_select = $conn_select->prepare($sql_select);
$stmt_select->bindParam(':rut', $negocio_rut, PDO::PARAM_STR);
$stmt_select->execute();
$tickets_anteriores = $stmt_select->fetchAll(PDO::FETCH_ASSOC);
$conn_select = null;
} catch (Exception $e) {
error_log("Error al obtener tickets anteriores para RUT {$negocio_rut}: " . $e->getMessage());
}
}
// --- FIN OBTENER TICKETS ANTERIORES ---
// Título de la página
$page_title = "Soporte Técnico - " . htmlspecialchars($negocio_nombre);
?>
Para un seguimiento detallado y formal de su solicitud, complete el siguiente formulario para generar un ticket de soporte.
Aún no has enviado tickets de soporte
Cuando envíes tu primer ticket, aparecerá aquí para que puedas hacer seguimiento.