vendor/uvdesk/core-framework/Controller/Account.php line 58

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\CoreFrameworkBundle\Controller;
  3. use Symfony\Component\HttpFoundation\Request;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Webkul\UVDesk\CoreFrameworkBundle\Entity\User;
  6. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Recaptcha;
  7. use Symfony\Component\EventDispatcher\GenericEvent;
  8. use Webkul\UVDesk\CoreFrameworkBundle\Form\UserAccount;
  9. use Webkul\UVDesk\CoreFrameworkBundle\Form\UserProfile;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Webkul\UVDesk\CoreFrameworkBundle\Entity\UserInstance;
  12. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportRole;
  13. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportTeam;
  14. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportGroup;
  15. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportPrivilege;
  16. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  17. use Webkul\UVDesk\CoreFrameworkBundle\Workflow\Events as CoreWorkflowEvents;
  18. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  19. use Webkul\UVDesk\CoreFrameworkBundle\Services\UserService;
  20. use Webkul\UVDesk\CoreFrameworkBundle\Services\UVDeskService;
  21. use Webkul\UVDesk\CoreFrameworkBundle\Services\FileUploadService;
  22. use Webkul\UVDesk\CoreFrameworkBundle\FileSystem\FileSystem;
  23. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. use Symfony\Component\Filesystem\Filesystem as Fileservice;
  26. class Account extends AbstractController
  27. {
  28. private $userService;
  29. private $authenticationUtils;
  30. private $eventDispatcher;
  31. private $translator;
  32. private $passwordEncoder;
  33. private $uvdeskService;
  34. private $fileSystem;
  35. private $fileUploadService;
  36. public function __construct(UserService $userService, EventDispatcherInterface $eventDispatcher, TranslatorInterface $translator, UserPasswordEncoderInterface $passwordEncoder, UVDeskService $uvdeskService, FileSystem $fileSystem, FileUploadService $fileUploadService)
  37. {
  38. $this->userService = $userService;
  39. $this->eventDispatcher = $eventDispatcher;
  40. $this->translator = $translator;
  41. $this->passwordEncoder = $passwordEncoder;
  42. $this->uvdeskService = $uvdeskService;
  43. $this->fileSystem = $fileSystem;
  44. $this->fileUploadService = $fileUploadService;
  45. }
  46. private function encodePassword(User $user, $plainPassword)
  47. {
  48. $encodedPassword = $this->passwordEncoder->encodePassword($user, $plainPassword);
  49. }
  50. public function loadDashboard(Request $request)
  51. {
  52. return $this->render('@UVDeskCoreFramework//dashboard.html.twig', []);
  53. }
  54. public function listAgents(Request $request)
  55. {
  56. if (!$this->userService->isAccessAuthorized('ROLE_AGENT_MANAGE_AGENT')){
  57. return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  58. }
  59. return $this->render('@UVDeskCoreFramework/Agents/listSupportAgents.html.twig');
  60. }
  61. public function loadProfile(Request $request)
  62. {
  63. // @TODO: Refactor
  64. $em = $this->getDoctrine()->getManager();
  65. $user = $this->getUser();
  66. $originalUser = clone $user;
  67. $errors = [];
  68. $dataFiles = $request->files->get('user_form');
  69. if ($request->getMethod() == "POST") {
  70. $data = $request->request->all();
  71. $dataFiles = $request->files->get('user_form');
  72. // Profile upload validation
  73. $validMimeType = ['image/jpeg', 'image/png', 'image/jpg'];
  74. if(isset($dataFiles['profileImage'])){
  75. if(!in_array($dataFiles['profileImage']->getMimeType(), $validMimeType)){
  76. $this->addFlash('warning', $this->translator->trans('Error ! Profile image is not valid, please upload a valid format'));
  77. return $this->redirect($this->generateUrl('helpdesk_member_profile'));
  78. }
  79. }
  80. $data = $data['user_form'];
  81. $checkUser = $em->getRepository(User::class)->findOneBy(array('email' => $data['email']));
  82. $errorFlag = 0;
  83. if ($checkUser) {
  84. if($checkUser->getId() != $user->getId())
  85. $errorFlag = 1;
  86. }
  87. if (!$errorFlag) {
  88. $password = $user->getPassword();
  89. $form = $this->createForm(UserProfile::class, $user);
  90. $form->handleRequest($request);
  91. $form->submit($data);
  92. if ($form->isValid()) {
  93. if ($data != null) {
  94. $submittedPassword = $data['password']['first'];
  95. $encoder = $this->passwordEncoder;
  96. // save previous password if password is blank or null provided
  97. $encodedPassword = empty($submittedPassword) ? $password : $encoder->encodePassword($user, $submittedPassword);
  98. if (!empty($encodedPassword) ) {
  99. $user->setPassword($encodedPassword);
  100. } else {
  101. $this->addFlash('warning', $this->translator->trans('Error! Given current password is incorrect.'));
  102. return $this->redirect($this->generateUrl('helpdesk_member_profile'));
  103. }
  104. }
  105. $user->setFirstName($data['firstName']);
  106. $user->setLastName($data['lastName']);
  107. $user->setEmail($data['email']);
  108. $user->setTimezone($data['timezone']);
  109. $user->setTimeformat($data['timeformat']);
  110. $em->persist($user);
  111. $em->flush();
  112. $userInstance = $em->getRepository(UserInstance::class)->findOneBy(array('user' => $user->getId()));
  113. $userInstance = $this->userService->getUserDetailById($user->getId());
  114. if (isset($dataFiles['profileImage'])) {
  115. $previousImage = $userInstance->getProfileImagePath();
  116. if($previousImage != null){
  117. $image = str_replace("\\","/",$this->getParameter('kernel.project_dir').'/public'.$previousImage);
  118. $check = $this->fileUploadService->fileRemoveFromFolder($image);
  119. }
  120. $assetDetails = $this->fileSystem->getUploadManager()->uploadFile($dataFiles['profileImage'], 'profile');
  121. $userInstance->setProfileImagePath($assetDetails['path']);
  122. }
  123. // Removed profile image from database and path
  124. $fileService = new Fileservice;
  125. if ($request->get('removeImage') == 'on') {
  126. if ($userInstance->getProfileImagePath()) {
  127. $fileService->remove($this->getParameter('kernel.project_dir').'/public'.$userInstance->getProfileImagePath());
  128. }
  129. $userInstance = $userInstance->setProfileImagePath(null);
  130. }
  131. $userInstance = $userInstance->setContactNumber($data['contactNumber']);
  132. $userInstance = $userInstance->setSignature($data['signature']);
  133. $em->persist($userInstance);
  134. $em->flush();
  135. $roleId = $user->getAgentInstance()->getSupportRole()->getId();
  136. if(in_array($roleId, [1,2])) {
  137. // Recaptcha Setting
  138. $recaptchaSetting = $em->getRepository(Recaptcha::class)->findOneBy(['id' => 1]);
  139. if($recaptchaSetting) {
  140. $recaptchaSetting->setSiteKey($data['recaptcha_site_key']);
  141. $recaptchaSetting->setSecretKey($data['recaptcha_secret_key']);
  142. if(isset($data['recaptcha_status'])) {
  143. $recaptchaSetting->setIsActive(true);
  144. } else {
  145. $recaptchaSetting->setIsActive(false);
  146. }
  147. $em->persist($recaptchaSetting);
  148. $em->flush();
  149. } else {
  150. $recaptchaNew = new Recaptcha;
  151. $recaptchaNew->setSiteKey($data['recaptcha_site_key']);
  152. $recaptchaNew->setSecretKey($data['recaptcha_secret_key']);
  153. if(isset($data['recaptcha_status'])) {
  154. $recaptchaNew->setIsActive(true);
  155. } else {
  156. $recaptchaNew->setIsActive(false);
  157. }
  158. $em->persist($recaptchaNew);
  159. $em->flush();
  160. }
  161. }
  162. $this->addFlash('success', $this->translator->trans('Success ! Profile update successfully.'));
  163. return $this->redirect($this->generateUrl('helpdesk_member_profile'));
  164. } else {
  165. $errors = $form->getErrors();
  166. dump($errors);
  167. die;
  168. $errors = $this->getFormErrors($form);
  169. }
  170. } else {
  171. $this->addFlash('warning', $this->translator->trans('Error ! User with same email is already exist.'));
  172. return $this->redirect($this->generateUrl('helpdesk_member_profile'));
  173. }
  174. }
  175. return $this->render('@UVDeskCoreFramework//profile.html.twig', array(
  176. 'user' => $user,
  177. 'errors' => json_encode($errors)
  178. ));
  179. }
  180. public function editAgent($agentId)
  181. {
  182. if (!$this->userService->isAccessAuthorized('ROLE_AGENT_MANAGE_AGENT')) {
  183. return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  184. }
  185. // @TODO: Refactor
  186. $em = $this->getDoctrine()->getManager();
  187. $request = $this->container->get('request_stack')->getCurrentRequest();
  188. $activeUser = $this->userService->getSessionUser();
  189. $user = $em->getRepository(User::class)->find($agentId);
  190. $instanceRole = $user->getAgentInstance()->getSupportRole()->getCode();
  191. if (empty($user)) {
  192. dump('Not found');die;
  193. }
  194. switch (strtoupper($request->getMethod())) {
  195. case 'POST':
  196. $formErrors = [];
  197. $data = $request->request->get('user_form');
  198. $dataFiles = $request->files->get('user_form');
  199. // Agent Profile upload validation
  200. $validMimeType = ['image/jpeg', 'image/png', 'image/jpg'];
  201. if(isset($dataFiles['profileImage'])){
  202. if(!in_array($dataFiles['profileImage']->getMimeType(), $validMimeType)){
  203. $this->addFlash('warning', $this->translator->trans('Error ! Profile image is not valid, please upload a valid format'));
  204. $response = $this->render('@UVDeskCoreFramework/Agents/updateSupportAgent.html.twig', [
  205. 'user' => $user,
  206. 'instanceRole' => $instanceRole,
  207. 'errors' => json_encode([])
  208. ]);
  209. break;
  210. }
  211. }
  212. $checkUser = $em->getRepository(User::class)->findOneBy(array('email'=> $data['email']));
  213. $errorFlag = 0;
  214. if ($checkUser && $checkUser->getId() != $agentId) {
  215. $errorFlag = 1;
  216. }
  217. if (!$errorFlag) {
  218. if (
  219. isset($data['password']['first']) && !empty(trim($data['password']['first']))
  220. && isset($data['password']['second']) && !empty(trim($data['password']['second']))
  221. && trim($data['password']['first']) == trim($data['password']['second'])) {
  222. $encodedPassword = $this->passwordEncoder->encodePassword($user, $data['password']['first']);
  223. $user->setPassword($encodedPassword);
  224. }
  225. $user->setFirstName($data['firstName']);
  226. $user->setLastName($data['lastName']);
  227. $user->setEmail($data['email']);
  228. $user->setIsEnabled(true);
  229. $userInstance = $em->getRepository(UserInstance::class)->findOneBy(array('user' => $agentId, 'supportRole' => array(1, 2, 3)));
  230. $oldSupportTeam = ($supportTeamList = $userInstance != null ? $userInstance->getSupportTeams() : null) ? $supportTeamList->toArray() : [];
  231. $oldSupportGroup = ($supportGroupList = $userInstance != null ? $userInstance->getSupportGroups() : null) ? $supportGroupList->toArray() : [];
  232. $oldSupportedPrivilege = ($supportPrivilegeList = $userInstance != null ? $userInstance->getSupportPrivileges() : null)? $supportPrivilegeList->toArray() : [];
  233. if(isset($data['role'])) {
  234. $role = $em->getRepository(SupportRole::class)->findOneBy(array('code' => $data['role']));
  235. $userInstance->setSupportRole($role);
  236. }
  237. if (isset($data['ticketView'])) {
  238. $userInstance->setTicketAccessLevel($data['ticketView']);
  239. }
  240. $userInstance->setDesignation($data['designation']);
  241. $userInstance->setContactNumber($data['contactNumber']);
  242. $userInstance->setSource('website');
  243. if (isset($dataFiles['profileImage'])) {
  244. // Removed profile image from database and path
  245. $fileService = new Fileservice;
  246. if ($userInstance->getProfileImagePath()) {
  247. $fileService->remove($this->getParameter('kernel.project_dir').'/public'.$userInstance->getProfileImagePath());
  248. }
  249. $assetDetails = $this->fileSystem->getUploadManager()->uploadFile($dataFiles['profileImage'], 'profile');
  250. $userInstance->setProfileImagePath($assetDetails['path']);
  251. }
  252. $userInstance->setSignature($data['signature']);
  253. $userInstance->setIsActive(isset($data['isActive']) ? $data['isActive'] : 0);
  254. if(isset($data['userSubGroup'])){
  255. foreach ($data['userSubGroup'] as $userSubGroup) {
  256. if($userSubGrp = $this->uvdeskService->getEntityManagerResult(
  257. SupportTeam::class,
  258. 'findOneBy', [
  259. 'id' => $userSubGroup
  260. ]
  261. )
  262. )
  263. if(!$oldSupportTeam || !in_array($userSubGrp, $oldSupportTeam)){
  264. $userInstance->addSupportTeam($userSubGrp);
  265. }elseif($oldSupportTeam && ($key = array_search($userSubGrp, $oldSupportTeam)) !== false)
  266. unset($oldSupportTeam[$key]);
  267. }
  268. foreach ($oldSupportTeam as $removeteam) {
  269. $userInstance->removeSupportTeam($removeteam);
  270. $em->persist($userInstance);
  271. }
  272. }
  273. if(isset($data['groups'])){
  274. foreach ($data['groups'] as $userGroup) {
  275. if($userGrp = $this->uvdeskService->getEntityManagerResult(
  276. SupportGroup::class,
  277. 'findOneBy', [
  278. 'id' => $userGroup
  279. ]
  280. )
  281. )
  282. if(!$oldSupportGroup || !in_array($userGrp, $oldSupportGroup)){
  283. $userInstance->addSupportGroup($userGrp);
  284. }elseif($oldSupportGroup && ($key = array_search($userGrp, $oldSupportGroup)) !== false)
  285. unset($oldSupportGroup[$key]);
  286. }
  287. foreach ($oldSupportGroup as $removeGroup) {
  288. $userInstance->removeSupportGroup($removeGroup);
  289. $em->persist($userInstance);
  290. }
  291. }
  292. if(isset($data['agentPrivilege'])){
  293. foreach ($data['agentPrivilege'] as $supportPrivilege) {
  294. if($supportPlg = $this->uvdeskService->getEntityManagerResult(
  295. SupportPrivilege::class,
  296. 'findOneBy', [
  297. 'id' => $supportPrivilege
  298. ]
  299. )
  300. )
  301. if(!$oldSupportedPrivilege || !in_array($supportPlg, $oldSupportedPrivilege)){
  302. $userInstance->addSupportPrivilege($supportPlg);
  303. }elseif($oldSupportedPrivilege && ($key = array_search($supportPlg, $oldSupportedPrivilege)) !== false)
  304. unset($oldSupportedPrivilege[$key]);
  305. }
  306. foreach ($oldSupportedPrivilege as $removeGroup) {
  307. $userInstance->removeSupportPrivilege($removeGroup);
  308. $em->persist($userInstance);
  309. }
  310. }
  311. $userInstance->setUser($user);
  312. $user->addUserInstance($userInstance);
  313. $em->persist($user);
  314. $em->persist($userInstance);
  315. $em->flush();
  316. // Trigger customer Update event
  317. $event = new CoreWorkflowEvents\Agent\Update();
  318. $event
  319. ->setUser($user)
  320. ;
  321. $this->eventDispatcher->dispatch($event, 'uvdesk.automation.workflow.execute');
  322. $this->addFlash('success', $this->translator->trans('Success ! Agent updated successfully.'));
  323. return $this->redirect($this->generateUrl('helpdesk_member_account_collection'));
  324. } else {
  325. $this->addFlash('warning', $this->translator->trans('Error ! User with same email is already exist.'));
  326. }
  327. $response = $this->render('@UVDeskCoreFramework/Agents/updateSupportAgent.html.twig', [
  328. 'user' => $user,
  329. 'instanceRole' => $instanceRole,
  330. 'errors' => json_encode([])
  331. ]);
  332. break;
  333. default:
  334. $response = $this->render('@UVDeskCoreFramework/Agents/updateSupportAgent.html.twig', [
  335. 'user' => $user,
  336. 'instanceRole' => $instanceRole,
  337. 'errors' => json_encode([])
  338. ]);
  339. break;
  340. }
  341. return $response;
  342. }
  343. public function createAgent(Request $request)
  344. {
  345. // @TODO: Refactor
  346. if(!$this->userService->isAccessAuthorized('ROLE_AGENT_MANAGE_AGENT')){
  347. return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  348. }
  349. $user = new User();
  350. $userServiceContainer = $this->userService;
  351. if ('POST' == $request->getMethod()) {
  352. $formDetails = $request->request->get('user_form');
  353. $uploadedFiles = $request->files->get('user_form');
  354. $entityManager = $this->getDoctrine()->getManager();
  355. // Profile upload validation
  356. $validMimeType = ['image/jpeg', 'image/png', 'image/jpg'];
  357. if(isset($uploadedFiles['profileImage'])){
  358. if(!in_array($uploadedFiles['profileImage']->getMimeType(), $validMimeType)){
  359. $this->addFlash('warning', $this->translator->trans('Error ! Profile image is not valid, please upload a valid format'));
  360. return $this->redirect($this->generateUrl('helpdesk_member_create_account'));
  361. }
  362. }
  363. $user = $entityManager->getRepository(User::class)->findOneByEmail($formDetails['email']);
  364. $agentInstance = !empty($user) ? $user->getAgentInstance() : null;
  365. if (empty($agentInstance)) {
  366. if (!empty($formDetails)) {
  367. $fullname = trim(implode(' ', [$formDetails['firstName'], $formDetails['lastName']]));
  368. $supportRole = $entityManager->getRepository(SupportRole::class)->findOneByCode($formDetails['role']);
  369. $user = $this->userService->createUserInstance($formDetails['email'], $fullname, $supportRole, [
  370. 'contact' => $formDetails['contactNumber'],
  371. 'source' => 'website',
  372. 'active' => !empty($formDetails['isActive']) ? true : false,
  373. 'image' => $uploadedFiles['profileImage'],
  374. 'signature' => $formDetails['signature'],
  375. 'designation' => $formDetails['designation'],
  376. ]);
  377. if(!empty($user)){
  378. $user->setIsEnabled(true);
  379. $entityManager->persist($user);
  380. $entityManager->flush();
  381. }
  382. $userInstance = $user->getAgentInstance();
  383. if (isset($formDetails['ticketView'])) {
  384. $userInstance->setTicketAccessLevel($formDetails['ticketView']);
  385. }
  386. // Map support team
  387. if (!empty($formDetails['userSubGroup'])) {
  388. $supportTeamRepository = $entityManager->getRepository(SupportTeam::class);
  389. foreach ($formDetails['userSubGroup'] as $supportTeamId) {
  390. $supportTeam = $supportTeamRepository->findOneById($supportTeamId);
  391. if (!empty($supportTeam)) {
  392. $userInstance->addSupportTeam($supportTeam);
  393. }
  394. }
  395. }
  396. // Map support group
  397. if (!empty($formDetails['groups'])) {
  398. $supportGroupRepository = $entityManager->getRepository(SupportGroup::class);
  399. foreach ($formDetails['groups'] as $supportGroupId) {
  400. $supportGroup = $supportGroupRepository->findOneById($supportGroupId);
  401. if (!empty($supportGroup)) {
  402. $userInstance->addSupportGroup($supportGroup);
  403. }
  404. }
  405. }
  406. // Map support privileges
  407. if (!empty($formDetails['agentPrivilege'])) {
  408. $supportPrivilegeRepository = $entityManager->getRepository(SupportPrivilege::class);
  409. foreach($formDetails['agentPrivilege'] as $supportPrivilegeId) {
  410. $supportPrivilege = $supportPrivilegeRepository->findOneById($supportPrivilegeId);
  411. if (!empty($supportPrivilege)) {
  412. $userInstance->addSupportPrivilege($supportPrivilege);
  413. }
  414. }
  415. }
  416. $entityManager->persist($userInstance);
  417. $entityManager->flush();
  418. $this->addFlash('success', $this->translator->trans('Success ! Agent added successfully.'));
  419. return $this->redirect($this->generateUrl('helpdesk_member_account_collection'));
  420. }
  421. } else {
  422. $this->addFlash('warning', $this->translator->trans('Error ! User with same email already exist.'));
  423. }
  424. }
  425. return $this->render('@UVDeskCoreFramework/Agents/createSupportAgent.html.twig', [
  426. 'user' => $user,
  427. 'errors' => json_encode([])
  428. ]);
  429. }
  430. }