<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\EmailTemplates;
use App\Entity\SmsHistory;
use App\Entity\SmsTemplates;
use App\Repository\EmailTemplatesRepository;
use App\Repository\SmsHistoryRepository;
use App\Repository\SmsTemplatesRepository;
use App\Repository\WarrantyRepository;
use App\Repository\EventRepository;
use App\Service\ConfigDataService;
use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Address;
use Smsapi\Client\Curl\SmsapiHttpClient;
use Smsapi\Client\Feature\Sms\Bag\SendSmsBag;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bridge\Twig\Mime\BodyRenderer;
use Twig\Environment;
class StartController extends AbstractController
{
#[Route('/', name: 'app_start')]
public function homepager(): Response
{
return $this->render('start/index.html.twig', [
'controller_name' => 'StartController',
]);
}
#[Route('/cronjob_send_email_client', name: 'app_cronjob_send_email_client')]
public function cronSendEmailClient(EventRepository $eventRepository, EmailTemplatesRepository $emailTemplatesRepository, ConfigDataService $configDataService, SmsHistoryRepository $smsHistoryRepository, SmsTemplatesRepository $smsTemplatesRepository, Request $request): Response
{
$emailTemplates = new EmailTemplates();
$emailTemplatesfindOneByTypeBefore = $emailTemplatesRepository->findOneByType($emailTemplates::TYPE_BEFORE);
$notificationBeforeEvent = $configDataService->get('before_event');
$notification = json_decode($notificationBeforeEvent, false, 512, JSON_THROW_ON_ERROR);
$newDate = new \DateTime('2022-12-31');
$events = $eventRepository->findBy(['event_date' => $newDate]);
//dd($notification);
foreach($events as $event) {
$company_name = $configDataService->get('company_name');
$eventDate = ($event->getEventDate() != null) ? $event->getEventDate()->format('d-m-Y') : '';
$contractDate = ($event->getContractDate() != null) ? $event->getContractDate()->format('d-m-Y') : '';
//dd($newEventDetailsPage);
$const = array(
'[EVENT_DATE]' => $eventDate,
'[CONTRACT_NUMBER]' => $event->getContractNumber() . '/'. $contractDate,
'[LOCATION]' => $event->getEventLocation()->getName(),
'[TOTAL]'=> $event->getEventPrice()->getTotal(),
'[ADVANCE]'=> $event->getEventPrice()->getAdvance(),
'[AMOUNT DUE]'=> $event->getEventPrice()->getAmountDue(),
'[EMAIL]' => $event->getClient()->getEmail(),
'[PHONE]' => $event->getClient()->getPhone(),
'[FIRSTNAME]' => $event->getClient()->getFirstName(),
'[LASTNAME]' => $event->getClient()->getLastName(),
'[COMPANY_NAME]' => $company_name,
'[SERVICE_NAME]' => $event->getService()->getName(),
);
if($notification->email == true){
if($event->getClient()->getEmail()) {
if( $configDataService->get('Transport') == 'sendgrid') {
$sendGridKey = $configDataService->get('sendGridKey');
$dsn = "sendgrid+api://". $sendGridKey ."@default";
$transport = Transport::fromDsn($dsn);
$mailer = new Mailer($transport);
} else if($configDataService->get('Transport') == 'smtp') {
//dd($configDataService);
$host = $configDataService->get('Host');
$port = $configDataService->get('port');
$username = $configDataService->get('username');
$password = $configDataService->get('password');
$dsn = 'smtp://'.$username.':'.$password.'@'.$host.':'. $port;
$transport = Transport::fromDsn($dsn);
$mailer = new Mailer($transport);
}
//dd($const);
$emailContent = strtr($emailTemplatesfindOneByTypeBefore->getContent(), $const);
//dd($emailContent);
$emailTitle = str_replace(array_keys($const), array_values($const), $emailTemplatesfindOneByTypeBefore->getTitle());
$fromName = $configDataService->get('fromName');
$fromEmail = $configDataService->get('fromEmail');
$email = (new Email())
->from(new Address($fromEmail, $fromName))
->to($event->getClient()->getEmail())
//->cc('cc@example.com')
//->bcc('bcc@example.com')
//->replyTo('fabien@example.com')
//->priority(Email::PRIORITY_HIGH)
->subject($emailTitle)
->html($emailContent);
try {
$mailer->send($email);
} catch(TransportExceptionInterface $e) {
$this->addFlash('app_event_error', $e->getMessage());
// return $this->redirectToRoute('app_event_index', [], Response::HTTP_SEE_OTHER);
}
} else {
$this->addFlash('app_event_error', 'Email address is empty. Cannot send email!');
}
}
if($notification->sms == true) {
if($event->getClient()->getPhone()){
$phone = $event->getClient()->getPhone();
$smsApiHttpClient = new SmsapiHttpClient();
$smsApiToken = $configDataService->get('smsApiToken');
$service = $smsApiHttpClient->smsapiComService($smsApiToken);
$result = $service->pingFeature()->ping();
//dd($result);
if ($result->authorized) {
$smsTemplates = new SmsTemplates();
$smsTemplatesfindOneByTypeBefore = $smsTemplatesRepository->findOneByType($smsTemplates::TYPE_BEFORE);
$smsContent = strtr($smsTemplatesfindOneByTypeBefore->getContent(), $const);
$smsBag = SendSmsBag::withMessage($phone, $smsContent);
//dd($smsContent);
$smsServiceBack = $service->smsFeature()->sendSms($smsBag);
$smsHistory = new SmsHistory();
$smsHistory->setIdSmsapi($smsServiceBack->id);
$smsHistory->setPoints($smsServiceBack->points);
$smsHistory->setDateSent($smsServiceBack->dateSent);
$smsHistory->setStatus($smsServiceBack->status);
$smsHistory->setContent($smsServiceBack->content->message);
$smsHistory->setEvent($event);
$smsHistoryRepository->save($smsHistory, true);
}
} else {
$this->addFlash('app_event_error', 'Phone address is empty. Cannot send sms!');
}
}
}
return new Response('OK!');
}
#[Route('/cronjob_send_email_client_after_event', name: 'app_cronjob_send_email_client_after_event')]
public function cronSendEmailClientAfterEvent(EventRepository $eventRepository, EmailTemplatesRepository $emailTemplatesRepository, ConfigDataService $configDataService, SmsHistoryRepository $smsHistoryRepository, SmsTemplatesRepository $smsTemplatesRepository, Request $request): Response
{
$emailTemplates = new EmailTemplates();
$emailTemplatesfindOneByTypeAfter = $emailTemplatesRepository->findOneByType($emailTemplates::TYPE_AFTER);
$notificationAfterEvent = $configDataService->get('after_event');
$notification = json_decode($notificationAfterEvent, false, 512, JSON_THROW_ON_ERROR);
$events = $eventRepository->getEventsToSendEmailClientAfterEvent('cancelled');
//dd($events);
foreach($events as $event) {
$company_name = $configDataService->get('company_name');
$eventDate = ($event->getEventDate() != null) ? $event->getEventDate()->format('d-m-Y') : '';
$contractDate = ($event->getContractDate() != null) ? $event->getContractDate()->format('d-m-Y') : '';
//dd($newEventDetailsPage);
$const = array(
'[EVENT_DATE]' => $eventDate,
'[CONTRACT_NUMBER]' => $event->getContractNumber() . '/'. $contractDate,
'[LOCATION]' => $event->getEventLocation()->getName(),
'[TOTAL]'=> $event->getEventPrice()->getTotal(),
'[ADVANCE]'=> $event->getEventPrice()->getAdvance(),
'[AMOUNT DUE]'=> $event->getEventPrice()->getAmountDue(),
'[EMAIL]' => $configDataService->get('email'),
'[PHONE]' => $configDataService->get('phone'),
'[FIRSTNAME]' => $event->getClient()->getFirstName(),
'[LASTNAME]' => $event->getClient()->getLastName(),
'[COMPANY_NAME]' => $company_name,
'[SERVICE_NAME]' => $event->getService()->getName(),
);
if($notification->email == true){
if($event->getClient()->getEmail()) {
if( $configDataService->get('Transport') == 'sendgrid') {
$sendGridKey = $configDataService->get('sendGridKey');
$dsn = "sendgrid+api://". $sendGridKey ."@default";
$transport = Transport::fromDsn($dsn);
$mailer = new Mailer($transport);
} else if($configDataService->get('Transport') == 'smtp') {
//dd($configDataService);
$host = $configDataService->get('Host');
$port = $configDataService->get('port');
$username = $configDataService->get('username');
$password = $configDataService->get('password');
$dsn = 'smtp://'.$username.':'.$password.'@'.$host.':'. $port;
$transport = Transport::fromDsn($dsn);
$mailer = new Mailer($transport);
}
if($emailTemplatesfindOneByTypeAfter != null) {
$emailContent = strtr($emailTemplatesfindOneByTypeAfter->getContent(), $const);
//dd($emailContent);
$emailTitle = str_replace(array_keys($const), array_values($const), $emailTemplatesfindOneByTypeAfter->getTitle());
$fromName = $configDataService->get('fromName');
$fromEmail = $configDataService->get('fromEmail');
$email = (new Email())
->from(new Address($fromEmail, $fromName))
->to($event->getClient()->getEmail())
//->cc('cc@example.com')
//->bcc('bcc@example.com')
//->replyTo('fabien@example.com')
//->priority(Email::PRIORITY_HIGH)
->subject($emailTitle)
->html($emailContent);
try {
$mailer->send($email);
} catch(TransportExceptionInterface $e) {
$this->addFlash('app_event_error', $e->getMessage());
// return $this->redirectToRoute('app_event_index', [], Response::HTTP_SEE_OTHER);
}
} else {
$this->addFlash('app_emailtemplate_error', 'Template is not set for after event!');
return $this->redirectToRoute('app_email_templates_index', [], Response::HTTP_SEE_OTHER);
}
} else {
$this->addFlash('app_event_error', 'Email address is empty. Cannot send email!');
return $this->redirectToRoute('app_email_templates_index', [], Response::HTTP_SEE_OTHER);
}
}
if($notification->sms == true) {
if($event->getClient()->getPhone()){
$phone = $event->getClient()->getPhone();
$smsApiHttpClient = new SmsapiHttpClient();
$smsApiToken = $configDataService->get('smsApiToken');
$service = $smsApiHttpClient->smsapiComService($smsApiToken);
$result = $service->pingFeature()->ping();
//dd($result);
if ($result->authorized) {
$smsTemplates = new SmsTemplates();
$smsTemplatesfindOneByTypeAfter = $smsTemplatesRepository->findOneByType($smsTemplates::TYPE_AFTER);
$smsContent = strtr($smsTemplatesfindOneByTypeAfter->getContent(), $const);
$smsBag = SendSmsBag::withMessage($phone, $smsContent);
//dd($smsContent);
$smsServiceBack = $service->smsFeature()->sendSms($smsBag);
$smsHistory = new SmsHistory();
$smsHistory->setIdSmsapi($smsServiceBack->id);
$smsHistory->setPoints($smsServiceBack->points);
$smsHistory->setDateSent($smsServiceBack->dateSent);
$smsHistory->setStatus($smsServiceBack->status);
$smsHistory->setContent($smsServiceBack->content->message);
$smsHistory->setEvent($event);
$smsHistoryRepository->save($smsHistory, true);
}
} else {
$this->addFlash('app_event_error', 'Phone address is empty. Cannot send sms!');
return $this->redirectToRoute('app_email_templates_index', [], Response::HTTP_SEE_OTHER);
}
}
}
return new Response('OK!');
}
#[Route('/cronjob_send_email_user', name: 'app_cronjob_send_email_user')]
public function cronSendEmailUser(EventRepository $eventRepository, EmailTemplatesRepository $emailTemplatesRepository, ConfigDataService $configDataService, SmsHistoryRepository $smsHistoryRepository, SmsTemplatesRepository $smsTemplatesRepository, Request $request): Response
{
$emailTemplates = new EmailTemplates();
$emailTemplatesfindOneByTypeBefore = $emailTemplatesRepository->findOneByType($emailTemplates::TYPE_USER_REMINDER);
//$baseURL = $request->getSchemeAndHttpHost();
$events = $eventRepository->getEventsToSendEmailUser('active');
//dd($events);
//$newDate = new \DateTime('2022-12-31');
//$events = $eventRepository->findBy(['event_date' => $newDate]);
//dd($events);
foreach($events as $event) {
if($event->getClient()->getEmail()){
if( $configDataService->get('Transport') == 'sendgrid') {
$sendGridKey = $configDataService->get('sendGridKey');
$dsn = "sendgrid+api://". $sendGridKey ."@default";
$transport = Transport::fromDsn($dsn);
$mailer = new Mailer($transport);
} else if($configDataService->get('Transport') == 'smtp') {
//dd($configDataService);
$host = $configDataService->get('Host');
$port = $configDataService->get('port');
$username = $configDataService->get('username');
$password = $configDataService->get('password');
$dsn = 'smtp://'.$username.':'.$password.'@'.$host.':'. $port;
$transport = Transport::fromDsn($dsn);
$mailer = new Mailer($transport);
}
$company_name = $configDataService->get('company_name');
$eventDate = ($event->getEventDate() != null) ? $event->getEventDate()->format('d-m-Y') : '';
$contractDate = ($event->getContractDate() != null) ? $event->getContractDate()->format('d-m-Y') : '';
//dd($newEventDetailsPage);
$const = array(
'[EVENT_DATE]' => $eventDate,
'[CONTRACT_NUMBER]' => $event->getContractNumber() . '/'. $contractDate,
'[LOCATION]' => $event->getEventLocation()->getName(),
'[TOTAL]'=> $event->getEventPrice()->getTotal(),
'[ADVANCE]'=> $event->getEventPrice()->getAdvance(),
'[AMOUNT DUE]'=> $event->getEventPrice()->getAmountDue(),
'[EMAIL]' => $event->getClient()->getEmail(),
'[PHONE]' => $event->getClient()->getPhone(),
'[FIRSTNAME]' => $event->getClient()->getFirstName(),
'[LASTNAME]' => $event->getClient()->getLastName(),
'[COMPANY_NAME]' => $company_name,
'[SERVICE_NAME]' => $event->getService()->getName(),
);
//dd($const);
$emailContent = strtr($emailTemplatesfindOneByTypeBefore->getContent(), $const);
$notificationEventDetailsJson = $configDataService->get('email_user_reminder');
$notificationEventDetailsUsers = json_decode($notificationEventDetailsJson, true, 512, JSON_THROW_ON_ERROR);
$notificationEventDetails = json_decode($notificationEventDetailsUsers['users'], true, 512, JSON_THROW_ON_ERROR);
//dd($emailContent);
$emailTitle = str_replace(array_keys($const), array_values($const), $emailTemplatesfindOneByTypeBefore->getTitle());
$fromName = $configDataService->get('fromName');
$fromEmail = $configDataService->get('fromEmail');
if(in_array($fromEmail, $notificationEventDetails)) {
//dd($notificationEventDetails);
foreach($notificationEventDetails as $key=>$notificationEventDetail) {
if($notificationEventDetail == $fromEmail) {
unset($notificationEventDetails[$key]);
}
}
}
$notificationEventDetailsMail = array_values($notificationEventDetails);
$email = (new Email())
->from(new Address($fromEmail, $fromName))
->to($fromEmail)
->cc(...$notificationEventDetailsMail)
//->bcc('bcc@example.com')
//->replyTo('fabien@example.com')
//->priority(Email::PRIORITY_HIGH)
->subject($emailTitle)
->html($emailContent);
try {
$mailer->send($email);
} catch(TransportExceptionInterface $e) {
$this->addFlash('app_event_error', $e->getMessage());
// return $this->redirectToRoute('app_event_index', [], Response::HTTP_SEE_OTHER);
}
}
}
return new Response('OK!');
}
#[Route('/cronjob_send_email_expire_warranties', name: 'app_cronjob_send_email_expire_warranties')]
public function cronSendEmailExpireWarranty(WarrantyRepository $warrantyRepository, EmailTemplatesRepository $emailTemplatesRepository, ConfigDataService $configDataService, SmsTemplatesRepository $smsTemplatesRepository, Request $request, Environment $twig): Response
{
$configWarrantyDaysReminder = $configDataService->get('warrantyDaysReminder');
//$baseURL = $request->getSchemeAndHttpHost();
$warranties = $warrantyRepository->findWarrantiesActiveToSendEmail('active', $configWarrantyDaysReminder);
//dd($events);
//$newDate = new \DateTime('2022-12-31');
//$events = $eventRepository->findBy(['event_date' => $newDate]);
//dd($events);
foreach($warranties as $warranty) {
if($configDataService->get('fromEmail') != null){
if( $configDataService->get('Transport') == 'sendgrid') {
$sendGridKey = $configDataService->get('sendGridKey');
$dsn = "sendgrid+api://". $sendGridKey ."@default";
$transport = Transport::fromDsn($dsn);
$mailer = new Mailer($transport);
} else if($configDataService->get('Transport') == 'smtp') {
//dd($configDataService);
$host = $configDataService->get('Host');
$port = $configDataService->get('port');
$username = $configDataService->get('username');
$password = $configDataService->get('password');
$dsn = 'smtp://'.$username.':'.$password.'@'.$host.':'. $port;
$transport = Transport::fromDsn($dsn);
$mailer = new Mailer($transport);
}
//dd($emailContent);
$emailTitle = "Notificare garantie: Peste ". $configWarrantyDaysReminder ." zile expira " . $warranty->getName();
$fromName = $configDataService->get('fromName');
$fromEmail = $configDataService->get('fromEmail');
$email = (new TemplatedEmail())
->from(new Address($fromEmail, $fromName))
->to($fromEmail)
//->bcc('bcc@example.com')
//->replyTo('fabien@example.com')
//->priority(Email::PRIORITY_HIGH)
->subject($emailTitle)
->htmlTemplate('emails/warranty_notification.html.twig')
->context([
'warranty' => $warranty,
'config' => $configDataService,
]);
$renderer = new BodyRenderer($twig);
$renderer->render($email);
try {
$mailer->send($email);
} catch(TransportExceptionInterface $e) {
$this->addFlash('app_event_error', $e->getMessage());
// return $this->redirectToRoute('app_event_index', [], Response::HTTP_SEE_OTHER);
}
}
}
return new Response('OK!');
}
}