<?php
namespace App\Controller;
use App\Entity\SaasInstance;
use App\Service\InstanceInspector;
use Doctrine\DBAL\DriverManager;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class DefaultController extends AbstractController
{
#[Route('/', name: 'desktop')]
public function index(ManagerRegistry $doctrine): Response
{
$instances = $doctrine->getRepository(SaasInstance::class)->findBy(['isActive' => 1], ['name' => 'ASC']);
return $this->render('default/index.html.twig', [
'instances' => $instances,
]);
}
/**
* Estadísticas de uso de una instancia (consulta de solo lectura a la base del cliente; caché de 5 minutos).
*/
#[Route('/panel/estadisticas/{id}', name: 'instance_stats', requirements: ['id' => '\d+'], methods: ['GET'])]
public function instanceStats(Request $request, ManagerRegistry $doctrine, InstanceInspector $inspector, int $id): JsonResponse
{
$instance = $doctrine->getRepository(SaasInstance::class)->find($id);
if (!$instance) {
return new JsonResponse(['ok' => false, 'error' => 'Instancia no encontrada'], 404);
}
return new JsonResponse($inspector->stats($instance, $request->query->getBoolean('refresh')));
}
#[Route('/monitor', name: 'monitor')]
public function monitor(Request $request): Response
{
$dateInit = $request->get('dateInit', date('Y-m-d'));
$dateFinish = $request->get('dateFinish', date('Y-m-d'));
return $this->render('default/monitor.html.twig', [
'dateInit' => $dateInit,
'dateFinish' => $dateFinish,
]);
}
#[Route('/analytics/ticket/hours', name: 'payment_analytics_by_hour')]
public function analyticsPaymentHours(Request $request, ManagerRegistry $doctrine): JsonResponse
{
$em = $doctrine->getManager();
$dateInit = $request->get('dateInit', date('Y-m-d'));
$dateFinish = $request->get('dateFinish', date('Y-m-d'));
$lists = $em->getRepository(SaasInstance::class)->findBy(['isActive' => 1]);
$sql = "SELECT
SUM(IF(realtion_payment = '1', total, 0)) AS Efectivo,
SUM(IF(realtion_payment = '2', total, 0)) AS Debito,
SUM(IF(realtion_payment = '3', total, 0)) AS Credito,
SUM(IF(realtion_payment = '4', total, 0)) AS tranferencia,
SUM(IF(realtion_payment = '5', total, 0)) AS wooCommerce,
SUM(total) AS totalDetails
FROM ticket
WHERE status = '2' AND created_at BETWEEN :dateInit AND :dateFinish";
$rest = [];
foreach ($lists as $instance) {
try {
$conn = DriverManager::getConnection([
'dbname' => $instance->getDbname(),
'user' => $instance->getDbuser(),
'password' => $instance->getDbpassword(),
'host' => $instance->getDbhost(),
'driver' => 'pdo_mysql',
]);
$results = $conn->executeQuery($sql, [
'dateInit' => $dateInit . ' 00:00:00',
'dateFinish' => $dateFinish . ' 23:59:59',
])->fetchAssociative();
} catch (\Throwable $e) {
// Una instancia caída no debe romper el monitor de las demás.
$results = [
'Efectivo' => 0, 'Debito' => 0, 'Credito' => 0, 'tranferencia' => 0,
'wooCommerce' => 0, 'totalDetails' => 0, 'error' => true,
];
}
$rest[] = [
'id' => $instance->getId(),
'name' => $instance->getName(),
'cant' => $results,
'url' => $instance->getHostname(),
'img' => $instance->getHostname() . '/publico/imagen/login',
];
}
return new JsonResponse(['detail' => $rest]);
}
}