vendor/uvdesk/core-framework/Controller/Customer.php line 103

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\CoreFrameworkBundle\Controller;
  3. use Webkul\UVDesk\CoreFrameworkBundle\Entity\User;
  4. use Webkul\UVDesk\CoreFrameworkBundle\Entity\UserInstance;
  5. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportRole;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\EventDispatcher\GenericEvent;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Webkul\UVDesk\CoreFrameworkBundle\Workflow\Events as CoreWorkflowEvents;
  11. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  12. use Webkul\UVDesk\CoreFrameworkBundle\Services\UserService;
  13. use Webkul\UVDesk\CoreFrameworkBundle\FileSystem\FileSystem;
  14. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  15. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. use Symfony\Component\Filesystem\Filesystem as Fileservice;
  18. class Customer extends AbstractController
  19. {
  20. private $userService;
  21. private $eventDispatcher;
  22. private $translator;
  23. private $fileSystem;
  24. private $passwordEncoder;
  25. public function __construct(UserService $userService, EventDispatcherInterface $eventDispatcher, TranslatorInterface $translator, FileSystem $fileSystem, UserPasswordEncoderInterface $passwordEncoder)
  26. {
  27. $this->userService = $userService;
  28. $this->eventDispatcher = $eventDispatcher;
  29. $this->translator = $translator;
  30. $this->fileSystem = $fileSystem;
  31. $this->passwordEncoder = $passwordEncoder;
  32. }
  33. public function listCustomers(Request $request)
  34. {
  35. if (!$this->userService->isAccessAuthorized('ROLE_AGENT_MANAGE_CUSTOMER')){
  36. return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  37. }
  38. return $this->render('@UVDeskCoreFramework/Customers/listSupportCustomers.html.twig');
  39. }
  40. public function createCustomer(Request $request)
  41. {
  42. if (!$this->userService->isAccessAuthorized('ROLE_AGENT_MANAGE_CUSTOMER')){
  43. return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  44. }
  45. if ($request->getMethod() == "POST") {
  46. $entityManager = $this->getDoctrine()->getManager();
  47. $formDetails = $request->request->get('customer_form');
  48. $uploadedFiles = $request->files->get('customer_form');
  49. // Profile upload validation
  50. $validMimeType = ['image/jpeg', 'image/png', 'image/jpg'];
  51. if (isset($uploadedFiles['profileImage'])) {
  52. if (!in_array($uploadedFiles['profileImage']->getMimeType(), $validMimeType)) {
  53. $this->addFlash('warning', $this->translator->trans('Error ! Profile image is not valid, please upload a valid format'));
  54. return $this->redirect($this->generateUrl('helpdesk_member_create_customer_account'));
  55. }
  56. }
  57. $user = $entityManager->getRepository(User::class)->findOneBy(array('email' => $formDetails['email']));
  58. $customerInstance = !empty($user) ? $user->getCustomerInstance() : null;
  59. if (empty($customerInstance)){
  60. if (!empty($formDetails)) {
  61. $fullname = trim(implode(' ', [$formDetails['firstName'], $formDetails['lastName']]));
  62. $supportRole = $entityManager->getRepository(SupportRole::class)->findOneByCode('ROLE_CUSTOMER');
  63. $user = $this->userService->createUserInstance($formDetails['email'], $fullname, $supportRole, [
  64. 'contact' => $formDetails['contactNumber'],
  65. 'source' => 'website',
  66. 'active' => !empty($formDetails['isActive']) ? true : false,
  67. 'image' => $uploadedFiles['profileImage'],
  68. ]);
  69. if (!empty($user)){
  70. $user->setIsEnabled(true);
  71. $entityManager->persist($user);
  72. $entityManager->flush();
  73. }
  74. $this->addFlash('success', $this->translator->trans('Success ! Customer saved successfully.'));
  75. return $this->redirect($this->generateUrl('helpdesk_member_manage_customer_account_collection'));
  76. }
  77. } else {
  78. $this->addFlash('warning', $this->translator->trans('Error ! User with same email already exist.'));
  79. }
  80. }
  81. return $this->render('@UVDeskCoreFramework/Customers/createSupportCustomer.html.twig', [
  82. 'user' => new User(),
  83. 'errors' => json_encode([])
  84. ]);
  85. }
  86. public function editCustomer(Request $request)
  87. {
  88. if (!$this->userService->isAccessAuthorized('ROLE_AGENT_MANAGE_CUSTOMER')) {
  89. return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  90. }
  91. $em = $this->getDoctrine()->getManager();
  92. $repository = $em->getRepository(User::class);
  93. if ($userId = $request->attributes->get('customerId')) {
  94. $user = $repository->findOneBy(['id' => $userId]);
  95. if (!$user)
  96. $this->noResultFound();
  97. }
  98. if ($request->getMethod() == "POST") {
  99. $contentFile = $request->files->get('customer_form');
  100. // Customer Profile upload validation
  101. $validMimeType = ['image/jpeg', 'image/png', 'image/jpg'];
  102. if (isset($contentFile['profileImage'])) {
  103. if (!in_array($contentFile['profileImage']->getMimeType(), $validMimeType)) {
  104. $this->addFlash('warning', $this->translator->trans('Error ! Profile image is not valid, please upload a valid format'));
  105. return $this->render('@UVDeskCoreFramework/Customers/updateSupportCustomer.html.twig', ['user' => $user,'errors' => json_encode([])]);
  106. }
  107. }
  108. if ($userId) {
  109. $data = $request->request->all();
  110. $data = $data['customer_form'];
  111. $checkUser = $em->getRepository(User::class)->findOneBy(array('email' => $data['email']));
  112. $errorFlag = 0;
  113. if ($checkUser) {
  114. if($checkUser->getId() != $userId)
  115. $errorFlag = 1;
  116. }
  117. if (!$errorFlag && 'hello@uvdesk.com' !== $user->getEmail()) {
  118. if (
  119. isset($data['password']['first']) && !empty(trim($data['password']['first']))
  120. && isset($data['password']['second']) && !empty(trim($data['password']['second']))
  121. && trim($data['password']['first']) == trim($data['password']['second'])) {
  122. $encodedPassword = $this->passwordEncoder->encodePassword($user, $data['password']['first']);
  123. $user->setPassword($encodedPassword);
  124. }
  125. $email = $user->getEmail();
  126. $user->setFirstName(trim($data['firstName']));
  127. $user->setLastName(trim($data['lastName']));
  128. $user->setEmail(trim($data['email']));
  129. $user->setIsEnabled(true);
  130. $em->persist($user);
  131. // User Instance
  132. $userInstance = $em->getRepository(UserInstance::class)->findOneBy(array('user' => $user->getId(), 'supportRole' => 4));
  133. $userInstance->setUser($user);
  134. $userInstance->setIsActive(isset($data['isActive']) ? $data['isActive'] : 0);
  135. $userInstance->setIsVerified(0);
  136. if (isset($data['contactNumber'])) {
  137. $userInstance->setContactNumber($data['contactNumber']);
  138. }
  139. if (isset($contentFile['profileImage'])) {
  140. // Removed profile image from database and path
  141. $fileService = new Fileservice;
  142. if ($userInstance->getProfileImagePath()) {
  143. $fileService->remove($this->getParameter('kernel.project_dir').'/public'.$userInstance->getProfileImagePath());
  144. }
  145. $assetDetails = $this->fileSystem->getUploadManager()->uploadFile($contentFile['profileImage'], 'profile');
  146. $userInstance->setProfileImagePath($assetDetails['path']);
  147. }
  148. $em->persist($userInstance);
  149. $em->flush();
  150. $user->addUserInstance($userInstance);
  151. $em->persist($user);
  152. $em->flush();
  153. // Trigger customer created event
  154. $event = new CoreWorkflowEvents\Customer\Update();
  155. $event
  156. ->setUser($user)
  157. ;
  158. $this->eventDispatcher->dispatch($event, 'uvdesk.automation.workflow.execute');
  159. $this->addFlash('success', $this->translator->trans('Success ! Customer information updated successfully.'));
  160. return $this->redirect($this->generateUrl('helpdesk_member_manage_customer_account_collection'));
  161. } else {
  162. $this->addFlash('warning', $this->translator->trans('Error ! User with same email is already exist.'));
  163. }
  164. }
  165. } elseif ($request->getMethod() == "PUT") {
  166. $content = json_decode($request->getContent(), true);
  167. $userId = $content['id'];
  168. $user = $repository->findOneBy(['id' => $userId]);
  169. if (!$user)
  170. $this->noResultFound();
  171. $checkUser = $em->getRepository(User::class)->findOneBy(array('email' => $content['email']));
  172. $errorFlag = 0;
  173. if ($checkUser) {
  174. if($checkUser->getId() != $userId)
  175. $errorFlag = 1;
  176. }
  177. if (!$errorFlag && 'hello@uvdesk.com' !== $user->getEmail()) {
  178. $name = explode(' ', $content['name']);
  179. $lastName = isset($name[1]) ? $name[1] : ' ';
  180. $user->setFirstName(trim($name[0]));
  181. $user->setLastName(trim($lastName));
  182. $user->setEmail(trim($content['email']));
  183. $em->persist($user);
  184. //user Instance
  185. $userInstance = $em->getRepository(UserInstance::class)->findOneBy(array('user' => $user->getId()));
  186. if (isset($content['contactNumber'])){
  187. $userInstance->setContactNumber($content['contactNumber']);
  188. }
  189. $em->persist($userInstance);
  190. $em->flush();
  191. $json['alertClass'] = 'success';
  192. $json['alertMessage'] = $this->translator->trans('Success ! Customer updated successfully.');
  193. } else {
  194. $json['alertClass'] = 'error';
  195. $json['alertMessage'] = $this->translator->trans('Error ! Customer with same email already exist.');
  196. }
  197. return new Response(json_encode($json), 200, []);
  198. }
  199. return $this->render('@UVDeskCoreFramework/Customers/updateSupportCustomer.html.twig', [
  200. 'user' => $user,
  201. 'errors' => json_encode([])
  202. ]);
  203. }
  204. protected function encodePassword(User $user, $plainPassword)
  205. {
  206. $encoder = $this->container->get('security.encoder_factory')
  207. ->getEncoder($user);
  208. return $encoder->encodePassword($plainPassword, $user->getSalt());
  209. }
  210. public function bookmarkCustomer(Request $request)
  211. {
  212. if ( !$this->userService->getSessionUser() && !$this->userService->isAccessAuthorized('ROLE_AGENT_MANAGE_CUSTOMER') ) {
  213. return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  214. }
  215. $json = array();
  216. $em = $this->getDoctrine()->getManager();
  217. $data = json_decode($request->getContent(), true);
  218. $id = $request->attributes->get('id') ? : $data['id'];
  219. $user = $em->getRepository(User::class)->findOneBy(['id' => $id]);
  220. if (!$user) {
  221. $json['error'] = 'resource not found';
  222. return new JsonResponse($json, Response::HTTP_NOT_FOUND);
  223. }
  224. $userInstance = $em->getRepository(UserInstance::class)->findOneBy(array(
  225. 'user' => $id,
  226. 'supportRole' => 4
  227. )
  228. );
  229. if ($userInstance->getIsStarred()) {
  230. $userInstance->setIsStarred(0);
  231. $em->persist($userInstance);
  232. $em->flush();
  233. $json['alertClass'] = 'success';
  234. $json['message'] = $this->translator->trans('unstarred Action Completed successfully');
  235. } else {
  236. $userInstance->setIsStarred(1);
  237. $em->persist($userInstance);
  238. $em->flush();
  239. $json['alertClass'] = 'success';
  240. $json['message'] = $this->translator->trans('starred Action Completed successfully');
  241. }
  242. $response = new Response(json_encode($json));
  243. $response->headers->set('Content-Type', 'application/json');
  244. return $response;
  245. }
  246. }