<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
class WorkingHoursController extends AbstractController
{
public function workingHoursAction(): Response
{
return $this->render('reports/working-hours.html.twig');
}
public function getWorkingHoursStatusAction(): JsonResponse
{
$entityManager = $this->getDoctrine()->getManager();
// Forzar refresh - cerrar y reabrir la conexión para evitar cache
$entityManager->close();
$entityManager = $this->getDoctrine()->getManager();
$connection = $entityManager->getConnection();
// Forzar que no use cache de transacciones
$connection->executeQuery('SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
// Obtener países y horarios desde la tabla uv_support_group y uv_working_hours
$sql = "
SELECT
sg.id as supportGroupId,
sg.name as supportGroupName,
sg.description as supportGroupDescription,
wh.timezone,
wh.start_time,
wh.end_time,
wh.monday,
wh.tuesday,
wh.wednesday,
wh.thursday,
wh.friday,
wh.saturday,
wh.sunday,
wh.is_active
FROM uv_support_group sg
LEFT JOIN uv_working_hours wh ON sg.id = wh.support_group_id
WHERE sg.is_active = 1
AND (sg.name LIKE 'OR %' OR sg.name = 'Casa Central')
ORDER BY
CASE
WHEN sg.name LIKE 'OR %' THEN 1
WHEN sg.name = 'Casa Central' THEN 2
ELSE 3
END,
sg.name
";
$stmt = $connection->prepare($sql);
$stmt->execute();
$supportGroups = $stmt->fetchAll(\PDO::FETCH_ASSOC);
// Obtener agentes activos agrupados por región
$sql = "
SELECT
a.id as agentId,
a.first_name as firstName,
a.last_name as lastName,
a.email,
a.is_enabled as isEnabled,
a.lastactivity,
a.idOR as idor,
sg.name as supportGroupName,
sg.description as supportGroupDescription,
sr.code as supportRoleCode
FROM uv_user a
JOIN uv_user_instance ui ON a.id = ui.user_id
JOIN uv_support_role sr ON ui.supportRole_id = sr.id
LEFT JOIN uv_support_group sg ON a.idOR = sg.id
WHERE a.is_enabled = 1
AND sr.code = 'ROLE_AGENT'
ORDER BY a.first_name, a.last_name
";
$stmt = $connection->prepare($sql);
$stmt->execute();
$agents = $stmt->fetchAll(\PDO::FETCH_ASSOC);
// Agrupar agentes por región
$agentsByRegion = [];
foreach ($agents as $agent) {
$regionName = $agent['supportGroupName'] ?: 'Sin región asignada';
if (!isset($agentsByRegion[$regionName])) {
$agentsByRegion[$regionName] = [];
}
$agentsByRegion[$regionName][] = [
'id' => $agent['agentId'],
'name' => $agent['firstName'] . ' ' . $agent['lastName'],
'email' => $agent['email'],
'isEnabled' => $agent['isEnabled'],
'lastActivity' => $agent['lastactivity'] ? $agent['lastactivity'] : 'N/A',
'idor' => $agent['idor'],
'role' => $agent['supportRoleCode']
];
}
$status = [];
foreach ($supportGroups as $group) {
// Extraer nombre del país del nombre del grupo
if ($group['supportGroupName'] === 'Casa Central') {
$countryName = 'Casa Central';
} else {
// Para oficinas regionales: "OR Colombia" -> "Colombia"
$countryName = trim(str_replace('OR', '', $group['supportGroupName']));
}
// Si no hay configuración de horarios, usar valores por defecto
if (!$group['timezone']) {
$group['timezone'] = 'UTC';
$group['start_time'] = '09:00:00';
$group['end_time'] = '18:00:00';
$group['monday'] = 1;
$group['tuesday'] = 1;
$group['wednesday'] = 1;
$group['thursday'] = 1;
$group['friday'] = 1;
$group['saturday'] = 0;
$group['sunday'] = 0;
}
$localTime = new \DateTime('now', new \DateTimeZone($group['timezone']));
$dayOfWeek = (int)$localTime->format('N'); // 1 = Monday, 7 = Sunday
$hour = (int)$localTime->format('G'); // 0-23 hour format
$minute = (int)$localTime->format('i');
$currentTime = $hour * 60 + $minute; // Convertir a minutos para comparación
// Convertir horarios de inicio y fin a minutos
$startTimeParts = explode(':', $group['start_time']);
$endTimeParts = explode(':', $group['end_time']);
$startTimeMinutes = (int)$startTimeParts[0] * 60 + (int)$startTimeParts[1];
$endTimeMinutes = (int)$endTimeParts[0] * 60 + (int)$endTimeParts[1];
// Verificar si es día laboral
$workingDays = [
1 => $group['monday'],
2 => $group['tuesday'],
3 => $group['wednesday'],
4 => $group['thursday'],
5 => $group['friday'],
6 => $group['saturday'],
7 => $group['sunday']
];
$isWorkingDay = $workingDays[$dayOfWeek] == 1;
// Verificar si está dentro del horario laboral
$isWorkingHours = $isWorkingDay && $currentTime >= $startTimeMinutes && $currentTime < $endTimeMinutes;
// Determinar estado
if ($isWorkingDay && $isWorkingHours) {
$statusCode = 'open';
$statusText = 'Abierto';
$statusColor = 'green';
} else {
$statusCode = 'closed';
$statusText = 'Cerrado';
$statusColor = 'red';
}
// Buscar agentes para este país
$countryAgents = [];
foreach ($agentsByRegion as $regionName => $regionAgents) {
if (stripos($regionName, $countryName) !== false ||
stripos($countryName, $regionName) !== false ||
$this->isCountryInRegion($countryName, $regionName)) {
$countryAgents = array_merge($countryAgents, $regionAgents);
}
}
$status[$countryName] = [
'country' => $countryName,
'timezone' => $group['timezone'],
'localTime' => $localTime->format('H:i:s'),
'localDate' => $localTime->format('Y-m-d'),
'dayOfWeek' => $localTime->format('l'),
'isWorkingDay' => $isWorkingDay,
'isWorkingHours' => $isWorkingHours,
'status' => $statusCode,
'statusText' => $statusText,
'statusColor' => $statusColor,
'workingHours' => $group['start_time'] . ' - ' . $group['end_time'],
'workingDays' => $this->getWorkingDaysText($workingDays),
'supportGroupId' => $group['supportGroupId'],
'agents' => $countryAgents
];
}
return new JsonResponse($status);
}
private function isCountryInRegion($country, $regionName): bool
{
// Mapeo de países a posibles nombres de regiones
$countryRegionMap = [
'Casa Central' => ['casa central', 'argentina', 'buenos aires', 'córdoba', 'rosario'],
'Colombia' => ['colombia', 'bogotá', 'medellín', 'cali', 'barranquilla'],
'Mexico' => ['mexico', 'méxico', 'ciudad de mexico', 'cdmx', 'guadalajara', 'monterrey'],
'Brasil' => ['brasil', 'brazil', 'sao paulo', 'rio de janeiro', 'brasilia'],
'España' => ['españa', 'spain', 'madrid', 'barcelona', 'valencia', 'sevilla'],
'Peru' => ['peru', 'perú', 'lima', 'arequipa', 'trujillo'],
'Chile' => ['chile', 'santiago', 'valparaíso', 'concepción'],
'Venezuela' => ['venezuela', 'caracas', 'maracaibo', 'valencia'],
'Costa Rica' => ['costa rica', 'san josé', 'cartago', 'alajuela']
];
if (isset($countryRegionMap[$country])) {
foreach ($countryRegionMap[$country] as $regionKeyword) {
if (stripos($regionName, $regionKeyword) !== false) {
return true;
}
}
}
return false;
}
private function getWorkingDaysText($workingDays): string
{
$days = [];
$dayNames = [
1 => 'Lunes',
2 => 'Martes',
3 => 'Miércoles',
4 => 'Jueves',
5 => 'Viernes',
6 => 'Sábado',
7 => 'Domingo'
];
foreach ($workingDays as $dayNum => $isWorking) {
if ($isWorking) {
$days[] = $dayNames[$dayNum];
}
}
if (empty($days)) {
return 'No hay días laborales configurados';
}
if (count($days) === 7) {
return 'Todos los días';
}
if (count($days) === 5 && $workingDays[1] && $workingDays[2] && $workingDays[3] && $workingDays[4] && $workingDays[5]) {
return 'Lunes a Viernes';
}
return implode(', ', $days);
}
public function getRecentTicketsAction(): JsonResponse
{
$entityManager = $this->getDoctrine()->getManager();
// Forzar refresh - cerrar y reabrir la conexión para evitar cache
$entityManager->close();
$entityManager = $this->getDoctrine()->getManager();
$connection = $entityManager->getConnection();
// Forzar que no use cache de transacciones
$connection->executeQuery('SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
// Query nativo MySQL para obtener los últimos 5 tickets
$sql = "
SELECT
t.id as ticketId,
t.subject,
s.code as status,
p.code as priority,
t.created_at as createdAt,
t.updated_at as updatedAt,
c.id as customerId,
c.first_name as customerFirstName,
c.last_name as customerLastName,
c.email as customerEmail,
c.idOR as idor,
sg.name as supportGroupName,
sg.description as supportGroupDescription,
a.id as agentId,
a.first_name as agentFirstName,
a.last_name as agentLastName,
a.email as agentEmail
FROM uv_ticket t
JOIN uv_user c ON t.customer_id = c.id
LEFT JOIN uv_ticket_status s ON t.status_id = s.id
LEFT JOIN uv_ticket_priority p ON t.priority_id = p.id
LEFT JOIN uv_support_group sg ON c.idOR = sg.id
LEFT JOIN uv_user a ON t.agent_id = a.id
WHERE t.is_trashed = 0
ORDER BY t.created_at DESC
LIMIT 5
";
$stmt = $connection->prepare($sql);
$stmt->execute();
$tickets = $stmt->fetchAll(\PDO::FETCH_ASSOC);
// Formatear los datos para la respuesta
$formattedTickets = [];
foreach ($tickets as $ticket) {
$formattedTickets[] = [
'ticketId' => $ticket['ticketId'],
'subject' => $ticket['subject'],
'status' => $ticket['status'],
'priority' => $ticket['priority'],
'createdAt' => $ticket['createdAt'],
'updatedAt' => $ticket['updatedAt'],
'customer' => [
'id' => $ticket['customerId'],
'name' => $ticket['customerFirstName'] . ' ' . $ticket['customerLastName'],
'email' => $ticket['customerEmail'],
'idor' => $ticket['idor']
],
'region' => [
'name' => $ticket['supportGroupName'] ?: 'Sin región asignada',
'description' => $ticket['supportGroupDescription'] ?: ''
],
'agent' => $ticket['agentId'] ? [
'id' => $ticket['agentId'],
'name' => $ticket['agentFirstName'] . ' ' . $ticket['agentLastName'],
'email' => $ticket['agentEmail']
] : null
];
}
return new JsonResponse($formattedTickets);
}
public function getAgentsAction(): JsonResponse
{
$entityManager = $this->getDoctrine()->getManager();
// Forzar refresh - cerrar y reabrir la conexión para evitar cache
$entityManager->close();
$entityManager = $this->getDoctrine()->getManager();
$connection = $entityManager->getConnection();
// Forzar que no use cache de transacciones
$connection->executeQuery('SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
$sql = "
SELECT
a.id as agentId,
a.first_name as firstName,
a.last_name as lastName,
a.email,
a.is_enabled as isEnabled,
a.lastactivity,
a.idOR as idor,
sg.name as supportGroupName,
sg.description as supportGroupDescription,
sr.code as supportRoleCode
FROM uv_user a
JOIN uv_user_instance ui ON a.id = ui.user_id
JOIN uv_support_role sr ON ui.supportRole_id = sr.id
LEFT JOIN uv_support_group sg ON a.idOR = sg.id
WHERE a.is_enabled = 1
AND sr.code = 'ROLE_AGENT'
ORDER BY a.first_name, a.last_name
";
$stmt = $connection->prepare($sql);
$stmt->execute();
$agents = $stmt->fetchAll(\PDO::FETCH_ASSOC);
$formattedAgents = [];
foreach ($agents as $agent) {
$formattedAgents[] = [
'id' => $agent['agentId'],
'name' => $agent['firstName'] . ' ' . $agent['lastName'],
'email' => $agent['email'],
'isEnabled' => $agent['isEnabled'],
'lastActivity' => $agent['lastactivity'] ?: 'N/A',
'idor' => $agent['idor'],
'role' => $agent['supportRoleCode'],
'region' => [
'name' => $agent['supportGroupName'] ?: 'Sin región asignada',
'description' => $agent['supportGroupDescription'] ?: 'No hay descripción disponible'
]
];
}
return new JsonResponse($formattedAgents);
}
public function getActiveOfficeAgentsAction(): JsonResponse
{
$entityManager = $this->getDoctrine()->getManager();
// Forzar refresh - cerrar y reabrir la conexión para evitar cache
$entityManager->close();
$entityManager = $this->getDoctrine()->getManager();
$connection = $entityManager->getConnection();
// Forzar que no use cache de transacciones
$connection->executeQuery('SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
// Primero obtener las oficinas que están abiertas actualmente
$sql = "
SELECT
sg.id as supportGroupId,
sg.name as supportGroupName,
sg.description as supportGroupDescription,
wh.timezone,
wh.start_time,
wh.end_time,
wh.monday,
wh.tuesday,
wh.wednesday,
wh.thursday,
wh.friday,
wh.saturday,
wh.sunday,
wh.is_active
FROM uv_support_group sg
LEFT JOIN uv_working_hours wh ON sg.id = wh.support_group_id
WHERE sg.is_active = 1
AND (sg.name LIKE 'OR %' OR sg.name = 'Casa Central')
";
$stmt = $connection->prepare($sql);
$stmt->execute();
$supportGroups = $stmt->fetchAll(\PDO::FETCH_ASSOC);
// Determinar qué oficinas están abiertas
$openOffices = [];
foreach ($supportGroups as $group) {
// Si no hay configuración de horarios, usar valores por defecto
if (!$group['timezone']) {
$group['timezone'] = 'UTC';
$group['start_time'] = '09:00:00';
$group['end_time'] = '18:00:00';
$group['monday'] = 1;
$group['tuesday'] = 1;
$group['wednesday'] = 1;
$group['thursday'] = 1;
$group['friday'] = 1;
$group['saturday'] = 0;
$group['sunday'] = 0;
}
$localTime = new \DateTime('now', new \DateTimeZone($group['timezone']));
$dayOfWeek = (int)$localTime->format('N'); // 1 = Monday, 7 = Sunday
$hour = (int)$localTime->format('G'); // 0-23 hour format
$minute = (int)$localTime->format('i');
$currentTime = $hour * 60 + $minute; // Convertir a minutos para comparación
// Convertir horarios de inicio y fin a minutos
$startTimeParts = explode(':', $group['start_time']);
$endTimeParts = explode(':', $group['end_time']);
$startTimeMinutes = (int)$startTimeParts[0] * 60 + (int)$startTimeParts[1];
$endTimeMinutes = (int)$endTimeParts[0] * 60 + (int)$endTimeParts[1];
// Verificar si es día laboral
$workingDays = [
1 => $group['monday'],
2 => $group['tuesday'],
3 => $group['wednesday'],
4 => $group['thursday'],
5 => $group['friday'],
6 => $group['saturday'],
7 => $group['sunday']
];
$isWorkingDay = $workingDays[$dayOfWeek] == 1;
// Verificar si está dentro del horario laboral
$isWorkingHours = $isWorkingDay && $currentTime >= $startTimeMinutes && $currentTime < $endTimeMinutes;
if ($isWorkingHours) {
$openOffices[] = $group['supportGroupId'];
}
}
// Si no hay oficinas abiertas, devolver array vacío
if (empty($openOffices)) {
return new JsonResponse([]);
}
// Obtener agentes solo de las oficinas abiertas
$placeholders = str_repeat('?,', count($openOffices) - 1) . '?';
$sql = "
SELECT
a.id as agentId,
a.first_name as firstName,
a.last_name as lastName,
a.email,
a.is_enabled as isEnabled,
a.lastactivity,
a.idOR as idor,
sg.name as supportGroupName,
sg.description as supportGroupDescription,
sr.code as supportRoleCode
FROM uv_user a
JOIN uv_user_instance ui ON a.id = ui.user_id
JOIN uv_support_role sr ON ui.supportRole_id = sr.id
LEFT JOIN uv_support_group sg ON a.idOR = sg.id
WHERE a.is_enabled = 1
AND sr.code = 'ROLE_AGENT'
AND a.idOR IN ($placeholders)
ORDER BY a.first_name, a.last_name
";
$stmt = $connection->prepare($sql);
$stmt->execute($openOffices);
$agents = $stmt->fetchAll(\PDO::FETCH_ASSOC);
$formattedAgents = [];
foreach ($agents as $agent) {
$formattedAgents[] = [
'id' => $agent['agentId'],
'name' => $agent['firstName'] . ' ' . $agent['lastName'],
'email' => $agent['email'],
'isEnabled' => $agent['isEnabled'],
'lastActivity' => $agent['lastactivity'] ?: 'N/A',
'idor' => $agent['idor'],
'role' => $agent['supportRoleCode'],
'region' => [
'name' => $agent['supportGroupName'] ?: 'Sin región asignada',
'description' => $agent['supportGroupDescription'] ?: 'No hay descripción disponible'
]
];
}
return new JsonResponse($formattedAgents);
}
public function assignAgentAction(Request $request): JsonResponse
{
try {
$data = json_decode($request->getContent(), true);
if (!isset($data['ticketId']) || !isset($data['agentId'])) {
return new JsonResponse([
'success' => false,
'message' => 'Se requieren ticketId y agentId'
], 400);
}
$ticketId = (int) $data['ticketId'];
$agentId = (int) $data['agentId'];
$entityManager = $this->getDoctrine()->getManager();
// Forzar refresh - cerrar y reabrir la conexión para evitar cache
$entityManager->close();
$entityManager = $this->getDoctrine()->getManager();
$connection = $entityManager->getConnection();
// Forzar que no use cache de transacciones
$connection->executeQuery('SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
// Verificar que el ticket existe usando query nativo
$sql = "SELECT id FROM uv_ticket WHERE id = ?";
$stmt = $connection->prepare($sql);
$stmt->execute([$ticketId]);
$ticket = $stmt->fetch(\PDO::FETCH_ASSOC);
if (!$ticket) {
return new JsonResponse([
'success' => false,
'message' => 'El ticket especificado no existe'
], 404);
}
// Verificar que el agente existe y está activo
$sql = "SELECT id, first_name, last_name, is_enabled FROM uv_user WHERE id = ?";
$stmt = $connection->prepare($sql);
$stmt->execute([$agentId]);
$agent = $stmt->fetch(\PDO::FETCH_ASSOC);
if (!$agent) {
return new JsonResponse([
'success' => false,
'message' => 'El agente especificado no existe'
], 404);
}
if (!$agent['is_enabled']) {
return new JsonResponse([
'success' => false,
'message' => 'El agente especificado no está activo'
], 400);
}
// Verificar que el usuario tiene rol de agente
$sql = "
SELECT sr.code
FROM uv_user_instance ui
JOIN uv_support_role sr ON ui.supportRole_id = sr.id
WHERE ui.user_id = ?
";
$stmt = $connection->prepare($sql);
$stmt->execute([$agentId]);
$role = $stmt->fetch(\PDO::FETCH_ASSOC);
if (!$role || $role['code'] !== 'ROLE_AGENT') {
return new JsonResponse([
'success' => false,
'message' => 'El usuario especificado no tiene rol de agente'
], 400);
}
// Asignar el agente al ticket usando query nativo
$sql = "UPDATE uv_ticket SET agent_id = ? WHERE id = ?";
$stmt = $connection->prepare($sql);
$stmt->execute([$agentId, $ticketId]);
return new JsonResponse([
'success' => true,
'message' => 'Ticket asignado exitosamente al agente',
'data' => [
'ticketId' => $ticketId,
'agentId' => $agentId,
'agentName' => $agent['first_name'] . ' ' . $agent['last_name']
]
]);
} catch (\Exception $e) {
return new JsonResponse([
'success' => false,
'message' => 'Error interno del servidor: ' . $e->getMessage()
], 500);
}
}
public function updateWorkingHoursAction(Request $request): JsonResponse
{
try {
$data = json_decode($request->getContent(), true);
if (!isset($data['supportGroupId']) || !isset($data['timezone']) ||
!isset($data['startTime']) || !isset($data['endTime'])) {
return new JsonResponse([
'success' => false,
'message' => 'Se requieren todos los campos obligatorios'
], 400);
}
$supportGroupId = (int) $data['supportGroupId'];
$timezone = $data['timezone'];
$startTime = $data['startTime'];
$endTime = $data['endTime'];
$monday = isset($data['monday']) ? (int) $data['monday'] : 1;
$tuesday = isset($data['tuesday']) ? (int) $data['tuesday'] : 1;
$wednesday = isset($data['wednesday']) ? (int) $data['wednesday'] : 1;
$thursday = isset($data['thursday']) ? (int) $data['thursday'] : 1;
$friday = isset($data['friday']) ? (int) $data['friday'] : 1;
$saturday = isset($data['saturday']) ? (int) $data['saturday'] : 0;
$sunday = isset($data['sunday']) ? (int) $data['sunday'] : 0;
$entityManager = $this->getDoctrine()->getManager();
// Forzar refresh - cerrar y reabrir la conexión para evitar cache
$entityManager->close();
$entityManager = $this->getDoctrine()->getManager();
$connection = $entityManager->getConnection();
// Forzar que no use cache de transacciones
$connection->executeQuery('SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
// Verificar que el grupo de soporte existe
$sql = "SELECT id FROM uv_support_group WHERE id = ? AND is_active = 1";
$stmt = $connection->prepare($sql);
$stmt->execute([$supportGroupId]);
$supportGroup = $stmt->fetch(\PDO::FETCH_ASSOC);
if (!$supportGroup) {
return new JsonResponse([
'success' => false,
'message' => 'El grupo de soporte especificado no existe o no está activo'
], 404);
}
// Verificar si ya existe configuración de horarios para este grupo
$sql = "SELECT id FROM uv_working_hours WHERE support_group_id = ?";
$stmt = $connection->prepare($sql);
$stmt->execute([$supportGroupId]);
$existingHours = $stmt->fetch(\PDO::FETCH_ASSOC);
if ($existingHours) {
// Actualizar horarios existentes
$sql = "
UPDATE uv_working_hours
SET timezone = ?, start_time = ?, end_time = ?,
monday = ?, tuesday = ?, wednesday = ?, thursday = ?,
friday = ?, saturday = ?, sunday = ?, updated_at = CURRENT_TIMESTAMP
WHERE support_group_id = ?
";
$stmt = $connection->prepare($sql);
$stmt->execute([
$timezone, $startTime, $endTime,
$monday, $tuesday, $wednesday, $thursday, $friday, $saturday, $sunday,
$supportGroupId
]);
} else {
// Crear nueva configuración de horarios
$sql = "
INSERT INTO uv_working_hours
(support_group_id, timezone, start_time, end_time,
monday, tuesday, wednesday, thursday, friday, saturday, sunday)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
";
$stmt = $connection->prepare($sql);
$stmt->execute([
$supportGroupId, $timezone, $startTime, $endTime,
$monday, $tuesday, $wednesday, $thursday, $friday, $saturday, $sunday
]);
}
return new JsonResponse([
'success' => true,
'message' => 'Horarios laborales actualizados exitosamente',
'data' => [
'supportGroupId' => $supportGroupId,
'timezone' => $timezone,
'startTime' => $startTime,
'endTime' => $endTime,
'workingDays' => [
'monday' => $monday,
'tuesday' => $tuesday,
'wednesday' => $wednesday,
'thursday' => $thursday,
'friday' => $friday,
'saturday' => $saturday,
'sunday' => $sunday
]
]
]);
} catch (\Exception $e) {
return new JsonResponse([
'success' => false,
'message' => 'Error interno del servidor: ' . $e->getMessage()
], 500);
}
}
}