vendor/uvdesk/core-framework/Controller/Report.php line 44

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\CoreFrameworkBundle\Controller;
  3. use Webkul\UVDesk\CoreFrameworkBundle\Entity;
  4. use Webkul\UVDesk\CoreFrameworkBundle\Form;
  5. use Webkul\UVDesk\CoreFrameworkBundle\Entity\User;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportGroup;
  9. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportTeam;
  10. use Webkul\UVDesk\CoreFrameworkBundle\Entity\UserInstance;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Webkul\UVDesk\CoreFrameworkBundle\Services\UserService;
  13. use Webkul\UVDesk\CoreFrameworkBundle\Services\UVDeskService;
  14. use Webkul\UVDesk\CoreFrameworkBundle\Services\ReportService;
  15. use Symfony\Contracts\Translation\TranslatorInterface;
  16. use Knp\Component\Pager\PaginatorInterface;
  17. use Doctrine\ORM\Query;
  18. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  19. use Symfony\Component\DependencyInjection\ContainerInterface;
  20. use Webkul\UVDesk\CoreFrameworkBundle\Entity\TicketRating;
  21. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Ticket;
  22. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  23. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  24. class Report extends AbstractController
  25. {
  26.     private $userService;
  27.     private $reportService;
  28.     private $uvdeskService;
  29.     private $paginator;
  30.     private $translator;
  31.     public function __construct(UserService $userServiceUVDeskService $uvdeskService,ReportService $reportServicePaginatorInterface $paginatorTranslatorInterface $translator)
  32.     {
  33.         $this->userService $userService;
  34.         $this->reportService $reportService;
  35.         $this->uvdeskService $uvdeskService;
  36.         $this->paginator $paginator;
  37.         $this->translator $translator;
  38.     }
  39.     public function listAgentActivity(Request $request)
  40.     {
  41.         if (!$this->userService->isAccessAuthorized('ROLE_AGENT_MANAGE_AGENT_ACTIVITY')){
  42.             return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  43.         }
  44.         return $this->render('@UVDeskCoreFramework/Reports/listAgentActivities.html.twig', [
  45.             'agents' => $this->userService->getAgentsPartialDetails(),
  46.         ]);
  47.     }
  48.     public function agentActivityXHR(Request $request)
  49.     {
  50.         $json = [];
  51.         if ($request->isXmlHttpRequest()) {
  52.             $json $this->agentActivityData($request);
  53.         }
  54.         return new Response(json_encode($json), 200, ['Content-Type' => 'application/json']);
  55.     }
  56.     public function agentActivityData(Request $request)
  57.     {
  58.         if (!$this->userService->isAccessAuthorized('ROLE_AGENT_MANAGE_AGENT_ACTIVITY')){
  59.             throw new \Exception('Access Denied'403);
  60.         }
  61.         
  62.         $data = [];
  63.         $reportService $this->reportService;
  64.         $reportService->parameters $request->query->all();
  65.         $startDate $reportService->parameters['after'];
  66.         $endDate $reportService->parameters['before'];
  67.         $agentIds = [];
  68.         if(isset($reportService->parameters['agent']))
  69.             $agentIds explode(','$reportService->parameters['agent']);
  70.         $userService $this->userService;
  71.         $from $startDate." 00:00:01";
  72.         $to $endDate." 23:59:59";
  73.         $reportService->parameters $request->query->all();
  74.         $qb $reportService->getAgentActivity($agentIds$from$to);
  75.         $paginator  $this->paginator;
  76.         $newQb = clone $qb;
  77.         $results $paginator->paginate(
  78.             $qb->getQuery()->setHydrationMode(Query::HYDRATE_ARRAY)->setHint('knp_paginator.count'count($newQb->getQuery()->getResult())),
  79.             $request->query->get('page') ?: 1,
  80.             20,
  81.             array('distinct' => true)
  82.         );
  83.         $paginationData $results->getPaginationData();
  84.         $queryParameters $results->getParams();
  85.         $queryParameters['page'] = "replacePage";
  86.         $paginationData['url'] = '#'.$this->uvdeskService->buildPaginationQuery($queryParameters);
  87.         $data = array();
  88.         $ticketIds = [];
  89.         $agentActivity = [];
  90.         $agentIds = [];
  91.         foreach ($results as $key => $activity) {
  92.             $ticket $this->getDoctrine()->getManager()->getRepository(Ticket::class)->findOneById($activity['ticketId']);
  93.             $currentDateTime  = new \DateTime('now');
  94.             $activityDateTime $activity['createdAt'];
  95.             $difference $currentDateTime->getTimeStamp() - $activityDateTime->getTimeStamp();
  96.             $lastReply $reportService->time2string($difference);
  97.             $ticketViewURL $this->get('router')->generate('helpdesk_member_ticket', ['ticketId' => $activity['ticketId']], UrlGeneratorInterface::ABSOLUTE_URL);
  98.             $data[] =   [
  99.                 'id' => $activity['id'],
  100.                 'ticketURL' => $ticketViewURL,
  101.                 'ticketId' => $activity['ticketId'],
  102.                 // 'typeId' => $activity['typeId'],
  103.                 'code' => $activity['code'],
  104.                 // 'subject' => $activity['subject'],
  105.                 // 'color'   => $activity['colorCode'],
  106.                 // 'customerName'=> $activity['customerName'],
  107.                 // 'threadType' => $activity['threadType'],
  108.                 // 'lastReply'  => $lastReply,
  109.                 // 'agentName'  => $activity['agentName']
  110.                 'fullName' => $activity['fullName'],
  111.                 'customerName' => $activity['customerName'],
  112.                 'timeSpent' => $activity['timeSpent'],
  113.                 'createdAt' => $activity['createdAt'] instanceof \DateTimeInterface
  114.         $activity['createdAt']->format('Y-m-d H:i:s')
  115.         : $activity['createdAt'],
  116.             ];
  117.             array_push($ticketIds$activity['ticketId']);
  118.             // array_push($agentIds, $activity['agentId']);
  119.         }
  120.        
  121.         // Separate logic to fetch all pagination data without interfering
  122.     $allPaginatedData = []; // Variable to store data from all pages
  123.     $totalPages $paginationData['pageCount']; // Total number of pages
  124.     for ($currentPage 1$currentPage <= $totalPages$currentPage++) {
  125.         $paginatedResults $paginator->paginate(
  126.             $qb->getQuery()->setHydrationMode(Query::HYDRATE_ARRAY),
  127.             $currentPage,
  128.             20,
  129.             ['distinct' => true]
  130.         );
  131.         foreach ($paginatedResults as $activity) { $ticketViewURL $this->get('router')->generate(
  132.             'helpdesk_member_ticket'
  133.             ['ticketId' => $activity['ticketId']], 
  134.             UrlGeneratorInterface::ABSOLUTE_URL
  135.         );
  136.             $allPaginatedData[] = [
  137.                 'id' => $activity['id'],
  138.                 'ticketURL' => $ticketViewURL,
  139.                 'ticketId' => $activity['ticketId'],
  140.                 // 'typeId' => $activity['typeId'],
  141.                 // 'ticketTypeCode' => $activity['ticketTypeCode'],
  142.                 // 'subject' => $activity['subject'],
  143.                 // 'color'   => $activity['colorCode'],
  144.                 // 'customerName'=> $activity['customerName'],
  145.                 // 'threadType' => $activity['threadType'],
  146.                 // 'lastReply'  => $lastReply,
  147.                 // 'agentName'  => $activity['agentName']
  148.                 'code' => $activity['code'],
  149.                 'fullName' => $activity['fullName'],
  150.                 'customerName' => $activity['customerName'],
  151.                 'timeSpent' => $activity['timeSpent'],
  152.                 'createdAt' => $activity['createdAt'] instanceof \DateTimeInterface
  153.         $activity['createdAt']->format('Y-m-d H:i:s')
  154.         : $activity['createdAt'],
  155.             ];
  156.         }
  157.     }
  158.         $threadDetails $reportService->getTotalReplies(array_unique($ticketIds), $agentIds$from$to);
  159.         foreach ($data as $index => $ticketDetail) {
  160.             foreach ($threadDetails as $detail) {
  161.                 if ($detail['ticketId'] == $ticketDetail['ticketId']) {
  162.                     $data[$index]['totalReply'] = $detail['ticketCount'];
  163.                 }
  164.             }
  165.         }
  166.         $agentActivity = [];
  167.         //$request->getSession()->set('agentActivity', $agentActivity); // Store in session
  168.         $agentActivity['data'] = $data;
  169.         $agentActivity['allPaginatedData'] = $allPaginatedData;
  170.         $agentActivity['pagination_data'] = $paginationData;
  171.         $request->getSession()->set('agentActivity'$agentActivity);
  172.         return $agentActivity;
  173.     }
  174.     
  175.     public function exportAgentActivity(Request $request): Response
  176. {
  177.     ob_start(); // Start output buffering
  178.     // Retrieve agent activity data from the session
  179.     $agentActivity $request->getSession()->get('agentActivity', []);
  180.     // Check if data is empty
  181.     if (empty($agentActivity) || empty($agentActivity['allPaginatedData'])) {
  182.         return new Response('No data available to export'404);
  183.     }
  184.     // Extract the data array from session data
  185.     $data $agentActivity['allPaginatedData'];
  186.     // Create a new Spreadsheet object
  187.     $spreadsheet = new Spreadsheet();
  188.     $sheet $spreadsheet->getActiveSheet();
  189.     // Extract headers dynamically from the first data row
  190.     $headers array_keys(reset($data));
  191.     // Set the header row
  192.     $col 'A';
  193.     foreach ($headers as $header) {
  194.         $sheet->setCellValue($col '1'$header);
  195.         $col++;
  196.     }
  197.     // Fill the data rows
  198.     $row 2;
  199.     foreach ($data as $rowData) {
  200.         $col 'A';
  201.         foreach ($headers as $header) {
  202.             $value $rowData[$header] ?? ''// Use empty string if value is not set
  203.             $sheet->setCellValue($col $row$value);
  204.             $col++;
  205.         }
  206.         $row++;
  207.     }
  208.     // Generate and return the Excel file
  209.     $writer = new Xlsx($spreadsheet);
  210.     $filename 'agentActivity.xlsx';
  211.     $response = new Response();
  212.     $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  213.     $response->headers->set('Content-Disposition''attachment; filename="' $filename '"');
  214.     $response->headers->set('Cache-Control''max-age=0');
  215.     $writer->save('php://output');
  216.     return $response;
  217. }
  218.     
  219.     public function achievementInsightsAction()
  220.     {
  221.         $this->userService->forceFormat true;
  222.         $startDate $this->userService->convertToTimezone(new \DateTime("-7 days"), 'Y-m-d');
  223.         $endDate $this->userService->convertToTimezone(new \DateTime("now"), 'Y-m-d');
  224.         $this->userService->forceFormat false;
  225.         return $this->render('@UVDeskCoreFramework/Reports/kudos-insights.html.twig',array(
  226.                 'startDate' => $startDate,
  227.                 'endDate' => $endDate
  228.             )
  229.         );
  230.     }
  231.     public function getAchievementsXhr(Request $requestContainerInterface $container)
  232.     {
  233.         $json = array();
  234.         if( $request->isXmlHttpRequest()) {
  235.             $repository $this->getDoctrine()->getRepository(TicketRating::class);
  236.             $json =  $repository->getRatedTicketList($request->query$container);
  237.             $json['data'] = $this->getAchievementsData($request$container);
  238.         }
  239.         $response = new Response(json_encode($json));
  240.         $response->headers->set('Content-Type''application/json');
  241.         return $response;
  242.     }
  243.     public function getAchievementsData($request$container)
  244.     {
  245.         $data = array();
  246.         $reportService $this->reportService;
  247.         $reportService->parameters $request->query->all();
  248.         $startDate $reportService->parameters['start'];
  249.         $endDate $reportService->parameters['end'];
  250.         $reportService->startDate $this->userService->convertToTimezone(new \DateTime($startDate),'Y-m-d H:i:s');
  251.         $reportService->endDate $this->userService->convertToTimezone(new \DateTime($endDate),'Y-m-d H:i:s');
  252.         $repository $this->getDoctrine()->getRepository(TicketRating::class);
  253.         $data =  $repository->getRatingData($request->query$container);
  254.         for ($i 1$i <= 5$i++) {
  255.             $data['ratings'][$i] = $repository->getRatingByStarCount($request->query$i$container);
  256.         }
  257.         return $data;
  258.     }
  259. }