delete test
This commit is contained in:
@@ -0,0 +1,222 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Servicio de Gestión de Menús
|
||||
* Maneja la obtención y navegación de menús
|
||||
*/
|
||||
|
||||
class MenuService
|
||||
{
|
||||
private $db;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->db = Database::getInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene un menú por su ID
|
||||
* @param int $menuId
|
||||
* @return array|null
|
||||
*/
|
||||
public function getMenu(int $menuId): ?array
|
||||
{
|
||||
$stmt = $this->db->prepare("
|
||||
SELECT * FROM menus
|
||||
WHERE id = ?
|
||||
AND status = 'active'
|
||||
LIMIT 1
|
||||
");
|
||||
$stmt->execute([$menuId]);
|
||||
$menu = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$menu) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Obtener opciones del menú
|
||||
$menu['options'] = $this->getMenuOptions($menuId);
|
||||
|
||||
return $menu;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene un menú por su clave
|
||||
* @param string $menuKey
|
||||
* @return array|null
|
||||
*/
|
||||
public function getMenuByKey(string $menuKey): ?array
|
||||
{
|
||||
$stmt = $this->db->prepare("
|
||||
SELECT * FROM menus
|
||||
WHERE menu_key = ?
|
||||
AND status = 'active'
|
||||
LIMIT 1
|
||||
");
|
||||
$stmt->execute([$menuKey]);
|
||||
$menu = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$menu) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$menu['options'] = $this->getMenuOptions($menu['id']);
|
||||
|
||||
return $menu;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene las opciones de un menú
|
||||
* @param int $menuId
|
||||
* @return array
|
||||
*/
|
||||
public function getMenuOptions(int $menuId): array
|
||||
{
|
||||
$stmt = $this->db->prepare("
|
||||
SELECT * FROM menu_options
|
||||
WHERE menu_id = ?
|
||||
AND is_active = 1
|
||||
ORDER BY option_order ASC
|
||||
");
|
||||
$stmt->execute([$menuId]);
|
||||
|
||||
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene el ID del menú principal
|
||||
* @return int|null
|
||||
*/
|
||||
public function getMainMenuId(): ?int
|
||||
{
|
||||
$stmt = $this->db->prepare("
|
||||
SELECT id FROM menus
|
||||
WHERE menu_key = 'lab_menu_principal'
|
||||
AND status = 'active'
|
||||
LIMIT 1
|
||||
");
|
||||
$stmt->execute();
|
||||
$result = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
return $result ? (int)$result['id'] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Procesa una opción seleccionada del menú
|
||||
* @param int $menuId
|
||||
* @param string $optionKey
|
||||
* @return array|null
|
||||
*/
|
||||
public function processMenuOption(int $menuId, string $optionKey): ?array
|
||||
{
|
||||
$stmt = $this->db->prepare("
|
||||
SELECT * FROM menu_options
|
||||
WHERE menu_id = ?
|
||||
AND option_key = ?
|
||||
AND is_active = 1
|
||||
LIMIT 1
|
||||
");
|
||||
$stmt->execute([$menuId, $optionKey]);
|
||||
$option = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$option) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return [
|
||||
'type' => $option['response_type'],
|
||||
'text' => $option['response_text'],
|
||||
'next_menu_id' => $option['next_menu_id']
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Formatea un menú con su welcome_message y opciones
|
||||
* @param int $menuId
|
||||
* @return string
|
||||
*/
|
||||
public function formatMenuMessage(int $menuId): string
|
||||
{
|
||||
$menu = $this->getMenu($menuId);
|
||||
|
||||
if (!$menu) {
|
||||
return "❌ Menú no disponible.";
|
||||
}
|
||||
|
||||
$message = $menu['welcome_message'];
|
||||
|
||||
// Si el welcome_message no incluye las opciones, agregarlas
|
||||
if (!empty($menu['options']) && strpos($message, '1️⃣') === false) {
|
||||
$message .= "\n\n";
|
||||
foreach ($menu['options'] as $option) {
|
||||
$emoji = $this->getNumberEmoji($option['option_key']);
|
||||
$message .= "$emoji {$option['option_text']}\n";
|
||||
}
|
||||
}
|
||||
|
||||
return $message;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene el emoji de número para una opción
|
||||
* @param string $number
|
||||
* @return string
|
||||
*/
|
||||
private function getNumberEmoji(string $number): string
|
||||
{
|
||||
$emojis = [
|
||||
'0' => '0️⃣',
|
||||
'1' => '1️⃣',
|
||||
'2' => '2️⃣',
|
||||
'3' => '3️⃣',
|
||||
'4' => '4️⃣',
|
||||
'5' => '5️⃣',
|
||||
'6' => '6️⃣',
|
||||
'7' => '7️⃣',
|
||||
'8' => '8️⃣',
|
||||
'9' => '9️⃣'
|
||||
];
|
||||
|
||||
return $emojis[$number] ?? $number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene todos los menús activos
|
||||
* @return array
|
||||
*/
|
||||
public function getAllMenus(): array
|
||||
{
|
||||
$stmt = $this->db->prepare("
|
||||
SELECT m.*,
|
||||
(SELECT COUNT(*) FROM menu_options WHERE menu_id = m.id AND is_active = 1) as options_count
|
||||
FROM menus m
|
||||
WHERE m.status = 'active'
|
||||
ORDER BY m.created_at ASC
|
||||
");
|
||||
$stmt->execute();
|
||||
|
||||
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene el menú padre de un menú
|
||||
* @param int $menuId
|
||||
* @return array|null
|
||||
*/
|
||||
public function getParentMenu(int $menuId): ?array
|
||||
{
|
||||
$stmt = $this->db->prepare("
|
||||
SELECT parent_menu_id FROM menus
|
||||
WHERE id = ?
|
||||
LIMIT 1
|
||||
");
|
||||
$stmt->execute([$menuId]);
|
||||
$result = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$result || !$result['parent_menu_id']) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $this->getMenu($result['parent_menu_id']);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user