src/Controller/GuardianRegister/GuardianRegisterAdminController.php line 425

Open in your IDE?
  1. <?php
  2. namespace App\Controller\GuardianRegister;
  3. use App\Entity\Child;
  4. use App\Entity\ChildPreference;
  5. use App\Entity\Guardian;
  6. use App\Entity\Guardian\GuardianPriceDiscount;
  7. use App\Entity\GuardianRegister\GuardianRegister;
  8. use App\Entity\GuardianRegister\GuardianRegisterChild;
  9. use App\Entity\GuardianRegister\GuardianRegisterChildPreference;
  10. use App\Entity\Lesson;
  11. use App\Form\GuardianRegister\GuardianRegisterRawType;
  12. use App\Form\GuardianRegister\GuardianRegisterType;
  13. use App\Message\AssignChildPreferenceTeacherMessage;
  14. use App\Message\SendMailMessage;
  15. use App\Message\SendSMSMessage;
  16. use App\Repository\AdminRepository;
  17. use App\Repository\ChildRepository;
  18. use App\Repository\ConfigurationRepository;
  19. use App\Repository\Guardian\GuardianContractPriceClassAmountPriceRepository;
  20. use App\Repository\GuardianRegister\GuardianRegisterRepository;
  21. use App\Repository\GuardianRepository;
  22. use App\Repository\PaymentRepository;
  23. use App\Repository\ReminderConfigurationRepository;
  24. use App\Service\ChildPreferenceService;
  25. use App\Service\CredentialsService;
  26. use App\Service\GuardianRegisterDuplicateReconciliationService;
  27. use App\Service\OmnisendService;
  28. use App\Service\SmsService;
  29. use App\Utils\HelperUtils;
  30. use App\Utils\RestUtils;
  31. use Doctrine\ORM\EntityManagerInterface;
  32. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  33. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  34. use Symfony\Component\HttpFoundation\JsonResponse;
  35. use Symfony\Component\HttpFoundation\Request;
  36. use Symfony\Component\HttpFoundation\Response;
  37. use Symfony\Component\Messenger\Envelope;
  38. use Symfony\Component\Messenger\MessageBusInterface;
  39. use Symfony\Component\Messenger\Stamp\DelayStamp;
  40. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  41. use Symfony\Component\Routing\Annotation\Route;
  42. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  43. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  44. /**
  45. * @Route("/guardian_register")
  46. */
  47. class GuardianRegisterAdminController extends AbstractController
  48. {
  49. private SmsService $smsService;
  50. private EntityManagerInterface $entityManager;
  51. private ReminderConfigurationRepository $reminderConfigurationRepository;
  52. private GuardianRegisterRepository $guardianRegisterRepository;
  53. private ConfigurationRepository $configurationRepository;
  54. private UserPasswordEncoderInterface $passwordEncoder;
  55. private GuardianRepository $guardianRepository;
  56. private ChildRepository $childRepository;
  57. private GuardianContractPriceClassAmountPriceRepository $guardianContractPriceClassAmountPriceRepository;
  58. private CredentialsService $credentialsService;
  59. private MessageBusInterface $messageBus;
  60. private ChildPreferenceService $childPreferenceService;
  61. private UserPasswordHasherInterface $userPasswordHasher;
  62. private OmnisendService $omnisendService;
  63. private GuardianRegisterDuplicateReconciliationService $guardianRegisterDuplicateReconciliationService;
  64. public function __construct(
  65. UserPasswordEncoderInterface $passwordEncoder,
  66. GuardianRepository $guardianRepository,
  67. ChildRepository $childRepository,
  68. SmsService $smsService,
  69. EntityManagerInterface $entityManager,
  70. ConfigurationRepository $configurationRepository,
  71. GuardianRegisterRepository $guardianRegisterRepository,
  72. ReminderConfigurationRepository $reminderConfigurationRepository,
  73. GuardianContractPriceClassAmountPriceRepository $guardianContractPriceClassAmountPriceRepository,
  74. CredentialsService $credentialsService,
  75. MessageBusInterface $messageBus,
  76. ChildPreferenceService $childPreferenceService,
  77. UserPasswordHasherInterface $userPasswordHasher,
  78. OmnisendService $omnisendService,
  79. GuardianRegisterDuplicateReconciliationService $guardianRegisterDuplicateReconciliationService
  80. ) {
  81. $this->smsService = $smsService;
  82. $this->entityManager = $entityManager;
  83. $this->reminderConfigurationRepository = $reminderConfigurationRepository;
  84. $this->guardianRegisterRepository = $guardianRegisterRepository;
  85. $this->configurationRepository = $configurationRepository;
  86. $this->passwordEncoder = $passwordEncoder;
  87. $this->guardianRepository = $guardianRepository;
  88. $this->childRepository = $childRepository;
  89. $this->guardianContractPriceClassAmountPriceRepository = $guardianContractPriceClassAmountPriceRepository;
  90. $this->credentialsService = $credentialsService;
  91. $this->messageBus = $messageBus;
  92. $this->childPreferenceService = $childPreferenceService;
  93. $this->userPasswordHasher = $userPasswordHasher;
  94. $this->omnisendService = $omnisendService;
  95. $this->guardianRegisterDuplicateReconciliationService = $guardianRegisterDuplicateReconciliationService;
  96. }
  97. /**
  98. * @Route("/guardian-google-conversion_csv.csv", name="guardian_google_conversion_csv", methods={"GET", "POST"})
  99. */
  100. public function guardian_google_conversion_csv(Request $request, GuardianRegisterRepository $guardianRegisterRepository, PaymentRepository $paymentRepository): Response
  101. {
  102. // ===============================
  103. // BASIC AUTH CONFIGURATION
  104. // ===============================
  105. $username = 'corepetitus_google_conversion_csv';
  106. $password = 'vTvCzW7eBTT40rVxTkgKmHN3vUtctyJ8';
  107. // ===============================
  108. // AUTH CHECK
  109. // ===============================
  110. if (!isset($_SERVER['PHP_AUTH_USER'])) {
  111. header('WWW-Authenticate: Basic realm="Protected CSV"');
  112. header('HTTP/1.0 401 Unauthorized');
  113. echo "Authentication required.";
  114. exit;
  115. } else {
  116. if ($_SERVER['PHP_AUTH_USER'] !== $username || $_SERVER['PHP_AUTH_PW'] !== $password) {
  117. header('WWW-Authenticate: Basic realm="Protected CSV"');
  118. header('HTTP/1.0 401 Unauthorized');
  119. echo "Invalid credentials.";
  120. exit;
  121. }
  122. }
  123. // if($request->query->get('token') != '9sd1f8sdf18af8ergftgh1e58hrsegawfgs1h8as8gf1asdf')
  124. // {
  125. // die();
  126. // }
  127. //Email,Phone Number,Google Click ID,Conversion Name,Conversion Time,Conversion Value,Conversion Currency
  128. // $f = fopen('php://memory', 'w');
  129. header('Content-Type: text/csv');
  130. header('Content-Disposition: attachment; filename="google_ads.csv"');
  131. $f = fopen('php://output', 'w');
  132. // $data = [0=>'Parameters:TimeZone=Europe/Vilnius'];
  133. // fputcsv($f, $data, ';');
  134. fputcsv($f, [
  135. 'Email',
  136. 'Phone Number',
  137. 'Google Click ID',
  138. 'Conversion Name',
  139. 'Conversion Time',
  140. 'Conversion Value',
  141. 'Conversion Currency',
  142. 'Ad User Data',
  143. 'Ad Personalization',
  144. ], ',');
  145. $dateFrom = new \DateTime();
  146. $dateFrom->setTime(8,50,0);
  147. $dateFrom->modify('-1 days');
  148. $dateTo = new \DateTime();
  149. $dateTo->setTime(9,10,0);
  150. $guardianRegistrations = $guardianRegisterRepository
  151. ->createQueryBuilder('gr')
  152. ->leftJoin('gr.guardian', 'g')
  153. ->andWhere('g.status = :status')
  154. ->setParameter('status', Guardian::STATUS_CONFIRMED['value'])
  155. ->andWhere('gr.contractSignedAt >= :dateFrom')
  156. ->andWhere('gr.contractSignedAt <= :dateto')
  157. ->setParameter('dateFrom', $dateFrom)
  158. ->setParameter('dateto', $dateTo)
  159. ->getQuery()
  160. ->getResult();
  161. //vakar 8.50 ir siandien 9.10
  162. foreach ($guardianRegistrations as $guardianRegister) {
  163. $guardian = $guardianRegister->getGuardian();
  164. if (strlen($guardianRegister->getLandingPage())) {
  165. $parts = parse_url($guardianRegister->getLandingPage());
  166. parse_str($parts['query'] ?? '', $params);
  167. $gclid = $params['gclid'] ?? '';
  168. }
  169. else
  170. {
  171. $gclid = '';
  172. }
  173. $payment = $paymentRepository->createQueryBuilder('p')
  174. ->andWhere('p.guardian = :guardian')
  175. ->setParameter('guardian', $guardian)
  176. ->setMaxResults(1)
  177. ->getQuery()
  178. ->getOneOrNullResult();
  179. $amount = 10;
  180. if($payment)
  181. {
  182. $amount = $payment->getAmount();
  183. }
  184. if ($amount < 0) {
  185. continue;
  186. }
  187. $data = [
  188. 0 => $guardian->getEmail(),
  189. 1 => $guardian->getPhoneNumber(),
  190. 2 => $gclid,
  191. 3 => "TSM ACTUAL BUYERS 2025.10 offline (Upload)",
  192. 4 => $guardianRegister->getContractSignedAt()->format('Y-m-d H:i:s'),
  193. 5 => $amount,
  194. 6 => "EUR",
  195. 7 => "Granted",
  196. 8 => "Granted",
  197. ];
  198. fputcsv($f, $data, ',');
  199. }
  200. fclose($f);
  201. // fseek($f, 0);
  202. // header('Content-Encoding: UTF-8');
  203. // header('Content-Type: text/csv; charset=UTF-8');
  204. // header('Content-Disposition: attachment; filename="guardian_google_conversion_csv.csv";');
  205. // echo "\xEF\xBB\xBF"; // UTF-8 BOM
  206. // fpassthru($f);
  207. exit();
  208. }
  209. /**
  210. * @Route("/ajax/check", name="guardian_registrations_dupe_check", methods={"GET", "POST"})
  211. * @Security("is_granted('ROLE_ADMIN')")
  212. */
  213. public function dupe_check(Request $request, GuardianRegisterRepository $guardianRegisterRepository): Response
  214. {
  215. $email = $request->get('email');
  216. $phone = $request->get('phone');
  217. $guardianRegisterRep = $guardianRegisterRepository->createQueryBuilder('g');
  218. if($email)
  219. {
  220. $guardianRegisterRep->andWhere('(g.email = :email or g.guardianEmail = :email)');
  221. $guardianRegisterRep->setParameter('email', $email);
  222. }
  223. if($phone)
  224. {
  225. $guardianRegisterRep->andWhere('(g.phone = :phone or g.guardianPhone = :phone)');
  226. $guardianRegisterRep->setParameter('phone', $phone);
  227. }
  228. $result = $guardianRegisterRep->getQuery()->getResult();
  229. $normalized = $this->get('serializer')->normalize($result, null, ['groups' => 'GuardianRegisterList']);
  230. return new JsonResponse($normalized);
  231. }
  232. /**
  233. * @Route("/recheck", name="guardian_registrations_recheck", methods={"GET", "POST"})
  234. * @Security("is_granted('ROLE_ADMIN')")
  235. */
  236. public function recheck(Request $request, GuardianRegisterRepository $guardianRegisterRepository): Response
  237. {
  238. $registrations = $guardianRegisterRepository->findBy(['status' => GuardianRegister::STATUS_CONFIRMED['value'], 'guardian' => null]);
  239. dump($registrations);
  240. die();
  241. foreach ($registrations as $guardianRegister) {
  242. $plainPassword = $this->createRandomPassword();
  243. $this->convertRegisterToGuardian($guardianRegister, $plainPassword);
  244. $this->sendSignedEmail($guardianRegister, $plainPassword);
  245. }
  246. exit();
  247. }
  248. /**
  249. * @Route("/registrations", name="guardian_registrations_index", methods={"GET", "POST"})
  250. * @Security("is_granted('ROLE_ADMIN')")
  251. */
  252. public function applications(Request $request, AdminRepository $adminRepository): Response
  253. {
  254. $admins = $adminRepository->findAll();
  255. $adminsToFront = [];
  256. $adminsToFront['Visi'] = ['Visi'];
  257. foreach ($admins as $admin) {
  258. if (in_array($admin->getId(), [2, 3, 5])) {
  259. continue;
  260. }
  261. if (in_array('ROLE_SALES', $admin->getRoles())) {
  262. $adminsToFront[$admin->getFullname()] = $admin->getFullname();
  263. }
  264. if (15 == $admin->getId()) {
  265. $adminsToFront[$admin->getFullname()] = $admin->getFullname();
  266. }
  267. }
  268. return $this->render('guardian_register/admin/list.html.twig', [
  269. 'adminsToFront' => $adminsToFront
  270. ]);
  271. }
  272. /**
  273. * @Route("/ajax", name="guardian_registrations_ajax", methods={"POST"})
  274. * @Security("is_granted('ROLE_ADMIN') and is_granted('IS_AUTHENTICATED_FULLY')")
  275. */
  276. public function ajax(Request $request, GuardianRegisterRepository $guardianRegisterRepository): Response
  277. {
  278. $objectRepository = $guardianRegisterRepository;
  279. $page = $request->request->get('page');
  280. $perPage = $request->request->get('perPage');
  281. $page = ($page && $page > 1) ? $page : 1;
  282. $perPage = ($perPage && $perPage > 0) ? $perPage : 10; // should change in the future
  283. $searchFilters = $request->request->get('filters', []);
  284. $sorters = $request->request->get('sorters', []);
  285. $query = $objectRepository->createQueryBuilder('a');
  286. $query->andWhere("a.status <> :ignoreStatusC")
  287. ->setParameter("ignoreStatusC", GuardianRegister::STATUS_CONFIRMED['value']);
  288. $query->andWhere("a.guardian IS NULL OR a.status IN (:earlyPaymentStatuses)")
  289. ->setParameter("earlyPaymentStatuses", [
  290. GuardianRegister::STATUS_WAITING['value'],
  291. GuardianRegister::STATUS_LOST_48['value'],
  292. GuardianRegister::STATUS_PAID_FIRST['value'],
  293. GuardianRegister::STATUS_NOT_PAID['value'],
  294. GuardianRegister::STATUS_NOT_PAID_48['value'],
  295. GuardianRegister::STATUS_LEFT_EARLY_PAYMENT['value'],
  296. ]);
  297. if (!$searchFilters || (count($searchFilters) == 1 && $searchFilters[0]['field'] == 'salesPerson.fullname')) {
  298. $query->andWhere("a.status <> :ignoreStatus")
  299. ->setParameter("ignoreStatus", GuardianRegister::STATUS_LOST['value']);
  300. $query->andWhere("a.status <> :ignoreStatus2")
  301. ->setParameter("ignoreStatus2", GuardianRegister::STATUS_UNTARGETED['value']);
  302. }
  303. $salesPersonSelected = false;
  304. $statusFilterIsLeftEarlyPayment = false;
  305. foreach ($searchFilters as $filter) {
  306. if ($filter['field'] == 'salesPerson.fullname' && !empty($filter['value']) && $filter['value'] != 'Visi') {
  307. $salesPersonSelected = true;
  308. }
  309. if ($filter['field'] == 'status' && ($filter['value'] ?? null) == GuardianRegister::STATUS_LEFT_EARLY_PAYMENT['value']) {
  310. $statusFilterIsLeftEarlyPayment = true;
  311. }
  312. }
  313. if ($salesPersonSelected && !$statusFilterIsLeftEarlyPayment) {
  314. $query->andWhere("a.status <> :ignoreStatusLeftEarlyPayment")
  315. ->setParameter("ignoreStatusLeftEarlyPayment", GuardianRegister::STATUS_LEFT_EARLY_PAYMENT['value']);
  316. }
  317. if ($searchFilters) {
  318. foreach ($searchFilters as $filter) {
  319. if (isset($filter['value'])) {
  320. if ($filter['value'] == 'Visi') {
  321. continue;
  322. }
  323. $relation = explode('.', $filter['field']);
  324. if (count($relation) == 1) {
  325. $searchValue = (is_string($filter['value']) ? $filter['value'] : reset($filter['value']));
  326. if ($filter['type'] == "like") {
  327. $query->andWhere("a.{$filter['field']} {$filter['type']} :{$filter['field']}")
  328. ->setParameter("{$filter['field']}", "%{$searchValue}%");
  329. if ($filter['field'] == 'email') {
  330. $query->orWhere("a.guardianEmail {$filter['type']} :{$filter['field']}");
  331. }
  332. if ($filter['field'] == 'phone') {
  333. $query->orWhere("a.guardianPhone {$filter['type']} :{$filter['field']}");
  334. }
  335. } else {
  336. $query->andWhere("a.{$filter['field']} {$filter['type']} :{$filter['field']}")
  337. ->setParameter("{$filter['field']}", "{$searchValue}");
  338. }
  339. } elseif (count($relation) == 2) {
  340. $searchValue = (is_string($filter['value']) ? $filter['value'] : reset($filter['value']));
  341. $field = $relation[1];
  342. $relation = $relation[0];
  343. if ($filter['type'] == "like") {
  344. $query
  345. ->leftJoin("a." . $relation, $relation)
  346. ->andWhere("{$relation}.{$field} {$filter['type']} :{$field}")
  347. ->setParameter("{$field}", "%{$searchValue}%");
  348. } else {
  349. $query
  350. ->leftJoin("a." . $relation, $relation)
  351. ->andWhere("{$relation}.{$field} {$filter['type']} :{$field}")
  352. ->setParameter("{$field}", "{$searchValue}");
  353. }
  354. }
  355. }
  356. }
  357. }
  358. if ($sorters) {
  359. foreach ($sorters as $sorter) {
  360. $query->addOrderBy('a.' . $sorter['field'], $sorter['dir']);
  361. }
  362. }
  363. $count = RestUtils::getQueryCount(clone $query);
  364. $pagesCount = ceil($count / $perPage);
  365. $guardianRegistrations = $this->get('serializer')->normalize(RestUtils::getPaginatedResults($query->getQuery(), $page, $perPage), null, ['groups' => "GuardianRegisterList"]);
  366. foreach ($guardianRegistrations as $key => $guardianRegistration) {
  367. $guardianRegistrations[$key]['guardian_name'] = $guardianRegistration['isGuardian'] ? $guardianRegistration['name'] : $guardianRegistration['guardianName'];
  368. $guardianRegistrations[$key]['email'] = $guardianRegistration['isGuardian'] ? $guardianRegistrations[$key]['email'] : $guardianRegistration['guardianEmail'];
  369. $guardianRegistrations[$key]['phone'] = $guardianRegistration['isGuardian'] ? $guardianRegistrations[$key]['phone'] : $guardianRegistration['guardianPhone'];
  370. $guardianRegistrations[$key]['isGuardian'] = $guardianRegistration['isGuardian'] ? 'TEV' : 'MOK';
  371. }
  372. return new JsonResponse([
  373. "last_page" => $pagesCount,
  374. "data" => $guardianRegistrations
  375. ]);
  376. }
  377. /**
  378. * @Route("/new", name="guardian_register_new", methods={"GET","POST"})
  379. * @Security("is_granted('ROLE_ADMIN') and is_granted('IS_AUTHENTICATED_FULLY')")
  380. */
  381. public function new(Request $request): Response
  382. {
  383. $guardianRegister = new GuardianRegister();
  384. $childName = 'Vardas1';
  385. if (!$guardianRegister->getGuardianRegisterChildren()->count()) {
  386. $guardianRegisterChild = new GuardianRegisterChild();
  387. $guardianRegisterChild->setName($childName);
  388. $guardianRegisterChild->setClass(8);
  389. $guardianRegisterChild->setGuardianRegister($guardianRegister);
  390. $guardianRegisterChildPreference = new GuardianRegisterChildPreference();
  391. $guardianRegisterChildPreference->setDuration(60);
  392. $guardianRegisterChildPreference->setAmount(2);
  393. $guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
  394. $guardianRegisterChild->addGuardianRegisterChildPreference($guardianRegisterChildPreference);
  395. $guardianRegister->addGuardianRegisterChild($guardianRegisterChild);
  396. }
  397. $DEFAULT_GUARDIAN_PRICE_CHANGE = $this->configurationRepository->findOneBy(['name' => 'DEFAULT_GUARDIAN_PRICE_CHANGE'])->getValue();
  398. $guardianRegister->setPriceChange($DEFAULT_GUARDIAN_PRICE_CHANGE);
  399. $guardianRegister->setSalesPerson($this->getUser());
  400. if (!$guardianRegister->getSalesAssignedAt()) {
  401. $guardianRegister->setSalesAssignedAt(new \DateTime());
  402. }
  403. $form = $this->createForm(GuardianRegisterType::class, $guardianRegister);
  404. $form->handleRequest($request);
  405. if ($form->isSubmitted() && $form->isValid()) {
  406. foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
  407. foreach ($guardianRegisterChild->getGuardianRegisterChildPreferences() as $guardianRegisterChildPreference) {
  408. $guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
  409. $this->entityManager->persist($guardianRegisterChildPreference);
  410. }
  411. $guardianRegisterChild->setGuardianRegister($guardianRegister);
  412. $this->entityManager->persist($guardianRegisterChild);
  413. }
  414. $this->handleStatusChange($guardianRegister, '');
  415. $this->entityManager->persist($guardianRegister);
  416. $this->entityManager->flush();
  417. $this->sendSuccessEmail($guardianRegister);
  418. return $this->redirectToRoute('guardian_registrations_index');
  419. }
  420. return $this->renderForm('guardian_register/admin/new.html.twig', [
  421. 'form' => $form,
  422. 'raw' => false,
  423. 'returningChildMatches' => $this->resolveReturningChildMatches($guardianRegister)
  424. ]);
  425. }
  426. /**
  427. * @Route("/ajax/{id}/edit", name="guardian_register_ajax_edit", methods={"POST"})
  428. * @Security("is_granted('ROLE_ADMIN') and is_granted('IS_AUTHENTICATED_FULLY')")
  429. */
  430. public function ajaxEdit(GuardianRegister $guardianRegister, Request $request): Response
  431. {
  432. if (!$guardianRegister) {
  433. $error = new JsonResponse();
  434. $error
  435. ->setStatusCode(Response::HTTP_NOT_FOUND)
  436. ->setData(['status' => "error"]);
  437. return $error;
  438. }
  439. $data = json_decode($request->getContent(), true);
  440. if (isset($data['status'])) {
  441. if (!$guardianRegister->getEmail() || $guardianRegister->getEmail() == "") {
  442. return new JsonResponse(['status' => "Vartotojas neturi elektroninio pasto"], Response::HTTP_BAD_REQUEST);
  443. }
  444. }
  445. $oldStatus = $guardianRegister->getStatus();
  446. $guardianRegister = $this->get('serializer')->deserialize($request->getContent(), GuardianRegister::class, 'json', [
  447. AbstractNormalizer::OBJECT_TO_POPULATE => $guardianRegister
  448. ]);
  449. $this->handleStatusChange($guardianRegister, $oldStatus);
  450. $this->entityManager->persist($guardianRegister);
  451. $this->entityManager->flush();
  452. return new JsonResponse(['status' => "OK"], Response::HTTP_OK);
  453. }
  454. /**
  455. * @Route("/setSales", name="guardian_register_set_sales", methods={"GET"})
  456. * @Security("is_granted('ROLE_ADMIN') and is_granted('IS_AUTHENTICATED_FULLY')")
  457. */
  458. public function setSales(Request $request, GuardianRegisterRepository $guardianRegisterRepository): Response
  459. {
  460. $ids = $request->query->get('Ids');
  461. $ids = explode(',', $ids);
  462. $currentUser = $this->getUser();
  463. foreach ($ids as $id) {
  464. $guardianRegister = $guardianRegisterRepository->find($id);
  465. if (!$guardianRegister->getSalesPerson()) {
  466. $guardianRegister->setSalesPerson($currentUser);
  467. if (!$guardianRegister->getSalesAssignedAt()) {
  468. $guardianRegister->setSalesAssignedAt(new \DateTime());
  469. }
  470. $this->entityManager->persist($guardianRegister);
  471. $this->entityManager->flush();
  472. }
  473. }
  474. return new JsonResponse();
  475. }
  476. /**
  477. * @Route("/{id}/edit", name="guardian_register_edit", methods={"GET","POST"})
  478. * @Security("is_granted('ROLE_ADMIN') and is_granted('IS_AUTHENTICATED_FULLY')")
  479. */
  480. public function edit(Request $request, GuardianRegister $guardianRegister, GuardianRegisterRepository $guardianRegisterRepository): Response
  481. {
  482. // if($guardianRegister->getSalesPerson() && $guardianRegister->getSalesPerson() != $this->getUser())
  483. // {
  484. // exit("Šią registraciją redaguoti gali tik {$this->getUser()->getFullname()}");
  485. // }
  486. // $date = new \DateTime();
  487. // dump("1. {$date->format('Y-m-d H:i:s')}");
  488. $childName = 'Vardas1';
  489. if (!$guardianRegister->getIsGuardian()) {
  490. $childName = "{$guardianRegister->getName()} {$guardianRegister->getLastname()}";
  491. }
  492. if (!$guardianRegister->getGuardianRegisterChildren()->count()) {
  493. $guardianRegisterChild = new GuardianRegisterChild();
  494. $guardianRegisterChild->setName($childName);
  495. $guardianRegisterChild->setClass(8);
  496. $guardianRegisterChild->setGuardianRegister($guardianRegister);
  497. $guardianRegisterChildPreference = new GuardianRegisterChildPreference();
  498. $guardianRegisterChildPreference->setDuration(60);
  499. $guardianRegisterChildPreference->setAmount(2);
  500. $guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
  501. $guardianRegisterChild->addGuardianRegisterChildPreference($guardianRegisterChildPreference);
  502. $guardianRegister->addGuardianRegisterChild($guardianRegisterChild);
  503. }
  504. foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
  505. if(!$guardianRegisterChild->getGuardianRegisterChildPreferences()->count())
  506. {
  507. $guardianRegisterChildPreference = new GuardianRegisterChildPreference();
  508. $guardianRegisterChildPreference->setDuration(60);
  509. $guardianRegisterChildPreference->setAmount(2);
  510. $guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
  511. $guardianRegisterChild->addGuardianRegisterChildPreference($guardianRegisterChildPreference);
  512. $guardianRegister->addGuardianRegisterChild($guardianRegisterChild);
  513. }
  514. }
  515. $form = $this->createForm(GuardianRegisterType::class, $guardianRegister);
  516. $oldStatus = $guardianRegister->getStatus();
  517. $originalGuardianRegisterChildren = $guardianRegister->getGuardianRegisterChildren()->getValues();
  518. $originalGuardianRegisterChildrenPreferences = [];
  519. foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
  520. $originalGuardianRegisterChildrenPreferences = array_merge($originalGuardianRegisterChildrenPreferences, $guardianRegisterChild->getGuardianRegisterChildPreferences()->getValues());
  521. }
  522. $form->handleRequest($request);
  523. if ($form->isSubmitted() && $form->isValid()) {
  524. // $date = new \DateTime();
  525. // dump("1. {$date->format('Y-m-d H:i:s')}");
  526. //remove
  527. foreach ($originalGuardianRegisterChildrenPreferences as $originalGuardianRegisterChildrenPreference) {
  528. $delete = true;
  529. foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
  530. if ($guardianRegisterChild->getGuardianRegisterChildPreferences()->contains($originalGuardianRegisterChildrenPreference)) {
  531. $delete = false;
  532. }
  533. }
  534. if ($delete) {
  535. $this->entityManager->remove($originalGuardianRegisterChildrenPreference);
  536. }
  537. }
  538. // $date = new \DateTime();
  539. // dump("2. {$date->format('Y-m-d H:i:s')}");
  540. foreach ($originalGuardianRegisterChildren as $originalGuardianRegisterChild) {
  541. if (!$guardianRegister->getGuardianRegisterChildren()->contains($originalGuardianRegisterChild)) {
  542. $this->entityManager->remove($originalGuardianRegisterChild);
  543. }
  544. }
  545. //add
  546. foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
  547. foreach ($guardianRegisterChild->getGuardianRegisterChildPreferences() as $guardianRegisterChildPreference) {
  548. $guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
  549. $this->entityManager->persist($guardianRegisterChildPreference);
  550. }
  551. $guardianRegisterChild->setGuardianRegister($guardianRegister);
  552. $this->entityManager->persist($guardianRegisterChild);
  553. }
  554. // $date = new \DateTime();
  555. // dump("3. {$date->format('Y-m-d H:i:s')}");
  556. $this->handleStatusChange($guardianRegister, $oldStatus);
  557. // $date = new \DateTime();
  558. // dump("5. {$date->format('Y-m-d H:i:s')}");
  559. $this->entityManager->persist($guardianRegister);
  560. $this->entityManager->flush();
  561. // $date = new \DateTime();
  562. // dump("6. {$date->format('Y-m-d H:i:s')}");
  563. // $date = new \DateTime();
  564. // dump("3. {$date->format('Y-m-d H:i:s')}");
  565. if ($form->has('change')) {
  566. $changeClicked = $form->get('change')->isClicked();
  567. } else {
  568. $changeClicked = false;
  569. }
  570. if ($changeClicked && $guardianRegister->getCurrentGuardianFoundBy()) {
  571. if ($guardian = $this->guardianRepository->findOneBy(['email' => $guardianRegister->getEmail()])) {
  572. $guardian->setEmail($guardian->getEmail() . 'BACK');
  573. }
  574. $phoneToSearch = $guardianRegister->getPhone();
  575. if ($phoneToSearch && strlen($phoneToSearch) > 6) {
  576. $phoneToSearch = str_replace('+3706', '', $phoneToSearch);
  577. $query = $this->guardianRepository->createQueryBuilder('g');
  578. $guardians = $query->andWhere('g.phoneNumber like :phone')
  579. ->setParameter('phone', "%{$phoneToSearch}%")
  580. ->getQuery()
  581. ->getResult();
  582. foreach ($guardians as $guardian) {
  583. $guardian->setPhoneNumber($guardian->getPhoneNumber() . 'BACK');
  584. $this->entityManager->persist($guardian);
  585. $this->entityManager->flush();
  586. }
  587. $query = $this->childRepository->createQueryBuilder('g');
  588. /**
  589. * @var $child Child
  590. */
  591. $children = $query->andWhere('g.phoneNumber like :phone')
  592. ->setParameter('phone', "%{$phoneToSearch}%")
  593. ->getQuery()
  594. ->getResult();
  595. foreach ($children as $child) {
  596. $child->setPhoneNumber($child->getPhoneNumber() . 'BACK');
  597. $this->entityManager->persist($child);
  598. $this->entityManager->flush();
  599. }
  600. }
  601. $phone = $guardianRegister->getGuardianPhone();
  602. if ($phone && strlen($phone) > 6) {
  603. $phoneToSearch = $phone;
  604. $phoneToSearch = str_replace('+3706', '', $phoneToSearch);
  605. $phoneToSearch = str_replace('3706', '', $phoneToSearch);
  606. $pattern = '/^86/i';
  607. $phoneToSearch = preg_replace($pattern, '', $phoneToSearch);
  608. $query = $this->guardianRepository->createQueryBuilder('g');
  609. $guardians = $query->andWhere('g.phoneNumber like :phone')
  610. ->setParameter('phone', "%{$phoneToSearch}%")
  611. ->getQuery()
  612. ->getResult();
  613. foreach ($guardians as $guardian) {
  614. $guardian->setPhoneNumber($guardian->getPhoneNumber() . 'BACK');
  615. $this->entityManager->persist($guardian);
  616. $this->entityManager->flush();
  617. }
  618. $query = $this->childRepository->createQueryBuilder('g');
  619. $children = $query->andWhere('g.phoneNumber like :phone')
  620. ->setParameter('phone', "%{$phoneToSearch}%")
  621. ->getQuery()
  622. ->getResult();
  623. foreach ($children as $child) {
  624. $child->setPhoneNumber($child->getPhoneNumber() . 'BACK');
  625. $this->entityManager->persist($child);
  626. $this->entityManager->flush();
  627. }
  628. }
  629. }
  630. $foundByEmail = false;
  631. $foundByPhone = false;
  632. if ($this->guardianRepository->findOneBy(['email' => $guardianRegister->getEmail()])) {
  633. $foundByEmail = true;
  634. }
  635. if ($guardianRegister->getGuardianEmail() && $this->guardianRepository->findOneBy(['email' => $guardianRegister->getGuardianEmail()])) {
  636. $foundByEmail = true;
  637. }
  638. $phoneToSearch = $guardianRegister->getPhone();
  639. $phoneToSearch = str_replace('+3706', '', $phoneToSearch);
  640. if ($phoneToSearch && strlen($phoneToSearch) > 6) {
  641. $query = $this->guardianRepository->createQueryBuilder('g');
  642. $result = $query->andWhere('g.phoneNumber like :phone')
  643. ->setParameter('phone', "%{$phoneToSearch}%")
  644. ->getQuery()
  645. ->getResult();
  646. if ($result) {
  647. $foundByPhone = true;
  648. }
  649. $query = $this->childRepository->createQueryBuilder('g');
  650. $result = $query->andWhere('g.phoneNumber like :phone')
  651. ->setParameter('phone', "%{$phoneToSearch}%")
  652. ->getQuery()
  653. ->getResult();
  654. if ($result) {
  655. $foundByPhone = true;
  656. }
  657. }
  658. $phone = $guardianRegister->getGuardianPhone();
  659. if ($phone && strlen($phone) > 6) {
  660. $phoneToSearch = $phone;
  661. $phoneToSearch = str_replace('+3706', '', $phoneToSearch);
  662. $phoneToSearch = str_replace('3706', '', $phoneToSearch);
  663. $pattern = '/^86/i';
  664. $phoneToSearch = preg_replace($pattern, '', $phoneToSearch);
  665. $query = $this->guardianRepository->createQueryBuilder('g');
  666. $result = $query->andWhere('g.phoneNumber like :phone')
  667. ->setParameter('phone', "%{$phoneToSearch}%")
  668. ->getQuery()
  669. ->getResult();
  670. if ($result) {
  671. $foundByPhone = true;
  672. }
  673. $query = $this->childRepository->createQueryBuilder('g');
  674. $result = $query->andWhere('g.phoneNumber like :phone')
  675. ->setParameter('phone', "%{$phoneToSearch}%")
  676. ->getQuery()
  677. ->getResult();
  678. if ($result) {
  679. $foundByPhone = true;
  680. }
  681. }
  682. if ($foundByEmail && !$foundByPhone) {
  683. $guardianRegister->setCurrentGuardianFoundBy('EMAIL');
  684. }
  685. if (!$foundByEmail && $foundByPhone) {
  686. $guardianRegister->setCurrentGuardianFoundBy('TEL');
  687. }
  688. if ($foundByEmail && $foundByPhone) {
  689. $guardianRegister->setCurrentGuardianFoundBy('EMAIL&TEL');
  690. }
  691. $this->entityManager->persist($guardianRegister);
  692. $this->entityManager->flush();
  693. return $this->redirectToRoute('guardian_registrations_index', [], Response::HTTP_SEE_OTHER);
  694. }
  695. $registrationData = $guardianRegister->getData() ?? json_decode($guardianRegister->getData());
  696. if (!empty($guardianRegister->getData())) {
  697. $registrationData = $this->changeFormat($registrationData);
  698. }
  699. $guardianRegisterRep = $guardianRegisterRepository->createQueryBuilder('g');
  700. $result = $guardianRegisterRep
  701. ->andWhere('(g.email = :email or g.guardianEmail = :email) and g.id != :id')
  702. ->orWhere('(g.phone = :phone or g.guardianPhone = :phone) and g.id != :id')
  703. ->setParameter('email', $guardianRegister->getEmail())
  704. ->setParameter('id', $guardianRegister->getId())
  705. ->setParameter('phone', $guardianRegister->getPhone())
  706. ->andWhere('g.createdAt >= :createdAt')
  707. ->setParameter('createdAt', ($guardianRegister->getCreatedAt())->modify('-7 days'))
  708. ->getQuery()
  709. ->getResult();
  710. return $this->renderForm('guardian_register/admin/edit.html.twig', [
  711. 'form' => $form,
  712. 'raw' => false,
  713. 'same_accounts_count' => $this->findSameAccounts($guardianRegister)['count'],
  714. 'same_accounts_id' => $this->findSameAccounts($guardianRegister)['id'],
  715. 'registrationData' => $registrationData,
  716. 'duplicateRegistrations' => $result,
  717. 'returningChildMatches' => $this->resolveReturningChildMatches($guardianRegister)
  718. ]);
  719. }
  720. private function resolveReturningChildMatches(GuardianRegister $guardianRegister): array
  721. {
  722. $matches = [];
  723. if (!in_array($guardianRegister->getCurrentGuardianFoundBy(), ['EMAIL', 'EMAIL&TEL'], true)) {
  724. return $matches;
  725. }
  726. $email = $guardianRegister->getIsGuardian() ? $guardianRegister->getEmail() : $guardianRegister->getGuardianEmail();
  727. $guardian = $email ? $this->guardianRepository->findOneBy(['email' => $email]) : null;
  728. if (!$guardian) {
  729. return $matches;
  730. }
  731. $classLabels = ['<1', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, '>12'];
  732. foreach ($guardianRegister->getGuardianRegisterChildren() as $index => $guardianRegisterChild) {
  733. $existingChild = $this->childRepository->findByGuardianAndNormalizedName($guardian, $guardianRegisterChild->getName());
  734. if ($existingChild) {
  735. $matches[$index] = [
  736. 'name' => $existingChild->getFullname(),
  737. 'classLabel' => $classLabels[$existingChild->getClass()] ?? $existingChild->getClass(),
  738. ];
  739. }
  740. }
  741. return $matches;
  742. }
  743. public function findSameAccounts(GuardianRegister $guardianRegister)
  744. {
  745. $foundByEmail = 0;
  746. $foundByPhone = 0;
  747. $guardianId = 0;
  748. if ($guardian = $this->guardianRepository->findOneBy(['email' => $guardianRegister->getEmail()])) {
  749. $foundByEmail++;
  750. $guardianId = $guardian->getId();
  751. }
  752. $phoneToSearch = $guardianRegister->getPhone();
  753. // dump($phoneToSearch);
  754. $phoneToSearch = str_replace('+3706', '', $phoneToSearch);
  755. // dump($phoneToSearch);
  756. // die();
  757. $query = $this->guardianRepository->createQueryBuilder('g');
  758. $result = $query->andWhere('g.phoneNumber like :phone')
  759. ->setParameter('phone', "%{$phoneToSearch}")
  760. ->getQuery()
  761. ->getResult();
  762. if ($result) {
  763. $foundByPhone += count($result);
  764. $guardianId = $result[0]->getId();
  765. // dump($guardianId);
  766. // dump($foundByPhone);
  767. // dump($phoneToSearch);
  768. // die();
  769. }
  770. $query = $this->childRepository->createQueryBuilder('g');
  771. $result = $query->andWhere('g.phoneNumber like :phone')
  772. ->setParameter('phone', "%{$phoneToSearch}")
  773. ->getQuery()
  774. ->getResult();
  775. if ($result) {
  776. $foundByPhone += count($result);
  777. $guardianId = $result[0]->getGuardian()->getId();
  778. }
  779. $phone = $guardianRegister->getGuardianPhone();
  780. if ($phone) {
  781. $phoneToSearch = $phone;
  782. $phoneToSearch = str_replace('+3706', '', $phoneToSearch);
  783. $phoneToSearch = str_replace('3706', '', $phoneToSearch);
  784. // $pattern = '/^86/i';
  785. // $phoneToSearch = preg_replace($pattern, '', $phoneToSearch);
  786. $query = $this->guardianRepository->createQueryBuilder('g');
  787. $result = $query->andWhere('g.phoneNumber like :phone')
  788. ->setParameter('phone', "%{$phoneToSearch}")
  789. ->getQuery()
  790. ->getResult();
  791. if ($result) {
  792. $foundByPhone += count($result);
  793. $guardianId = $result[0]->getId();
  794. }
  795. $query = $this->childRepository->createQueryBuilder('g');
  796. $result = $query->andWhere('g.phoneNumber like :phone')
  797. ->setParameter('phone', "%{$phoneToSearch}")
  798. ->getQuery()
  799. ->getResult();
  800. if ($result) {
  801. $foundByPhone += count($result);
  802. $guardianId = $result[0]->getGuardian()->getId();
  803. }
  804. }
  805. return ['count' => $foundByEmail + $foundByPhone, 'id' => $guardianId];
  806. }
  807. /**
  808. * @Route("/{id}/editRaw", name="guardian_register_edit_raw", methods={"GET","POST"})
  809. * @Security("is_granted('ROLE_ADMIN') and is_granted('IS_AUTHENTICATED_FULLY')")
  810. */
  811. public function editRaw(Request $request, GuardianRegister $guardianRegister): Response
  812. {
  813. $childName = 'Vardas1';
  814. if (!$guardianRegister->getIsGuardian()) {
  815. $childName = "{$guardianRegister->getName()} {$guardianRegister->getLastname()}";
  816. }
  817. if (!$guardianRegister->getGuardianRegisterChildren()->count()) {
  818. $guardianRegisterChild = new GuardianRegisterChild();
  819. $guardianRegisterChild->setName($childName);
  820. $guardianRegisterChild->setClass(8);
  821. $guardianRegisterChild->setGuardianRegister($guardianRegister);
  822. $guardianRegisterChildPreference = new GuardianRegisterChildPreference();
  823. $guardianRegisterChildPreference->setDuration(60);
  824. $guardianRegisterChildPreference->setAmount(2);
  825. $guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
  826. $guardianRegisterChild->addGuardianRegisterChildPreference($guardianRegisterChildPreference);
  827. $guardianRegister->addGuardianRegisterChild($guardianRegisterChild);
  828. }
  829. $form = $this->createForm(GuardianRegisterRawType::class, $guardianRegister);
  830. $oldStatus = $guardianRegister->getStatus();
  831. $originalGuardianRegisterChildren = $guardianRegister->getGuardianRegisterChildren()->getValues();
  832. $originalGuardianRegisterChildrenPreferences = [];
  833. foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
  834. $originalGuardianRegisterChildrenPreferences = array_merge($originalGuardianRegisterChildrenPreferences, $guardianRegisterChild->getGuardianRegisterChildPreferences()->getValues());
  835. }
  836. $form->handleRequest($request);
  837. if ($form->isSubmitted() && $form->isValid()) {
  838. //remove
  839. foreach ($originalGuardianRegisterChildrenPreferences as $originalGuardianRegisterChildrenPreference) {
  840. $delete = true;
  841. foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
  842. if ($guardianRegisterChild->getGuardianRegisterChildPreferences()->contains($originalGuardianRegisterChildrenPreference)) {
  843. $delete = false;
  844. }
  845. }
  846. if ($delete) {
  847. $this->entityManager->remove($originalGuardianRegisterChildrenPreference);
  848. }
  849. }
  850. foreach ($originalGuardianRegisterChildren as $originalGuardianRegisterChild) {
  851. if (!$guardianRegister->getGuardianRegisterChildren()->contains($originalGuardianRegisterChild)) {
  852. $this->entityManager->remove($originalGuardianRegisterChild);
  853. }
  854. }
  855. //add
  856. foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
  857. foreach ($guardianRegisterChild->getGuardianRegisterChildPreferences() as $guardianRegisterChildPreference) {
  858. $guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
  859. $this->entityManager->persist($guardianRegisterChildPreference);
  860. }
  861. $guardianRegisterChild->setGuardianRegister($guardianRegister);
  862. $this->entityManager->persist($guardianRegisterChild);
  863. }
  864. $this->handleStatusChange($guardianRegister, $oldStatus);
  865. $this->entityManager->persist($guardianRegister);
  866. $this->entityManager->flush();
  867. return $this->redirectToRoute('guardian_registrations_index', [], Response::HTTP_SEE_OTHER);
  868. }
  869. return $this->renderForm('guardian_register/admin/_form.html.twig', [
  870. 'form' => $form,
  871. 'raw' => true,
  872. 'returningChildMatches' => $this->resolveReturningChildMatches($guardianRegister)
  873. ]);
  874. }
  875. public function sendSuccessEmail(GuardianRegister $guardianRegister)
  876. {
  877. // $this->messageBus->dispatch(new SendMailMessage($guardianRegister->getEmail(), '', '', [], 'REGISTER_NOTIF_0'));
  878. }
  879. public function handleStatusChange(GuardianRegister $guardianRegister, $oldStatus)
  880. {
  881. if ($guardianRegister->isFlagEarlyPayment()) {
  882. if (!$guardianRegister->getEarlyPaymentToken() || !$guardianRegister->getEarlyPaymentTokenValidTo() || $guardianRegister->getEarlyPaymentTokenValidTo() < new \DateTime()) {
  883. $randomString = $this->createRandomString();
  884. while ($this->guardianRegisterRepository->findOneBy(['earlyPaymentToken' => $randomString])) {
  885. $randomString = $this->createRandomString();
  886. }
  887. $guardianRegister->setEarlyPaymentToken($randomString);
  888. $guardianRegister->setEarlyPaymentTokenValidTo((new \DateTime())->modify('+2 days'));
  889. $guardianRegister->setEarlyPaymentSentAt(new \DateTime());
  890. $this->entityManager->persist($guardianRegister);
  891. $this->entityManager->flush();
  892. }
  893. }
  894. $foundByEmail = false;
  895. $foundByPhone = false;
  896. if ($this->guardianRepository->findOneBy(['email' => $guardianRegister->getEmail()])) {
  897. $foundByEmail = true;
  898. }
  899. if ($guardianRegister->getGuardianEmail() && $this->guardianRepository->findOneBy(['email' => $guardianRegister->getGuardianEmail()])) {
  900. $foundByEmail = true;
  901. }
  902. $phoneToSearch = $guardianRegister->getPhone();
  903. $phoneToSearch = str_replace('+3706', '', $phoneToSearch);
  904. if ($phoneToSearch && strlen($phoneToSearch) > 5) {
  905. $query = $this->guardianRepository->createQueryBuilder('g');
  906. $result = $query->andWhere('g.phoneNumber like :phone')
  907. ->setParameter('phone', "%{$phoneToSearch}%")
  908. ->getQuery()
  909. ->getResult();
  910. if ($result) {
  911. $foundByPhone = true;
  912. }
  913. $query = $this->childRepository->createQueryBuilder('g');
  914. $result = $query->andWhere('g.phoneNumber like :phone')
  915. ->setParameter('phone', "%{$phoneToSearch}%")
  916. ->getQuery()
  917. ->getResult();
  918. if ($result) {
  919. $foundByPhone = true;
  920. }
  921. }
  922. $phone = $guardianRegister->getGuardianPhone();
  923. if ($phone && strlen($phone) > 5) {
  924. $phoneToSearch = $phone;
  925. $phoneToSearch = str_replace('+3706', '', $phoneToSearch);
  926. $phoneToSearch = str_replace('3706', '', $phoneToSearch);
  927. $pattern = '/^86/i';
  928. $phoneToSearch = preg_replace($pattern, '', $phoneToSearch);
  929. $query = $this->guardianRepository->createQueryBuilder('g');
  930. $result = $query->andWhere('g.phoneNumber like :phone')
  931. ->setParameter('phone', "%{$phoneToSearch}%")
  932. ->getQuery()
  933. ->getResult();
  934. if ($result) {
  935. $foundByPhone = true;
  936. }
  937. $query = $this->childRepository->createQueryBuilder('g');
  938. $result = $query->andWhere('g.phoneNumber like :phone')
  939. ->setParameter('phone', "%{$phoneToSearch}%")
  940. ->getQuery()
  941. ->getResult();
  942. if ($result) {
  943. $foundByPhone = true;
  944. }
  945. }
  946. if ($foundByEmail && !$foundByPhone) {
  947. $guardianRegister->setCurrentGuardianFoundBy('EMAIL');
  948. }
  949. if (!$foundByEmail && $foundByPhone) {
  950. $guardianRegister->setCurrentGuardianFoundBy('TEL');
  951. }
  952. if ($foundByEmail && $foundByPhone) {
  953. $guardianRegister->setCurrentGuardianFoundBy('EMAIL&TEL');
  954. }
  955. $this->entityManager->persist($guardianRegister);
  956. $this->entityManager->flush();
  957. $newStatus = $guardianRegister->getStatus();
  958. if ($oldStatus == $newStatus) {
  959. return;
  960. }
  961. if (!$guardianRegister->getSalesPerson()) {
  962. $guardianRegister->setSalesPerson($this->getUser());
  963. if (!$guardianRegister->getSalesAssignedAt()) {
  964. $guardianRegister->setSalesAssignedAt(new \DateTime());
  965. }
  966. }
  967. $guardianRegister->setIgnoredEmailCount(0);
  968. $guardianRegister->setIgnoredAt(null);
  969. if ($newStatus == GuardianRegister::STATUS_IGNORED['value']) {
  970. if (!$guardianRegister->getIgnoredAt()) {
  971. $guardianRegister->setIgnoredAt(new \DateTime());
  972. }
  973. $this->sendIgnoredEmailAndSMS($guardianRegister);
  974. }
  975. if ($newStatus == GuardianRegister::STATUS_DECLINED['value']) {
  976. $this->sendDeclinedEmail($guardianRegister);
  977. }
  978. if ($newStatus == GuardianRegister::STATUS_LOST['value']) {
  979. $this->sendLostEmail($guardianRegister);
  980. $guardianRegister->setLostAt(new \DateTime());
  981. $this->entityManager->persist($guardianRegister);
  982. $this->entityManager->flush();
  983. $emailToSend = $guardianRegister->getEmail();
  984. if (!$guardianRegister->getIsGuardian()) {
  985. $emailToSend = $guardianRegister->getGuardianEmail();
  986. }
  987. $this->omnisendService->trackEvent($emailToSend, 'ContractLost');
  988. }
  989. if ($newStatus == GuardianRegister::STATUS_SENT['value']) {
  990. if (!$guardianRegister->getContractSentAt()) {
  991. $guardianRegister->setContractSentAt(new \DateTime());
  992. }
  993. $this->sendContractEmailAndSMS($guardianRegister);
  994. }
  995. if ($newStatus == GuardianRegister::STATUS_CONFIRMED['value']) {
  996. $plainPassword = $this->createRandomPassword();
  997. $childrenCredentials = $this->convertRegisterToGuardian($guardianRegister, $plainPassword);
  998. $this->sendSignedEmail($guardianRegister, $plainPassword, $childrenCredentials);
  999. if (!$guardianRegister->getContractSignedAt()) {
  1000. $guardianRegister->setContractSignedAt(new \DateTime());
  1001. $this->entityManager->persist($guardianRegister);
  1002. $this->entityManager->flush();
  1003. }
  1004. if (!$guardianRegister->isFlagManualAssignment()) {
  1005. $this->entityManager->refresh($guardianRegister);
  1006. $guardian = $guardianRegister->getGuardian();
  1007. $this->entityManager->refresh($guardian);
  1008. foreach ($guardian->getChildren() as $child) {
  1009. $this->entityManager->refresh($child);
  1010. $dateToSendAt = new \DateTime();
  1011. foreach ($child->getChildPreferences() as $childPreference) {
  1012. $this->entityManager->refresh($childPreference);
  1013. $this->messageBus->dispatch(new Envelope(new AssignChildPreferenceTeacherMessage($childPreference->getId()), [
  1014. DelayStamp::delayUntil($dateToSendAt),
  1015. ]));
  1016. $dateToSendAt->modify('+1 minute');
  1017. }
  1018. }
  1019. }
  1020. }
  1021. if ($newStatus == GuardianRegister::STATUS_UNTARGETED['value']) {
  1022. $emailToSend = $guardianRegister->getEmail();
  1023. if (!$guardianRegister->getIsGuardian()) {
  1024. $emailToSend = $guardianRegister->getGuardianEmail();
  1025. }
  1026. $replacements = [
  1027. '[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
  1028. '[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
  1029. ];
  1030. $this->messageBus->dispatch(new SendMailMessage($emailToSend, '', '', $replacements, 'REGISTER_FAKE'));
  1031. $this->omnisendService->trackEvent($emailToSend, 'ContractUntargeted');
  1032. }
  1033. }
  1034. public function convertRegisterToGuardian(GuardianRegister $guardianRegister, $plainPassword)
  1035. {
  1036. $childrenCredentials = "";
  1037. if ($guardianRegister->getIsGuardian()) {
  1038. $name = $guardianRegister->getName();
  1039. $lastname = $guardianRegister->getLastname();
  1040. $email = $guardianRegister->getEmail();
  1041. $phone = $guardianRegister->getPhone();
  1042. } else {
  1043. $name = $guardianRegister->getGuardianName();
  1044. $lastname = $guardianRegister->getGuardianLastname();
  1045. $email = $guardianRegister->getGuardianEmail();
  1046. $phone = $guardianRegister->getGuardianPhone();
  1047. }
  1048. $guardian = null;
  1049. if ($guardianRegister->getCurrentGuardianFoundBy() == "EMAIL" || $guardianRegister->getCurrentGuardianFoundBy() == "EMAIL&TEL") {
  1050. $guardian = $this->guardianRepository->findOneBy(['email' => $email]);
  1051. if ($guardian) {
  1052. $otherGuardianRegisters = $this->guardianRegisterRepository->findBy(['guardian' => $guardian->getId()]);
  1053. foreach ($otherGuardianRegisters as $otherGuardianRegister) {
  1054. $otherGuardianRegister->setGuardian(null);
  1055. $this->entityManager->persist($otherGuardianRegister);
  1056. $this->entityManager->flush();
  1057. }
  1058. }
  1059. }
  1060. if (!$guardian) {
  1061. $guardian = new Guardian();
  1062. }
  1063. $guardian->setGuardianRegister($guardianRegister);
  1064. $guardian->setEmail($email);
  1065. $guardian->setFullname("{$name} {$lastname}");
  1066. $guardian->setPhoneNumber($phone);
  1067. $guardian->setStatus(Guardian::STATUS_CONFIRMED['value']);
  1068. $guardian->setGuardianContract($guardianRegister->getGuardianContract());
  1069. $guardian->setComment($guardianRegister->getComment());
  1070. $guardian->setContractPricingFrom(new \DateTime());
  1071. $guardian->setEarlyPaymentDay($guardianRegister->getEarlyPaymentDay());
  1072. $guardian->setFlagEarlyPayment($guardianRegister->isFlagEarlyPayment());
  1073. $encoded = $this->userPasswordHasher->hashPassword($guardian, $plainPassword);
  1074. $guardian->setPassword($encoded);
  1075. $this->entityManager->persist($guardian);
  1076. $this->entityManager->flush($guardian);
  1077. $guardianRegister->setGuardian($guardian);
  1078. $this->entityManager->persist($guardianRegister);
  1079. $this->entityManager->flush($guardianRegister);
  1080. $this->guardianRegisterDuplicateReconciliationService->closeOpenDuplicates($guardianRegister, $phone, $email);
  1081. if ($guardianRegister->getGuardianPriceDiscount()) {
  1082. $guardianPriceDiscount = new GuardianPriceDiscount();
  1083. $guardianPriceDiscount->setGuardian($guardian);
  1084. $guardianPriceDiscount->setDateFrom(new \DateTime());
  1085. $guardianPriceDiscount->setDateTo((new \DateTime())->modify('+10 years'));
  1086. $guardianPriceDiscount->setDiscountPercent($guardianRegister->getGuardianPriceDiscount());
  1087. $this->entityManager->persist($guardianPriceDiscount);
  1088. $this->entityManager->flush();
  1089. }
  1090. // $priceChange = new PriceChange();
  1091. // $priceChange->setGuardian($guardian);
  1092. // $priceChange->setValue($guardianRegister->getPriceChange());
  1093. // $priceChange->setDateFrom(new \Datetime());
  1094. // $this->entityManager->persist($priceChange);
  1095. // $this->entityManager->flush();
  1096. foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
  1097. $child = null;
  1098. if ($guardianRegister->getCurrentGuardianFoundBy() == "EMAIL" || $guardianRegister->getCurrentGuardianFoundBy() == "EMAIL&TEL") {
  1099. $child = $this->childRepository->findByGuardianAndNormalizedName($guardian, $guardianRegisterChild->getName());
  1100. }
  1101. if (!$child) {
  1102. $child = new Child();
  1103. }
  1104. $child->setLessonsEnd(null);
  1105. $child->setGuardian($guardian);
  1106. $child->setFullname($guardianRegisterChild->getName());
  1107. $child->setClass($guardianRegisterChild->getClass());
  1108. $child->setEmail($guardianRegisterChild->getEmail());
  1109. $child->setFittingTimes($guardianRegisterChild->getFittingTimes());
  1110. $child->setFittingTimesPriority($guardianRegisterChild->getFittingTimesPriority());
  1111. $child->setFlagENG($guardianRegisterChild->getFlagENG());
  1112. $child->setFlagPL($guardianRegisterChild->getFlagPL());
  1113. $child->setFlagRU($guardianRegisterChild->getFlagRU());
  1114. $child->setFlagDyslexia($guardianRegisterChild->getFlagDyslexia());
  1115. $child->setFlagIB($guardianRegisterChild->getFlagIB());
  1116. $child->setFlagIelts($guardianRegisterChild->isFlagIelts());
  1117. $child->setFlagDyslexia($guardianRegisterChild->getFlagDyslexia());
  1118. $child->setFlagSensitive($guardianRegisterChild->getFlagSensitive());
  1119. $child->setFlagStrict($guardianRegisterChild->isFlagStrict());
  1120. $child->setVbeOver90($guardianRegisterChild->isVbeOver90());
  1121. $child->setFlagExperienceAtSchool($guardianRegisterChild->isFlagExperienceAtSchool());
  1122. $child->setExperienceOver12Month($guardianRegisterChild->isExperienceOver12Month());
  1123. $child->setGender($guardianRegisterChild->getGender());
  1124. $child->setSchool($guardianRegisterChild->getSchool());
  1125. $child->setTutorComment($guardianRegisterChild->getTutorComment());
  1126. $token = HelperUtils::createRandomString();
  1127. while ($this->childRepository->findOneBy(['loginToken' => $token])) {
  1128. $token = HelperUtils::createRandomString();
  1129. }
  1130. $child->setLoginToken($token);
  1131. if (!$guardianRegister->getIsGuardian()) {
  1132. $child->setPhoneNumber($guardianRegister->getPhone());
  1133. $child->setEmail($guardianRegister->getEmail());
  1134. }
  1135. $childPlainPwd = HelperUtils::generateLithuanianPassword(1, 4);
  1136. $encoded = $this->userPasswordHasher->hashPassword($child, $childPlainPwd);
  1137. $child->setPassword($encoded);
  1138. if (!$child->getUsername()) {
  1139. $username = HelperUtils::removeLtLetters(strtolower(explode(' ', $child->getFullname())[0] . "cor"));
  1140. if (!$username) {
  1141. $username = HelperUtils::generateLithuanianPassword(1, 0) . 'cor';
  1142. }
  1143. $counter = 1;
  1144. while ($this->childRepository->findOneBy(['username' => $username . $counter])) {
  1145. $counter++;
  1146. if ($counter == 69) {
  1147. $counter++;
  1148. }
  1149. }
  1150. $username = $username . $counter;
  1151. $child->setUsername($username);
  1152. }
  1153. $childUsername = $child->getEmail();
  1154. if (!$childUsername) {
  1155. $childUsername = $child->getUsername();
  1156. }
  1157. $childrenCredentials .= "
  1158. <b>Mokinys:</b> {$guardianRegisterChild->getName()}<br>
  1159. <b>Mokinio prisijungimo vardas:</b> {$childUsername}<br>
  1160. <b>Slaptažodis:</b> {$childPlainPwd}<br><br>
  1161. ";
  1162. $guardian->addChild($child);
  1163. $this->entityManager->persist($child);
  1164. $this->entityManager->flush();
  1165. if ($child->getEmail()) {
  1166. $this->credentialsService->sendChildrenEmailLogins($child, $childPlainPwd);
  1167. }
  1168. foreach ($guardianRegisterChild->getGuardianRegisterChildPreferences() as $guardianRegisterChildPreference) {
  1169. $childPreference = new ChildPreference();
  1170. if ($guardianRegister->isFlagManualAssignment()) {
  1171. $childPreference->setFlagManualAssignment(true);
  1172. }
  1173. $childPreference->setChild($child);
  1174. $childPreference->setFittingTimes($guardianRegisterChild->getFittingTimes());
  1175. $childPreference->setFittingTimesPriority($guardianRegisterChild->getFittingTimesPriority());
  1176. $childPreference->setComment($guardianRegisterChildPreference->getComment());
  1177. $childPreference->setDiscipline($guardianRegisterChildPreference->getDiscipline());
  1178. $childPreference->setSingleEmailDuration($guardianRegisterChildPreference->getDuration());
  1179. $childPreference->setType(Lesson::TYPE_INDIVIDUAL);
  1180. $childPreference->setEmailDuration($guardianRegisterChildPreference->getDuration() * $guardianRegisterChildPreference->getAmount());
  1181. $childPreference->setAssignedFrom('Naujas');
  1182. $child->addChildPreference($childPreference);
  1183. $this->entityManager->persist($childPreference);
  1184. $this->entityManager->persist($child);
  1185. $this->entityManager->flush();
  1186. }
  1187. }
  1188. // $this->credentialsService->sendChildrenCredentialsTokenEmail($guardian);
  1189. return $childrenCredentials;
  1190. // $this->credentialsService->sendChildrenCredentialsEmailOLD($guardian);
  1191. }
  1192. public function sendSignedEmail(GuardianRegister $guardianRegister, $plainPassword, $childrenCredentials)
  1193. {
  1194. $emailToSend = $guardianRegister->getEmail();
  1195. if (!$guardianRegister->getIsGuardian()) {
  1196. $emailToSend = $guardianRegister->getGuardianEmail();
  1197. }
  1198. $replacements = [
  1199. '[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
  1200. '[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
  1201. '[USER_EMAIL]' => $emailToSend,
  1202. '[USER_PASSWORD]' => $plainPassword,
  1203. '[CURRENT_TIME]' => (new \DateTime())->format('H:i'),
  1204. '[CHILDREN_CREDENTIALS]' => $childrenCredentials
  1205. ];
  1206. $this->messageBus->dispatch(new SendMailMessage($emailToSend, '', '', $replacements, 'REGISTER_NOTIF_4'));
  1207. }
  1208. public function createRandomPassword(): string
  1209. {
  1210. $length = rand(10, 12);
  1211. $chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
  1212. return substr(str_shuffle(str_repeat($chars, $length)), 0, $length);
  1213. }
  1214. public function sendEarlyPaymentEmailAndSMS(GuardianRegister $guardianRegister)
  1215. {
  1216. $randomString = $this->createRandomString();
  1217. while ($this->guardianRegisterRepository->findOneBy(['cancelToken' => $randomString])) {
  1218. $randomString = $this->createRandomString();
  1219. }
  1220. $guardianRegister->setCancelToken($randomString);
  1221. $guardianRegister->setContractGeneratedAt(new \Datetime());
  1222. $guardianRegister->setMarksignUrl(null);
  1223. $guardianRegister->setMarksignDocumentId(null);
  1224. $guardianRegister->setIgnoredEmailCount(0);
  1225. $guardianRegister->setStatus(GuardianRegister::STATUS_WAITING['value']);
  1226. $this->entityManager->persist($guardianRegister);
  1227. $this->entityManager->flush();
  1228. $replacements = [
  1229. '[APMOKĖJIMO_NUORODĄ]' => "https://cor.lt/ep/{$guardianRegister->getEarlyPaymentToken()}",
  1230. '[ĮDĖKITE NUORODĄ]' => "https://cor.lt/ep/{$guardianRegister->getEarlyPaymentToken()}",
  1231. '[_LINK]' => "https://cor.lt/ep/{$guardianRegister->getEarlyPaymentToken()}",
  1232. '[CURRENT_TIME]' => (new \Datetime())->format('H:i'),
  1233. '[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
  1234. '[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
  1235. '[CONTRACT_LINK]' => "https://cor.lt/c/{$guardianRegister->getContractToken()}",
  1236. 'https://app.corepetitus.lt/[CANCEL_LINK]' => $this->getParameter('domain') . $this->generateUrl('guardian_register_cancel', ['token' => $guardianRegister->getCancelToken()]),
  1237. '[CANCEL_LINK]' => $this->getParameter('domain') . $this->generateUrl('guardian_register_cancel', ['token' => $guardianRegister->getCancelToken()]),
  1238. ];
  1239. $emailToSend = $guardianRegister->getEmail();
  1240. $phoneToSend = $guardianRegister->getPhone();
  1241. if (!$guardianRegister->getIsGuardian()) {
  1242. $emailToSend = $guardianRegister->getGuardianEmail();
  1243. $phoneToSend = $guardianRegister->getGuardianPhone();
  1244. }
  1245. $this->messageBus->dispatch(new SendMailMessage($emailToSend, '', '', $replacements, 'CLIENT_PAYMENT_LINK'));
  1246. $this->messageBus->dispatch(new SendSMSMessage($phoneToSend, '', $replacements, 'CLIENT_PAYMENT_LINK'));
  1247. }
  1248. public function sendContractEmailAndSMS(GuardianRegister $guardianRegister)
  1249. {
  1250. $emailToSend = $guardianRegister->getEmail();
  1251. if (!$guardianRegister->getIsGuardian()) {
  1252. $emailToSend = $guardianRegister->getGuardianEmail();
  1253. }
  1254. $this->omnisendService->trackEvent($emailToSend, 'ContractSent');
  1255. if ($guardianRegister->getEarlyPaymentDay()) {
  1256. $this->sendEarlyPaymentEmailAndSMS($guardianRegister);
  1257. return true;
  1258. }
  1259. $randomString = $this->createRandomString();
  1260. while ($this->guardianRegisterRepository->findOneBy(['contractToken' => $randomString])) {
  1261. $randomString = $this->createRandomString();
  1262. }
  1263. $guardianRegister->setContractToken($randomString);
  1264. $randomString = $this->createRandomString();
  1265. while ($this->guardianRegisterRepository->findOneBy(['cancelToken' => $randomString])) {
  1266. $randomString = $this->createRandomString();
  1267. }
  1268. $guardianRegister->setCancelToken($randomString);
  1269. $guardianRegister->setContractGeneratedAt(new \Datetime());
  1270. $guardianRegister->setMarksignUrl(null);
  1271. $guardianRegister->getMarksignDocumentId(null);
  1272. $guardianRegister->setIgnoredEmailCount(0);
  1273. $contractSummary = "";
  1274. $weeklyCost = 0;
  1275. $totalAmount = 0;
  1276. foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
  1277. foreach ($guardianRegisterChild->getGuardianRegisterChildPreferences() as $guardianRegisterChildPreference) {
  1278. $hourCost = $this->findPriceByClass($guardianRegister, $guardianRegisterChildPreference);
  1279. $totalAmount += $guardianRegisterChildPreference->getAmount();
  1280. $preferenceWeekDuration = $guardianRegisterChildPreference->getAmount() * $guardianRegisterChildPreference->getDuration();
  1281. $preferenceWeekCost = round($preferenceWeekDuration / 60 * $hourCost, 2);
  1282. $weeklyCost += $preferenceWeekCost;
  1283. $fittingTimes = $guardianRegisterChild->getFittingTimes();
  1284. $fittingTimes = str_replace(';', ';<br>', $fittingTimes);
  1285. $contractSummary .= "Vaiko vardas: {$guardianRegisterChild->getName()}<br>
  1286. Klasė: {$guardianRegisterChild->getClass()}<br>
  1287. Disciplina: {$guardianRegisterChildPreference->getDiscipline()->getName()}<br>
  1288. Dažnis (per savaitę): {$guardianRegisterChildPreference->getAmount()}<br>
  1289. Vieno užsiėmimo trukmė (min.): {$guardianRegisterChildPreference->getDuration()}<br>
  1290. Bendra užsiėmimų trukmė per savaitę (min.): {$preferenceWeekDuration}<br>
  1291. Vietos tipas: Nuotolinis <br>
  1292. Tipas: Individualiai <br>
  1293. Mokiniui tinkami užsiėmimų laikai:<br>
  1294. {$fittingTimes}
  1295. Užsiėmimų kaina į savaitę: {$preferenceWeekCost} EUR<br><br>
  1296. ";
  1297. }
  1298. }
  1299. // if(count($guardianRegister->getGuardianRegisterChildren()) >=2 && $guardianRegister->getGuardianContract()->getId() > 25)
  1300. // {
  1301. // if($totalAmount == 2)
  1302. // {
  1303. // $contractSummary .= "Nuolaida: 10% vienam savaitiniam užsiėmimui vyresniam mokiniui.<br><br>";
  1304. // }
  1305. // elseif($totalAmount == 3)
  1306. // {
  1307. // $contractSummary .= "Nuolaida: 15% vienam savaitiniam užsiėmimui vyresniam mokiniui.<br><br>";
  1308. // }
  1309. // elseif($totalAmount > 3)
  1310. // {
  1311. // $contractSummary .= "Nuolaida: 20% vienam savaitiniam užsiėmimui vyresniam mokiniui.<br><br>";
  1312. // }
  1313. // }
  1314. $replacements = [
  1315. '[CURRENT_TIME]' => (new \Datetime())->format('H:i'),
  1316. '[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
  1317. '[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
  1318. '[CONTRACT_SUMMARY]' => $contractSummary,
  1319. '[WEEKLY_COST]' => $weeklyCost,
  1320. '[CONTRACT_LINK]' => "https://cor.lt/c/{$guardianRegister->getContractToken()}",
  1321. // '[CONTRACT_LINK]' => "https://corepetitus.tlprojektai.lt/c/{$guardianRegister->getContractToken()}",
  1322. '[CANCEL_LINK]' => $this->getParameter('domain') . $this->generateUrl('guardian_register_cancel', ['token' => $guardianRegister->getCancelToken()])
  1323. ];
  1324. $emailToSend = $guardianRegister->getEmail();
  1325. $phoneToSend = $guardianRegister->getPhone();
  1326. if (!$guardianRegister->getIsGuardian()) {
  1327. $emailToSend = $guardianRegister->getGuardianEmail();
  1328. $phoneToSend = $guardianRegister->getGuardianPhone();
  1329. }
  1330. $this->messageBus->dispatch(new SendMailMessage($emailToSend, '', '', $replacements, 'REGISTER_NOTIF_2'));
  1331. $this->messageBus->dispatch(new SendSMSMessage($phoneToSend, '', $replacements, 'REGISTER_NOTIF_2'));
  1332. }
  1333. public function findPriceByClass(GuardianRegister $guardianRegister, GuardianRegisterChildPreference $guardianRegisterChildPreference)
  1334. {
  1335. $guardianContract = $guardianRegister->getGuardianContract();
  1336. $amountFrom = 0;
  1337. foreach ($guardianRegisterChildPreference->getGuardianRegisterChild()->getGuardianRegister()->getGuardianRegisterChildren() as $guardianRegisterChild) {
  1338. foreach ($guardianRegisterChild->getGuardianRegisterChildPreferences() as $guardianRegisterChildPreferenceForAmount) {
  1339. $amountFrom += $guardianRegisterChildPreferenceForAmount->getAmount();
  1340. }
  1341. }
  1342. $class = $guardianRegisterChildPreference->getGuardianRegisterChild()->getClass();
  1343. $query = $this->guardianContractPriceClassAmountPriceRepository->createQueryBuilder('cap');
  1344. $guardianContractPriceClassAmountPrice = $query
  1345. ->leftJoin('cap.guardianContractPriceDiscipline', 'guardianContractPriceDiscipline')
  1346. ->leftJoin('guardianContractPriceDiscipline.guardianContractPrice', 'guardianContractPrice')
  1347. ->andWhere('guardianContractPrice.guardianContract = :guardianContract')
  1348. ->setParameter('guardianContract', $guardianContract)
  1349. ->andWhere(':discipline MEMBER OF guardianContractPriceDiscipline.disciplines')
  1350. ->setParameter('discipline', $guardianRegisterChildPreference->getDiscipline())
  1351. ->andWhere('cap.classFrom <= :classFrom')
  1352. ->setParameter('classFrom', $class)
  1353. ->andWhere('cap.amountFrom < :amountFrom')
  1354. ->setParameter('amountFrom', $amountFrom)
  1355. ->orderBy('cap.classFrom', 'DESC')
  1356. ->addOrderBy('cap.amountFrom', 'DESC')
  1357. ->setMaxResults(1)
  1358. ->getQuery()
  1359. ->getOneOrNullResult();
  1360. $priceAmountGuardian = $guardianContractPriceClassAmountPrice->getPrice();
  1361. if ($guardianRegister->getGuardianPriceDiscount()) {
  1362. $priceAmountGuardian *= ((100 - $guardianRegister->getGuardianPriceDiscount()) / 100);
  1363. }
  1364. return round($priceAmountGuardian, 2);
  1365. }
  1366. public function createRandomString(): string
  1367. {
  1368. $length = rand(4, 6);
  1369. $chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
  1370. return substr(str_shuffle(str_repeat($chars, $length)), 0, $length);
  1371. }
  1372. public function sendIgnoredEmailAndSMS(GuardianRegister $guardianRegister)
  1373. {
  1374. $reminderObject = $this->reminderConfigurationRepository->findOneBy(['reminder_key' => 'REGISTER_NOTIF_1']);
  1375. $replacements = [
  1376. '[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
  1377. '[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
  1378. '[CURRENT_TIME]' => (new \DateTime())->format('H:i'),
  1379. ];
  1380. $emailToSend = $guardianRegister->getEmail();
  1381. $phoneToSend = $guardianRegister->getPhone();
  1382. $this->messageBus->dispatch(new SendMailMessage($emailToSend, '', '', $replacements, 'REGISTER_NOTIF_1'));
  1383. if ($guardianRegister->getGuardianEmail()) {
  1384. $emailToSend = $guardianRegister->getGuardianEmail();
  1385. $this->messageBus->dispatch(new SendMailMessage($emailToSend, '', '', $replacements, 'REGISTER_NOTIF_1'));
  1386. }
  1387. $smsContent = $reminderObject->getSmsTemplate();
  1388. $smsContent = str_replace(array_keys($replacements), array_values($replacements), $smsContent);
  1389. $this->smsService->send($phoneToSend, $smsContent, true);
  1390. if ($guardianRegister->getGuardianPhone()) {
  1391. $phoneToSend = $guardianRegister->getGuardianPhone();
  1392. $this->smsService->send($phoneToSend, $smsContent, true);
  1393. }
  1394. }
  1395. public function sendLostEmail(GuardianRegister $guardianRegister)
  1396. {
  1397. $replacements = [
  1398. '[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
  1399. '[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
  1400. '[CURRENT_TIME]' => (new \DateTime())->format('H:i'),
  1401. ];
  1402. $this->messageBus->dispatch(new SendMailMessage($guardianRegister->getEmail(), '', '', $replacements, 'REGISTER_NOTIF_5'));
  1403. }
  1404. public function sendDeclinedEmail(GuardianRegister $guardianRegister)
  1405. {
  1406. $replacements = [
  1407. '[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
  1408. '[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
  1409. '[CURRENT_TIME]' => (new \DateTime())->format('H:i'),
  1410. ];
  1411. $this->messageBus->dispatch(new SendMailMessage($guardianRegister->getEmail(), '', '', $replacements, 'REGISTER_NOTIF_3'));
  1412. }
  1413. private function changeFormat(array $data): array
  1414. {
  1415. $dayMap = [
  1416. 'Pir' => 'monday',
  1417. 'Ant' => 'tuesday',
  1418. 'Tre' => 'wednesday',
  1419. 'Ket' => 'thursday',
  1420. 'Pen' => 'friday',
  1421. 'Šeš' => 'saturday',
  1422. 'Ses' => 'saturday',
  1423. 'Sek' => 'sunday',
  1424. ];
  1425. $times = [
  1426. 'monday' => [],
  1427. 'tuesday' => [],
  1428. 'wednesday' => [],
  1429. 'thursday' => [],
  1430. 'friday' => [],
  1431. 'saturday' => [],
  1432. 'sunday' => [],
  1433. ];
  1434. $timeRows = [];
  1435. if (isset($data['weekday_time']) && is_array($data['weekday_time'])) {
  1436. $timeRows = array_merge($timeRows, $data['weekday_time']);
  1437. }
  1438. if (isset($data['weekend_time']) && is_array($data['weekend_time'])) {
  1439. $timeRows = array_merge($timeRows, $data['weekend_time']);
  1440. }
  1441. foreach ($timeRows as $row) {
  1442. if (!is_array($row)) {
  1443. continue;
  1444. }
  1445. $dayKey = $dayMap[$row['day'] ?? ''] ?? null;
  1446. $rawTime = $row['time'] ?? '';
  1447. if (!$dayKey || !$rawTime) {
  1448. continue;
  1449. }
  1450. $time = trim($rawTime);
  1451. $time = preg_replace('/\s*[–-]\s*/u', ' - ', $time);
  1452. $time = preg_replace('/:00\b/', '', $time);
  1453. $time = trim($time);
  1454. if ($time !== '' && !in_array($time, $times[$dayKey], true)) {
  1455. $times[$dayKey][] = $time;
  1456. }
  1457. }
  1458. $data['times'] = $times;
  1459. unset($data['weekday_time'], $data['weekend_time']);
  1460. return $data;
  1461. }
  1462. }