src/AdminBundle/Controller/DashboardController.php line 119

Open in your IDE?
  1. <?php
  2. namespace AdminBundle\Controller;
  3. use DateTime;
  4. use Symfony\Bundle\FrameworkBundle\Console\Application;
  5. use Symfony\Component\Console\Input\ArrayInput;
  6. use Symfony\Component\Console\Output\BufferedOutput;
  7. use CoreBundle\Component\FormManager;
  8. use CoreBundle\Entity\Forms;
  9. use CoreBundle\Entity\Ticket;
  10. use CoreBundle\Entity\User;
  11. use CoreBundle\Entity\Dealer;
  12. use CoreBundle\Entity\VehicleEstimate;
  13. use DcSiteBundle\Entity\OnlineServiceBooking;
  14. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\HttpFoundation\Request;
  17. class DashboardController extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractController
  18. {
  19.     public function init(Request $request)
  20.     {
  21.         /** @var User $User */
  22.         $User $this->getUser();
  23.         $Dealer $User->getDealer();
  24.         $leadsResult null;
  25.         $ticketsResult null;
  26.         $leadsByUtm = [];
  27.         $date = new DateTime();
  28.         if ($request->get('isPrev')) {
  29.             $date $date->modify('-1 month');
  30.         }
  31.         if ($Dealer) {
  32.             $monthLeads $this->getDoctrine()->getRepository(Forms::class)->getMonthForms($Dealer$date);
  33.             $monthCount count($monthLeads);
  34.             $monthInCrmCount 0;
  35.             $todayCount 0;
  36.             $todayInCrmCount 0;
  37.             $leads = [];
  38.             $leadsByType = [];
  39.             /** @var Forms $lead */
  40.             foreach ($monthLeads as $lead) {
  41.                 $type $lead->getType();
  42.                 if ($lead->getUtm()) {
  43.                     $decodedUtm json_decode($lead->getUtm());
  44.                     if (!isset($leadsByUtm[$decodedUtm->utm_source])) {
  45.                         $leadsByUtm[$decodedUtm->utm_source] = [];
  46.                     }
  47.                     if (!isset($leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium])) {
  48.                         $leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium] = [];
  49.                     }
  50.                     $name $decodedUtm->utm_campaign ' / ' $decodedUtm->utm_content;
  51.                     $hash md5($name);
  52.                     if (!isset($leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash])) {
  53.                         $leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash] = [
  54.                             'count' => 1,
  55.                             'name' => $name,
  56.                         ];
  57.                     } else {
  58.                         $leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash]['count']++;
  59.                     }
  60.                 }
  61.                 if (!isset($leadsByType[$type])) {
  62.                     $leadsByType[$type] = [
  63.                         'type' => $type,
  64.                         'title' => FormManager::getTypeName($type),
  65.                         'count' => 0,
  66.                     ];
  67.                 }
  68.                 $leadsByType[$type]['count']++;
  69.             }
  70.             for ($i 1$i <= date('t'); $i++) {
  71.                 $leads[$i] = [
  72.                     'total' => 0,
  73.                     'inCrm' => 0,
  74.                 ];
  75.                 /** @var Forms $lead */
  76.                 foreach ($monthLeads as $lead) {
  77.                     $day $lead->getDateCreate()->format('d');
  78.                     if ((int)$day != $i) {
  79.                         continue;
  80.                     }
  81.                     $leads[$i]['total']++;
  82.                     if ($lead->getInCrm() && $lead->getCrmLeadId()) {
  83.                         $monthInCrmCount++;
  84.                         $leads[$i]['inCrm']++;
  85.                         if ($day == date('t')) {
  86.                             $todayInCrmCount++;
  87.                         }
  88.                     }
  89.                     if ($day == date('t')) {
  90.                         $todayCount++;
  91.                     }
  92.                 }
  93.             }
  94.             $oEst $this->getDoctrine()->getRepository(VehicleEstimate::class)->getMonth($Dealer$date);
  95.             /** @var VehicleEstimate $lead */
  96.             foreach ($oEst as $lead) {
  97.                 if ($lead->getForm()) {
  98.                     continue;
  99.                 }
  100.                 if ($lead->getUtm()) {
  101.                     $decodedUtm json_decode($lead->getUtm());
  102.                     if (!isset($leadsByUtm[$decodedUtm->utm_source])) {
  103.                         $leadsByUtm[$decodedUtm->utm_source] = [];
  104.                     }
  105.                     if (!isset($leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium])) {
  106.                         $leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium] = [];
  107.                     }
  108.                     $name $decodedUtm->utm_campaign ' / ' $decodedUtm->utm_content;
  109.                     $hash md5($name);
  110.                     if (!isset($leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash])) {
  111.                         $leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash] = [
  112.                             'count' => 1,
  113.                             'name' => $name,
  114.                         ];
  115.                     } else {
  116.                         $leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash]['count']++;
  117.                     }
  118.                 }
  119.             }
  120.             $oBooking =
  121.                 $this->getDoctrine()->getRepository(OnlineServiceBooking::class)->getMonth($Dealer$date);
  122.             /** @var OnlineServiceBooking $lead */
  123.             foreach ($oBooking as $lead) {
  124.                 if (!$lead->getUtm()) {
  125.                     continue;
  126.                 }
  127.                 $decodedUtm json_decode($lead->getUtm());
  128.                 if (!isset($leadsByUtm[$decodedUtm->utm_source])) {
  129.                     $leadsByUtm[$decodedUtm->utm_source] = [];
  130.                 }
  131.                 if (!isset($leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium])) {
  132.                     $leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium] = [];
  133.                 }
  134.                 $name $decodedUtm->utm_campaign ' / ' $decodedUtm->utm_content;
  135.                 $hash md5($name);
  136.                 if (!isset($leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash])) {
  137.                     $leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash] = [
  138.                         'count' => 1,
  139.                         'name' => $name,
  140.                     ];
  141.                 } else {
  142.                     $leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash]['count']++;
  143.                 }
  144.             }
  145.             $leadsResult = [
  146.                 'count' => $monthCount,
  147.                 'countInCrm' => $monthInCrmCount,
  148.                 'today' => $todayCount,
  149.                 'todayInCrm' => $todayInCrmCount,
  150.                 'byDays' => $leads,
  151.                 'byTypes' => $leadsByType,
  152.             ];
  153. //TODO remove magic numbers rename to normal
  154.             $Tickets $this->getDoctrine()->getRepository(Ticket::class)->getByState([], [38], $Dealer);
  155.             $ticketsResult = [
  156.                 'total' => count($Tickets),
  157.                 'inProgress' => 0,
  158.                 'wait' => 0,
  159.                 'done' => 0,
  160.             ];
  161.             /** @var Ticket $ticket */
  162.             foreach ($Tickets as $ticket) {
  163.                 $state $ticket->getState();
  164.                 switch ($state) {
  165.                     case \CoreBundle\Model\Ticket::STATE_DOING:
  166.                     case \CoreBundle\Model\Ticket::STATE_STOP:
  167.                         $ticketsResult['inProgress']++;
  168.                         break;
  169.                     case \CoreBundle\Model\Ticket::STATE_WAIT:
  170.                         $ticketsResult['wait']++;
  171.                         break;
  172.                     case \CoreBundle\Model\Ticket::STATE_DONE:
  173.                         $ticketsResult['done']++;
  174.                         break;
  175.                 }
  176.             }
  177.         }
  178.         return new JsonResponse([
  179.             'leads' => $leadsResult,
  180.             'leadsByUtm' => $leadsByUtm,
  181.             'tickets' => $ticketsResult,
  182.         ]);
  183.     }
  184.     public function statistic(Request $request)
  185.     {
  186.         $result = [];
  187.         $em $this->container->get('doctrine.orm.entity_manager');
  188.         $forms $em->getRepository(Forms::class);
  189.         $dealers $em->getRepository(Dealer::class)->findAll();
  190.         $types = [];
  191.         foreach (FormManager::getFormTypeName(nulltrue) as $key => $type) {
  192.             $types[] = [
  193.                 'id' => $key,
  194.                 'name' => $type,
  195.             ];
  196.         }
  197.         if ($request->isXmlHttpRequest()) {
  198.             $date_start $request->get('date_start');
  199.             $date_end $request->get('date_end');
  200.             $dealer $request->get('dealer');
  201.             $type $request->get('type');
  202.             $formResult $forms->createQueryBuilder('f')
  203.                 ->select('COUNT(f.type) as counted, f.type as type')
  204.                 ->where('f.date_create BETWEEN :dateStart AND :dateEnd')
  205.                 ->setParameter('dateStart'date($date_start))
  206.                 ->setParameter('dateEnd'date($date_end));
  207.             if ($dealer !== 'vidi') {
  208.                 $formResult
  209.                     ->andWhere('f.dealer = :dealer')->setParameter('dealer'$dealer);
  210.             } else {
  211.                 $formResult->andWhere('f.domain = :domain')->setParameter('domain''vidi.ua');
  212.             }
  213.             if ($type !== 'all') {
  214.                 $formResult
  215.                     ->andWhere('f.type = :type')->setParameter('type'$type);
  216.             }
  217.             $formResult
  218.                 ->groupBy('f.type');
  219.             foreach ($formResult->getQuery()->getResult() as $item) {
  220.                 $result[] = [
  221.                     'form' => FormManager::getFormTypeName($item['type'], true),
  222.                     'count' => $item['counted'],
  223.                 ];
  224.             }
  225.             return new JsonResponse($result);
  226.         }
  227.         return $this->render(
  228.             '@Admin/admin/statistic.html.twig',
  229.             ['dealers' => $dealers'result' => $result'types' => $types]
  230.         );
  231.     }
  232.     public function changePassword(Request $request)
  233.     {
  234.         $result = [];
  235.         $em $this->container->get('doctrine.orm.entity_manager');
  236.         $forms $em->getRepository(Forms::class);
  237.         $dealers $em->getRepository(Dealer::class)->findAll();
  238.         $types = [];
  239.         foreach (FormManager::getFormTypeName(nulltrue) as $key => $type) {
  240.             $types[] = [
  241.                 'id' => $key,
  242.                 'name' => $type,
  243.             ];
  244.         }
  245.         if ($request->isXmlHttpRequest()) {
  246.             $date_start $request->get('date_start');
  247.             $date_end $request->get('date_end');
  248.             $dealer $request->get('dealer');
  249.             $type $request->get('type');
  250.             $formResult $forms->createQueryBuilder('f')
  251.                 ->select('COUNT(f.type) as counted, f.type as type')
  252.                 ->where('f.date_create BETWEEN :dateStart AND :dateEnd')
  253.                 ->setParameter('dateStart'date($date_start))
  254.                 ->setParameter('dateEnd'date($date_end));
  255.             if ($dealer !== 'vidi') {
  256.                 $formResult
  257.                     ->andWhere('f.dealer = :dealer')->setParameter('dealer'$dealer);
  258.             } else {
  259.                 $formResult->andWhere('f.domain = :domain')->setParameter('domain''vidi.ua');
  260.             }
  261.             if ($type !== 'all') {
  262.                 $formResult
  263.                     ->andWhere('f.type = :type')->setParameter('type'$type);
  264.             }
  265.             $formResult
  266.                 ->groupBy('f.type');
  267.             foreach ($formResult->getQuery()->getResult() as $item) {
  268.                 $result[] = [
  269.                     'form' => FormManager::getFormTypeName($item['type'], true),
  270.                     'count' => $item['counted'],
  271.                 ];
  272.             }
  273.             return new JsonResponse($result);
  274.         }
  275.         return $this->render(
  276.             '@Admin/admin/change-password.html.twig',
  277.             ['dealers' => $dealers'result' => $result'types' => $types]
  278.         );
  279.     }
  280.     public function savePassword(Request $request){
  281.         /**
  282.          * @var User $user
  283.          */
  284.         $user $this->getUser();
  285.         $em $this->container->get('doctrine.orm.entity_manager');
  286.         $newPassword $request->get('newPassword');
  287.         $password password_hash($newPasswordPASSWORD_BCRYPT, ['cost' => 13]);
  288.         $user->setEnabled(true);
  289.         $user->setPassword($password);
  290.         $em->persist($user);
  291.         $em->flush();
  292.         return new JsonResponse(['successMessage' => 'Ви успішно змінили пароль!']);
  293.     }
  294.     public function runMigration()
  295.     {
  296.         if (!defined('STDIN')) {
  297.             define('STDIN'fopen('php://stdin''r'));
  298.         }
  299.         if (!defined('STDOUT')) {
  300.             define('STDOUT'fopen('php://stdout''w'));
  301.         }
  302.         if (!defined('STDERR')) {
  303.             define('STDERR'fopen('php://stderr''w'));
  304.         }
  305.         $this->denyAccessUnlessGranted('ROLE_SUPER_ADMIN');
  306.         $application = new Application($this->get('kernel'));
  307.         $application->setAutoExit(false);
  308.         $input = new ArrayInput([
  309.             'command' => 'doctrine:migrations:migrate',
  310.             '--no-interaction' => true,
  311.         ]);
  312.         $output = new BufferedOutput();
  313.         $application->run($input$output);
  314.         $result $output->fetch();
  315.         $this->addFlash('sonata_flash_success''Команда успешно выполнена. Вывод: ' $result);
  316.         return $this->redirect($this->generateUrl('sonata_admin_dashboard'));
  317.     }
  318. }