<?php
namespace App\AppBundle\Controller;
use App\AppBundle\Entity\LoginLog;
use App\AppBundle\Entity\MacroDealer;
use App\AppBundle\Entity\MvMycmMyamsCustomer;
use App\AppBundle\Entity\User;
use App\AppBundle\Other\Constants;
use App\AppBundle\Repository\CurrencyRepository;
use Doctrine\Common\Collections\ArrayCollection;
use App\AppBundle\Repository\CountryRepository;
use App\AppBundle\Repository\WarehouseRepository;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Configuration\ConfigManager;
use Psr\Log\LoggerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Finder\Exception\AccessDeniedException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class DefaultController extends AbstractController {
const DOP = "DOP";
const THIRD_PARTS = "3rdParts";
const EUR_CURRENCY_CODE = 200;
public function __construct(
private ConfigManager $configManager,
private TranslatorInterface $translator,
private ParameterBagInterface $parameterBag
) {
}
protected static function getMacroDealerGroups() {
return array(
self::DOP => User::DOP,
self::THIRD_PARTS => User::THIRD_PARTS
);
}
/**
* @Route("/", name="homepage")
*/
public function indexAction(Request $request) {
/** @var User $user */
$user = $this->getUser();
if(!$user->getIsActive())
return new RedirectResponse("/not-active");
$authChceker = $this->container->get('security.authorization_checker');
/** @var User $user */
$user = $this->getUser();
if($authChceker->isGranted('ROLE_GRANT_DASHBOARD')) {
if (!$user->getDefaultUrl()) {
$menu = $this->configManager->getBackendConfig('design')['menu'];
$user->setDefaultUrl($menu);
}
$url = $user->getDefaultUrl();
} elseif($authChceker->isGranted('ROLE_GRANT_USERS')) {
$url = '/admin/?action=list&entity=User';
}
$response = new RedirectResponse($url);
return $response;
}
/**
* @Route("/switch-version", name="switch_version")
*/
public function switchVersion(Request $request) {
$version = $request->get('v');
/** @var User $user */
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$user->setSwitchToOld($version);
$authChceker = $this->get('security.authorization_checker');
if($authChceker->isGranted('ROLE_GRANT_DASHBOARD')) {
$loginLog = new LoginLog();
if (!$user->getDefaultUrl()) {
$menu = $this->configManager->getBackendConfig('design')['menu'];
$user->setDefaultUrl($menu);
}
$url = $user->getDefaultUrl();
if(!$version) {
$user->setLastLoginMyAms(new \DateTime());
$user->setNumberOfLoginsMyAms($user->getNumberOfLoginsMyAms() + 1);
$loginLog->setPortal(Constants::PORTAL["MYI/AB"]);
$newRole = $user->getRolesMyAms();
} else {
$user->setLastLogin(new \DateTime());
$user->setNumberOfLogins($user->getNumberOfLogins() + 1);
$loginLog->setPortal(Constants::PORTAL["I/ASOD"]);
$newRole = $user->getRolesIsod();
}
$loginLog->setUser($user);
$em->persist($loginLog);
} else {
throw new AccessDeniedException("Postal switching failed!");
}
$response = new RedirectResponse($url);
$em->persist($user);
$em->flush();
// Create an token for target role
$token = new UsernamePasswordToken($user, null, 'main', $newRole);
$this->get('security.token_storage')->setToken($token);
return $response;
}
/**
* @Route("/download-manual", name="download_manual")
*/
public function downloadManual(Request $request) {
$language = $request->get('lang');
$environment = $this->getParameter("environment");
$filename = "User_Manual_MyAMSBusiness_$language.pdf";
$path = $this->getParameter('kernel.project_dir') . "/public/downloads/$environment/";
if (file_exists($path . $filename)) {
$content = file_get_contents($path . $filename);
$response = new Response();
$response->headers->set('Content-Type', 'mime/type');
$response->headers->set('Content-Disposition', 'attachment;filename="' . $filename);
$response->setContent($content);
} else {
$translator = $this->translator;
$message = $translator->trans('app.file.error.not.found');
$response = new Response('', Response::HTTP_NOT_FOUND, ['content-type' => 'application/json']);
$response->setContent(json_encode(['data' => $message]));
}
return $response;
}
/**
* @Route("/user/selectedCountry", name="selectedCountry")
*/
public function selectedCountry(Request $request) {
$id = $request->get('id');
/** @var CountryRepository $countryRepo */
$countryRepo = $this->getDoctrine()->getRepository('AppBundle:Country');
$country = $countryRepo->findOneById($id);
/** @var User $user */
$user = $this->getUser();
$user->setSelectedCountry($country);
if (in_array($user->getPrettyRole(), [User::ROLE_PSM, User::ROLE_DP, User::ROLE_DEALER])) {
/** @var ArrayCollection $userMacrodealersByCountrySelected */
$userMacrodealersByCountrySelected = $this->getAllowedMacroDealers($user);
if ($userMacrodealersByCountrySelected->count() == 1) {
$user->setSelectedMacroDealer($userMacrodealersByCountrySelected->first());
} else {
$user->setSelectedMacroDealer(null);
}
} else {
$user->setSelectedMacroDealer(null);
}
$user->setSelectedWarehouses(null);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
$this->get('session')->set('sameCountry', 0);
return new JsonResponse(array('success' => true, 'id' => $id));
}
/**
* @Route("/user/selectedBrand", name="selectedBrand")
*/
public function selectedBrand(Request $request) {
$brands = $request->get('ids');
/** @var User $user */
$user = $this->getUser();
$user->setSelectedBrands(implode(',', $brands));
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return new JsonResponse(array('success' => true, 'ids' => $brands));
}
private function getAllowedMacroDealers(User $user) {
$country = $user->getSelectedCountry();
return $user->getMacroDealers()->filter(
function ($entry) use ($country) {
return $entry->getCountry() == $country;
}
);
}
/**
* @Route("/user/selectedMacroDealer", name="selectedMacroDealer")
*/
public function selectedMacroDealer(Request $request) {
$id = $request->get('id');
/** @var WarehouseRepository $macroDealerRepo */
$macroDealerRepo = $this->getDoctrine()->getRepository('AppBundle:MacroDealer');
/** @var MacroDealer $macroDealer */
$macroDealer = null;
$macroDealerGroup = null;
if (!is_null($id)) {
if (is_numeric($id)) {
$macroDealer = $macroDealerRepo->find($id);
} elseif (in_array($id, array_keys(self::getMacroDealerGroups()))) {
$macroDealerGroup = self::getMacroDealerGroups()[$id];
}
}
/** @var User $user */
$user = $this->getUser();
$user->setSelectedMacroDealer($macroDealer);
$user->setSelectedCountry($macroDealer ? $macroDealer->getCountry() : $user->getSelectedCountry());
$user->setSelectedWarehouses(null);
$user->setSelectedMacroDealerGroup($macroDealerGroup);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return new JsonResponse(array('success' => true, 'id' => $id));
}
/**
* @Route("/user/selectedWarehouse", name="selectedWarehouse")
*/
public function selectedWarehouse(Request $request) {
$id = $request->get('id');
/** @var WarehouseRepository $warehousesRepo */
$warehousesRepo = $this->getDoctrine()->getRepository('AppBundle:Warehouse');
$warehouse = $warehousesRepo->find($id);
/** @var User $user */
$user = $this->getUser();
$user->setSelectedWarehouses($warehouse);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return new JsonResponse(array('success' => true, 'id' => $id));
}
/**
* @Route("/checkStatus", name="checkIsodStatus")
*/
public function checkStatus() {
return new Response("Ok");
}
/**
* @Route("/user/selectedCurrency", name="selectedCurrency")
*/
public function selectedCurrency(Request $request) {
$code = $request->request->get('value');
$response = array();
/** @var CurrencyRepository $warehousesRepo */
$currencyRepo = $this->getDoctrine()->getRepository('AppBundle:Currency');
$currency = $currencyRepo->findOneBy(array(
"code" => $code,
"dateYear" => date("Y")
));
//check if exist currency rate
if (is_null($currency)) {
$response["status"] = "error";
$response["type"] = "unknown_rate";
} else {
/** @var User $user */
$user = $this->getUser();
$user->setSelectedCurrencyCode($code);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
$response["status"] = "success";
}
/* flag the fact that we are in the same country */
$this->get('session')->set('sameCountry', 1);
return new JsonResponse($response);
}
/**
* @Route("/user/getWarehousesByMacroDealer/{id}", name="getWarehousesByMacroDealer")
*/
public function getAvaliableWarehousesByMacrodealer(Request $request, $id) {
/** @var WarehouseRepository $warehousesRepo */
$warehousesRepo = $this->getDoctrine()->getRepository('AppBundle:Warehouse');
$result = array();
foreach ($warehousesRepo->getMacroDealerWharehousesById($id) as $autocompleteItem) {
$result[] = array(
'id' => (int)$autocompleteItem->getId(),
'text' => $autocompleteItem->getWhId() . ' - ' . $autocompleteItem->getDescription()
);
}
return new JsonResponse($result);
}
/**
* @Route("/user/getAvailableWarehouse/{macrodealers}", name="getAvailableWarehouse")
*/
public function getAvailableWarehouse(Request $request, $macrodealers) {
$macrodealersId = json_decode($macrodealers);
/** @var WarehouseRepository $warehousesRepo */
$warehousesRepo = $this->getDoctrine()->getRepository('AppBundle:Warehouse');
$result = array();
foreach ($warehousesRepo->getWarehousesInMacrodealers($macrodealersId) as $autocompleteItem) {
$result[] = array(
'id' => (int)$autocompleteItem->getId(),
'text' => $autocompleteItem->getWhId() . ' - ' . $autocompleteItem->getDescription()
);
}
return new JsonResponse($result);
}
/**
* @Route("/user/getAvailableDealership/{dealerGroups}", name="getAvailableDealership")
*/
public function getAvailableDealership(Request $request, $dealerGroups) {
$dealerGroupId = json_decode($dealerGroups);
/** @var MvMycmMyamsCustomerRepository $mvMycmMyamsCustomerRepo */
$mvMycmMyamsCustomerRepo = $this->getDoctrine()->getRepository(MvMycmMyamsCustomer::class);
$result = array();
foreach ($mvMycmMyamsCustomerRepo->getFilteredDealership($dealerGroupId) as $autocompleteItem) {
$result[] = array(
'id' => (string)$autocompleteItem['cdCustomerFull'],
'text' => $autocompleteItem['cdCustomerFull']
. ' - ' . $autocompleteItem['dsCustomer']
. (isset($autocompleteItem['cdCommercialBrand']) ? " (" . $autocompleteItem['cdCommercialBrand'] . ")" : "")
);
}
return new JsonResponse($result);
}
/**
* @Route("/user/getAvaliableMacrodealers/{macrodealer}", name="getAvaliableMacrodealers")
*/
public function getAvaliableMacrodealers(Request $request, $macrodealer) {
$macrodealerId = json_decode($macrodealer);
/** @var MacroDealerRepository $repo */
$repo = $this->getDoctrine()->getRepository(MacroDealer::class);
$macrodealer = $repo->find($macrodealerId);
$result = array();
foreach ($repo->findByCountry($macrodealer->getCountry()) as $autocompleteItem) {
$result[] = array(
'id' => (int)$autocompleteItem->getId(),
'text' => $autocompleteItem->__toString()
);
}
return new JsonResponse($result);
}
/**
* @Route("/user/getAllMacrodealers", name="getAllMacrodealers")
*/
public function getAllMacrodealers(Request $request) {
/** @var WarehouseRepository $warehousesRepo */
$repo = $this->getDoctrine()->getRepository('AppBundle:MacroDealer');
$result = array();
foreach ($repo->findAll() as $autocompleteItem) {
$result[] = array(
'id' => (int)$autocompleteItem->getId(),
'text' => $autocompleteItem->__toString()
);
}
return new JsonResponse($result);
}
/**
* @Route("/testdevexpress", name="testdevexpress")
*/
public function testDevExpress() {
return $this->render(
'@App/testDevExpress.html.twig',
array()
);
}
/**
* @Route("/testwebix", name="testwebix")
*/
public function testwebix() {
return $this->render(
'@App/testWebix.html.twig',
array()
);
}
/**
* @Route("/getAllTest", name="getAll")
*/
public function getAllTest() {
$fp = fopen(__DIR__ . '/../Resources/public/testdata.json', 'r');
die(fgets($fp));
}
/**
* @Route("/administration/dmsCostomerCode", name="dmsSection")
*/
public function dsmSection() {
return $this->render(
'@App/admin/dmsSection.html.twig', [
'page_title' => 'app.administration.dmsCustomerCode'
]
);
}
/**
* @Route("/selloutCustomPages/{type}", name="selloutCustomPages")
*/
public function selloutCustomPages($type) {
$user = $this->container->get('security.token_storage')->getToken()->getUser();
if (!$user->getAccessToNew()) {
throw $this->createAccessDeniedException();
} else {
$url = '/admin/?action=list&entity=' . $type;
$response = new RedirectResponse($url);
return $response;
}
}
/**
* @Route("/import/{type}", name="import")
*/
public function import($type) {
$user = $this->container->get('security.token_storage')->getToken()->getUser();
if (!$user->getAccessToNew()) {
throw $this->createAccessDeniedException();
}
return $this->render(
"@App/admin/import/$type.html.twig",
array()
);
}
/**
* @Route("/administration/profileManagement", name="profileManagement")
*/
public function profileManagement() {
/** @var User $user */
$user = $this->getUser();
return new RedirectResponse($this->generateUrl(
"easyadmin",
array(
'entity' => 'UserSettings',
'action' => 'edit',
'id' => $user->getId()
)
));
}
/**
* @Route("/logout-to-iveco", name="logout_to_iveco")
*
*/
public function logoutToIveco() {
$dealerPortal = $this->getParameter("dealer_portal");
return $this->redirect("https://$dealerPortal/");
}
/**
* @Route("/not-active", name="not_active")
*/
public function userNotActiveAction(Request $request) {
$content = $this->render('@App/security/user-message.html.twig', array(
'title' => 'app.user.notProfiled.message',
'emailToContact' => $this->getParameter("profiler_email")
));
return new Response($content);
}
/**
* @Route("/error", name="error")
*/
public function errorAction(Request $request) {
$content = $this->render('@App/security/user-message.html.twig', array(
'title' => 'app.error.message',
'emailToContact' => $this->getParameter("profiler_email")
));
return new Response($content);
}
}