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 .= '| Semana | Periodo | Estado |
';
+
+ foreach ($semanasFuturas as $index => $semana) {
+ $esMiTurno = !empty($semana['asignaciones']) && in_array($userId, array_column($semana['asignaciones'], 'id'));
+ $html .= '';
+ $html .= '| ' . date('d/m/Y', strtotime($semana['inicio']));
+ if ($index === 0) {
+ $html .= ' Actual';
+ }
+ if ($esMiTurno) {
+ $html .= ' Tu turno';
+ }
+ $html .= ' | ';
+ $html .= '' . date('d/m/Y', strtotime($semana['inicio'])) . ' - ' . date('d/m/Y', strtotime($semana['fin'])) . ' | ';
+ $html .= '' . ($esMiTurno ? 'Asignado' : 'Sin asignar') . ' | ';
+ $html .= '
';
+ }
+ $html .= '
';
+
+ $html .= 'Horarios por Semana
';
+ $html .= '| Semana | ';
+ foreach ($diasOrden as $dia) {
+ $html .= '' . $diasNombres[$dia] . ' | ';
+ }
+ $html .= '
';
+
+ foreach ($semanasFuturas as $index => $semana) {
+ $esMiTurno = !empty($semana['asignaciones']) && in_array($userId, array_column($semana['asignaciones'], 'id'));
+ $html .= '';
+ $html .= '| ' . date('d/m', strtotime($semana['inicio']));
+ if ($index === 0) {
+ $html .= ' Actual';
+ }
+ $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 .= '';
+ $html .= date('H:i', strtotime($horarioDia['hora_apertura'])) . ' ' . date('H:i', strtotime($horarioDia['hora_cierre']));
+ $html .= ' | ';
+ } elseif (!$esActivo) {
+ $html .= 'Cerrado | ';
+ } else {
+ $html .= '' . date('H:i', strtotime($horarioDia['hora_apertura'])) . ' ' . date('H:i', strtotime($horarioDia['hora_cierre'])) . ' | ';
+ }
+ }
+ $html .= '
';
+ }
+ $html .= '
';
+ $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 .= '| Ayudante | Fecha 1 | Fecha 2 | Fecha 3 | Fecha 4 |
';
+
+ 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 .= '| ' . htmlspecialchars($ayudante['nombre']) . ' | ';
+ for ($i = 0; $i < 4; $i++) {
+ if (isset($turnos[$i])) {
+ $html .= '' . date('d/m/Y', strtotime($turnos[$i]['semana_inicio'])) . ' - ' . date('d/m/Y', strtotime($turnos[$i]['semana_fin'])) . ' | ';
+ } else {
+ $html .= '- | ';
+ }
+ }
+ $html .= '
';
+ }
+ $html .= '
';
+
+ $html .= 'Horarios por Semana
';
+ $html .= '| Semana | ';
+ foreach ($diasOrden as $dia) {
+ $html .= '' . $diasNombres[$dia] . ' | ';
+ }
+ $html .= '
';
+
+ foreach ($semanasFuturas as $index => $semana) {
+ $html .= '';
+ $html .= '| ' . date('d/m', strtotime($semana['inicio']));
+ if ($index === 0) {
+ $html .= ' Actual';
+ }
+ $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 .= '' . date('H:i', strtotime($horarioDia['hora_apertura'])) . ' ' . date('H:i', strtotime($horarioDia['hora_cierre'])) . ' | ';
+ } else {
+ $html .= 'Cerrado | ';
+ }
+ }
+ $html .= '
';
+ }
+ $html .= '
';
+
+ $html .= 'Horarios de Apertura
';
+ $html .= '| Dia | Hora Apertura | Hora Cierre | Estado |
';
+ foreach ($horarios as $h) {
+ $html .= '';
+ $html .= '| ' . ucfirst($h['dia_semana']) . ' | ';
+ $html .= '' . date('H:i', strtotime($h['hora_apertura'])) . ' | ';
+ $html .= '' . date('H:i', strtotime($h['hora_cierre'])) . ' | ';
+ $html .= '' . ($h['activo'] ? 'Abierto' : 'Cerrado') . ' | ';
+ $html .= '
';
+ }
+ $html .= '
';
+ $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";