<?php
namespace App\Controller;
use App\Entity\Ticket;
use App\Entity\TransactionLog;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Service\TicketOneService;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\Id;
use PhpParser\Node\Expr\New_;
use Symfony\Component\HttpFoundation\Request;
use App\Repository\TransactionLogRepository;
use Doctrine\ORM\EntityManager;
use App\Service\TicketServiceFactoryInterface;
use Sonata\AdminBundle\Admin\Pool;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\Form\Extension\Core\Type\DateType;
class DefaultController extends AbstractController
{
private TicketServiceFactoryInterface $ticketServiceFactory;
/**
* @var EntityManagerInterface
*/
private $em;
private $adminPool;
private $csrfTokenManager;
private $formFactory;
public function __construct(EntityManagerInterface $em, TicketServiceFactoryInterface $ticketServiceFactory, Pool $adminPool, CsrfTokenManagerInterface $csrfTokenManager, FormFactoryInterface $formFactory) {
$this->em = $em;
$this->adminPool = $adminPool;
$this->csrfTokenManager = $csrfTokenManager;
$this->formFactory = $formFactory;
$this->ticketServiceFactory = $ticketServiceFactory;
}
#[Route('/', name: 'home')]
public function home(): Response
{
return $this->redirectToRoute('sonata_admin_dashboard');
}
#[Route('/admin/default/revenues',name:'admin_default_revenueChart')]
public function revenueChart(Request $request): Response{
$startDate = date('Y-m-d H:i:s',strtotime('-6 day'));
$endDate = date('Y-m-d H:i:s',strtotime('+1 day'));
$filters = $request->query->all();
$orderDate = $filters['filter']['orderDate'] ?? null;
if (!is_null($orderDate)){
$startDate = $orderDate['value']['start'];
$endDate = $orderDate['value']['end'];
}
$dateFilter = ['start' => $startDate, 'end' => $endDate];
$ticketRepository = $this->em->getRepository(Ticket::class);
$ticketDaylyRevenues = $ticketRepository->currentYearRevenueTrendByDay($dateFilter);
$vDaysShortTranslated = ['Mon'=>'Lun','Tue'=>'Mar','Wed'=>'Mer','Thu'=>'Gio','Fri'=>'Ven','Sat'=>'Sab','Sun'=>'Dom'];
foreach ($ticketDaylyRevenues as $date => $ticket){
$datetime = new \DateTime($date);
$dayName = $datetime->format('D');
$dayNumber = $datetime->format('d');
$month = $datetime->format('m');
$labelName = $vDaysShortTranslated[$dayName] . ' ' . $dayNumber . '/' . $month;
$labels[] = $labelName;
$revenues[]=$ticket;
}
$chartData = [
'labels' => $labels,
'datasets' => [
[
'label' => 'incassi',
'backgroundColor' => 'rgba(75, 192, 192, 0.2)',
'borderColor' => 'rgba(0, 65, 210, 1)',
'borderWidth' => 1,
'data' => $revenues,
]
]
];
return $this->render('admin/default/revenue_chart.html.twig',[
'chartData'=>$chartData,
'startDate'=>$startDate,
'endDate'=>$endDate
]);
}
#[Route('/admin/current_year_issues', name: 'current_year_issues')]
public function currentYearIssues(Request $request): Response
{
$startDate = date('Y') . '-01-01';
$endDate = date('Y-m-d');
$filters = $request->query->all();
$orderDate = $filters['filter']['orderDate'] ?? null;
if (!is_null($orderDate)){
$startDate = $orderDate['value']['start'];
$endDate = $orderDate['value']['end'];
}
$filterDate = ['start' => $startDate, 'end' => $endDate];
$ticketRepository = $this->em->getRepository(Ticket::class);
$ticketIssues = $ticketRepository->countTicketsGroupedByDay($filterDate);
$vDaysShortTranslated = ['Mon'=>'Lun','Tue'=>'Mar','Wed'=>'Mer','Thu'=>'Gio','Fri'=>'Ven','Sat'=>'Sab','Sun'=>'Dom'];
foreach ($ticketIssues as $date => $ticket){
$datetime = new \DateTime($date);
$dayName = $datetime->format('D');
$dayNumber = $datetime->format('d');
$month = $datetime->format('m');
$labelName = $vDaysShortTranslated[$dayName] . ' ' . $dayNumber . '/' . $month;
$labels[] = $labelName;
}
return $this->render('/admin/default/current_year_issues.html.twig', [
'labels' => $labels,
'ticketIssues' => $ticketIssues,
'startDate' => $startDate,
'endDate' => $endDate,
]);
}
#[Route('/admin/museum_sold_tickets', name: 'museum_sold_tickets')]
public function museumSoldTickets(Request $request): Response
{
$startDate = date('Y') . '-01-01';
$endDate = date('Y-m-d');
$filters = $request->query->all();
$orderDate = $filters['filter']['orderDate'] ?? null;
if (!is_null($orderDate)){
$startDate = $orderDate['value']['start'];
$endDate = $orderDate['value']['end'];
}
$filterDate = ['start' => $startDate, 'end' => $endDate];
$ticketRepository = $this->em->getRepository(Ticket::class);
$museumSoldTickets = $ticketRepository->museumBySoldTickets('sold_tickets',$filterDate);
$soldTickets = $this->extractInfo($museumSoldTickets,'sold_tickets');
$labels = $this->extractInfo($museumSoldTickets,'eventPlace');
$colors = array_map([$this, 'generateColor'], $labels);
return $this->render('/admin/default/museum_sold_tickets.html.twig', [
'soldTickets' => $soldTickets,
'labels' => $labels,
'colors' => $colors,
'startDate' => $startDate,
'endDate' => $endDate,
]);
}
#[Route('/admin/museum_ticket_revenue', name: 'museum_ticket_revenue')]
public function museumTicketRevenue(Request $request): Response
{
$startDate = date('Y') . '-01-01';
$endDate = date('Y-m-d');
$filters = $request->query->all();
$orderDate = $filters['filter']['orderDate'] ?? null;
if (!is_null($orderDate)){
$startDate = $orderDate['value']['start'];
$endDate = $orderDate['value']['end'];
}
$filterDate = ['start' => $startDate, 'end' => $endDate];
$ticketRepository = $this->em->getRepository(Ticket::class);
$museumTicketRevenue = $ticketRepository->museumBySoldTickets('ticket_revenue',$filterDate);
$ticketRevenue = $this->extractInfo($museumTicketRevenue,'ticket_revenue');
$labels = $this->extractInfo($museumTicketRevenue,'eventPlace');
$colors = array_map([$this, 'generateColor'], $labels);
return $this->render('/admin/default/museum_ticket_revenue.html.twig', [
'ticketRevenue' => $ticketRevenue,
'labels' => $labels,
'colors' => $colors,
'startDate' => $startDate,
'endDate' => $endDate,
]);
}
private function extractInfo($array,$info)
{
return array_map(function($subArray) use ($info) {
return $info == 'eventPlace' && is_null($subArray[$info])
? 'Non specificato'
: $subArray[$info];
}, $array);
}
private function generateColor($input)
{
return '#' . substr(md5($input), 0, 6);
}
}