src/Controller/DefaultController.php line 18

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\SaasInstance;
  4. use App\Service\InstanceInspector;
  5. use Doctrine\DBAL\DriverManager;
  6. use Doctrine\Persistence\ManagerRegistry;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. class DefaultController extends AbstractController
  13. {
  14. #[Route('/', name: 'desktop')]
  15. public function index(ManagerRegistry $doctrine): Response
  16. {
  17. $instances = $doctrine->getRepository(SaasInstance::class)->findBy(['isActive' => 1], ['name' => 'ASC']);
  18. return $this->render('default/index.html.twig', [
  19. 'instances' => $instances,
  20. ]);
  21. }
  22. /**
  23. * Estadísticas de uso de una instancia (consulta de solo lectura a la base del cliente; caché de 5 minutos).
  24. */
  25. #[Route('/panel/estadisticas/{id}', name: 'instance_stats', requirements: ['id' => '\d+'], methods: ['GET'])]
  26. public function instanceStats(Request $request, ManagerRegistry $doctrine, InstanceInspector $inspector, int $id): JsonResponse
  27. {
  28. $instance = $doctrine->getRepository(SaasInstance::class)->find($id);
  29. if (!$instance) {
  30. return new JsonResponse(['ok' => false, 'error' => 'Instancia no encontrada'], 404);
  31. }
  32. return new JsonResponse($inspector->stats($instance, $request->query->getBoolean('refresh')));
  33. }
  34. #[Route('/monitor', name: 'monitor')]
  35. public function monitor(Request $request): Response
  36. {
  37. $dateInit = $request->get('dateInit', date('Y-m-d'));
  38. $dateFinish = $request->get('dateFinish', date('Y-m-d'));
  39. return $this->render('default/monitor.html.twig', [
  40. 'dateInit' => $dateInit,
  41. 'dateFinish' => $dateFinish,
  42. ]);
  43. }
  44. #[Route('/analytics/ticket/hours', name: 'payment_analytics_by_hour')]
  45. public function analyticsPaymentHours(Request $request, ManagerRegistry $doctrine): JsonResponse
  46. {
  47. $em = $doctrine->getManager();
  48. $dateInit = $request->get('dateInit', date('Y-m-d'));
  49. $dateFinish = $request->get('dateFinish', date('Y-m-d'));
  50. $lists = $em->getRepository(SaasInstance::class)->findBy(['isActive' => 1]);
  51. $sql = "SELECT
  52. SUM(IF(realtion_payment = '1', total, 0)) AS Efectivo,
  53. SUM(IF(realtion_payment = '2', total, 0)) AS Debito,
  54. SUM(IF(realtion_payment = '3', total, 0)) AS Credito,
  55. SUM(IF(realtion_payment = '4', total, 0)) AS tranferencia,
  56. SUM(IF(realtion_payment = '5', total, 0)) AS wooCommerce,
  57. SUM(total) AS totalDetails
  58. FROM ticket
  59. WHERE status = '2' AND created_at BETWEEN :dateInit AND :dateFinish";
  60. $rest = [];
  61. foreach ($lists as $instance) {
  62. try {
  63. $conn = DriverManager::getConnection([
  64. 'dbname' => $instance->getDbname(),
  65. 'user' => $instance->getDbuser(),
  66. 'password' => $instance->getDbpassword(),
  67. 'host' => $instance->getDbhost(),
  68. 'driver' => 'pdo_mysql',
  69. ]);
  70. $results = $conn->executeQuery($sql, [
  71. 'dateInit' => $dateInit . ' 00:00:00',
  72. 'dateFinish' => $dateFinish . ' 23:59:59',
  73. ])->fetchAssociative();
  74. } catch (\Throwable $e) {
  75. // Una instancia caída no debe romper el monitor de las demás.
  76. $results = [
  77. 'Efectivo' => 0, 'Debito' => 0, 'Credito' => 0, 'tranferencia' => 0,
  78. 'wooCommerce' => 0, 'totalDetails' => 0, 'error' => true,
  79. ];
  80. }
  81. $rest[] = [
  82. 'id' => $instance->getId(),
  83. 'name' => $instance->getName(),
  84. 'cant' => $results,
  85. 'url' => $instance->getHostname(),
  86. 'img' => $instance->getHostname() . '/publico/imagen/login',
  87. ];
  88. }
  89. return new JsonResponse(['detail' => $rest]);
  90. }
  91. }