diff --git a/bot/TelegramBot.php b/bot/TelegramBot.php index 05faf90..6be3610 100755 --- a/bot/TelegramBot.php +++ b/bot/TelegramBot.php @@ -53,6 +53,9 @@ class TelegramBot { ['text' => 'Ver Turnos', 'callback_data' => 'ver_turnos'], ['text' => 'Semana Actual', 'callback_data' => 'semana_actual'] ], + [ + ['text' => '📄 Mi PDF', 'callback_data' => 'mi_pdf'] + ], [ ['text' => '🔍 Buscar por Nombre', 'callback_data' => 'buscar_nombre'] ] @@ -203,4 +206,262 @@ class TelegramBot { $ayudantes = (new Asignacion())->getAyudantesPorOrden(); return array_map(fn($a) => $a['nombre'], $ayudantes); } + + public function sendPDF($chatId, $userId) { + require_once __DIR__ . '/../src/PDFGenerator.php'; + require_once __DIR__ . '/../src/User.php'; + require_once __DIR__ . '/../src/DiasHorarios.php'; + require_once __DIR__ . '/../src/Asignacion.php'; + require_once __DIR__ . '/../src/Database.php'; + + $userModel = new User(); + $userData = $userModel->getById($userId); + + if (!$userData) { + $this->sendMessage($chatId, "Usuario no encontrado."); + return; + } + + $horariosModel = new DiasHorarios(); + $asignacionModel = new Asignacion(); + $db = \Database::getInstance()->getConnection(); + + $horarios = $horariosModel->getActivos(); + $ayudantes = $userModel->getAyudantesActivos(); + + $semanasFuturas = []; + $hoy = new DateTime(); + $diaSemana = (int)$hoy->format('w'); + $domingoEstaSemana = clone $hoy; + $domingoEstaSemana->modify('-' . $diaSemana . ' days'); + + for ($i = 0; $i <= 4; $i++) { + $semanaDomingo = clone $domingoEstaSemana; + $semanaDomingo->modify("+{$i} weeks"); + $semanaInicio = $semanaDomingo->format('Y-m-d'); + $asignacionesSemana = $asignacionModel->getTodasAsignacionesPorSemana($semanaInicio); + $semanasFuturas[] = [ + 'inicio' => $semanaInicio, + 'fin' => date('Y-m-d', strtotime('+5 days', strtotime($semanaInicio))), + 'asignaciones' => $asignacionesSemana, + ]; + } + + $diasNombres = [ + 'domingo' => 'Domingo', 'lunes' => 'Lunes', 'martes' => 'Martes', + 'miercoles' => 'Miercoles', 'jueves' => 'Jueves', 'viernes' => 'Viernes', 'sabado' => 'Sabado' + ]; + $diasOrden = ['domingo', 'lunes', 'martes', 'miercoles', 'jueves', 'viernes', 'sabado']; + + $html = PDFGenerator::getStyles(); + $html .= PDFGenerator::getHeader('Horarios y Turnos - ' . $userData['nombre']); + + $html .= '

Mis Turnos

'; + $html .= ''; + + foreach ($semanasFuturas as $index => $semana) { + $esMiTurno = !empty($semana['asignaciones']) && in_array($userId, array_column($semana['asignaciones'], 'id')); + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + } + $html .= '
SemanaPeriodoEstado
' . date('d/m/Y', strtotime($semana['inicio'])); + if ($index === 0) { + $html .= ' Actual'; + } + if ($esMiTurno) { + $html .= ' Tu turno'; + } + $html .= '' . date('d/m/Y', strtotime($semana['inicio'])) . ' - ' . date('d/m/Y', strtotime($semana['fin'])) . '' . ($esMiTurno ? 'Asignado' : 'Sin asignar') . '
'; + + $html .= '

Horarios por Semana

'; + $html .= ''; + foreach ($diasOrden as $dia) { + $html .= ''; + } + $html .= ''; + + foreach ($semanasFuturas as $index => $semana) { + $esMiTurno = !empty($semana['asignaciones']) && in_array($userId, array_column($semana['asignaciones'], 'id')); + $html .= ''; + $html .= ''; + + foreach ($diasOrden as $dia) { + $horarioDia = null; + foreach ($horarios as $h) { + if ($h['dia_semana'] === $dia) { + $horarioDia = $h; + break; + } + } + $esActivo = $horarioDia && $horarioDia['activo']; + + if ($esMiTurno && $esActivo) { + $html .= ''; + } elseif (!$esActivo) { + $html .= ''; + } else { + $html .= ''; + } + } + $html .= ''; + } + $html .= '
Semana' . $diasNombres[$dia] . '
' . date('d/m', strtotime($semana['inicio'])); + if ($index === 0) { + $html .= ' Actual'; + } + $html .= ''; + $html .= date('H:i', strtotime($horarioDia['hora_apertura'])) . '
' . date('H:i', strtotime($horarioDia['hora_cierre'])); + $html .= '
Cerrado' . date('H:i', strtotime($horarioDia['hora_apertura'])) . '
' . date('H:i', strtotime($horarioDia['hora_cierre'])) . '
'; + $html .= PDFGenerator::getFooter(); + + $pdfGenerator = new PDFGenerator(); + $pdfContent = $pdfGenerator->generateFromHtml($html); + + $pdfFile = tempnam(sys_get_temp_dir(), 'turnos'); + file_put_contents($pdfFile, $pdfContent); + + $this->sendDocument($chatId, $pdfFile, 'mis-turnos-' . date('Y-m-d') . '.pdf'); + + unlink($pdfFile); + } + + public function sendDocument($chatId, $documentPath, $filename) { + $url = "{$this->apiUrl}/sendDocument"; + $postFields = [ + 'chat_id' => $chatId, + 'document' => new CURLFile($documentPath, 'application/pdf', $filename) + ]; + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_exec($ch); + curl_close($ch); + } + + public function sendPDFGeneral($chatId) { + require_once __DIR__ . '/../src/PDFGenerator.php'; + require_once __DIR__ . '/../src/User.php'; + require_once __DIR__ . '/../src/DiasHorarios.php'; + require_once __DIR__ . '/../src/Asignacion.php'; + require_once __DIR__ . '/../src/Database.php'; + + $userModel = new User(); + $horariosModel = new DiasHorarios(); + $asignacionModel = new Asignacion(); + $db = \Database::getInstance()->getConnection(); + + $horarios = $horariosModel->getActivos(); + $ayudantes = $userModel->getAyudantesActivos(); + + $semanasFuturas = []; + $hoy = new DateTime(); + $diaSemana = (int)$hoy->format('w'); + $domingoEstaSemana = clone $hoy; + $domingoEstaSemana->modify('-' . $diaSemana . ' days'); + + for ($i = 0; $i <= 4; $i++) { + $semanaDomingo = clone $domingoEstaSemana; + $semanaDomingo->modify("+{$i} weeks"); + $semanaInicio = $semanaDomingo->format('Y-m-d'); + $asignacionesSemana = $asignacionModel->getTodasAsignacionesPorSemana($semanaInicio); + $semanasFuturas[] = [ + 'inicio' => $semanaInicio, + 'fin' => date('Y-m-d', strtotime('+5 days', strtotime($semanaInicio))), + 'asignaciones' => $asignacionesSemana, + ]; + } + + $diasNombres = [ + 'domingo' => 'Domingo', 'lunes' => 'Lunes', 'martes' => 'Martes', + 'miercoles' => 'Miercoles', 'jueves' => 'Jueves', 'viernes' => 'Viernes', 'sabado' => 'Sabado' + ]; + $diasOrden = ['domingo', 'lunes', 'martes', 'miercoles', 'jueves', 'viernes', 'sabado']; + + $html = PDFGenerator::getStyles(); + $html .= PDFGenerator::getHeader('Horarios y Turnos - Todos los Ayudantes'); + + $html .= '

Turnos de Ayudantes

'; + $html .= ''; + + foreach ($ayudantes as $ayudante) { + $stmt = $db->prepare("SELECT semana_inicio, semana_fin FROM asignaciones_turnos WHERE user_id = ? AND semana_inicio >= CURDATE() ORDER BY semana_inicio LIMIT 4"); + $stmt->execute([$ayudante['id']]); + $turnos = $stmt->fetchAll(); + + $html .= ''; + $html .= ''; + for ($i = 0; $i < 4; $i++) { + if (isset($turnos[$i])) { + $html .= ''; + } else { + $html .= ''; + } + } + $html .= ''; + } + $html .= '
AyudanteFecha 1Fecha 2Fecha 3Fecha 4
' . htmlspecialchars($ayudante['nombre']) . '' . date('d/m/Y', strtotime($turnos[$i]['semana_inicio'])) . ' - ' . date('d/m/Y', strtotime($turnos[$i]['semana_fin'])) . '-
'; + + $html .= '

Horarios por Semana

'; + $html .= ''; + foreach ($diasOrden as $dia) { + $html .= ''; + } + $html .= ''; + + foreach ($semanasFuturas as $index => $semana) { + $html .= ''; + $html .= ''; + + foreach ($diasOrden as $dia) { + $horarioDia = null; + foreach ($horarios as $h) { + if ($h['dia_semana'] === $dia) { + $horarioDia = $h; + break; + } + } + $esActivo = $horarioDia && $horarioDia['activo']; + + if ($esActivo) { + $html .= ''; + } else { + $html .= ''; + } + } + $html .= ''; + } + $html .= '
Semana' . $diasNombres[$dia] . '
' . date('d/m', strtotime($semana['inicio'])); + if ($index === 0) { + $html .= ' Actual'; + } + $html .= '' . date('H:i', strtotime($horarioDia['hora_apertura'])) . '
' . date('H:i', strtotime($horarioDia['hora_cierre'])) . '
Cerrado
'; + + $html .= '

Horarios de Apertura

'; + $html .= ''; + foreach ($horarios as $h) { + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + } + $html .= '
DiaHora AperturaHora CierreEstado
' . ucfirst($h['dia_semana']) . '' . date('H:i', strtotime($h['hora_apertura'])) . '' . date('H:i', strtotime($h['hora_cierre'])) . '' . ($h['activo'] ? 'Abierto' : 'Cerrado') . '
'; + $html .= PDFGenerator::getFooter(); + + $pdfGenerator = new PDFGenerator(); + $pdfContent = $pdfGenerator->generateFromHtml($html); + + $pdfFile = tempnam(sys_get_temp_dir(), 'turnos'); + file_put_contents($pdfFile, $pdfContent); + + $this->sendDocument($chatId, $pdfFile, 'turnos-contenedor-' . date('Y-m-d') . '.pdf'); + + unlink($pdfFile); + } } diff --git a/bot/webhook.php b/bot/webhook.php index d12c51d..9f7f5fc 100755 --- a/bot/webhook.php +++ b/bot/webhook.php @@ -50,9 +50,33 @@ class TurnoBot { } elseif ($textLower === '/ayudantes' || $textLower === 'ayudantes') { $ayudantes = $this->bot->getListaAyudantesParaBusqueda(); $this->bot->sendMessage($chatId, "AYUDANTES DISPONIBLES:\n\n" . implode("\n", $ayudantes)); + } elseif ($textLower === '/pdf' || $textLower === 'pdf' || $textLower === 'mi pdf') { + $this->bot->sendPDFGeneral($chatId); } else { - // Buscar por nombre - $this->bot->sendMessage($chatId, $this->bot->getTurnosAyudante($text)); + // Buscar por nombre - verificar si existe el usuario + $config = require __DIR__ . '/../config/config.php'; + try { + $pdo = new PDO( + "mysql:host={$config['db']['host']};port={$config['db']['port']};dbname={$config['db']['database']};charset=utf8mb4", + $config['db']['username'], + $config['db']['password'], + [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] + ); + } catch (Exception $e) { + $this->bot->sendMessage($chatId, "Error de conexion."); + return; + } + + $stmt = $pdo->prepare("SELECT * FROM users WHERE (nombre LIKE ? OR username LIKE ?) AND rol = 'ayudante' AND activo = 1 LIMIT 1"); + $stmt->execute(["%$text%", "%$text%"]); + $user = $stmt->fetch(); + + if ($user) { + $this->bot->sendMessage($chatId, "Generando PDF de turnos..."); + $this->bot->sendPDF($chatId, $user['id']); + } else { + $this->bot->sendMessage($chatId, $this->bot->getTurnosAyudante($text)); + } } } catch (Exception $e) { error_log("Error en handleUpdate: " . $e->getMessage()); @@ -81,6 +105,11 @@ class TurnoBot { $this->bot->editMessage($chatId, $messageId, $this->bot->getSemanaActual()); break; + case 'mi_pdf': + $this->bot->answerCallback($callbackId, 'Generando PDF...'); + $this->bot->sendPDFGeneral($chatId); + break; + case 'buscar_nombre': $this->bot->answerCallback($callbackId, ''); $this->bot->deleteMessage($chatId, $messageId); @@ -105,6 +134,7 @@ class TurnoBot { $mensaje .= "Selecciona una opcion del menu:\n\n"; $mensaje .= "Ver Turnos - Tabla completa de asignaciones\n"; $mensaje .= "Semana Actual - Quien tiene turno esta semana\n"; + $mensaje .= "Mi PDF - Descargar horarios en PDF\n"; $mensaje .= "Buscar por Nombre - Consultar un ayudante especifico\n"; $mensaje .= "Mi Turno - Ver tu proximo turno";