<?php
namespace AdminBundle\Controller;
use DateTime;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use CoreBundle\Component\FormManager;
use CoreBundle\Entity\Forms;
use CoreBundle\Entity\Ticket;
use CoreBundle\Entity\User;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\VehicleEstimate;
use DcSiteBundle\Entity\OnlineServiceBooking;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
class DashboardController extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractController
{
public function init(Request $request)
{
/** @var User $User */
$User = $this->getUser();
$Dealer = $User->getDealer();
$leadsResult = null;
$ticketsResult = null;
$leadsByUtm = [];
$date = new DateTime();
if ($request->get('isPrev')) {
$date = $date->modify('-1 month');
}
if ($Dealer) {
$monthLeads = $this->getDoctrine()->getRepository(Forms::class)->getMonthForms($Dealer, $date);
$monthCount = count($monthLeads);
$monthInCrmCount = 0;
$todayCount = 0;
$todayInCrmCount = 0;
$leads = [];
$leadsByType = [];
/** @var Forms $lead */
foreach ($monthLeads as $lead) {
$type = $lead->getType();
if ($lead->getUtm()) {
$decodedUtm = json_decode($lead->getUtm());
if (!isset($leadsByUtm[$decodedUtm->utm_source])) {
$leadsByUtm[$decodedUtm->utm_source] = [];
}
if (!isset($leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium])) {
$leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium] = [];
}
$name = $decodedUtm->utm_campaign . ' / ' . $decodedUtm->utm_content;
$hash = md5($name);
if (!isset($leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash])) {
$leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash] = [
'count' => 1,
'name' => $name,
];
} else {
$leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash]['count']++;
}
}
if (!isset($leadsByType[$type])) {
$leadsByType[$type] = [
'type' => $type,
'title' => FormManager::getTypeName($type),
'count' => 0,
];
}
$leadsByType[$type]['count']++;
}
for ($i = 1; $i <= date('t'); $i++) {
$leads[$i] = [
'total' => 0,
'inCrm' => 0,
];
/** @var Forms $lead */
foreach ($monthLeads as $lead) {
$day = $lead->getDateCreate()->format('d');
if ((int)$day != $i) {
continue;
}
$leads[$i]['total']++;
if ($lead->getInCrm() && $lead->getCrmLeadId()) {
$monthInCrmCount++;
$leads[$i]['inCrm']++;
if ($day == date('t')) {
$todayInCrmCount++;
}
}
if ($day == date('t')) {
$todayCount++;
}
}
}
$oEst = $this->getDoctrine()->getRepository(VehicleEstimate::class)->getMonth($Dealer, $date);
/** @var VehicleEstimate $lead */
foreach ($oEst as $lead) {
if ($lead->getForm()) {
continue;
}
if ($lead->getUtm()) {
$decodedUtm = json_decode($lead->getUtm());
if (!isset($leadsByUtm[$decodedUtm->utm_source])) {
$leadsByUtm[$decodedUtm->utm_source] = [];
}
if (!isset($leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium])) {
$leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium] = [];
}
$name = $decodedUtm->utm_campaign . ' / ' . $decodedUtm->utm_content;
$hash = md5($name);
if (!isset($leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash])) {
$leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash] = [
'count' => 1,
'name' => $name,
];
} else {
$leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash]['count']++;
}
}
}
$oBooking =
$this->getDoctrine()->getRepository(OnlineServiceBooking::class)->getMonth($Dealer, $date);
/** @var OnlineServiceBooking $lead */
foreach ($oBooking as $lead) {
if (!$lead->getUtm()) {
continue;
}
$decodedUtm = json_decode($lead->getUtm());
if (!isset($leadsByUtm[$decodedUtm->utm_source])) {
$leadsByUtm[$decodedUtm->utm_source] = [];
}
if (!isset($leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium])) {
$leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium] = [];
}
$name = $decodedUtm->utm_campaign . ' / ' . $decodedUtm->utm_content;
$hash = md5($name);
if (!isset($leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash])) {
$leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash] = [
'count' => 1,
'name' => $name,
];
} else {
$leadsByUtm[$decodedUtm->utm_source][$decodedUtm->utm_medium][$hash]['count']++;
}
}
$leadsResult = [
'count' => $monthCount,
'countInCrm' => $monthInCrmCount,
'today' => $todayCount,
'todayInCrm' => $todayInCrmCount,
'byDays' => $leads,
'byTypes' => $leadsByType,
];
//TODO remove magic numbers rename to normal
$Tickets = $this->getDoctrine()->getRepository(Ticket::class)->getByState([], [3, 8], $Dealer);
$ticketsResult = [
'total' => count($Tickets),
'inProgress' => 0,
'wait' => 0,
'done' => 0,
];
/** @var Ticket $ticket */
foreach ($Tickets as $ticket) {
$state = $ticket->getState();
switch ($state) {
case \CoreBundle\Model\Ticket::STATE_DOING:
case \CoreBundle\Model\Ticket::STATE_STOP:
$ticketsResult['inProgress']++;
break;
case \CoreBundle\Model\Ticket::STATE_WAIT:
$ticketsResult['wait']++;
break;
case \CoreBundle\Model\Ticket::STATE_DONE:
$ticketsResult['done']++;
break;
}
}
}
return new JsonResponse([
'leads' => $leadsResult,
'leadsByUtm' => $leadsByUtm,
'tickets' => $ticketsResult,
]);
}
public function statistic(Request $request)
{
$result = [];
$em = $this->container->get('doctrine.orm.entity_manager');
$forms = $em->getRepository(Forms::class);
$dealers = $em->getRepository(Dealer::class)->findAll();
$types = [];
foreach (FormManager::getFormTypeName(null, true) as $key => $type) {
$types[] = [
'id' => $key,
'name' => $type,
];
}
if ($request->isXmlHttpRequest()) {
$date_start = $request->get('date_start');
$date_end = $request->get('date_end');
$dealer = $request->get('dealer');
$type = $request->get('type');
$formResult = $forms->createQueryBuilder('f')
->select('COUNT(f.type) as counted, f.type as type')
->where('f.date_create BETWEEN :dateStart AND :dateEnd')
->setParameter('dateStart', date($date_start))
->setParameter('dateEnd', date($date_end));
if ($dealer !== 'vidi') {
$formResult
->andWhere('f.dealer = :dealer')->setParameter('dealer', $dealer);
} else {
$formResult->andWhere('f.domain = :domain')->setParameter('domain', 'vidi.ua');
}
if ($type !== 'all') {
$formResult
->andWhere('f.type = :type')->setParameter('type', $type);
}
$formResult
->groupBy('f.type');
foreach ($formResult->getQuery()->getResult() as $item) {
$result[] = [
'form' => FormManager::getFormTypeName($item['type'], true),
'count' => $item['counted'],
];
}
return new JsonResponse($result);
}
return $this->render(
'@Admin/admin/statistic.html.twig',
['dealers' => $dealers, 'result' => $result, 'types' => $types]
);
}
public function changePassword(Request $request)
{
$result = [];
$em = $this->container->get('doctrine.orm.entity_manager');
$forms = $em->getRepository(Forms::class);
$dealers = $em->getRepository(Dealer::class)->findAll();
$types = [];
foreach (FormManager::getFormTypeName(null, true) as $key => $type) {
$types[] = [
'id' => $key,
'name' => $type,
];
}
if ($request->isXmlHttpRequest()) {
$date_start = $request->get('date_start');
$date_end = $request->get('date_end');
$dealer = $request->get('dealer');
$type = $request->get('type');
$formResult = $forms->createQueryBuilder('f')
->select('COUNT(f.type) as counted, f.type as type')
->where('f.date_create BETWEEN :dateStart AND :dateEnd')
->setParameter('dateStart', date($date_start))
->setParameter('dateEnd', date($date_end));
if ($dealer !== 'vidi') {
$formResult
->andWhere('f.dealer = :dealer')->setParameter('dealer', $dealer);
} else {
$formResult->andWhere('f.domain = :domain')->setParameter('domain', 'vidi.ua');
}
if ($type !== 'all') {
$formResult
->andWhere('f.type = :type')->setParameter('type', $type);
}
$formResult
->groupBy('f.type');
foreach ($formResult->getQuery()->getResult() as $item) {
$result[] = [
'form' => FormManager::getFormTypeName($item['type'], true),
'count' => $item['counted'],
];
}
return new JsonResponse($result);
}
return $this->render(
'@Admin/admin/change-password.html.twig',
['dealers' => $dealers, 'result' => $result, 'types' => $types]
);
}
public function savePassword(Request $request){
/**
* @var User $user
*/
$user = $this->getUser();
$em = $this->container->get('doctrine.orm.entity_manager');
$newPassword = $request->get('newPassword');
$password = password_hash($newPassword, PASSWORD_BCRYPT, ['cost' => 13]);
$user->setEnabled(true);
$user->setPassword($password);
$em->persist($user);
$em->flush();
return new JsonResponse(['successMessage' => 'Ви успішно змінили пароль!']);
}
public function runMigration()
{
if (!defined('STDIN')) {
define('STDIN', fopen('php://stdin', 'r'));
}
if (!defined('STDOUT')) {
define('STDOUT', fopen('php://stdout', 'w'));
}
if (!defined('STDERR')) {
define('STDERR', fopen('php://stderr', 'w'));
}
$this->denyAccessUnlessGranted('ROLE_SUPER_ADMIN');
$application = new Application($this->get('kernel'));
$application->setAutoExit(false);
$input = new ArrayInput([
'command' => 'doctrine:migrations:migrate',
'--no-interaction' => true,
]);
$output = new BufferedOutput();
$application->run($input, $output);
$result = $output->fetch();
$this->addFlash('sonata_flash_success', 'Команда успешно выполнена. Вывод: ' . $result);
return $this->redirect($this->generateUrl('sonata_admin_dashboard'));
}
}