<?php
namespace App\Controller;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\SignUpProcess;
use App\Entity\SignUpCode;
use App\Entity\GmbPage;
use App\Entity\MarketerClientRequest;
use Orc\SaasBundle\Entity\Client;
use Orc\SaasBundle\Entity\Site;
use Orc\UserBundle\Entity\User;
use Orc\BookingBundle\Entity\DateTime;
use Orc\BookingBundle\Entity\Region;
use Orc\BookingBundle\Entity\Boundary;
use Orc\BookingBundle\Entity\Location;
use Orc\BookingBundle\Entity\Service;
use Orc\BookingBundle\Entity\Crew;
use Orc\BookingBundle\Entity\Worker;
use Orc\BookingBundle\Booking\TimezoneGuesser;
use Orc\SaasBundle\Form\Type\ClientType;
use Orc\SaasBundle\Form\Type\RegistrationFormType;
use App\Repository\SignUpProcessRepository;
use App\Repository\SignUpCodeRepository;
use App\Service\BaseService;
use App\Service\BookingUtilService;
use App\Service\Mapservice;
use App\Service\IntercomIntegrationService;
use App\Security\LoginFormAuthenticator;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Orc\SaasBundle\SaasEvents;
use Orc\BillingBundle\EventListener\CreateCustomer;
use Orc\SaasBundle\Event\ClientEvent;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Twilio\Rest\Client as TwilioClient;
use Ramsey\Uuid\Uuid;
use Mobile_Detect;
class SignUpController extends AbstractController
{
private $doctrine = null;
private $entityManager = null;
private $signUpProcessRepository = null;
private $signUpCodeRepository = null;
private $loginFormAuthenticator = null;
private $guardAuthenticatorHandler = null;
private $timezoneGuesser = null;
private $createCustomer = null;
private $request = null;
private $bookingUtilService = null;
private $mapservice = null;
private $intercomIntegrationService = null;
public function __construct(ManagerRegistry $doctrine, UserPasswordEncoderInterface $passwordEncoder, LoginFormAuthenticator $loginFormAuthenticator, GuardAuthenticatorHandler $guardAuthenticatorHandler, CreateCustomer $createCustomer, RequestStack $requestStack, TimezoneGuesser $timezoneGuesser, BookingUtilService $bookingUtilService, Mapservice $mapservice, IntercomIntegrationService $intercomIntegrationService) {
$this->doctrine = $doctrine;
$this->entityManager = $doctrine->getManager();
$this->signUpProcessRepository = $doctrine->getRepository(SignUpProcess::class);
$this->signUpCodeRepository = $doctrine->getRepository(SignUpCode::class);
$this->passwordEncoder = $passwordEncoder;
$this->loginFormAuthenticator = $loginFormAuthenticator;
$this->guardAuthenticationHandler = $guardAuthenticatorHandler;
$this->createCustomer = $createCustomer;
$this->timezoneGuesser = $timezoneGuesser;
$this->request = $requestStack->getCurrentRequest();
$this->encoders = [new XmlEncoder(), new JsonEncoder()];
$this->normalizers = [new ObjectNormalizer()];
$this->serializer = new Serializer($this->normalizers, $this->encoders);
$this->bookingUtilService = $bookingUtilService;
$this->mapservice = $mapservice;
$this->intercomIntegrationService = $intercomIntegrationService;
}
private $screens = [
'input-login',
'input-company',
'input-servicearea',
'input-service',
'input-gbp',
'commit',
'complete'
];
private $screensmap = [
'input-login' => 'sign_up_login',
'input-company' => 'sign_up_company',
'input-servicearea' => 'sign_up_servicearea',
'input-service' => 'sign_up_service',
'input-gbp' => 'sign_up_gbp',
'commit' => 'sign_up_commit',
'complete' => 'sign_up_complete'
];
private function checkSignUpProcess($request) {
$_sign_up_code_ = $request->cookies->get('_sign_up_code_');
$signUpProcess = null;
if ($_sign_up_code_ == null) {
$signUpProcess = null;
} else {
$signUpProcess = $this->signUpProcessRepository->findOneBy(['code' => $_sign_up_code_, 'status' => 'form']);
}
return $signUpProcess;
}
protected function getUrlFromName($name) {
$schedulingwebsite = strtolower(preg_replace('/[^a-zA-Z0-9\-]+/i', '', $name));
return $schedulingwebsite;
}
private function generateSignUpProcess($request) {
$now = new \DateTime();
$nowPlus48h = clone $now;
$nowPlus48h->add(new \DateInterval('PT48H'));
$uuid = Uuid::uuid4();
$suuid = $uuid->toString();
$_sign_up_code_ = $suuid;
$via = $request->query->get('via');
if ($via == null) {
$rewardful_referral = $request->cookies->get('rewardful_referral');
if ($rewardful_referral != null) {
$sjson = urldecode($rewardful_referral);
$ojson = json_decode($sjson);
if ($ojson != null && property_exists($ojson, 'affiliate') && $ojson->affiliate != null && property_exists($ojson->affiliate, 'token') && $ojson->affiliate->token != null) {
$via = $ojson->affiliate->token;
}
}
}
$redirect_mode = '';
$redirect_uri = $request->query->get('redirect_uri');
if ($redirect_uri == null) {
$redirect_uri = '';
}
if ($redirect_uri != '') {
$redirect_mode = 'fbe';
}
$suname = $request->query->get('suname');
if ($suname === null) {
$suname = '';
}
$suemail = $request->query->get('suemail');
if ($suemail === null) {
$suemail = '';
}
$suphone = $request->query->get('suphone');
if ($suphone === null) {
$suphone = '';
}
$susignupcode = $request->query->get('signupcode');
if ($susignupcode === null) {
$susignupcode = '';
}
$companyname = $request->request->get('fullname');
if ($companyname == null && $suname != null) {
$companyname = $suname;
}
$email = $request->request->get('email');
if ($email == null && $suemail != null) {
$email = $suemail;
}
$phone = $request->request->get('phone');
if ($phone == null && $suphone != null) {
$phone = $suphone;
}
$signupcode = $request->request->get('signupcode');
if ($signupcode == null && $susignupcode != null) {
$signupcode = $susignupcode;
}
$signUpProcess = new SignUpProcess();
$signUpProcess->setCode($_sign_up_code_);
$signUpProcess->setStatus('form');
$signUpProcess->setScreen('input-login');
$signUpProcess->setStep('input-login');
$signUpProcess->setCompanyName($companyname != null ? $companyname : '');
if ($companyname != null) {
$schedulingWebSite = $this->getUrlFromName($companyname);
$domain_suffix = '.' . substr($request->server->get('SERVER_NAME'), 6);
$schedulingWebSiteFull = "$schedulingWebSite$domain_suffix";
$signUpProcess->setSchedulingWebsite($schedulingWebSite);
$signUpProcess->setSchedulingWebsiteFull($schedulingWebSiteFull);
} else {
$signUpProcess->setSchedulingWebsite('');
$signUpProcess->setSchedulingWebsiteFull('');
}
$signUpProcess->setEmail($email != null ? $email : '');
$signUpProcess->setPhoneNumber($phone != null ? $phone : '');
$signUpProcess->setPassword('');
$signUpProcess->setConfirmPassword('');
$signUpProcess->setLocationText('');
$signUpProcess->setFlatRegions('');
$signUpProcess->setNameOfService('');
$signUpProcess->setTimeRequired(0);
$signUpProcess->setCreatedAt($now);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setExpiresAt($nowPlus48h);
$signUpProcess->setIpAddress($request->getClientIp());
try {
$o = $this->validateSignupcode($request, $signUpProcess, false);
if ($o === null || !$o["valid"]) {
$signupcode = '';
}
} catch (\Throwable $throwable) {
$signupcode = '';
}
$signUpProcess->setSignupcode($signupcode);
$signUpProcess->setVia($via);
$signUpProcess->setRedirectMode($redirect_mode);
$signUpProcess->setFbeRedirectUri($redirect_uri);
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
return $signUpProcess;
}
private function setCookie($response, $value) {
$now = new \DateTime();
$dt = clone $now;
$dt->add(new \DateInterval('PT24H'));
$response->headers->setCookie(new Cookie('_sign_up_code_', $value, $dt, '/sign/up'));
}
private function unsetCookie($response) {
$response->headers->clearCookie('_sign_up_code_', '/sign/up', null);
}
private function doStepRedirectionGET($request, $signUpProcess) {
switch ($signUpProcess->getScreen()) {
case 'input-login':
{
return $this->redirect($this->generateUrl('sign_up_login'));
}
break;
case 'input-company':
{
return $this->redirect($this->generateUrl('sign_up_company'));
}
break;
case 'input-servicearea':
{
return $this->redirect($this->generateUrl('sign_up_servicearea'));
}
break;
case 'input-service':
{
return $this->redirect($this->generateUrl('sign_up_service'));
}
break;
case 'input-gbp':
{
return $this->redirect($this->generateUrl('sign_up_gbp'));
}
break;
default:
{
//return $this->step_company($request);
//return $this->forward('App\Controller\SignUpController::step_company', array());
return new Response(
'INVALID STEP',
Response::HTTP_OK,
['content-type' => 'text/html']
);
}
}
}
private function setGoToScreenOnSignUpProcess($signUpProcess, $newscreen) {
$now = new \DateTime();
$newposition = array_search($newscreen, $this->screens);
if ($newposition === false) {
return;
}
$currentstep = array_search($signUpProcess->getStep(), $this->screens);
if ($newposition > $currentstep) {
$signUpProcess->setStep($newscreen);
}
$signUpProcess->setScreen($newscreen);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
private function redirectOnInvalidStep($signUpProcess, $screen) {
$position = array_search($screen, $this->screens);
if ($position === false) {
return $this->redirect($this->generateUrl($this->screensmap[$signUpProcess->getStep()]));
}
$currentstep = array_search($signUpProcess->getStep(), $this->screens);
if ($position > $currentstep) {
return $this->redirect($this->generateUrl($this->screensmap[$signUpProcess->getStep()]));
}
return null;
}
private function doStepCompany($request, $signUpProcess) {
$now = new \DateTime();
$domain_suffix = '.' . substr($request->server->get('SERVER_NAME'), 6);
if ($signUpProcess->getPhoneNumber() != $request->request->get('phone_number')) {
$signUpProcess->setConfirmationCodeVerified(false);
}
$signUpProcess->setCompanyName($request->request->get('company_name'));
$signUpProcess->setPhoneNumber($request->request->get('phone_number'));
$signUpProcess->setSchedulingWebsite($request->request->get('scheduling_website'));
$signUpProcess->setSchedulingWebsiteFull($request->request->get('scheduling_website') . $domain_suffix);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
return true;
}
private function doStepLogin($request, $signUpProcess) {
$now = new \DateTime();
$signupcode = $request->request->get('signupcode');
$rexception = null;
$signUpCode = null;
try {
$o = $this->validateSignupcode($request, $signUpProcess, false);
if ($o !== null && $o["valid"]) {
$signUpCode = $o["signUpCode"];
}
} catch (\Exception $e) {
$rexception = $e;
}
$signUpProcess->setEmail($request->request->get('email'));
$signUpProcess->setPassword($request->request->get('password'));
$signUpProcess->setConfirmPassword($request->request->get('confirm_password'));
$signUpProcess->setServiceType($request->request->get('service_type'));
$signUpProcess->setSignupcode($signupcode);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
if ($rexception != null) {
throw $rexception;
}
return true;
}
private function doStepServiceArea($request, $signUpProcess) {
$now = new \DateTime();
$signUpProcess->setLocationText($request->request->get('location_text'));
$signUpProcess->setFlatRegions($request->request->get('flat_regions'));
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
return true;
}
private function doStepService($request, $signUpProcess) {
$now = new \DateTime();
$stimerequired = $request->request->get('time_required');
if ($stimerequired == null || $stimerequired == '') {
$stimerequired = '00:00';
}
$stimerequired = preg_replace("/[^0-9]/", "", $stimerequired );
$stimerequired_length = strlen($stimerequired);
if ($stimerequired_length < 4) {
$stimerequired = sprintf('%04s', $stimerequired);
}
$stimerequired_hours = substr($stimerequired, 0, $stimerequired_length - 2);
$stimerequired_minutes = substr($stimerequired, $stimerequired_length - 2, 2);
$itimerequired_hours = intval($stimerequired_hours);
$itimerequired_minutes = intval($stimerequired_minutes);
$itimerequired = $itimerequired_hours * 60 + $itimerequired_minutes;
$signUpProcess->setNameOfService($request->request->get('name_of_service'));
$signUpProcess->setTimeRequired($itimerequired);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
return true;
}
private function doStepGbp($request, $signUpProcess) {
$now = new \DateTime();
$gmb_skip = $request->request->get('gmb_skip');
$gmb_name = $request->request->get('gmb_name');
$gmb_address = $request->request->get('gmb_address');
$gmb_phone = $request->request->get('gmb_phone');
if ($gmb_skip === 'true') {
$signUpProcess->setGmbSkip(true);
$signUpProcess->setGmbName(null);
$signUpProcess->setGmbAddress(null);
$signUpProcess->setGmbPhone(null);
} else {
$signUpProcess->setGmbSkip(false);
$signUpProcess->setGmbName($gmb_name);
$signUpProcess->setGmbAddress($gmb_address);
$signUpProcess->setGmbPhone($gmb_phone);
}
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
return true;
}
private function doStepCommit($request, $signUpProcess) {
$now = new \DateTime();
$timezone = $this->timezoneGuesser->queryIpstack();
if ($timezone != null) {
$timezone = $timezone['id'];
}
//dd($signUpProcess);
//dd($signUpProcess->getPhoneNumber());
$o = $this->validateSignupcode($request, $signUpProcess, true);
if ($o === null || !$o["valid"] ) {
throw new \Exception("Unexpected error!");
}
$signUpCode = $o["signUpCode"];
$marketerClientRequest = null;
$client = new Client();
$client->setDateCreated($now);
$client->setParentDomain(substr($request->server->get('SERVER_NAME'), 6)); //$client->setParentDomain($this->getParameter('orc_saas.parentdomain'));
$client->setBrandingColor($this->getParameter('orc_saas.branding.defaultColor'));
$client->setName($signUpProcess->getCompanyName());
$client->setPhone($signUpProcess->getPhoneNumber());
$client->setEmail($signUpProcess->getEmail());
$client->setServiceType($signUpProcess->getServiceType());
$client->setArrivalWindow($signUpProcess->getServiceType() === 'fixed' ? 0 : 0); // It was 2 for clients whose service_type != 'fixed'
$client->setVia($signUpProcess->getVia());
$client->setSignupcode($signUpProcess->getSignupcode());
$client->setLive(true);
$client->setLiveNotified(true);
if ($signUpCode !== null && $signUpCode->getMarketer() !== null) {
$marketer = $signUpCode->getMarketer();
$client->setMarketedBy($marketer);
$client->setOriginallyMarketedBy($marketer);
$client->setSignupsource('coupon');
$marketerClientRequest = new MarketerClientRequest();
$marketerClientRequest->setClient($client);
$marketerClientRequest->setMarketer($marketer);
$marketerClientRequest->setTimeSent($now);
$marketerClientRequest->setTimeAccepted($now);
$marketerClientRequest->setAccepted(MarketerClientRequest::STATUS_ACCEPTED);
$this->entityManager->persist($marketerClientRequest);
} else {
$client->setSignupsource('direct');
}
$client->setStatus(Client::STATUS_NEW);
if ($timezone != null) {
$client->setTimezone($timezone);
}
$site = new Site();
$site->setClient($client);
$client->setSite($site);
$site->setDomain($signUpProcess->getSchedulingWebsiteFull());
$this->entityManager->persist($site);
$this->entityManager->persist($client);
$this->entityManager->flush();
$clientId = $client->getId();
$user = new User();
$user->setClient($client);
$user->setEmail($signUpProcess->getEmail());
$user->setPassword($signUpProcess->getPassword());
$user->setPassword($this->passwordEncoder->encodePassword($user, $user->getPassword()));
$roles = $user->getRoles();
$roles[] = 'ROLE_CLIENT';
$roles[] = 'ROLE_STAFF';
$user->setRoles($roles);
$client->setUser($user);
$o_flat_regions = $signUpProcess->getFlatRegionsObject();
$regions = [];
$opregion = null;
$oplocation = null;
foreach ($o_flat_regions->regions as $o_region) {
$addressDetails = $this->mapservice->getAddressDetailsFromPlace($o_region->place);
$region = new Region();
$region->setClient($client);
$region->setName($o_region->name);
$region->setServiceType($signUpProcess->getServiceType());
//$region->setStatus(0);
$region->setAddress(array_key_exists('formatted_address', $addressDetails) && !empty($addressDetails['formatted_address']) ? $addressDetails['formatted_address'] : '');
$region->setStreet(array_key_exists('street', $addressDetails) && !empty($addressDetails['street']) ? $addressDetails['street'] : '');
$region->setCity(array_key_exists('city', $addressDetails) && !empty($addressDetails['city']) ? $addressDetails['city'] : '');
$region->setCode(array_key_exists('code', $addressDetails) && !empty($addressDetails['code']) ? $addressDetails['code'] : '');
$region->setProvince(array_key_exists('province', $addressDetails) && !empty($addressDetails['province']) ? $addressDetails['province'] : '');
$region->setCountry(array_key_exists('country', $addressDetails) && !empty($addressDetails['country']) ? $addressDetails['country'] : '');
$region->setLatitude(array_key_exists('latitude', $addressDetails) && !empty($addressDetails['latitude']) ? $addressDetails['latitude'] : 0.0);
$region->setLongitude(array_key_exists('longitude', $addressDetails) && !empty($addressDetails['longitude']) ? $addressDetails['longitude'] : 0.0);
foreach ($o_region->boundaries as $o_boundary) {
$boundary = new Boundary();
$boundary->setRegion($region);
$boundary->setOrder(intval($o_boundary->order));
//dd($addressDetails);
$location = new Location();
$location->setStreet(array_key_exists('street', $addressDetails) && !empty($addressDetails['street']) ? $addressDetails['street'] : '');
$location->setCity(array_key_exists('city', $addressDetails) && !empty($addressDetails['city']) ? $addressDetails['city'] : '');
$location->setCode(array_key_exists('code', $addressDetails) && !empty($addressDetails['code']) ? $addressDetails['code'] : '');
$location->setProvince(array_key_exists('province', $addressDetails) && !empty($addressDetails['province']) ? $addressDetails['province'] : '');
$location->setCountry(array_key_exists('country', $addressDetails) && !empty($addressDetails['country']) ? $addressDetails['country'] : '');
$location->setLatitude($o_boundary->location->latitude);
$location->setLongitude($o_boundary->location->longitude);
$boundary->setLocation($location);
$this->entityManager->persist($location);
$this->entityManager->persist($boundary);
$opregion = $region;
$oplocation = $location;
}
$this->entityManager->persist($region);
$regions[] = $region;
}
$service = new Service();
$service->setClient($client);
$service->setName($signUpProcess->getNameOfService());
$service->setBaseTime($signUpProcess->getTimeRequired());
$service->setCutofftime(24);
$crew = new Crew();
$crew->setClient($client);
$crew->setName('Default Team');
foreach ($regions as $region) {
$crew->addRegion($region);
}
$crew->addService($service);
$worker = new Worker();
$worker->setClient($client);
$worker->setCrew($crew);
$worker->setUser($user);
$worker->setName('Admin');
$worker->setType(Worker::TYPE_ADMIN);
$crew->addWorker($worker);
$this->entityManager->persist($client);
$this->entityManager->persist($site);
$this->entityManager->persist($user);
$this->entityManager->persist($service);
$this->entityManager->persist($crew);
$this->entityManager->persist($worker);
$this->entityManager->flush();
if (!$client->getStripeId()) {
try {
$dispatcher = new EventDispatcher();
$dispatcher->addListener(SaasEvents::CLIENT_CREATE, [$this->createCustomer, 'onCreateClient']);
$dispatcher->dispatch(new ClientEvent($client), SaasEvents::CLIENT_CREATE);
} catch (\Throwable $throwable) {
// NOTHING
dump('PASSED HERE');
dump([
'message' => $throwable->getMessage(),
'file' => $throwable->getFile(),
'line' => $throwable->getTrace(),
'trace' => $throwable->getTrace()
]);
dd('END');
}
}
$this->get('session')->set('original_url', sprintf("%s://%s/dashboard/googlecalendar/addstaffcalendars", $request->getScheme(), $signUpProcess->getSchedulingWebsiteFull()));
$client = $this->entityManager->find('Orc\SaasBundle\Entity\Client', $clientId);
//$client->setStatus(Client::STATUS_ACTIVE);
$client->setArrivalWindow($signUpProcess->getServiceType() === 'fixed' ? 0 : 0);
//$this->entityManager->persist($client->getCustomer());
$this->entityManager->persist($client);
$this->entityManager->flush();
//dd($client);
$result_dummybooking = $this->bookingUtilService->createDummyBooking($client, $opregion, $oplocation);
$dummybooking = null;
if (count($result_dummybooking) == 0) {
//dd('GENERAL FAILURE DUMMY BOOKING');
} else if ($result_dummybooking[0] !== 'ok') {
//dd($result_dummybooking[0]);
} else {
$dummybooking = $result_dummybooking[1];
}
$this->intercomIntegrationService->sendToIntercom($client->getId(), true, true, [], []);
//$this->get('session')->set('client', $client->getId());
$gmb_skip = $signUpProcess->getGmbSkip() ? 'true' : 'false';
$gmb_name = $signUpProcess->getGmbName();
$gmb_address = $signUpProcess->getGmbAddress();
$gmb_phone = $signUpProcess->getGmbPhone();
if ($gmb_skip !== 'true' && !empty($gmb_name) && !empty($gmb_address) && !empty($gmb_phone)) {
$oaddress = (array) $this->mapservice->getAddressDetailsExt($gmb_address);
$geocoordinates['unstructured_address'] = array_key_exists('raw', $oaddress) && $oaddress['raw'] !== null ? $oaddress['raw'] : '';
$oaddress = [
'street_address' => array_key_exists('street_single', $oaddress) && $oaddress['street_single'] !== null ? $oaddress['street_single'] : '',
'locality' => array_key_exists('city', $oaddress) && $oaddress['city'] !== null ? $oaddress['city'] : '',
'region' => array_key_exists('province', $oaddress) && $oaddress['province'] !== null ? $oaddress['province'] : '',
'postal_code' => array_key_exists('code', $oaddress) && $oaddress['code'] !== null ? $oaddress['code'] : '',
'country' => array_key_exists('country', $oaddress) && $oaddress['country'] !== null ? $oaddress['country'] : ''
];
$gmbPage = new GmbPage();
$gmbPage->setClient($client);
$gmbPage->setGmbEnabled(true);
$gmbPage->setGmbName($gmb_name);
$gmbPage->setGmbAddress($gmb_address);
$gmbPage->setGmbPhone($gmb_phone);
$gmbPage->setActionUrl($site->getDomain());
$client->setGmbEnabled(true);
$this->entityManager->persist($client);
$this->entityManager->persist($gmbPage);
$this->entityManager->flush();
}
return [
'client' => $client,
'user' => $user,
'crew' => $crew,
'service' => $service,
'dummybooking' => $dummybooking
];
}
private function doStepComplete($request, $signUpProcess) {
$now = new \DateTime();
$signUpProcess->setStatus('complete');
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
return true;
}
private function doStepRedirectionPOST($request, $signUpProcess) {
$now = new \DateTime();
$go = $request->request->get('go');
switch ($signUpProcess->getScreen()) {
case 'input-login':
{
$b = false;
try {
$b = $this->doStepLogin($request, $signUpProcess);
if (!$b) {
throw new \Exception("Unexpected error!");
}
$warningbody = json_encode([
'code' => 0,
'message' => '',
'trace' => null
]);
$signUpProcess->setWarningstatus(1);
$signUpProcess->setWarningbody($warningbody);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
} catch (\Throwable $throwable) {
$warningbody = json_encode([
'code' => $throwable->getCode(),
'line' => $throwable->getLine(),
'file' => $throwable->getFile(),
'message' => $throwable->getMessage(),
'trace' => $throwable->getTrace()
]);
$signUpProcess->setWarningstatus(1);
$signUpProcess->setWarningbody($warningbody);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
//dd($signUpProcess->getScreen());
//dd($go);
if ($b) {
switch ($go) {
case 'previous':
case 'back';
$this->setGoToScreenOnSignUpProcess($signUpProcess, 'input-login');
return $this->redirect($this->generateUrl('sign_up_login'));
break;
case 'next':
default:
$this->setGoToScreenOnSignUpProcess($signUpProcess, 'input-company');
return $this->redirect($this->generateUrl('sign_up_company'));
break;
}
}
return $this->redirect($this->generateUrl('sign_up_login'));
}
break;
case 'input-company':
{
$b = false;
try {
$b = $this->doStepCompany($request, $signUpProcess);
if (!$b) {
throw new \Exception("Unexpected error!");
}
$warningbody = json_encode([
'code' => 0,
'message' => '',
'trace' => null
]);
$signUpProcess->setWarningstatus(1);
$signUpProcess->setWarningbody($warningbody);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
} catch (\Throwable $throwable) {
$warningbody = json_encode([
'code' => $throwable->getCode(),
'line' => $throwable->getLine(),
'file' => $throwable->getFile(),
'message' => $throwable->getMessage(),
'trace' => $throwable->getTrace()
]);
$signUpProcess->setWarningstatus(1);
$signUpProcess->setWarningbody($warningbody);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
if ($b) {
switch ($go) {
case 'previous':
case 'back';
$this->setGoToScreenOnSignUpProcess($signUpProcess, 'input-login');
return $this->redirect($this->generateUrl('sign_up_login'));
break;
case 'next':
default:
$this->setGoToScreenOnSignUpProcess($signUpProcess, 'input-servicearea');
return $this->redirect($this->generateUrl('sign_up_servicearea'));
break;
}
}
return $this->redirect($this->generateUrl('sign_up_company'));
}
break;
case 'input-servicearea':
{
$b = false;
try {
$b = $this->doStepServiceArea($request, $signUpProcess);
if (!$b) {
throw new \Exception("Unexpected error!");
}
$warningbody = json_encode([
'code' => 0,
'message' => '',
'trace' => null
]);
$signUpProcess->setWarningstatus(1);
$signUpProcess->setWarningbody($warningbody);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
} catch (\Throwable $throwable) {
$warningbody = json_encode([
'code' => $throwable->getCode(),
'line' => $throwable->getLine(),
'file' => $throwable->getFile(),
'message' => $throwable->getMessage(),
'trace' => $throwable->getTrace()
]);
$signUpProcess->setWarningstatus(1);
$signUpProcess->setWarningbody($warningbody);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
if ($b) {
switch ($go) {
case 'previous':
case 'back';
$this->setGoToScreenOnSignUpProcess($signUpProcess, 'input-company');
return $this->redirect($this->generateUrl('sign_up_company'));
break;
case 'next':
default:
$this->setGoToScreenOnSignUpProcess($signUpProcess, 'input-service');
return $this->redirect($this->generateUrl('sign_up_service'));
break;
}
}
return $this->redirect($this->generateUrl('sign_up_servicearea'));
}
break;
case 'input-service':
{
$b = false;
try {
$b = $this->doStepService($request, $signUpProcess);
if (!$b) {
throw new \Exception("Unexpected error!");
}
$warningbody = json_encode([
'code' => 0,
'message' => '',
'trace' => null
]);
$signUpProcess->setWarningstatus(1);
$signUpProcess->setWarningbody($warningbody);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
} catch (\Throwable $throwable) {
$warningbody = json_encode([
'code' => $throwable->getCode(),
'line' => $throwable->getLine(),
'file' => $throwable->getFile(),
'message' => $throwable->getMessage(),
'trace' => $throwable->getTrace()
]);
$signUpProcess->setWarningstatus(1);
$signUpProcess->setWarningbody($warningbody);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
if ($b) {
switch ($go) {
case 'previous':
case 'back';
$this->setGoToScreenOnSignUpProcess($signUpProcess, 'input-servicearea');
return $this->redirect($this->generateUrl('sign_up_servicearea'));
break;
case 'next':
default:
$this->setGoToScreenOnSignUpProcess($signUpProcess, 'input-gbp');
return $this->redirect($this->generateUrl('sign_up_gbp'));
break;
}
}
return $this->redirect($this->generateUrl('sign_up_service'));
}
break;
case 'input-gbp':
{
$b = false;
try {
$b = $this->doStepGbp($request, $signUpProcess);
if (!$b) {
throw new \Exception("Unexpected error!");
}
$warningbody = json_encode([
'code' => 0,
'message' => '',
'trace' => null
]);
$signUpProcess->setWarningstatus(1);
$signUpProcess->setWarningbody($warningbody);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
} catch (\Throwable $throwable) {
$warningbody = json_encode([
'code' => $throwable->getCode(),
'line' => $throwable->getLine(),
'file' => $throwable->getFile(),
'message' => $throwable->getMessage(),
'trace' => $throwable->getTrace()
]);
$signUpProcess->setWarningstatus(1);
$signUpProcess->setWarningbody($warningbody);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
if ($b) {
switch ($go) {
case 'previous':
case 'back';
$this->setGoToScreenOnSignUpProcess($signUpProcess, 'input-service');
return $this->redirect($this->generateUrl('sign_up_service'));
break;
case 'next':
default:
$this->setGoToScreenOnSignUpProcess($signUpProcess, 'commit');
return $this->redirect($this->generateUrl('sign_up_commit'));
break;
}
}
return $this->redirect($this->generateUrl('sign_up_gbp'));
}
break;
default:
{
//return $this->step_company($request);
//return $this->forward('App\Controller\SignUpController::step_company', array());
return new Response(
'INVALID STEP',
Response::HTTP_OK,
['content-type' => 'text/html']
);
}
}
}
/**
* @Route("/sign/up/step", name="sign_up_step")
*/
public function step(Request $request): Response
{
$signUpProcess = $this->checkSignUpProcess($request);
if ($signUpProcess == null) {
$response = $this->redirect($this->generateUrl('sign_up_login'));
$this->unsetCookie($response);
return $response;
}
$screen = $request->request->get('screen');
if ($screen != null) {
$this->setGoToScreenOnSignUpProcess($signUpProcess, $screen);
}
if ($request->getMethod() == 'POST') {
return $this->doStepRedirectionPOST($request, $signUpProcess);
} else {
return $this->doStepRedirectionGET($request, $signUpProcess);
}
}
/**
* @Route("/sign/up", name="sign_up_login")
*/
public function step_login(Request $request): Response
{
$now = new \DateTime();
$setCookie = false;
$signUpProcess = $this->checkSignUpProcess($request);
if ($signUpProcess == null) {
$signUpProcess = $this->generateSignUpProcess($request);
$setCookie = true;
} else {
$o = $this->redirectOnInvalidStep($signUpProcess, 'input-login');
if ($o != null) {
return $o;
} else {
$signUpProcess->setScreen('input-login');
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
}
$response = $this->render('sign_up_process/step_login.html.twig', array(
'controller' => $this,
'code' => $signUpProcess->getCode(),
'screen' => 'input-login',
'headersteps' => true,
'complete' => false,
'controller_name' => 'SignUpController',
'next' => $this->generateUrl($this->screensmap['input-company']),
'signUpProcess' => $signUpProcess,
'displaywarning' => true,
'warningstatus' => $signUpProcess != null && $signUpProcess->getWarningstatus() != null ? $signUpProcess->getWarningstatus() : 0,
'warningbody' => $signUpProcess != null && $signUpProcess->getWarningbody() != null && $signUpProcess->getWarningbody() != '' ? json_decode($signUpProcess->getWarningbody()) : null,
'nextlabel' => 'CREATE ACCOUNT'
));
if ($setCookie) {
$this->setCookie($response, $signUpProcess->getCode());
}
return $response;
}
/**
* @Route("/sign/up/company", name="sign_up_company")
*/
public function step_company(Request $request): Response
{
$now = new \DateTime();
$dt = clone $now;
$dt->add(new \DateInterval('PT24H'));
$setCookie = false;
$signUpProcess = $this->checkSignUpProcess($request);
if ($signUpProcess == null) {
return $this->redirect($this->generateUrl('sign_up_login'));
} else {
$o = $this->redirectOnInvalidStep($signUpProcess, 'input-company');
if ($o != null) {
return $o;
} else {
$signUpProcess->setScreen('input-company');
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
}
$domain_suffix = '.' . substr($request->server->get('SERVER_NAME'), 6);
$response = $this->render('sign_up_process/step_company.html.twig', [
'controller' => $this,
'code' => $signUpProcess->getCode(),
'screen' => 'input-company',
'headersteps' => true,
'complete' => false,
'controller_name' => 'SignUpController',
'signUpProcess' => $signUpProcess,
'domain_suffix' => $domain_suffix,
'next' => $this->generateUrl($this->screensmap['input-servicearea']),
'previous' => $this->generateUrl($this->screensmap['input-login']),
'warningstatus' => 0,
'warningbody' => ''
]);
return $response;
}
/**
* @Route("/sign/up/company/save", name="sign_up_company_save")
*/
public function saveCompanySetup(Request $request): Response
{
$signUpProcess = $this->checkSignUpProcess($request);
if ($signUpProcess == null) {
return new JsonResponse(
['message' => 'Sign up process not found'],
Response::HTTP_NOT_FOUND,
['content-type' => 'application/json']
);
}
$result = $this->doStepCompany($request, $signUpProcess);
if (!$result) {
return new JsonResponse(
['message' => 'Setup Company Not Saved'],
Response::HTTP_INTERNAL_SERVER_ERROR,
['content-type' => 'application/json']
);
}
$signUpProcess = $this->checkSignUpProcess($request);
$data = [
'confirmationCodeSent' => $signUpProcess->getConfirmationCodeSent(),
'confirmationCodeVerified' => $signUpProcess->getConfirmationCodeVerified(),
];
return new JsonResponse(
[
'message' => 'Setup Company Saved',
'data' => $data
],
Response::HTTP_OK,
['content-type' => 'application/json']
);
}
/**
* @Route("/sign/up/company/validateCode", name="sign_up_company_validate_code")
*/
public function validateVerificationCode(Request $request): Response
{
$signUpProcess = $this->checkSignUpProcess($request);
if ($signUpProcess == null) {
return new JsonResponse(
['message' => 'Sign up process not found'],
Response::HTTP_NOT_FOUND,
['content-type' => 'application/json']
);
}
$now = new \DateTime();
$verificationCode = $request->query->get('verification_code');
if ($now <= $signUpProcess->getConfirmationCodeExpireAt() && $verificationCode == $signUpProcess->getConfirmationCode()) {
$signUpProcess->setConfirmationCodeVerified(true);
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
return new JsonResponse(
['message' => 'Verification code OK'],
Response::HTTP_OK,
['content-type' => 'application/json']
);
}
return new JsonResponse(
['message' => 'Verification code does\'t match'],
Response::HTTP_FORBIDDEN,
['content-type' => 'application/json']
);
}
/**
* @Route("/sign/up/company/sendCode", name="sign_up_company_send_code")
*/
public function sendVerificationCode(Request $request): Response
{
$signUpProcess = $this->checkSignUpProcess($request);
if ($signUpProcess == null) {
return new JsonResponse(
['message' => 'Sign up process not found'],
Response::HTTP_NOT_FOUND,
['content-type' => 'application/json']
);
}
$phoneNumber = $signUpProcess->getPhoneNumber();
$code = sprintf('%06d', rand(0, 999999));
$now = new \DateTime();
$codeExpireAt = clone $now;
$codeExpireAt->modify('+2 minute');
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setConfirmationCode($code);
$signUpProcess->setConfirmationCodeExpireAt($codeExpireAt);
$signUpProcess->setIpAddress($this->request->getClientIp());
$signUpProcess->setConfirmationCodeSent(true);
$signUpProcess->setConfirmationCodeVerified(false);
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
$smsSent = $this->sendSMS($code, $phoneNumber);
if (!$smsSent) {
return new JsonResponse(
['message' => 'SMS not sent'],
Response::HTTP_INTERNAL_SERVER_ERROR,
['content-type' => 'application/json']
);
}
return new JsonResponse(
[
'message' => 'SMS sent',
'code_expire_at' => $codeExpireAt->format(\DateTime::ATOM)
],
Response::HTTP_OK,
['content-type' => 'application/json']
);
}
private function sendSMS(string $code, string $phoneNumber): bool
{
$account_sid = $this->getParameter('twilio_account_sid');
$auth_token = $this->getParameter('twilio_auth_token');
$twilio_number = $this->getParameter('twilio_number');
$client = new TwilioClient($account_sid, $auth_token);
try {
$message = $client->messages->create(
$phoneNumber,
array(
'from' => $twilio_number,
'body' => 'Routezilla verification code: ' . $code
)
);
if (in_array($message->status, ['sent', 'queued'])) {
return true;
}
return false;
} catch (\Exception $e) {
return false;
}
}
/**
* @Route("/sign/up/servicearea", name="sign_up_servicearea")
*/
public function step_servicearea(Request $request): Response
{
$now = new \DateTime();
$setCookie = false;
$signUpProcess = $this->checkSignUpProcess($request);
if ($signUpProcess == null) {
return $this->redirect($this->generateUrl('sign_up_login'));
} else {
$o = $this->redirectOnInvalidStep($signUpProcess, 'input-servicearea');
if ($o != null) {
return $o;
} else {
$signUpProcess->setScreen('input-servicearea');
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
}
return $this->render('sign_up_process/step_servicearea.html.twig', array(
'controller' => $this,
'code' => $signUpProcess->getCode(),
'screen' => 'input-servicearea',
'headersteps' => true,
'complete' => false,
'controller_name' => 'SignUpController',
'signUpProcess' => $signUpProcess,
'apiKey' => $this->getParameter('maps_api_key'),
'next' => $this->generateUrl($this->screensmap['input-service']),
'previous' => $this->generateUrl($this->screensmap['input-company']),
'warningstatus' => 0,
'warningbody' => ''
));
}
/**
* @Route("/sign/up/service", name="sign_up_service")
*/
public function step_service(Request $request): Response
{
$now = new \DateTime();
$setCookie = false;
$signUpProcess = $this->checkSignUpProcess($request);
if ($signUpProcess == null) {
return $this->redirect($this->generateUrl('sign_up_login'));
} else {
$o = $this->redirectOnInvalidStep($signUpProcess, 'input-service');
if ($o != null) {
return $o;
} else {
$signUpProcess->setScreen('input-service');
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
}
return $this->render('sign_up_process/step_service.html.twig', array(
'controller' => $this,
'code' => $signUpProcess->getCode(),
'screen' => 'input-service',
'headersteps' => true,
'complete' => false,
'controller_name' => 'SignUpController',
'signUpProcess' => $signUpProcess,
'next' => $this->generateUrl($this->screensmap['complete']),
'previous' => $this->generateUrl($this->screensmap['input-servicearea']),
'displaywarning' => true,
'warningstatus' => $signUpProcess != null && $signUpProcess->getWarningstatus() != null ? $signUpProcess->getWarningstatus() : 0,
'warningbody' => $signUpProcess != null && $signUpProcess->getWarningbody() != null && $signUpProcess->getWarningbody() != '' ? json_decode($signUpProcess->getWarningbody()) : null,
));
}
/**
* @Route("/sign/up/gbp", name="sign_up_gbp")
*/
public function step_gbp(Request $request): Response
{
$now = new \DateTime();
$setCookie = false;
$signUpProcess = $this->checkSignUpProcess($request);
if ($signUpProcess == null) {
return $this->redirect($this->generateUrl('sign_up_login'));
} else {
$o = $this->redirectOnInvalidStep($signUpProcess, 'input-service');
if ($o != null) {
return $o;
} else {
$signUpProcess->setScreen('input-service');
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
}
return $this->render('sign_up_process/step_gbp.html.twig', array(
'controller' => $this,
'code' => $signUpProcess->getCode(),
'screen' => 'input-gbp',
'headersteps' => true,
'complete' => false,
'controller_name' => 'SignUpController',
'signUpProcess' => $signUpProcess,
'next' => $this->generateUrl($this->screensmap['complete']),
'previous' => $this->generateUrl($this->screensmap['input-servicearea']),
'displaywarning' => true,
'warningstatus' => $signUpProcess != null && $signUpProcess->getWarningstatus() != null ? $signUpProcess->getWarningstatus() : 0,
'warningbody' => $signUpProcess != null && $signUpProcess->getWarningbody() != null && $signUpProcess->getWarningbody() != '' ? json_decode($signUpProcess->getWarningbody()) : null,
));
}
/**
* @Route("/sign/up/commit", name="sign_up_commit")
*/
public function step_commit(Request $request): Response
{
$now = new \DateTime();
$setCookie = false;
$signUpProcess = $this->checkSignUpProcess($request);
if ($signUpProcess == null) {
return $this->redirect($this->generateUrl('sign_up_login'));
}
$missingFields = $this->validateMissingFields($signUpProcess);
if ($missingFields) {
return $this->redirect($this->generateUrl('sign_up_login'));
}
$signUpCode = null;
try {
$o = $this->validateSignupcode($request, $signUpProcess, false);
if ($o === null) {
throw new \Exception("Unexpected error!");
}
if (!$o["valid"] ) {
throw new \Exception("Your sign up code is not valid anymore!");
}
$signUpCode = $o["signUpCode"];
$warningbody = json_encode([
'code' => 0,
'message' => '',
'trace' => null
]);
$signUpProcess->setWarningstatus(1);
$signUpProcess->setWarningbody($warningbody);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
} catch (\Throwable $throwable) {
$warningbody = json_encode([
'code' => $throwable->getCode(),
'line' => $throwable->getLine(),
'file' => $throwable->getFile(),
'message' => $throwable->getMessage(),
'trace' => $throwable->getTrace()
]);
$signUpProcess->setWarningstatus(1);
$signUpProcess->setWarningbody($warningbody);
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
return $this->redirect($this->generateUrl('sign_up_login'));
}
$o = $this->redirectOnInvalidStep($signUpProcess, 'commit');
if ($o != null) {
return $o;
} else {
$signUpProcess->setScreen('commit');
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
$b = $this->doStepCommit($request, $signUpProcess);
//dd($b);
if ($b != null) {
$this->setGoToScreenOnSignUpProcess($signUpProcess, 'complete');
$this->doStepComplete($request, $signUpProcess);
$response = $this->guardAuthenticationHandler->authenticateUserAndHandleSuccess(
$b['user'],
$request,
$this->loginFormAuthenticator,
'main'
);
// $response = $this->render('sign_up_process/step_complete.html.twig', array(
// 'code' => $signUpProcess->getCode(),
// 'signUpProcess' => $signUpProcess
// ));
$this->unsetCookie($response);
} else {
$response = new Response(
'COMMIT FAILED',
Response::HTTP_OK,
['content-type' => 'text/html']
);
}
return $response;
}
private function validateSignupcode($request, $signUpProcess, $markvalidation = true) {
$now = new \DateTime();
if ($markvalidation) {
$signupcode = $signUpProcess->getSignupcode();
} else {
$signupcode = $request->request->get('signupcode');
if ($signupcode === null || $signupcode === '') {
$signupcode = $request->query->get('signupcode');
}
}
if ($signupcode !== null && $signupcode !== '') {
$signUpCode = $this->signUpCodeRepository->findOneBy(['code' => $signupcode]);
if ($signUpCode == null) {
throw new \Exception("Coupon code not found!");
}
if ($signUpCode->getStatus() != 'new') {
throw new \Exception("This coupon has expired!");
}
if ($signUpCode->getMaxUsageCount() !== null) {
if ($signUpCode->getUsageCount() === null) {
$signUpCode->setUsageCount(0);
}
if ($signUpCode->getUsageCount() >= $signUpCode->getMaxUsageCount()) {
if ($markvalidation) {
$signUpCode->setStatus('validated');
if ($signUpCode->getValidatedAt() === null) {
$signUpCode->setValidatedAt($now);
}
$this->entityManager->persist($signUpCode);
$this->entityManager->flush();
}
throw new \Exception("This coupon has expired!");
} else {
//if ($markvalidation) { dd(['signupcode' => $signupcode, 'signUpCode' => $signUpCode]); }
if ($markvalidation) {
$signUpCode->setUsageCount($signUpCode->getUsageCount() + 1);
if ($signUpCode->getUsageCount() >= $signUpCode->getMaxUsageCount()) {
$signUpCode->setStatus('validated');
$signUpCode->setValidatedAt($now);
}
$this->entityManager->persist($signUpCode);
$this->entityManager->flush();
}
}
} else {
if ($signUpCode->getUsageCount() + 1 >= $signUpCode->getMaxUsageCount()) {
if ($markvalidation) {
$signUpCode->setUsageCount($signUpCode->getUsageCount() + 1);
//$signUpCode->setStatus('validated');
//$signUpCode->setValidatedAt($now);
$this->entityManager->persist($signUpCode);
$this->entityManager->flush();
}
}
}
return [
"valid" => true,
"coupon" => $signupcode,
"signUpCode" =>$signUpCode
];
} else {
return [
"valid" => true,
"coupon" => $signupcode,
"signUpCode" => null
];
}
}
private function validateMissingFields($signUpProcess): bool
{
$methods = ['getEmail', 'getPassword', 'getConfirmPassword', 'getCompanyName', 'getPhoneNumber', 'getSchedulingWebsite', 'getLocationText', 'getNameOfService', 'getTimeRequired'];
foreach ($methods as $method) {
if (!$signUpProcess->$method()) {
return true;
}
}
return false;
}
/**
* @Route("/sign/up/complete", name="sign_up_complete")
*/
public function step_complete(Request $request): Response
{
$now = new \DateTime();
$setCookie = false;
$signUpProcess = $this->checkSignUpProcess($request);
if ($signUpProcess == null) {
return $this->redirect($this->generateUrl('sign_up_login'));
} else {
$o = $this->redirectOnInvalidStep($signUpProcess, 'complete');
if ($o != null) {
return $o;
} else {
$signUpProcess->setScreen('complete');
$signUpProcess->setUpdatedAt($now);
$signUpProcess->setIpAddress($this->request->getClientIp());
$this->entityManager->persist($signUpProcess);
$this->entityManager->flush();
}
}
$response = $this->render('sign_up_process/step_complete.html.twig', array(
'controller' => $this,
'code' => $signUpProcess->getCode(),
'signUpProcess' => $signUpProcess
));
$this->unsetCookie($response);
return $response;
}
/**
* @Route("/sign/up/checkdomain", name="sign_up_checkdomain")
*/
public function checkdomain(Request $request): Response
{
$currentSignUpProcess = $this->checkSignUpProcess($request);
$prefix = $request->request->get('prefix');
if ($prefix == null) {
$prefix = $request->query->get('prefix');
}
$domain_suffix = '.' . substr($request->server->get('SERVER_NAME'), 6);
$domain = "$prefix$domain_suffix";
$clientRepository = $this->entityManager->getRepository(Client::class);
$client = $clientRepository->findOneByDomain($domain);
$result = true;
if ($client != null) {
$result = true;
} else {
$signUpProcess = $this->signUpProcessRepository->findOneBy(['status' => 'form', 'scheduling_website_full' => $domain]);
if ($signUpProcess != null && $signUpProcess->getCode() != $currentSignUpProcess->getCode()) {
$result = true;
} else {
$result = false;
}
}
$response = new JsonResponse(
$result,
Response::HTTP_OK,
['content-type' => 'application/json']
);
return $response;
}
private function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[random_int(0, $charactersLength - 1)];
}
return $randomString;
}
/**
* @Route("/sign/up/generatecodes/{num}/{len}", name="sign_up_generatecodes")
*/
public function generatecodes(Request $request, int $num, int $len): Response
{
$now = new \DateTime();
for ($i = 0; $i < $num; $i++) {
$code = $this->generateRandomString($len);
$signUpCode = new SignUpCode();
$signUpCode->setStatus('new');
$signUpCode->setCode($code);
$signUpCode->setCreatedAt($now);
$signUpCode->setCreatedAt($now);
$this->entityManager->persist($signUpCode);
}
$this->entityManager->flush();
$response = new JsonResponse(
"OK",
Response::HTTP_OK,
['content-type' => 'application/json']
);
return $response;
}
/**
* @Route("/sign/up/checkemail", name="sign_up_checkemail")
*/
public function checkemail(Request $request): Response
{
$currentSignUpProcess = $this->checkSignUpProcess($request);
$email = $request->request->get('email');
if ($email == null) {
$email = $request->query->get('email');
}
$domain_suffix = '.' . substr($request->server->get('SERVER_NAME'), 6);
$userRepository = $this->entityManager->getRepository(User::class);
$user = $userRepository->findOneByEmail($email);
$result = true;
if ($user != null) {
$result = true;
} else {
$signUpProcess = $this->signUpProcessRepository->findOneBy(['status' => 'form', 'email' => $email]);
if ($signUpProcess != null && $signUpProcess->getCode() != $currentSignUpProcess->getCode()) {
$result = true;
} else {
$result = false;
}
}
$response = new JsonResponse(
$result,
Response::HTTP_OK,
['content-type' => 'application/json']
);
return $response;
}
/**
* @Route("/sign/up/start", name="sign_up_start")
*/
public function start(Request $request): Response
{
$mobile_detect = new Mobile_Detect();
$redirect_uri = $request->query->get('redirect_uri');
$redirect_qparm = $redirect_uri == null ? '' : '?redirect_uri=' . urlencode($redirect_uri);
if ($mobile_detect->isMobile()) {
return $this->redirect($request->getSchemeAndHttpHost() . $this->getParameter("signup_path_mobile") . $redirect_qparm);
} else {
return $this->redirect($request->getSchemeAndHttpHost() . $this->getParameter("signup_path") . $redirect_qparm);
}
}
public function getEnvType() {
$domain = $this->request->getSchemeAndHttpHost();
if (preg_match('/^[^:]+:\/\/[^\.]+\.routezilla\.com/', $domain, $output_array)) {
return 'production';
} else if (preg_match('/^[^:]+:\/\/[^\.]+\.test.upgrade.routezilla\.com/', $domain, $output_array)) {
return 'staging';
} else if (preg_match('/^[^:]+:\/\/[^\.]+\.staging.routezilla\.com/', $domain, $output_array)) {
return 'staging';
} else if (preg_match('/^[^:]+:\/\/[^\.]+\.dev.routezilla\.com/', $domain, $output_array)) {
return 'development';
} else {
return 'local';
}
}
/**
* @Route("/sign/up/test", name="sign_up_test")
*/
public function test(Request $request): Response
{
// Your Account SID and Auth Token from twilio.com/console
//$account_sid = 'AC9abc2cfa0bd339976d41715a953a37c8';
//$auth_token = '8c32a440651eb070edc7a2c9eaf1eddf';
// In production, these should be environment variables. E.g.:
// $auth_token = $_ENV["TWILIO_AUTH_TOKEN"]
$account_sid = $this->getParameter('twilio_account_sid');
$auth_token = $this->getParameter('twilio_auth_token');
// A Twilio number you own with SMS capabilities
//$twilio_number = "+19402408415";
$twilio_number = $this->getParameter('twilio_number');
$client = new TwilioClient($account_sid, $auth_token);
$resp = $client->messages->create(
// Where to send a text message (your cell phone?)
//'+16048077923',
'+5585997147777',
array(
'from' => $twilio_number,
'body' => 'Pedro: I sent this message in under 10 minutes!'
)
);
dd($resp);
}
/**
* @Route("/clientredirect/{prefix}", name="sign_up_client_redirect")
*/
public function client_redirect(Request $request, $prefix) {
//$via = $request->query->get('via');
$a_server = explode('.', $request->server->get('SERVER_NAME'));
array_splice($a_server, 0, 1);
$saddress = sprintf('%s://%s.%s/dashboard?ic_track_event=client-onboarding-survey-completed', $request->getScheme(), $prefix, implode('.', $a_server));
return $this->redirect($saddress);
}
}