<?php
namespace AdminBundle\Controller;
use Exception;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Sonata\AdminBundle\Controller\CRUDController;
use AdminBundle\Controller\Traits\AdminControllerTrait;
use AdminBundle\Form\Type\AdminEmailTemplateType;
use AdminBundle\Model\AdminEmailTemplateModel;
use AdminBundle\Entity\Account;
use AdminBundle\Entity\Booking;
use AdminBundle\Entity\Driver;
use AdminBundle\Entity\Settings;
use AdminBundle\Entity\Ticket;
class EmailTemplatesAdminController extends CRUDController
{
use AdminControllerTrait;
/**
* @return Response
*/
public function listAction(Request $request):Response
{
$model = new AdminEmailTemplateModel();
$form = $this->createForm(AdminEmailTemplateType::class, $model);
$form->handleRequest($this->getRequest());
$emailContent = null;
if ($form->isSubmitted() && $form->isValid()) {
try {
$emailContent = $this
->get('mandrill.manager')
->getEmailContent($model->getTemplate(), $this->prepareEmailTemplateVars($model))
;
} catch (Exception $e) {
$form->addError(new FormError($e->getMessage()));
}
}
return $this->render('@Admin/Admin/email_templates.html.twig', [
'form' => $form->createView(),
'email_content' => $emailContent,
]);
}
/**
* @param AdminEmailTemplateModel $model
*
* @return array
*/
private function prepareEmailTemplateVars(AdminEmailTemplateModel $model)
{
$vars = [];
if (null !== $model->getBookingKey()) {
/** @var Booking|null $booking */
$booking = $this
->getDoctrine()
->getRepository(Booking::class)
->findOneByKey($model->getBookingKey())
;
$vars = array_replace_recursive($vars, $this->prepareEmailTemplateBookingVars($booking));
}
if (null !== $model->getDriverInternalName()) {
/** @var Driver|null $driver */
$driver = $this
->getDoctrine()
->getRepository(Driver::class)
->findOneByInternalName($model->getDriverInternalName())
;
$vars = array_replace_recursive($vars, $this->prepareEmailTemplateDriverVars($driver));
}
if (null !== $model->getClientEmail()) {
/** @var Account|null $account */
$account = $this
->getDoctrine()
->getRepository(Account::class)
->findOneByEmail($model->getClientEmail())
;
$vars = array_replace_recursive($vars, $this->prepareEmailTemplateAccountVars($account));
}
if (null !== $model->getTicketId()) {
/** @var Ticket|null $ticket */
$ticket = $this
->getDoctrine()
->getRepository(Ticket::class)
->find($model->getTicketId())
;
$vars = array_replace_recursive($vars, $this->prepareEmailTemplateTicketVars($ticket));
}
return $vars;
}
/**
* @param Booking|null $booking
*
* @return array
*/
private function prepareEmailTemplateBookingVars(Booking $booking = null)
{
if (null === $booking) {
return [];
}
/** @var Settings|null $distanceUnitSetting */
$distanceUnitSetting = $this
->getDoctrine()
->getRepository(Settings::class)
->findOneByKey('distance_unit')
;
$distanceUnit = $distanceUnitSetting ? $distanceUnitSetting->getValue() : 'Miles';
$currency = $this
->get('currency.service')
->getSystemCurrency()
;
$vars = [
'passenger_name' => $booking->getFullname(),
'passenger_phone' => $booking->getClientPhone(),
'passenger_email' => $booking->getClientEmail(),
'booking_key' => $booking->getKey(),
'booking_pickup_date' => $booking
->getPickUpDate()
->format('d/m/Y'),
'booking_pickup_time' => $booking->getPickUpTime(),
'booking_pickup_location' => $booking->getPickUpAddress(),
'booking_dropoff_location' => $booking->getDestinationAddress(),
'booking_vias_content' => sprintf('<ul>%s</ul>', implode('', array_map(function ($address) {
return "<li>{$address}</li>";
}, $booking->getViasAsArray()))),
'booking_passengers' => $booking->getPassengersNumber(),
'booking_luggage' => $booking->getCheckinLuggage(),
'booking_notes' => $booking->getNotes(),
'booking_cost' => $booking->getOverridePrice(),
'booking_duration' => $booking->getEstimatedTimePrettyFormat(),
'booking_distance' => "{$booking->getDistanceUnit()} {$distanceUnit}",
'booking_car_type' => $booking
->getCarType()
->getName(),
'booking_hand_luggage' => $booking->getHandLuggage(),
'flight_number' => !empty($booking->getFlightNumber()) ? $booking->getFlightNumber() : null,
'landing_time' => $booking->getFlightLandingTime(),
'mg_timeframe' => $booking->getMeetAndGreetTimePrettyFormat(),
'currency_symbol' => $currency,
'booking_creation_date' => $booking
->getBookingDate()
->format('d/m/Y'),
'booking_creation_time' => $booking
->getBookingDate()
->format('H:i'),
'booking_origin' => 'origin',
'booking_cancel_reason' => $booking->getCancelReason() ?? 'Office Cancellation - Payment not Processed',
'booking_cancel_charge' => $booking->getCancelRefund() == -1 ? 'TBC' : $booking->getCancelRefund(),
'booking_review_link' => "{$this->getParameter('assets_base_url')}review/{$booking->getKey()}",
'payment_link' => 'http://paymentlinkfortesting.com',
'passenger_password' => 'http://passengerpasswordurl.com',
'drivers' => '<ul><li>Id: 1</li><li>Name: Driver1</li><li>Id: 2</li><li>Name: Driver2</li></ul>',
'error_message' => 'Error message',
'bookingID' => $booking->getId(),
'message' => 'This is a test message.',
'return_booking' => false,
];
$returnBooking = $booking->getReturnBooking();
if (null !== $returnBooking) {
$vars = array_replace_recursive($vars, [
'return_booking' => true,
'return_booking_key' => $returnBooking->getKey(),
'return_booking_pickup_date' => $returnBooking
->getPickUpDate()
->format('d/m/Y'),
'return_booking_pickup_time' => $returnBooking->getPickUpTime(),
'return_booking_pickup_location' => $returnBooking->getPickUpAddress(),
'return_booking_dropoff_location' => $returnBooking->getDestinationAddress(),
'return_booking_vias_content' => sprintf('<ul>%s</ul>', implode('', array_map(function ($address) {
return "<li>{$address}</li>";
}, $returnBooking->getViasAsArray()))),
'return_booking_notes' => $returnBooking->getNotes(),
'return_booking_duration' => $returnBooking->getEstimatedTimePrettyFormat(),
'return_booking_distance' => "{$returnBooking->getDistanceUnit()} {$distanceUnit}",
]);
}
return array_replace_recursive($vars, $this->prepareEmailTemplateDriverVars($booking->getDriver()));
}
/**
* @param Driver|null $driver
*
* @return array
*/
private function prepareEmailTemplateDriverVars(Driver $driver = null)
{
if (null === $driver) {
return [];
}
$car = $driver->getCar();
return [
'driver_ID' => $driver->getInternalName(),
'driver_internal_name' => $driver->getInternalName(),
'driver_email' => $driver
->getUser()
->getEmail(),
'driver_name' => $driver
->getUser()
->getFullname(),
'driver_PCO' => $driver->getPublicCarriageOfficeLicenceNumber(),
'driver_HACK' => $driver->getHackLicenseNumber(),
'driver_SSN' => $driver->getSocialSecurityNumber(),
'driver_phone' => $driver->getPhone(),
'driver_vehicle_name' => $car ? "{$car->getMaker()} {$car->getModel()}" : null,
'driver_vehicle_plate' => $car ? $car->getPlateNumber() : null,
'driver_vehicle_PHV' => $car ? $car->getPhvLicenseNumber() : null,
'driver_vehicle_LIMO' => $car ? $car->getLimoLicenseNumber() : null,
'driver_vehicle_color' => $car ? $car->getColor() : null,
'driver_password' => 'http://driverpasswordurl.com',
'week_number' => 3,
'week_period' => '05.05.2020-10.05.2020',
'current_week_saturday' => '08.05.2020',
];
}
/**
* @param Account|null $account
*
* @return array
*/
private function prepareEmailTemplateAccountVars(Account $account = null)
{
if (null === $account) {
return [];
}
$user = $account->getUser();
return [
'passenger_name' => $account->getName(),
'passenger_email' => $user ? $user->getEmail() : null,
'passenger_phone' => $account->getPhone(),
'department' => $account->getDepartment(),
'first_name' => $user ? $user->getFirstname() : null,
'last_name' => $user ? $user->getLastname() : null,
'user_email' => $user ? $user->getEmail() : null,
'user_phone' => $user ? $user->getPhone() : null,
];
}
/**
* @param Ticket|null $ticket
*
* @return array
*/
private function prepareEmailTemplateTicketVars(Ticket $ticket = null)
{
if (null === $ticket) {
return [];
}
return [
'ticket_id' => $ticket->getId(),
'ticket_subject' => $ticket->getSubject(),
'ticket_description' => $ticket->getDescription(),
'ticket_creation_date' => $ticket
->getCreatedDate()
->format('Y-m-d'),
'ticket_creation_time' => $ticket
->getCreatedDate()
->format('H:i:s'),
'booking_key' => $ticket->getBooking(),
'ticket_department' => $ticket->getDepartmentNames(),
'ticket_message' => $ticket->getTicketMessages(),
];
}
}