<?php
namespace App\Controller\GuardianRegister;
use App\Entity\Child;
use App\Entity\ChildPreference;
use App\Entity\Guardian;
use App\Entity\Guardian\GuardianPriceDiscount;
use App\Entity\GuardianRegister\GuardianRegister;
use App\Entity\GuardianRegister\GuardianRegisterChild;
use App\Entity\GuardianRegister\GuardianRegisterChildPreference;
use App\Entity\Lesson;
use App\Form\GuardianRegister\GuardianRegisterRawType;
use App\Form\GuardianRegister\GuardianRegisterType;
use App\Message\AssignChildPreferenceTeacherMessage;
use App\Message\SendMailMessage;
use App\Message\SendSMSMessage;
use App\Repository\AdminRepository;
use App\Repository\ChildRepository;
use App\Repository\ConfigurationRepository;
use App\Repository\Guardian\GuardianContractPriceClassAmountPriceRepository;
use App\Repository\GuardianRegister\GuardianRegisterRepository;
use App\Repository\GuardianRepository;
use App\Repository\PaymentRepository;
use App\Repository\ReminderConfigurationRepository;
use App\Service\ChildPreferenceService;
use App\Service\CredentialsService;
use App\Service\GuardianRegisterDuplicateReconciliationService;
use App\Service\OmnisendService;
use App\Service\SmsService;
use App\Utils\HelperUtils;
use App\Utils\RestUtils;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Messenger\Stamp\DelayStamp;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
/**
* @Route("/guardian_register")
*/
class GuardianRegisterAdminController extends AbstractController
{
private SmsService $smsService;
private EntityManagerInterface $entityManager;
private ReminderConfigurationRepository $reminderConfigurationRepository;
private GuardianRegisterRepository $guardianRegisterRepository;
private ConfigurationRepository $configurationRepository;
private UserPasswordEncoderInterface $passwordEncoder;
private GuardianRepository $guardianRepository;
private ChildRepository $childRepository;
private GuardianContractPriceClassAmountPriceRepository $guardianContractPriceClassAmountPriceRepository;
private CredentialsService $credentialsService;
private MessageBusInterface $messageBus;
private ChildPreferenceService $childPreferenceService;
private UserPasswordHasherInterface $userPasswordHasher;
private OmnisendService $omnisendService;
private GuardianRegisterDuplicateReconciliationService $guardianRegisterDuplicateReconciliationService;
public function __construct(
UserPasswordEncoderInterface $passwordEncoder,
GuardianRepository $guardianRepository,
ChildRepository $childRepository,
SmsService $smsService,
EntityManagerInterface $entityManager,
ConfigurationRepository $configurationRepository,
GuardianRegisterRepository $guardianRegisterRepository,
ReminderConfigurationRepository $reminderConfigurationRepository,
GuardianContractPriceClassAmountPriceRepository $guardianContractPriceClassAmountPriceRepository,
CredentialsService $credentialsService,
MessageBusInterface $messageBus,
ChildPreferenceService $childPreferenceService,
UserPasswordHasherInterface $userPasswordHasher,
OmnisendService $omnisendService,
GuardianRegisterDuplicateReconciliationService $guardianRegisterDuplicateReconciliationService
) {
$this->smsService = $smsService;
$this->entityManager = $entityManager;
$this->reminderConfigurationRepository = $reminderConfigurationRepository;
$this->guardianRegisterRepository = $guardianRegisterRepository;
$this->configurationRepository = $configurationRepository;
$this->passwordEncoder = $passwordEncoder;
$this->guardianRepository = $guardianRepository;
$this->childRepository = $childRepository;
$this->guardianContractPriceClassAmountPriceRepository = $guardianContractPriceClassAmountPriceRepository;
$this->credentialsService = $credentialsService;
$this->messageBus = $messageBus;
$this->childPreferenceService = $childPreferenceService;
$this->userPasswordHasher = $userPasswordHasher;
$this->omnisendService = $omnisendService;
$this->guardianRegisterDuplicateReconciliationService = $guardianRegisterDuplicateReconciliationService;
}
/**
* @Route("/guardian-google-conversion_csv.csv", name="guardian_google_conversion_csv", methods={"GET", "POST"})
*/
public function guardian_google_conversion_csv(Request $request, GuardianRegisterRepository $guardianRegisterRepository, PaymentRepository $paymentRepository): Response
{
// ===============================
// BASIC AUTH CONFIGURATION
// ===============================
$username = 'corepetitus_google_conversion_csv';
$password = 'vTvCzW7eBTT40rVxTkgKmHN3vUtctyJ8';
// ===============================
// AUTH CHECK
// ===============================
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Protected CSV"');
header('HTTP/1.0 401 Unauthorized');
echo "Authentication required.";
exit;
} else {
if ($_SERVER['PHP_AUTH_USER'] !== $username || $_SERVER['PHP_AUTH_PW'] !== $password) {
header('WWW-Authenticate: Basic realm="Protected CSV"');
header('HTTP/1.0 401 Unauthorized');
echo "Invalid credentials.";
exit;
}
}
// if($request->query->get('token') != '9sd1f8sdf18af8ergftgh1e58hrsegawfgs1h8as8gf1asdf')
// {
// die();
// }
//Email,Phone Number,Google Click ID,Conversion Name,Conversion Time,Conversion Value,Conversion Currency
// $f = fopen('php://memory', 'w');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="google_ads.csv"');
$f = fopen('php://output', 'w');
// $data = [0=>'Parameters:TimeZone=Europe/Vilnius'];
// fputcsv($f, $data, ';');
fputcsv($f, [
'Email',
'Phone Number',
'Google Click ID',
'Conversion Name',
'Conversion Time',
'Conversion Value',
'Conversion Currency',
'Ad User Data',
'Ad Personalization',
], ',');
$dateFrom = new \DateTime();
$dateFrom->setTime(8,50,0);
$dateFrom->modify('-1 days');
$dateTo = new \DateTime();
$dateTo->setTime(9,10,0);
$guardianRegistrations = $guardianRegisterRepository
->createQueryBuilder('gr')
->leftJoin('gr.guardian', 'g')
->andWhere('g.status = :status')
->setParameter('status', Guardian::STATUS_CONFIRMED['value'])
->andWhere('gr.contractSignedAt >= :dateFrom')
->andWhere('gr.contractSignedAt <= :dateto')
->setParameter('dateFrom', $dateFrom)
->setParameter('dateto', $dateTo)
->getQuery()
->getResult();
//vakar 8.50 ir siandien 9.10
foreach ($guardianRegistrations as $guardianRegister) {
$guardian = $guardianRegister->getGuardian();
if (strlen($guardianRegister->getLandingPage())) {
$parts = parse_url($guardianRegister->getLandingPage());
parse_str($parts['query'] ?? '', $params);
$gclid = $params['gclid'] ?? '';
}
else
{
$gclid = '';
}
$payment = $paymentRepository->createQueryBuilder('p')
->andWhere('p.guardian = :guardian')
->setParameter('guardian', $guardian)
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
$amount = 10;
if($payment)
{
$amount = $payment->getAmount();
}
if ($amount < 0) {
continue;
}
$data = [
0 => $guardian->getEmail(),
1 => $guardian->getPhoneNumber(),
2 => $gclid,
3 => "TSM ACTUAL BUYERS 2025.10 offline (Upload)",
4 => $guardianRegister->getContractSignedAt()->format('Y-m-d H:i:s'),
5 => $amount,
6 => "EUR",
7 => "Granted",
8 => "Granted",
];
fputcsv($f, $data, ',');
}
fclose($f);
// fseek($f, 0);
// header('Content-Encoding: UTF-8');
// header('Content-Type: text/csv; charset=UTF-8');
// header('Content-Disposition: attachment; filename="guardian_google_conversion_csv.csv";');
// echo "\xEF\xBB\xBF"; // UTF-8 BOM
// fpassthru($f);
exit();
}
/**
* @Route("/ajax/check", name="guardian_registrations_dupe_check", methods={"GET", "POST"})
* @Security("is_granted('ROLE_ADMIN')")
*/
public function dupe_check(Request $request, GuardianRegisterRepository $guardianRegisterRepository): Response
{
$email = $request->get('email');
$phone = $request->get('phone');
$guardianRegisterRep = $guardianRegisterRepository->createQueryBuilder('g');
if($email)
{
$guardianRegisterRep->andWhere('(g.email = :email or g.guardianEmail = :email)');
$guardianRegisterRep->setParameter('email', $email);
}
if($phone)
{
$guardianRegisterRep->andWhere('(g.phone = :phone or g.guardianPhone = :phone)');
$guardianRegisterRep->setParameter('phone', $phone);
}
$result = $guardianRegisterRep->getQuery()->getResult();
$normalized = $this->get('serializer')->normalize($result, null, ['groups' => 'GuardianRegisterList']);
return new JsonResponse($normalized);
}
/**
* @Route("/recheck", name="guardian_registrations_recheck", methods={"GET", "POST"})
* @Security("is_granted('ROLE_ADMIN')")
*/
public function recheck(Request $request, GuardianRegisterRepository $guardianRegisterRepository): Response
{
$registrations = $guardianRegisterRepository->findBy(['status' => GuardianRegister::STATUS_CONFIRMED['value'], 'guardian' => null]);
dump($registrations);
die();
foreach ($registrations as $guardianRegister) {
$plainPassword = $this->createRandomPassword();
$this->convertRegisterToGuardian($guardianRegister, $plainPassword);
$this->sendSignedEmail($guardianRegister, $plainPassword);
}
exit();
}
/**
* @Route("/registrations", name="guardian_registrations_index", methods={"GET", "POST"})
* @Security("is_granted('ROLE_ADMIN')")
*/
public function applications(Request $request, AdminRepository $adminRepository): Response
{
$admins = $adminRepository->findAll();
$adminsToFront = [];
$adminsToFront['Visi'] = ['Visi'];
foreach ($admins as $admin) {
if (in_array($admin->getId(), [2, 3, 5])) {
continue;
}
if (in_array('ROLE_SALES', $admin->getRoles())) {
$adminsToFront[$admin->getFullname()] = $admin->getFullname();
}
if (15 == $admin->getId()) {
$adminsToFront[$admin->getFullname()] = $admin->getFullname();
}
}
return $this->render('guardian_register/admin/list.html.twig', [
'adminsToFront' => $adminsToFront
]);
}
/**
* @Route("/ajax", name="guardian_registrations_ajax", methods={"POST"})
* @Security("is_granted('ROLE_ADMIN') and is_granted('IS_AUTHENTICATED_FULLY')")
*/
public function ajax(Request $request, GuardianRegisterRepository $guardianRegisterRepository): Response
{
$objectRepository = $guardianRegisterRepository;
$page = $request->request->get('page');
$perPage = $request->request->get('perPage');
$page = ($page && $page > 1) ? $page : 1;
$perPage = ($perPage && $perPage > 0) ? $perPage : 10; // should change in the future
$searchFilters = $request->request->get('filters', []);
$sorters = $request->request->get('sorters', []);
$query = $objectRepository->createQueryBuilder('a');
$query->andWhere("a.status <> :ignoreStatusC")
->setParameter("ignoreStatusC", GuardianRegister::STATUS_CONFIRMED['value']);
$query->andWhere("a.guardian IS NULL OR a.status IN (:earlyPaymentStatuses)")
->setParameter("earlyPaymentStatuses", [
GuardianRegister::STATUS_WAITING['value'],
GuardianRegister::STATUS_LOST_48['value'],
GuardianRegister::STATUS_PAID_FIRST['value'],
GuardianRegister::STATUS_NOT_PAID['value'],
GuardianRegister::STATUS_NOT_PAID_48['value'],
GuardianRegister::STATUS_LEFT_EARLY_PAYMENT['value'],
]);
if (!$searchFilters || (count($searchFilters) == 1 && $searchFilters[0]['field'] == 'salesPerson.fullname')) {
$query->andWhere("a.status <> :ignoreStatus")
->setParameter("ignoreStatus", GuardianRegister::STATUS_LOST['value']);
$query->andWhere("a.status <> :ignoreStatus2")
->setParameter("ignoreStatus2", GuardianRegister::STATUS_UNTARGETED['value']);
}
$salesPersonSelected = false;
$statusFilterIsLeftEarlyPayment = false;
foreach ($searchFilters as $filter) {
if ($filter['field'] == 'salesPerson.fullname' && !empty($filter['value']) && $filter['value'] != 'Visi') {
$salesPersonSelected = true;
}
if ($filter['field'] == 'status' && ($filter['value'] ?? null) == GuardianRegister::STATUS_LEFT_EARLY_PAYMENT['value']) {
$statusFilterIsLeftEarlyPayment = true;
}
}
if ($salesPersonSelected && !$statusFilterIsLeftEarlyPayment) {
$query->andWhere("a.status <> :ignoreStatusLeftEarlyPayment")
->setParameter("ignoreStatusLeftEarlyPayment", GuardianRegister::STATUS_LEFT_EARLY_PAYMENT['value']);
}
if ($searchFilters) {
foreach ($searchFilters as $filter) {
if (isset($filter['value'])) {
if ($filter['value'] == 'Visi') {
continue;
}
$relation = explode('.', $filter['field']);
if (count($relation) == 1) {
$searchValue = (is_string($filter['value']) ? $filter['value'] : reset($filter['value']));
if ($filter['type'] == "like") {
$query->andWhere("a.{$filter['field']} {$filter['type']} :{$filter['field']}")
->setParameter("{$filter['field']}", "%{$searchValue}%");
if ($filter['field'] == 'email') {
$query->orWhere("a.guardianEmail {$filter['type']} :{$filter['field']}");
}
if ($filter['field'] == 'phone') {
$query->orWhere("a.guardianPhone {$filter['type']} :{$filter['field']}");
}
} else {
$query->andWhere("a.{$filter['field']} {$filter['type']} :{$filter['field']}")
->setParameter("{$filter['field']}", "{$searchValue}");
}
} elseif (count($relation) == 2) {
$searchValue = (is_string($filter['value']) ? $filter['value'] : reset($filter['value']));
$field = $relation[1];
$relation = $relation[0];
if ($filter['type'] == "like") {
$query
->leftJoin("a." . $relation, $relation)
->andWhere("{$relation}.{$field} {$filter['type']} :{$field}")
->setParameter("{$field}", "%{$searchValue}%");
} else {
$query
->leftJoin("a." . $relation, $relation)
->andWhere("{$relation}.{$field} {$filter['type']} :{$field}")
->setParameter("{$field}", "{$searchValue}");
}
}
}
}
}
if ($sorters) {
foreach ($sorters as $sorter) {
$query->addOrderBy('a.' . $sorter['field'], $sorter['dir']);
}
}
$count = RestUtils::getQueryCount(clone $query);
$pagesCount = ceil($count / $perPage);
$guardianRegistrations = $this->get('serializer')->normalize(RestUtils::getPaginatedResults($query->getQuery(), $page, $perPage), null, ['groups' => "GuardianRegisterList"]);
foreach ($guardianRegistrations as $key => $guardianRegistration) {
$guardianRegistrations[$key]['guardian_name'] = $guardianRegistration['isGuardian'] ? $guardianRegistration['name'] : $guardianRegistration['guardianName'];
$guardianRegistrations[$key]['email'] = $guardianRegistration['isGuardian'] ? $guardianRegistrations[$key]['email'] : $guardianRegistration['guardianEmail'];
$guardianRegistrations[$key]['phone'] = $guardianRegistration['isGuardian'] ? $guardianRegistrations[$key]['phone'] : $guardianRegistration['guardianPhone'];
$guardianRegistrations[$key]['isGuardian'] = $guardianRegistration['isGuardian'] ? 'TEV' : 'MOK';
}
return new JsonResponse([
"last_page" => $pagesCount,
"data" => $guardianRegistrations
]);
}
/**
* @Route("/new", name="guardian_register_new", methods={"GET","POST"})
* @Security("is_granted('ROLE_ADMIN') and is_granted('IS_AUTHENTICATED_FULLY')")
*/
public function new(Request $request): Response
{
$guardianRegister = new GuardianRegister();
$childName = 'Vardas1';
if (!$guardianRegister->getGuardianRegisterChildren()->count()) {
$guardianRegisterChild = new GuardianRegisterChild();
$guardianRegisterChild->setName($childName);
$guardianRegisterChild->setClass(8);
$guardianRegisterChild->setGuardianRegister($guardianRegister);
$guardianRegisterChildPreference = new GuardianRegisterChildPreference();
$guardianRegisterChildPreference->setDuration(60);
$guardianRegisterChildPreference->setAmount(2);
$guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
$guardianRegisterChild->addGuardianRegisterChildPreference($guardianRegisterChildPreference);
$guardianRegister->addGuardianRegisterChild($guardianRegisterChild);
}
$DEFAULT_GUARDIAN_PRICE_CHANGE = $this->configurationRepository->findOneBy(['name' => 'DEFAULT_GUARDIAN_PRICE_CHANGE'])->getValue();
$guardianRegister->setPriceChange($DEFAULT_GUARDIAN_PRICE_CHANGE);
$guardianRegister->setSalesPerson($this->getUser());
if (!$guardianRegister->getSalesAssignedAt()) {
$guardianRegister->setSalesAssignedAt(new \DateTime());
}
$form = $this->createForm(GuardianRegisterType::class, $guardianRegister);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
foreach ($guardianRegisterChild->getGuardianRegisterChildPreferences() as $guardianRegisterChildPreference) {
$guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
$this->entityManager->persist($guardianRegisterChildPreference);
}
$guardianRegisterChild->setGuardianRegister($guardianRegister);
$this->entityManager->persist($guardianRegisterChild);
}
$this->handleStatusChange($guardianRegister, '');
$this->entityManager->persist($guardianRegister);
$this->entityManager->flush();
$this->sendSuccessEmail($guardianRegister);
return $this->redirectToRoute('guardian_registrations_index');
}
return $this->renderForm('guardian_register/admin/new.html.twig', [
'form' => $form,
'raw' => false,
'returningChildMatches' => $this->resolveReturningChildMatches($guardianRegister)
]);
}
/**
* @Route("/ajax/{id}/edit", name="guardian_register_ajax_edit", methods={"POST"})
* @Security("is_granted('ROLE_ADMIN') and is_granted('IS_AUTHENTICATED_FULLY')")
*/
public function ajaxEdit(GuardianRegister $guardianRegister, Request $request): Response
{
if (!$guardianRegister) {
$error = new JsonResponse();
$error
->setStatusCode(Response::HTTP_NOT_FOUND)
->setData(['status' => "error"]);
return $error;
}
$data = json_decode($request->getContent(), true);
if (isset($data['status'])) {
if (!$guardianRegister->getEmail() || $guardianRegister->getEmail() == "") {
return new JsonResponse(['status' => "Vartotojas neturi elektroninio pasto"], Response::HTTP_BAD_REQUEST);
}
}
$oldStatus = $guardianRegister->getStatus();
$guardianRegister = $this->get('serializer')->deserialize($request->getContent(), GuardianRegister::class, 'json', [
AbstractNormalizer::OBJECT_TO_POPULATE => $guardianRegister
]);
$this->handleStatusChange($guardianRegister, $oldStatus);
$this->entityManager->persist($guardianRegister);
$this->entityManager->flush();
return new JsonResponse(['status' => "OK"], Response::HTTP_OK);
}
/**
* @Route("/setSales", name="guardian_register_set_sales", methods={"GET"})
* @Security("is_granted('ROLE_ADMIN') and is_granted('IS_AUTHENTICATED_FULLY')")
*/
public function setSales(Request $request, GuardianRegisterRepository $guardianRegisterRepository): Response
{
$ids = $request->query->get('Ids');
$ids = explode(',', $ids);
$currentUser = $this->getUser();
foreach ($ids as $id) {
$guardianRegister = $guardianRegisterRepository->find($id);
if (!$guardianRegister->getSalesPerson()) {
$guardianRegister->setSalesPerson($currentUser);
if (!$guardianRegister->getSalesAssignedAt()) {
$guardianRegister->setSalesAssignedAt(new \DateTime());
}
$this->entityManager->persist($guardianRegister);
$this->entityManager->flush();
}
}
return new JsonResponse();
}
/**
* @Route("/{id}/edit", name="guardian_register_edit", methods={"GET","POST"})
* @Security("is_granted('ROLE_ADMIN') and is_granted('IS_AUTHENTICATED_FULLY')")
*/
public function edit(Request $request, GuardianRegister $guardianRegister, GuardianRegisterRepository $guardianRegisterRepository): Response
{
// if($guardianRegister->getSalesPerson() && $guardianRegister->getSalesPerson() != $this->getUser())
// {
// exit("Šią registraciją redaguoti gali tik {$this->getUser()->getFullname()}");
// }
// $date = new \DateTime();
// dump("1. {$date->format('Y-m-d H:i:s')}");
$childName = 'Vardas1';
if (!$guardianRegister->getIsGuardian()) {
$childName = "{$guardianRegister->getName()} {$guardianRegister->getLastname()}";
}
if (!$guardianRegister->getGuardianRegisterChildren()->count()) {
$guardianRegisterChild = new GuardianRegisterChild();
$guardianRegisterChild->setName($childName);
$guardianRegisterChild->setClass(8);
$guardianRegisterChild->setGuardianRegister($guardianRegister);
$guardianRegisterChildPreference = new GuardianRegisterChildPreference();
$guardianRegisterChildPreference->setDuration(60);
$guardianRegisterChildPreference->setAmount(2);
$guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
$guardianRegisterChild->addGuardianRegisterChildPreference($guardianRegisterChildPreference);
$guardianRegister->addGuardianRegisterChild($guardianRegisterChild);
}
foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
if(!$guardianRegisterChild->getGuardianRegisterChildPreferences()->count())
{
$guardianRegisterChildPreference = new GuardianRegisterChildPreference();
$guardianRegisterChildPreference->setDuration(60);
$guardianRegisterChildPreference->setAmount(2);
$guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
$guardianRegisterChild->addGuardianRegisterChildPreference($guardianRegisterChildPreference);
$guardianRegister->addGuardianRegisterChild($guardianRegisterChild);
}
}
$form = $this->createForm(GuardianRegisterType::class, $guardianRegister);
$oldStatus = $guardianRegister->getStatus();
$originalGuardianRegisterChildren = $guardianRegister->getGuardianRegisterChildren()->getValues();
$originalGuardianRegisterChildrenPreferences = [];
foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
$originalGuardianRegisterChildrenPreferences = array_merge($originalGuardianRegisterChildrenPreferences, $guardianRegisterChild->getGuardianRegisterChildPreferences()->getValues());
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $date = new \DateTime();
// dump("1. {$date->format('Y-m-d H:i:s')}");
//remove
foreach ($originalGuardianRegisterChildrenPreferences as $originalGuardianRegisterChildrenPreference) {
$delete = true;
foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
if ($guardianRegisterChild->getGuardianRegisterChildPreferences()->contains($originalGuardianRegisterChildrenPreference)) {
$delete = false;
}
}
if ($delete) {
$this->entityManager->remove($originalGuardianRegisterChildrenPreference);
}
}
// $date = new \DateTime();
// dump("2. {$date->format('Y-m-d H:i:s')}");
foreach ($originalGuardianRegisterChildren as $originalGuardianRegisterChild) {
if (!$guardianRegister->getGuardianRegisterChildren()->contains($originalGuardianRegisterChild)) {
$this->entityManager->remove($originalGuardianRegisterChild);
}
}
//add
foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
foreach ($guardianRegisterChild->getGuardianRegisterChildPreferences() as $guardianRegisterChildPreference) {
$guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
$this->entityManager->persist($guardianRegisterChildPreference);
}
$guardianRegisterChild->setGuardianRegister($guardianRegister);
$this->entityManager->persist($guardianRegisterChild);
}
// $date = new \DateTime();
// dump("3. {$date->format('Y-m-d H:i:s')}");
$this->handleStatusChange($guardianRegister, $oldStatus);
// $date = new \DateTime();
// dump("5. {$date->format('Y-m-d H:i:s')}");
$this->entityManager->persist($guardianRegister);
$this->entityManager->flush();
// $date = new \DateTime();
// dump("6. {$date->format('Y-m-d H:i:s')}");
// $date = new \DateTime();
// dump("3. {$date->format('Y-m-d H:i:s')}");
if ($form->has('change')) {
$changeClicked = $form->get('change')->isClicked();
} else {
$changeClicked = false;
}
if ($changeClicked && $guardianRegister->getCurrentGuardianFoundBy()) {
if ($guardian = $this->guardianRepository->findOneBy(['email' => $guardianRegister->getEmail()])) {
$guardian->setEmail($guardian->getEmail() . 'BACK');
}
$phoneToSearch = $guardianRegister->getPhone();
if ($phoneToSearch && strlen($phoneToSearch) > 6) {
$phoneToSearch = str_replace('+3706', '', $phoneToSearch);
$query = $this->guardianRepository->createQueryBuilder('g');
$guardians = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}%")
->getQuery()
->getResult();
foreach ($guardians as $guardian) {
$guardian->setPhoneNumber($guardian->getPhoneNumber() . 'BACK');
$this->entityManager->persist($guardian);
$this->entityManager->flush();
}
$query = $this->childRepository->createQueryBuilder('g');
/**
* @var $child Child
*/
$children = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}%")
->getQuery()
->getResult();
foreach ($children as $child) {
$child->setPhoneNumber($child->getPhoneNumber() . 'BACK');
$this->entityManager->persist($child);
$this->entityManager->flush();
}
}
$phone = $guardianRegister->getGuardianPhone();
if ($phone && strlen($phone) > 6) {
$phoneToSearch = $phone;
$phoneToSearch = str_replace('+3706', '', $phoneToSearch);
$phoneToSearch = str_replace('3706', '', $phoneToSearch);
$pattern = '/^86/i';
$phoneToSearch = preg_replace($pattern, '', $phoneToSearch);
$query = $this->guardianRepository->createQueryBuilder('g');
$guardians = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}%")
->getQuery()
->getResult();
foreach ($guardians as $guardian) {
$guardian->setPhoneNumber($guardian->getPhoneNumber() . 'BACK');
$this->entityManager->persist($guardian);
$this->entityManager->flush();
}
$query = $this->childRepository->createQueryBuilder('g');
$children = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}%")
->getQuery()
->getResult();
foreach ($children as $child) {
$child->setPhoneNumber($child->getPhoneNumber() . 'BACK');
$this->entityManager->persist($child);
$this->entityManager->flush();
}
}
}
$foundByEmail = false;
$foundByPhone = false;
if ($this->guardianRepository->findOneBy(['email' => $guardianRegister->getEmail()])) {
$foundByEmail = true;
}
if ($guardianRegister->getGuardianEmail() && $this->guardianRepository->findOneBy(['email' => $guardianRegister->getGuardianEmail()])) {
$foundByEmail = true;
}
$phoneToSearch = $guardianRegister->getPhone();
$phoneToSearch = str_replace('+3706', '', $phoneToSearch);
if ($phoneToSearch && strlen($phoneToSearch) > 6) {
$query = $this->guardianRepository->createQueryBuilder('g');
$result = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}%")
->getQuery()
->getResult();
if ($result) {
$foundByPhone = true;
}
$query = $this->childRepository->createQueryBuilder('g');
$result = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}%")
->getQuery()
->getResult();
if ($result) {
$foundByPhone = true;
}
}
$phone = $guardianRegister->getGuardianPhone();
if ($phone && strlen($phone) > 6) {
$phoneToSearch = $phone;
$phoneToSearch = str_replace('+3706', '', $phoneToSearch);
$phoneToSearch = str_replace('3706', '', $phoneToSearch);
$pattern = '/^86/i';
$phoneToSearch = preg_replace($pattern, '', $phoneToSearch);
$query = $this->guardianRepository->createQueryBuilder('g');
$result = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}%")
->getQuery()
->getResult();
if ($result) {
$foundByPhone = true;
}
$query = $this->childRepository->createQueryBuilder('g');
$result = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}%")
->getQuery()
->getResult();
if ($result) {
$foundByPhone = true;
}
}
if ($foundByEmail && !$foundByPhone) {
$guardianRegister->setCurrentGuardianFoundBy('EMAIL');
}
if (!$foundByEmail && $foundByPhone) {
$guardianRegister->setCurrentGuardianFoundBy('TEL');
}
if ($foundByEmail && $foundByPhone) {
$guardianRegister->setCurrentGuardianFoundBy('EMAIL&TEL');
}
$this->entityManager->persist($guardianRegister);
$this->entityManager->flush();
return $this->redirectToRoute('guardian_registrations_index', [], Response::HTTP_SEE_OTHER);
}
$registrationData = $guardianRegister->getData() ?? json_decode($guardianRegister->getData());
if (!empty($guardianRegister->getData())) {
$registrationData = $this->changeFormat($registrationData);
}
$guardianRegisterRep = $guardianRegisterRepository->createQueryBuilder('g');
$result = $guardianRegisterRep
->andWhere('(g.email = :email or g.guardianEmail = :email) and g.id != :id')
->orWhere('(g.phone = :phone or g.guardianPhone = :phone) and g.id != :id')
->setParameter('email', $guardianRegister->getEmail())
->setParameter('id', $guardianRegister->getId())
->setParameter('phone', $guardianRegister->getPhone())
->andWhere('g.createdAt >= :createdAt')
->setParameter('createdAt', ($guardianRegister->getCreatedAt())->modify('-7 days'))
->getQuery()
->getResult();
return $this->renderForm('guardian_register/admin/edit.html.twig', [
'form' => $form,
'raw' => false,
'same_accounts_count' => $this->findSameAccounts($guardianRegister)['count'],
'same_accounts_id' => $this->findSameAccounts($guardianRegister)['id'],
'registrationData' => $registrationData,
'duplicateRegistrations' => $result,
'returningChildMatches' => $this->resolveReturningChildMatches($guardianRegister)
]);
}
private function resolveReturningChildMatches(GuardianRegister $guardianRegister): array
{
$matches = [];
if (!in_array($guardianRegister->getCurrentGuardianFoundBy(), ['EMAIL', 'EMAIL&TEL'], true)) {
return $matches;
}
$email = $guardianRegister->getIsGuardian() ? $guardianRegister->getEmail() : $guardianRegister->getGuardianEmail();
$guardian = $email ? $this->guardianRepository->findOneBy(['email' => $email]) : null;
if (!$guardian) {
return $matches;
}
$classLabels = ['<1', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, '>12'];
foreach ($guardianRegister->getGuardianRegisterChildren() as $index => $guardianRegisterChild) {
$existingChild = $this->childRepository->findByGuardianAndNormalizedName($guardian, $guardianRegisterChild->getName());
if ($existingChild) {
$matches[$index] = [
'name' => $existingChild->getFullname(),
'classLabel' => $classLabels[$existingChild->getClass()] ?? $existingChild->getClass(),
];
}
}
return $matches;
}
public function findSameAccounts(GuardianRegister $guardianRegister)
{
$foundByEmail = 0;
$foundByPhone = 0;
$guardianId = 0;
if ($guardian = $this->guardianRepository->findOneBy(['email' => $guardianRegister->getEmail()])) {
$foundByEmail++;
$guardianId = $guardian->getId();
}
$phoneToSearch = $guardianRegister->getPhone();
// dump($phoneToSearch);
$phoneToSearch = str_replace('+3706', '', $phoneToSearch);
// dump($phoneToSearch);
// die();
$query = $this->guardianRepository->createQueryBuilder('g');
$result = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}")
->getQuery()
->getResult();
if ($result) {
$foundByPhone += count($result);
$guardianId = $result[0]->getId();
// dump($guardianId);
// dump($foundByPhone);
// dump($phoneToSearch);
// die();
}
$query = $this->childRepository->createQueryBuilder('g');
$result = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}")
->getQuery()
->getResult();
if ($result) {
$foundByPhone += count($result);
$guardianId = $result[0]->getGuardian()->getId();
}
$phone = $guardianRegister->getGuardianPhone();
if ($phone) {
$phoneToSearch = $phone;
$phoneToSearch = str_replace('+3706', '', $phoneToSearch);
$phoneToSearch = str_replace('3706', '', $phoneToSearch);
// $pattern = '/^86/i';
// $phoneToSearch = preg_replace($pattern, '', $phoneToSearch);
$query = $this->guardianRepository->createQueryBuilder('g');
$result = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}")
->getQuery()
->getResult();
if ($result) {
$foundByPhone += count($result);
$guardianId = $result[0]->getId();
}
$query = $this->childRepository->createQueryBuilder('g');
$result = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}")
->getQuery()
->getResult();
if ($result) {
$foundByPhone += count($result);
$guardianId = $result[0]->getGuardian()->getId();
}
}
return ['count' => $foundByEmail + $foundByPhone, 'id' => $guardianId];
}
/**
* @Route("/{id}/editRaw", name="guardian_register_edit_raw", methods={"GET","POST"})
* @Security("is_granted('ROLE_ADMIN') and is_granted('IS_AUTHENTICATED_FULLY')")
*/
public function editRaw(Request $request, GuardianRegister $guardianRegister): Response
{
$childName = 'Vardas1';
if (!$guardianRegister->getIsGuardian()) {
$childName = "{$guardianRegister->getName()} {$guardianRegister->getLastname()}";
}
if (!$guardianRegister->getGuardianRegisterChildren()->count()) {
$guardianRegisterChild = new GuardianRegisterChild();
$guardianRegisterChild->setName($childName);
$guardianRegisterChild->setClass(8);
$guardianRegisterChild->setGuardianRegister($guardianRegister);
$guardianRegisterChildPreference = new GuardianRegisterChildPreference();
$guardianRegisterChildPreference->setDuration(60);
$guardianRegisterChildPreference->setAmount(2);
$guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
$guardianRegisterChild->addGuardianRegisterChildPreference($guardianRegisterChildPreference);
$guardianRegister->addGuardianRegisterChild($guardianRegisterChild);
}
$form = $this->createForm(GuardianRegisterRawType::class, $guardianRegister);
$oldStatus = $guardianRegister->getStatus();
$originalGuardianRegisterChildren = $guardianRegister->getGuardianRegisterChildren()->getValues();
$originalGuardianRegisterChildrenPreferences = [];
foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
$originalGuardianRegisterChildrenPreferences = array_merge($originalGuardianRegisterChildrenPreferences, $guardianRegisterChild->getGuardianRegisterChildPreferences()->getValues());
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//remove
foreach ($originalGuardianRegisterChildrenPreferences as $originalGuardianRegisterChildrenPreference) {
$delete = true;
foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
if ($guardianRegisterChild->getGuardianRegisterChildPreferences()->contains($originalGuardianRegisterChildrenPreference)) {
$delete = false;
}
}
if ($delete) {
$this->entityManager->remove($originalGuardianRegisterChildrenPreference);
}
}
foreach ($originalGuardianRegisterChildren as $originalGuardianRegisterChild) {
if (!$guardianRegister->getGuardianRegisterChildren()->contains($originalGuardianRegisterChild)) {
$this->entityManager->remove($originalGuardianRegisterChild);
}
}
//add
foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
foreach ($guardianRegisterChild->getGuardianRegisterChildPreferences() as $guardianRegisterChildPreference) {
$guardianRegisterChildPreference->setGuardianRegisterChild($guardianRegisterChild);
$this->entityManager->persist($guardianRegisterChildPreference);
}
$guardianRegisterChild->setGuardianRegister($guardianRegister);
$this->entityManager->persist($guardianRegisterChild);
}
$this->handleStatusChange($guardianRegister, $oldStatus);
$this->entityManager->persist($guardianRegister);
$this->entityManager->flush();
return $this->redirectToRoute('guardian_registrations_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('guardian_register/admin/_form.html.twig', [
'form' => $form,
'raw' => true,
'returningChildMatches' => $this->resolveReturningChildMatches($guardianRegister)
]);
}
public function sendSuccessEmail(GuardianRegister $guardianRegister)
{
// $this->messageBus->dispatch(new SendMailMessage($guardianRegister->getEmail(), '', '', [], 'REGISTER_NOTIF_0'));
}
public function handleStatusChange(GuardianRegister $guardianRegister, $oldStatus)
{
if ($guardianRegister->isFlagEarlyPayment()) {
if (!$guardianRegister->getEarlyPaymentToken() || !$guardianRegister->getEarlyPaymentTokenValidTo() || $guardianRegister->getEarlyPaymentTokenValidTo() < new \DateTime()) {
$randomString = $this->createRandomString();
while ($this->guardianRegisterRepository->findOneBy(['earlyPaymentToken' => $randomString])) {
$randomString = $this->createRandomString();
}
$guardianRegister->setEarlyPaymentToken($randomString);
$guardianRegister->setEarlyPaymentTokenValidTo((new \DateTime())->modify('+2 days'));
$guardianRegister->setEarlyPaymentSentAt(new \DateTime());
$this->entityManager->persist($guardianRegister);
$this->entityManager->flush();
}
}
$foundByEmail = false;
$foundByPhone = false;
if ($this->guardianRepository->findOneBy(['email' => $guardianRegister->getEmail()])) {
$foundByEmail = true;
}
if ($guardianRegister->getGuardianEmail() && $this->guardianRepository->findOneBy(['email' => $guardianRegister->getGuardianEmail()])) {
$foundByEmail = true;
}
$phoneToSearch = $guardianRegister->getPhone();
$phoneToSearch = str_replace('+3706', '', $phoneToSearch);
if ($phoneToSearch && strlen($phoneToSearch) > 5) {
$query = $this->guardianRepository->createQueryBuilder('g');
$result = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}%")
->getQuery()
->getResult();
if ($result) {
$foundByPhone = true;
}
$query = $this->childRepository->createQueryBuilder('g');
$result = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}%")
->getQuery()
->getResult();
if ($result) {
$foundByPhone = true;
}
}
$phone = $guardianRegister->getGuardianPhone();
if ($phone && strlen($phone) > 5) {
$phoneToSearch = $phone;
$phoneToSearch = str_replace('+3706', '', $phoneToSearch);
$phoneToSearch = str_replace('3706', '', $phoneToSearch);
$pattern = '/^86/i';
$phoneToSearch = preg_replace($pattern, '', $phoneToSearch);
$query = $this->guardianRepository->createQueryBuilder('g');
$result = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}%")
->getQuery()
->getResult();
if ($result) {
$foundByPhone = true;
}
$query = $this->childRepository->createQueryBuilder('g');
$result = $query->andWhere('g.phoneNumber like :phone')
->setParameter('phone', "%{$phoneToSearch}%")
->getQuery()
->getResult();
if ($result) {
$foundByPhone = true;
}
}
if ($foundByEmail && !$foundByPhone) {
$guardianRegister->setCurrentGuardianFoundBy('EMAIL');
}
if (!$foundByEmail && $foundByPhone) {
$guardianRegister->setCurrentGuardianFoundBy('TEL');
}
if ($foundByEmail && $foundByPhone) {
$guardianRegister->setCurrentGuardianFoundBy('EMAIL&TEL');
}
$this->entityManager->persist($guardianRegister);
$this->entityManager->flush();
$newStatus = $guardianRegister->getStatus();
if ($oldStatus == $newStatus) {
return;
}
if (!$guardianRegister->getSalesPerson()) {
$guardianRegister->setSalesPerson($this->getUser());
if (!$guardianRegister->getSalesAssignedAt()) {
$guardianRegister->setSalesAssignedAt(new \DateTime());
}
}
$guardianRegister->setIgnoredEmailCount(0);
$guardianRegister->setIgnoredAt(null);
if ($newStatus == GuardianRegister::STATUS_IGNORED['value']) {
if (!$guardianRegister->getIgnoredAt()) {
$guardianRegister->setIgnoredAt(new \DateTime());
}
$this->sendIgnoredEmailAndSMS($guardianRegister);
}
if ($newStatus == GuardianRegister::STATUS_DECLINED['value']) {
$this->sendDeclinedEmail($guardianRegister);
}
if ($newStatus == GuardianRegister::STATUS_LOST['value']) {
$this->sendLostEmail($guardianRegister);
$guardianRegister->setLostAt(new \DateTime());
$this->entityManager->persist($guardianRegister);
$this->entityManager->flush();
$emailToSend = $guardianRegister->getEmail();
if (!$guardianRegister->getIsGuardian()) {
$emailToSend = $guardianRegister->getGuardianEmail();
}
$this->omnisendService->trackEvent($emailToSend, 'ContractLost');
}
if ($newStatus == GuardianRegister::STATUS_SENT['value']) {
if (!$guardianRegister->getContractSentAt()) {
$guardianRegister->setContractSentAt(new \DateTime());
}
$this->sendContractEmailAndSMS($guardianRegister);
}
if ($newStatus == GuardianRegister::STATUS_CONFIRMED['value']) {
$plainPassword = $this->createRandomPassword();
$childrenCredentials = $this->convertRegisterToGuardian($guardianRegister, $plainPassword);
$this->sendSignedEmail($guardianRegister, $plainPassword, $childrenCredentials);
if (!$guardianRegister->getContractSignedAt()) {
$guardianRegister->setContractSignedAt(new \DateTime());
$this->entityManager->persist($guardianRegister);
$this->entityManager->flush();
}
if (!$guardianRegister->isFlagManualAssignment()) {
$this->entityManager->refresh($guardianRegister);
$guardian = $guardianRegister->getGuardian();
$this->entityManager->refresh($guardian);
foreach ($guardian->getChildren() as $child) {
$this->entityManager->refresh($child);
$dateToSendAt = new \DateTime();
foreach ($child->getChildPreferences() as $childPreference) {
$this->entityManager->refresh($childPreference);
$this->messageBus->dispatch(new Envelope(new AssignChildPreferenceTeacherMessage($childPreference->getId()), [
DelayStamp::delayUntil($dateToSendAt),
]));
$dateToSendAt->modify('+1 minute');
}
}
}
}
if ($newStatus == GuardianRegister::STATUS_UNTARGETED['value']) {
$emailToSend = $guardianRegister->getEmail();
if (!$guardianRegister->getIsGuardian()) {
$emailToSend = $guardianRegister->getGuardianEmail();
}
$replacements = [
'[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
'[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
];
$this->messageBus->dispatch(new SendMailMessage($emailToSend, '', '', $replacements, 'REGISTER_FAKE'));
$this->omnisendService->trackEvent($emailToSend, 'ContractUntargeted');
}
}
public function convertRegisterToGuardian(GuardianRegister $guardianRegister, $plainPassword)
{
$childrenCredentials = "";
if ($guardianRegister->getIsGuardian()) {
$name = $guardianRegister->getName();
$lastname = $guardianRegister->getLastname();
$email = $guardianRegister->getEmail();
$phone = $guardianRegister->getPhone();
} else {
$name = $guardianRegister->getGuardianName();
$lastname = $guardianRegister->getGuardianLastname();
$email = $guardianRegister->getGuardianEmail();
$phone = $guardianRegister->getGuardianPhone();
}
$guardian = null;
if ($guardianRegister->getCurrentGuardianFoundBy() == "EMAIL" || $guardianRegister->getCurrentGuardianFoundBy() == "EMAIL&TEL") {
$guardian = $this->guardianRepository->findOneBy(['email' => $email]);
if ($guardian) {
$otherGuardianRegisters = $this->guardianRegisterRepository->findBy(['guardian' => $guardian->getId()]);
foreach ($otherGuardianRegisters as $otherGuardianRegister) {
$otherGuardianRegister->setGuardian(null);
$this->entityManager->persist($otherGuardianRegister);
$this->entityManager->flush();
}
}
}
if (!$guardian) {
$guardian = new Guardian();
}
$guardian->setGuardianRegister($guardianRegister);
$guardian->setEmail($email);
$guardian->setFullname("{$name} {$lastname}");
$guardian->setPhoneNumber($phone);
$guardian->setStatus(Guardian::STATUS_CONFIRMED['value']);
$guardian->setGuardianContract($guardianRegister->getGuardianContract());
$guardian->setComment($guardianRegister->getComment());
$guardian->setContractPricingFrom(new \DateTime());
$guardian->setEarlyPaymentDay($guardianRegister->getEarlyPaymentDay());
$guardian->setFlagEarlyPayment($guardianRegister->isFlagEarlyPayment());
$encoded = $this->userPasswordHasher->hashPassword($guardian, $plainPassword);
$guardian->setPassword($encoded);
$this->entityManager->persist($guardian);
$this->entityManager->flush($guardian);
$guardianRegister->setGuardian($guardian);
$this->entityManager->persist($guardianRegister);
$this->entityManager->flush($guardianRegister);
$this->guardianRegisterDuplicateReconciliationService->closeOpenDuplicates($guardianRegister, $phone, $email);
if ($guardianRegister->getGuardianPriceDiscount()) {
$guardianPriceDiscount = new GuardianPriceDiscount();
$guardianPriceDiscount->setGuardian($guardian);
$guardianPriceDiscount->setDateFrom(new \DateTime());
$guardianPriceDiscount->setDateTo((new \DateTime())->modify('+10 years'));
$guardianPriceDiscount->setDiscountPercent($guardianRegister->getGuardianPriceDiscount());
$this->entityManager->persist($guardianPriceDiscount);
$this->entityManager->flush();
}
// $priceChange = new PriceChange();
// $priceChange->setGuardian($guardian);
// $priceChange->setValue($guardianRegister->getPriceChange());
// $priceChange->setDateFrom(new \Datetime());
// $this->entityManager->persist($priceChange);
// $this->entityManager->flush();
foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
$child = null;
if ($guardianRegister->getCurrentGuardianFoundBy() == "EMAIL" || $guardianRegister->getCurrentGuardianFoundBy() == "EMAIL&TEL") {
$child = $this->childRepository->findByGuardianAndNormalizedName($guardian, $guardianRegisterChild->getName());
}
if (!$child) {
$child = new Child();
}
$child->setLessonsEnd(null);
$child->setGuardian($guardian);
$child->setFullname($guardianRegisterChild->getName());
$child->setClass($guardianRegisterChild->getClass());
$child->setEmail($guardianRegisterChild->getEmail());
$child->setFittingTimes($guardianRegisterChild->getFittingTimes());
$child->setFittingTimesPriority($guardianRegisterChild->getFittingTimesPriority());
$child->setFlagENG($guardianRegisterChild->getFlagENG());
$child->setFlagPL($guardianRegisterChild->getFlagPL());
$child->setFlagRU($guardianRegisterChild->getFlagRU());
$child->setFlagDyslexia($guardianRegisterChild->getFlagDyslexia());
$child->setFlagIB($guardianRegisterChild->getFlagIB());
$child->setFlagIelts($guardianRegisterChild->isFlagIelts());
$child->setFlagDyslexia($guardianRegisterChild->getFlagDyslexia());
$child->setFlagSensitive($guardianRegisterChild->getFlagSensitive());
$child->setFlagStrict($guardianRegisterChild->isFlagStrict());
$child->setVbeOver90($guardianRegisterChild->isVbeOver90());
$child->setFlagExperienceAtSchool($guardianRegisterChild->isFlagExperienceAtSchool());
$child->setExperienceOver12Month($guardianRegisterChild->isExperienceOver12Month());
$child->setGender($guardianRegisterChild->getGender());
$child->setSchool($guardianRegisterChild->getSchool());
$child->setTutorComment($guardianRegisterChild->getTutorComment());
$token = HelperUtils::createRandomString();
while ($this->childRepository->findOneBy(['loginToken' => $token])) {
$token = HelperUtils::createRandomString();
}
$child->setLoginToken($token);
if (!$guardianRegister->getIsGuardian()) {
$child->setPhoneNumber($guardianRegister->getPhone());
$child->setEmail($guardianRegister->getEmail());
}
$childPlainPwd = HelperUtils::generateLithuanianPassword(1, 4);
$encoded = $this->userPasswordHasher->hashPassword($child, $childPlainPwd);
$child->setPassword($encoded);
if (!$child->getUsername()) {
$username = HelperUtils::removeLtLetters(strtolower(explode(' ', $child->getFullname())[0] . "cor"));
if (!$username) {
$username = HelperUtils::generateLithuanianPassword(1, 0) . 'cor';
}
$counter = 1;
while ($this->childRepository->findOneBy(['username' => $username . $counter])) {
$counter++;
if ($counter == 69) {
$counter++;
}
}
$username = $username . $counter;
$child->setUsername($username);
}
$childUsername = $child->getEmail();
if (!$childUsername) {
$childUsername = $child->getUsername();
}
$childrenCredentials .= "
<b>Mokinys:</b> {$guardianRegisterChild->getName()}<br>
<b>Mokinio prisijungimo vardas:</b> {$childUsername}<br>
<b>Slaptažodis:</b> {$childPlainPwd}<br><br>
";
$guardian->addChild($child);
$this->entityManager->persist($child);
$this->entityManager->flush();
if ($child->getEmail()) {
$this->credentialsService->sendChildrenEmailLogins($child, $childPlainPwd);
}
foreach ($guardianRegisterChild->getGuardianRegisterChildPreferences() as $guardianRegisterChildPreference) {
$childPreference = new ChildPreference();
if ($guardianRegister->isFlagManualAssignment()) {
$childPreference->setFlagManualAssignment(true);
}
$childPreference->setChild($child);
$childPreference->setFittingTimes($guardianRegisterChild->getFittingTimes());
$childPreference->setFittingTimesPriority($guardianRegisterChild->getFittingTimesPriority());
$childPreference->setComment($guardianRegisterChildPreference->getComment());
$childPreference->setDiscipline($guardianRegisterChildPreference->getDiscipline());
$childPreference->setSingleEmailDuration($guardianRegisterChildPreference->getDuration());
$childPreference->setType(Lesson::TYPE_INDIVIDUAL);
$childPreference->setEmailDuration($guardianRegisterChildPreference->getDuration() * $guardianRegisterChildPreference->getAmount());
$childPreference->setAssignedFrom('Naujas');
$child->addChildPreference($childPreference);
$this->entityManager->persist($childPreference);
$this->entityManager->persist($child);
$this->entityManager->flush();
}
}
// $this->credentialsService->sendChildrenCredentialsTokenEmail($guardian);
return $childrenCredentials;
// $this->credentialsService->sendChildrenCredentialsEmailOLD($guardian);
}
public function sendSignedEmail(GuardianRegister $guardianRegister, $plainPassword, $childrenCredentials)
{
$emailToSend = $guardianRegister->getEmail();
if (!$guardianRegister->getIsGuardian()) {
$emailToSend = $guardianRegister->getGuardianEmail();
}
$replacements = [
'[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
'[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
'[USER_EMAIL]' => $emailToSend,
'[USER_PASSWORD]' => $plainPassword,
'[CURRENT_TIME]' => (new \DateTime())->format('H:i'),
'[CHILDREN_CREDENTIALS]' => $childrenCredentials
];
$this->messageBus->dispatch(new SendMailMessage($emailToSend, '', '', $replacements, 'REGISTER_NOTIF_4'));
}
public function createRandomPassword(): string
{
$length = rand(10, 12);
$chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
return substr(str_shuffle(str_repeat($chars, $length)), 0, $length);
}
public function sendEarlyPaymentEmailAndSMS(GuardianRegister $guardianRegister)
{
$randomString = $this->createRandomString();
while ($this->guardianRegisterRepository->findOneBy(['cancelToken' => $randomString])) {
$randomString = $this->createRandomString();
}
$guardianRegister->setCancelToken($randomString);
$guardianRegister->setContractGeneratedAt(new \Datetime());
$guardianRegister->setMarksignUrl(null);
$guardianRegister->setMarksignDocumentId(null);
$guardianRegister->setIgnoredEmailCount(0);
$guardianRegister->setStatus(GuardianRegister::STATUS_WAITING['value']);
$this->entityManager->persist($guardianRegister);
$this->entityManager->flush();
$replacements = [
'[APMOKĖJIMO_NUORODĄ]' => "https://cor.lt/ep/{$guardianRegister->getEarlyPaymentToken()}",
'[ĮDĖKITE NUORODĄ]' => "https://cor.lt/ep/{$guardianRegister->getEarlyPaymentToken()}",
'[_LINK]' => "https://cor.lt/ep/{$guardianRegister->getEarlyPaymentToken()}",
'[CURRENT_TIME]' => (new \Datetime())->format('H:i'),
'[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
'[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
'[CONTRACT_LINK]' => "https://cor.lt/c/{$guardianRegister->getContractToken()}",
'https://app.corepetitus.lt/[CANCEL_LINK]' => $this->getParameter('domain') . $this->generateUrl('guardian_register_cancel', ['token' => $guardianRegister->getCancelToken()]),
'[CANCEL_LINK]' => $this->getParameter('domain') . $this->generateUrl('guardian_register_cancel', ['token' => $guardianRegister->getCancelToken()]),
];
$emailToSend = $guardianRegister->getEmail();
$phoneToSend = $guardianRegister->getPhone();
if (!$guardianRegister->getIsGuardian()) {
$emailToSend = $guardianRegister->getGuardianEmail();
$phoneToSend = $guardianRegister->getGuardianPhone();
}
$this->messageBus->dispatch(new SendMailMessage($emailToSend, '', '', $replacements, 'CLIENT_PAYMENT_LINK'));
$this->messageBus->dispatch(new SendSMSMessage($phoneToSend, '', $replacements, 'CLIENT_PAYMENT_LINK'));
}
public function sendContractEmailAndSMS(GuardianRegister $guardianRegister)
{
$emailToSend = $guardianRegister->getEmail();
if (!$guardianRegister->getIsGuardian()) {
$emailToSend = $guardianRegister->getGuardianEmail();
}
$this->omnisendService->trackEvent($emailToSend, 'ContractSent');
if ($guardianRegister->getEarlyPaymentDay()) {
$this->sendEarlyPaymentEmailAndSMS($guardianRegister);
return true;
}
$randomString = $this->createRandomString();
while ($this->guardianRegisterRepository->findOneBy(['contractToken' => $randomString])) {
$randomString = $this->createRandomString();
}
$guardianRegister->setContractToken($randomString);
$randomString = $this->createRandomString();
while ($this->guardianRegisterRepository->findOneBy(['cancelToken' => $randomString])) {
$randomString = $this->createRandomString();
}
$guardianRegister->setCancelToken($randomString);
$guardianRegister->setContractGeneratedAt(new \Datetime());
$guardianRegister->setMarksignUrl(null);
$guardianRegister->getMarksignDocumentId(null);
$guardianRegister->setIgnoredEmailCount(0);
$contractSummary = "";
$weeklyCost = 0;
$totalAmount = 0;
foreach ($guardianRegister->getGuardianRegisterChildren() as $guardianRegisterChild) {
foreach ($guardianRegisterChild->getGuardianRegisterChildPreferences() as $guardianRegisterChildPreference) {
$hourCost = $this->findPriceByClass($guardianRegister, $guardianRegisterChildPreference);
$totalAmount += $guardianRegisterChildPreference->getAmount();
$preferenceWeekDuration = $guardianRegisterChildPreference->getAmount() * $guardianRegisterChildPreference->getDuration();
$preferenceWeekCost = round($preferenceWeekDuration / 60 * $hourCost, 2);
$weeklyCost += $preferenceWeekCost;
$fittingTimes = $guardianRegisterChild->getFittingTimes();
$fittingTimes = str_replace(';', ';<br>', $fittingTimes);
$contractSummary .= "Vaiko vardas: {$guardianRegisterChild->getName()}<br>
Klasė: {$guardianRegisterChild->getClass()}<br>
Disciplina: {$guardianRegisterChildPreference->getDiscipline()->getName()}<br>
Dažnis (per savaitę): {$guardianRegisterChildPreference->getAmount()}<br>
Vieno užsiėmimo trukmė (min.): {$guardianRegisterChildPreference->getDuration()}<br>
Bendra užsiėmimų trukmė per savaitę (min.): {$preferenceWeekDuration}<br>
Vietos tipas: Nuotolinis <br>
Tipas: Individualiai <br>
Mokiniui tinkami užsiėmimų laikai:<br>
{$fittingTimes}
Užsiėmimų kaina į savaitę: {$preferenceWeekCost} EUR<br><br>
";
}
}
// if(count($guardianRegister->getGuardianRegisterChildren()) >=2 && $guardianRegister->getGuardianContract()->getId() > 25)
// {
// if($totalAmount == 2)
// {
// $contractSummary .= "Nuolaida: 10% vienam savaitiniam užsiėmimui vyresniam mokiniui.<br><br>";
// }
// elseif($totalAmount == 3)
// {
// $contractSummary .= "Nuolaida: 15% vienam savaitiniam užsiėmimui vyresniam mokiniui.<br><br>";
// }
// elseif($totalAmount > 3)
// {
// $contractSummary .= "Nuolaida: 20% vienam savaitiniam užsiėmimui vyresniam mokiniui.<br><br>";
// }
// }
$replacements = [
'[CURRENT_TIME]' => (new \Datetime())->format('H:i'),
'[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
'[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
'[CONTRACT_SUMMARY]' => $contractSummary,
'[WEEKLY_COST]' => $weeklyCost,
'[CONTRACT_LINK]' => "https://cor.lt/c/{$guardianRegister->getContractToken()}",
// '[CONTRACT_LINK]' => "https://corepetitus.tlprojektai.lt/c/{$guardianRegister->getContractToken()}",
'[CANCEL_LINK]' => $this->getParameter('domain') . $this->generateUrl('guardian_register_cancel', ['token' => $guardianRegister->getCancelToken()])
];
$emailToSend = $guardianRegister->getEmail();
$phoneToSend = $guardianRegister->getPhone();
if (!$guardianRegister->getIsGuardian()) {
$emailToSend = $guardianRegister->getGuardianEmail();
$phoneToSend = $guardianRegister->getGuardianPhone();
}
$this->messageBus->dispatch(new SendMailMessage($emailToSend, '', '', $replacements, 'REGISTER_NOTIF_2'));
$this->messageBus->dispatch(new SendSMSMessage($phoneToSend, '', $replacements, 'REGISTER_NOTIF_2'));
}
public function findPriceByClass(GuardianRegister $guardianRegister, GuardianRegisterChildPreference $guardianRegisterChildPreference)
{
$guardianContract = $guardianRegister->getGuardianContract();
$amountFrom = 0;
foreach ($guardianRegisterChildPreference->getGuardianRegisterChild()->getGuardianRegister()->getGuardianRegisterChildren() as $guardianRegisterChild) {
foreach ($guardianRegisterChild->getGuardianRegisterChildPreferences() as $guardianRegisterChildPreferenceForAmount) {
$amountFrom += $guardianRegisterChildPreferenceForAmount->getAmount();
}
}
$class = $guardianRegisterChildPreference->getGuardianRegisterChild()->getClass();
$query = $this->guardianContractPriceClassAmountPriceRepository->createQueryBuilder('cap');
$guardianContractPriceClassAmountPrice = $query
->leftJoin('cap.guardianContractPriceDiscipline', 'guardianContractPriceDiscipline')
->leftJoin('guardianContractPriceDiscipline.guardianContractPrice', 'guardianContractPrice')
->andWhere('guardianContractPrice.guardianContract = :guardianContract')
->setParameter('guardianContract', $guardianContract)
->andWhere(':discipline MEMBER OF guardianContractPriceDiscipline.disciplines')
->setParameter('discipline', $guardianRegisterChildPreference->getDiscipline())
->andWhere('cap.classFrom <= :classFrom')
->setParameter('classFrom', $class)
->andWhere('cap.amountFrom < :amountFrom')
->setParameter('amountFrom', $amountFrom)
->orderBy('cap.classFrom', 'DESC')
->addOrderBy('cap.amountFrom', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
$priceAmountGuardian = $guardianContractPriceClassAmountPrice->getPrice();
if ($guardianRegister->getGuardianPriceDiscount()) {
$priceAmountGuardian *= ((100 - $guardianRegister->getGuardianPriceDiscount()) / 100);
}
return round($priceAmountGuardian, 2);
}
public function createRandomString(): string
{
$length = rand(4, 6);
$chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
return substr(str_shuffle(str_repeat($chars, $length)), 0, $length);
}
public function sendIgnoredEmailAndSMS(GuardianRegister $guardianRegister)
{
$reminderObject = $this->reminderConfigurationRepository->findOneBy(['reminder_key' => 'REGISTER_NOTIF_1']);
$replacements = [
'[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
'[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
'[CURRENT_TIME]' => (new \DateTime())->format('H:i'),
];
$emailToSend = $guardianRegister->getEmail();
$phoneToSend = $guardianRegister->getPhone();
$this->messageBus->dispatch(new SendMailMessage($emailToSend, '', '', $replacements, 'REGISTER_NOTIF_1'));
if ($guardianRegister->getGuardianEmail()) {
$emailToSend = $guardianRegister->getGuardianEmail();
$this->messageBus->dispatch(new SendMailMessage($emailToSend, '', '', $replacements, 'REGISTER_NOTIF_1'));
}
$smsContent = $reminderObject->getSmsTemplate();
$smsContent = str_replace(array_keys($replacements), array_values($replacements), $smsContent);
$this->smsService->send($phoneToSend, $smsContent, true);
if ($guardianRegister->getGuardianPhone()) {
$phoneToSend = $guardianRegister->getGuardianPhone();
$this->smsService->send($phoneToSend, $smsContent, true);
}
}
public function sendLostEmail(GuardianRegister $guardianRegister)
{
$replacements = [
'[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
'[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
'[CURRENT_TIME]' => (new \DateTime())->format('H:i'),
];
$this->messageBus->dispatch(new SendMailMessage($guardianRegister->getEmail(), '', '', $replacements, 'REGISTER_NOTIF_5'));
}
public function sendDeclinedEmail(GuardianRegister $guardianRegister)
{
$replacements = [
'[ADMIN_NAME]' => $guardianRegister->getSalesPerson()->getFullname(),
'[ADMIN_PHONE]' => $guardianRegister->getSalesPerson()->getPhone(),
'[CURRENT_TIME]' => (new \DateTime())->format('H:i'),
];
$this->messageBus->dispatch(new SendMailMessage($guardianRegister->getEmail(), '', '', $replacements, 'REGISTER_NOTIF_3'));
}
private function changeFormat(array $data): array
{
$dayMap = [
'Pir' => 'monday',
'Ant' => 'tuesday',
'Tre' => 'wednesday',
'Ket' => 'thursday',
'Pen' => 'friday',
'Šeš' => 'saturday',
'Ses' => 'saturday',
'Sek' => 'sunday',
];
$times = [
'monday' => [],
'tuesday' => [],
'wednesday' => [],
'thursday' => [],
'friday' => [],
'saturday' => [],
'sunday' => [],
];
$timeRows = [];
if (isset($data['weekday_time']) && is_array($data['weekday_time'])) {
$timeRows = array_merge($timeRows, $data['weekday_time']);
}
if (isset($data['weekend_time']) && is_array($data['weekend_time'])) {
$timeRows = array_merge($timeRows, $data['weekend_time']);
}
foreach ($timeRows as $row) {
if (!is_array($row)) {
continue;
}
$dayKey = $dayMap[$row['day'] ?? ''] ?? null;
$rawTime = $row['time'] ?? '';
if (!$dayKey || !$rawTime) {
continue;
}
$time = trim($rawTime);
$time = preg_replace('/\s*[–-]\s*/u', ' - ', $time);
$time = preg_replace('/:00\b/', '', $time);
$time = trim($time);
if ($time !== '' && !in_array($time, $times[$dayKey], true)) {
$times[$dayKey][] = $time;
}
}
$data['times'] = $times;
unset($data['weekday_time'], $data['weekend_time']);
return $data;
}
}