<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Mailer\Exception\TransportException;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
use Symfony\Component\HttpFoundation\JsonResponse;
use Orc\UserBundle\Entity\User;
use App\Controller\BaseController;
use App\Entity\MarketerClientRequest;
use App\Entity\MarketerRedemptionCode;
use App\Entity\SignUpCode;
use App\Form\Marketing\Account;
use App\Form\Marketing\AccountType;
use App\Form\Marketing\RegistrationAppsumoType;
use App\Model\EntityModel\SiteEntityModel;
use App\Model\EntityModel\ClientEntityModel;
use App\Model\MarketingModel;
use App\Mailer\MarketerRequestMailer;
use App\Form\Marketing\RegistrationType;
use App\Security\LoginFormAuthenticator;
use App\Model\EntityModel\WorkerEnityModel;
use App\Repository\MarketerValidRedemptionCodesRepository;
use App\Repository\SignUpCodeRepository;
use App\Service\IntercomIntegrationService;
use Orc\SaasBundle\Repository\ClientRepository;
use Symfony\Component\Form\FormError;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Twilio\Rest\Client as TwilioClient;
class MarketingController extends BaseController {
const LABEL_AUTHORIZATION_SUCCESS = "You successfully authorized %s to have access to your account.";
const LABEL_AUTHORIZATION_ALREADY_AUTHORIZED = "You already authorized %s to have access to your account.";
const LABEL_AUTHORIZATION_FAIL = "An unexpected error error prevented us from authorizing %s to access your account.";
const MSG_DELETE_ONE_SUCCESS = 'Account deleted successfully.';
const MSG_DELETE_ONE_NOT_FOUND = 'Account not found.';
const MSG_DELETE_ONE_NOT_YOURS = 'You are not authorized to this account.';
const MSG_DELETE_ONE_FAIL = 'Unable to delte account (unexpected error).';
const MSG_DENY_STATUS_ERROR = 'An unexpected error prevented us from completing your request. But %s is still not authorized to have access to your account.';
const MSG_DENY_STATUS_SUCCESS = "You successfully denied %s from having access to your account.";
const MSG_DENY_STATUS_ALREADY_DENIED = "You already denied %s from having access to your account.";
const MSG_DENY_STATUS_PREVIOUSLY_AUTHORIZED = "You authorized %s to have access to your account previously.";
const MSG_DENY_STATUS_NOT_FOUND = 4;
const NUMBER_OF_ITEMS_PER_PAGE = 20;
/**
* @Route("/marketing", name="app_marketing_index")
*/
public function index(
Request $request, SiteEntityModel $siteEntityModel,
ClientEntityModel $clientEntityModel, MarketingModel $marketingModel,
MarketerRequestMailer $marketerRequestMailer, ContainerInterface $container
)
{
$marketer = $this->getUser()->getMarketer();
if (!$marketer) {
return $this->redirect($this->generateUrl('app_logout'));
}
$domain = $container->getParameter('marketing_subdomain'). '.' .
$container->getParameter('domain_name');
$form = $this->createForm(AccountType::class, (new Account())->setMarketer($marketer));
$form->handleRequest($request);
if ( $form->isSubmitted() && $form->isValid() ) {
$account = $form->getData();
$accountUrl = $account->getUrl();
$domain = str_replace(
['http://', 'https://', '/'], ['', ''], $accountUrl
);
$site = $siteEntityModel->findOneByDomain($domain);
$accountClient = $site->getClient();
if (!$marketer) {
throw new \Exception('Marketer not defined');
}
$marketerClientRequest = $marketingModel->addMarketingClientRequest($marketer, $accountClient);
try {
$blnSent = $marketerRequestMailer->send($marketerClientRequest);
if ($blnSent) {
//$this->addFlash('success', "Request sent to {$domain} owner.");
return $this->redirect($this->generateUrl(
'app_marketing_index'
));
}
else {
$this->addFlash('error', "Unexpected error: Unable to send request to {$domain} owner.");
}
}
catch(TransportException $e) {
$this->addFlash('error', "Unable to send request to {$domain} owner. Maybe the email in their account is not valid.");
}
}
else if ($request->isMethod('post')) {
//$this->addFlash('error', 'Please correct the errors!');
//$this->addFlash('error', 'Account Not Found!');
}
$from = $request->query->has('from') ? $request->query->get('from') : 1;
$to = $request->query->has('to') ? $request->query->get('to') : self::NUMBER_OF_ITEMS_PER_PAGE;
if ($from >= $to) {
$from = 1;
$to = self::NUMBER_OF_ITEMS_PER_PAGE;
}
$marketerClientRequests = $marketingModel->findMarketerClientRequestsByMarketerPaginated($marketer, $from-1, self::NUMBER_OF_ITEMS_PER_PAGE);
$totalItems = $marketingModel->countMarketerClientRequestsByMarketer($marketer);
return $this->render('orc/views/marketing/index.html.twig', [
'marketer' => $marketer,
'form' => $form->createView(),
'marketerClientRequests' => $marketerClientRequests,
//'site' => $marketer->getSite(),
'queryText' => '',
'totalItems' => $totalItems,
'from' => $from,
'to' => $to,
'numberOfItemsPerPage' => 5, //self::NUMBER_OF_ITEMS_PER_PAGE,
'deleteSelectedRoute' => 'app_marketing_delete_selected',
'domain' => $domain
]);
}
/**
* @Route("/dashboard/marketer-request/{id}/{token}/{choice}",
* name="app_marketing_authorize_marketer",
* requirements={"choice"="yes|no"}
* )
*/
public function authorize(
Request $request, MarketerClientRequest $marketerClientRequest,
string $token, $choice, SiteEntityModel $siteEntityModel,
ClientEntityModel $clientEntityModel, MarketingModel $marketingModel,
ContainerInterface $container
)
{
$domain = $container->getParameter('marketing_subdomain'). '.' .
$container->getParameter('domain_name');
$marketer = $this->getUser()->getMarketer();
if ($choice == 'yes') {
$status = $marketingModel->authorizeRequest($marketerClientRequest, $token);
if ($status == MarketingModel::RESPONSE_STATUS_SUCCESS) {
$this->addFlash('success', sprintf(
self::LABEL_AUTHORIZATION_SUCCESS,
$marketerClientRequest->getMarketer()->getName()
));
}
else if ($status == MarketingModel::RESPONSE_STATUS_ALREADY_AUTHORIZED) {
$this->addFlash('error', sprintf(
self::LABEL_AUTHORIZATION_ALREADY_AUTHORIZED,
$marketerClientRequest->getMarketer()->getName()
));
}
else {
$this->addFlash('error', sprintf(
self::LABEL_AUTHORIZATION_FAIL,
$marketerClientRequest->getMarketer()->getName()
));
}
}
else if ($choice == 'no') {
$status = $marketingModel->denyRequest($marketerClientRequest, $token);
switch ($status) {
case MarketingModel::DENY_STATUS_SUCCESS:
$this->addFlash('success', sprintf(
self::MSG_DENY_STATUS_SUCCESS,
$marketerClientRequest->getMarketer()->getName()
));
break;
case MarketingModel::DENY_STATUS_ALREADY_AUTHORIZED:
$this->addFlash('success', sprintf(
self::MSG_DENY_STATUS_PREVIOUSLY_AUTHORIZED,
$marketerClientRequest->getMarketer()->getName()
));
break;
case MarketingModel::DENY_STATUS_ALREADY_DENIED:
$this->addFlash('success', sprintf(
self::MSG_DENY_STATUS_ALREADY_DENIED,
$marketerClientRequest->getMarketer()->getName()
));
break;
case MarketingModel::DENY_STATUS_NOT_FOUND:
throw $this->createNotFoundException('Page not found');
break;
case MarketingModel::DENY_STATUS_ERROR:
$this->addFlash('error', sprintf(
self::MSG_DENY_STATUS_ERROR,
$marketerClientRequest->getMarketer()->getName()
));
break;
default:
break;
}
}
return $this->redirect($this->generateUrl('app_client_marketing'));
}
/**
* @Route("/marketing/list/filter", name="app_marketing_list_filter")
*/
public function listFilter(Request $request, MarketingModel $marketingModel, ContainerInterface $container, EntityManagerInterface $entityManager)
{
//$marketerRepository = $entityManager->getRepository('App\\Entity\\Marketer');
//$marketer = $marketerRepository->find($this->getUser()->getMarketer()->getId());
$marketer = $this->getUser()->getMarketer();
if (!$marketer) {
return $this->redirect($this->generateUrl('app_logout'));
}
$marketer->getName();
$domain = $container->getParameter('marketing_subdomain'). '.' .
$container->getParameter('domain_name');
$marketer = $this->getUser()->getMarketer();
$marketer = $this->getUser()->getMarketer();
if (!$marketer) {
return $this->redirect($this->generateUrl('app_logout'));
}
$queryText = $request->query->get('q');
if (!$queryText || empty($queryText)) {
return $this->redirect($this->generateUrl('app_marketing_index'));
}
$form = $this->createForm(AccountType::class, (new Account())->setMarketer($marketer));
$form->handleRequest($request);
$from = $request->query->has('from') ? $request->query->get('from') : 1;
$to = $request->query->has('from') ? $request->query->get('to') : self::NUMBER_OF_ITEMS_PER_PAGE;
if ($from >= $to) {
$from = 1;
$to = self::NUMBER_OF_ITEMS_PER_PAGE;
}
$marketerClientRequests = $marketingModel->findFilteredMarketerClientRequestsPaginated($marketer, $from-1, $to, $queryText);
$totalItems = $marketingModel->countFilteredMarketerClientRequests($marketer, $queryText);
return $this->render('orc/views/marketing/index.html.twig', array(
'site' => $this->site,
'client' => $marketer,
'form' => $form->createView(),
'marketer' => $marketer,
'marketerClientRequests' => $marketerClientRequests,
'totalItems' => $totalItems,
'from' => $from,
'to' => $to,
'queryText' => $queryText,
'numberOfItemsPerPage' => self::NUMBER_OF_ITEMS_PER_PAGE,
'deleteSelectedRoute' => 'app_marketing_delete_selected',
'domain' => $domain,
'user' => $this->getUser()
));
}
/**
* @Route("/marketing/requests/delete-selected/{ids}", name="app_marketing_delete_selected")
*/
public function deleteSelected(
Request $request, string $ids,
MarketingModel $marketingModel
)
{
$marketer = $this->getUser()->getMarketer();
$marketer = $this->getUser()->getMarketer();
if (!$marketer) {
return $this->redirect($this->generateUrl('app_logout'));
}
$deleted = $marketingModel->deleteMarketerClientRequestsByIds(
$marketer, $ids
);
if ($deleted) {
$this->addFlash('success', 'Accounts removed successfully.');
}
else {
$this->addFlash('success', 'Unexpected error.');
}
return $this->redirect($this->generateUrl('app_marketing_index'));
}
/**
* @Route("/marketing/requests/{id}", name="app_marketing_delete", methods={"GET"})
*/
public function delete(
Request $request, MarketerClientRequest $marketerClientRequest,
MarketingModel $marketingModel
)
{
$marketer = $this->getUser()->getMarketer();
if (!$marketer) {
return $this->redirect($this->generateUrl('app_logout'));
}
$deleteStatus = $marketingModel->deleteMarketerClientRequest(
$marketer, $marketerClientRequest
);
if ($deleteStatus == MarketingModel::DELETE_ONE_STATUS_SUCCESS) {
$this->addFlash('success', self::MSG_DELETE_ONE_SUCCESS);
}
else if ($deleteStatus == MarketingModel::DELETE_ONE_STATUS_NOT_FOUND) {
throw $this->createNotFoundException(MarketingModel::DELETE_ONE_STATUS_NOT_FOUND);
}
else if ($deleteStatus == MarketingModel::DELETE_ONE_STATUS_ACCOUNT_NOT_YOURS) {
$this->addFlash('error', self::MSG_DELETE_ONE_NOT_YOURS);
}
else {
$this->addFlash('error', self::MSG_DELETE_ONE_FAIL);
}
return $this->redirect($this->generateUrl('app_marketing_index'));
}
/**
* @Route("/marketing/redemption/add", name="app_marketing_redemtioncode_add", methods={"POST"})
*/
public function redemtioncode_add(
Request $request,
MarketerValidRedemptionCodesRepository $marketerValidRedemptionCodesRepository
)
{
try {
$marketer = $this->getUser()->getMarketer();
$now = new \DateTime();
$entityManager = $this->getDoctrine()->getManager();
$odata = json_decode($request->getContent());
if (!$marketer->isLicensed()) {
throw new \Exception("This is not a licensed marketer!");
}
if (empty($odata) || !property_exists($odata, 'code') || empty($odata->code)) {
throw new \Exception("Please provide a valid redemption code!");
}
$ncodes = count($marketer->getMarketerRedemptionCodes());
if ($ncodes >= 3) {
throw new \Exception("You cannot add more than three redemption codes!");
}
$vrcode = $odata->code;
$marketerValidRedemptionCode = $marketerValidRedemptionCodesRepository->findOneBy(['code' => $vrcode, 'status' => false]);
if ($marketerValidRedemptionCode == null) {
throw new \Exception("Please provide a valid redemption code!");
}
$marketerValidRedemptionCode->setStatus(true);
$entityManager->persist($marketerValidRedemptionCode);
$entityManager->flush();
$marketerRedemptionCode = new MarketerRedemptionCode();
$marketerRedemptionCode->setMarketer($marketer);
$marketerRedemptionCode->setStatus(MarketerRedemptionCode::STATUS_ENABLED);
$marketerRedemptionCode->setDateAdded(clone $now);
$marketerRedemptionCode->setIpaddress($request->getClientIp());
$marketerRedemptionCode->setCode($vrcode);
$entityManager->persist($marketerRedemptionCode);
$entityManager->flush();
$signUpCode = $marketer->getSignUpCodes()[0];
$ncodesnew = $ncodes + 1;
$newmaxusagecount = null;
switch ($ncodesnew) {
case 2:
{
$newmaxusagecount = MarketerRedemptionCode::MAXUSAGECOUNT_2;
}
break;
case 3:
{
$newmaxusagecount = MarketerRedemptionCode::MAXUSAGECOUNT_3;
}
break;
}
$signUpCode->setStatus('new');
if (!empty($newmaxusagecount)) {
$signUpCode->setMaxUsageCount($newmaxusagecount);
}
$entityManager->persist($signUpCode);
$entityManager->flush();
return new JsonResponse(
[
'status' => 'ok',
'usage' => [
'current' => $signUpCode->getUsageCount(),
'max' => $signUpCode->getMaxUsageCount()
]
],
Response::HTTP_OK,
['content-type' => 'application/json']
);
} catch (\Throwable $throwable) {
return new JsonResponse(
[
'message' => $throwable->getMessage(),
'trace' => $throwable->getTrace(),
'file' => $throwable->getFile(),
'line' => $throwable->getLine()
],
Response::HTTP_BAD_REQUEST,
['content-type' => 'application/json']
);
}
}
/**
* @Route("/marketing/requests/{id}/togglelive", name="app_marketing_togglelive", methods={"POST"})
*/
public function togglelive(
Request $request, MarketerClientRequest $marketerClientRequest,
MarketingModel $marketingModel,EntityManagerInterface $entityManager,
MailerInterface $mailerInterface, ContainerInterface $container,
IntercomIntegrationService $intercomIntegrationService
)
{
$marketer = $this->getUser()->getMarketer();
if (!$marketer) {
return $this->redirect($this->generateUrl('app_logout'));
}
$client = $marketerClientRequest->getClient();
$doSendToIntercom = false;
if ($client->getLive()) {
$client->setLive(false);
} else {
$client->setLive(true);
if (!$client->getLiveNotified()) {
/*
try {
$email = (new Email())
->from('info@routezilla.com')
->to($client->getEmail())
//->cc('cc@example.com')
//->bcc('bcc@example.com')
//->replyTo('fabien@example.com')
//->priority(Email::PRIORITY_HIGH)
//->subject('Your new Routezilla Account is ready!')
->subject('Your New Routezilla Account is Now Live!')
//->html(sprintf('<p>Your new Routezilla Account <a href="%s">%s</a> is now live! Please <a href="%s/reset-password">click here</a> to set your password and start your journey!</p>', $client->getDomainWithProtocol(), $client->getName(), $client->getDomainWithProtocol()));
->html(sprintf('<p>Your new Routezilla Account, <a href="%s">%s</a>, is now live! Please <a href="%s/reset-password">click here</a> to set your password and start your journey!</p>', $client->getDomainWithProtocol(), $client->getName(), $client->getDomainWithProtocol()));
$mailerInterface->send($email);
} catch (\Throwable $throwable) {
// NOTHING
}
*/
try {
$phoneNumber = $client->getPhone();
$phoneNumber = MarketingController::enforcePhoneNumberPattern($phoneNumber);
$account_sid = $container->getParameter('twilio_account_sid');
$auth_token = $container->getParameter('twilio_auth_token');
$twilio_number = $container->getParameter('twilio_number');
$twilioClient = new TwilioClient($account_sid, $auth_token);
$resp = $twilioClient->messages->create(
// Where to send a text message (your cell phone?)
//'+16048077923',
$phoneNumber,
array(
'from' => $twilio_number,
'body' => 'Congrats! Your Routezilla account is now set up. We are launching your account. Check your email in 30 minutes to reset your password and get started.'
//'body' => 'Congrats! Your Routezilla account is now set up. Check your email to reset your password and get started.'
//'body' => 'Congratulations, your Routezilla account is setup. Go to you email to reset your password and learn more about Routezilla',
// implode(' ',[
// sprintf('Your new Routezilla Account %s is now live!', $client->getName()),
// sprintf('Please click the link below to set your password and start your journey:'),
// sprintf('%s/reset-password .', $client->getDomainWithProtocol()),
// sprintf('Your Routezilla booking link is:'),
// sprintf('%s .', $client->getDomainWithProtocol())
// ])
)
);
} catch (\Throwable $throwable) {
// NOTHING
}
$doSendToIntercom = true;
$client->setLiveNotified(true);
$entityManager->persist($client);
$entityManager->flush();
}
}
$entityManager->persist($client);
$entityManager->flush();
//dd($doSendToIntercom);
if ($doSendToIntercom) {
try {
$data = $intercomIntegrationService->sendToIntercom($client->getId(), true, false, [], []);
// dump($client);
// dd($data);
} catch (\Throwable $throwable) {
//dd($throwable->getMessage());
// NOTHING
}
$intercomIntegrationService->sendMerchantNotifyEvent($client->getId());
}
return new JsonResponse(
[ 'client' => $client ],
Response::HTTP_OK,
['content-type' => 'application/json']
);
}
/**
* @Route("/marketing/licenses/requests", name="app_marketing_post_licenses_requests", methods={"POST"})
*/
public function post_licenses_requests(Request $request)
{
$user = $this->getUser();
$marketer = $this->getUser()->getMarketer();
$odata = json_decode($request->getContent());
$subject = 'License request submitted';
$text = sprintf('You have successfully requested %d licenses for your marketing portal on Routezilla. Our team will contact you for next steps.', $odata->number_of_licenses);
$email = (new Email())
->from('notifications@routezilla.com')
->to($user->getEmail())
//->cc('cc@example.com')
->bcc('info@routezilla.com', 'brent@routezilla.com', 'ken@routezilla.com', 'robert@routezilla.com', 'pedro@routezilla.com')
->replyTo('info@routezilla.com')
//->priority(Email::PRIORITY_HIGH)
->subject("$subject")
->text($text)
->html($text);
return new JsonResponse(
[ 'ok' => true ],
Response::HTTP_OK,
['content-type' => 'application/json']
);
}
/**
* @Route("/signup/marketer", name="app_marketing_signup", methods={"GET", "POST"})
*/
public function signup(
Request $request, LoginFormAuthenticator $authenticator,
UserPasswordEncoderInterface $passwordEncoder,
GuardAuthenticatorHandler $guardAuthenticatorHandler
)
{
$now = new \DateTime();
$user = new User();
$form = $this->createForm(RegistrationType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData();
$user->setPassword(
$passwordEncoder->encodePassword($user, $user->getPassword())
);
$roles = $user->getRoles();
$roles[] = 'ROLE_MARKETER';
$user->setRoles($roles);
$user->getMarketer()->setUser($user);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
$code = $this->generateRandomString();
$signUpCode = new SignUpCode();
$signUpCode->setCode($code);
$signUpCode->setCreatedAt($now);
$signUpCode->setStatus('new');
$signUpCode->setMarketer($user->getMarketer());
$signUpCode->setOriginallyMarketer($user->getMarketer());
$signUpCode->setMaxUsageCount(null);
$signUpCode->setUsageCount(null);
$entityManager->persist($signUpCode);
$entityManager->flush();
return $guardAuthenticatorHandler->authenticateUserAndHandleSuccess(
$user, // the User object you just created
$request,
$authenticator, // authenticator whose onAuthenticationSuccess you want to use
'main' // the name of your firewall in security.yaml
);
}
else if ($request->isMethod('post')) {
$this->addFlash('error', 'Please correct the errors!');
// $errors = $this->getErrorMessages($form);
// error_log(__FILE__ . ': ' . __LINE__ . ': $errors = ' . var_export($errors, true));
}
return $this->render('orc/views/marketing/signup.html.twig', array(
'form' => $form->createView()
));
}
/**
* @Route("/appsumo/signup", name="app_marketing_appsumo_signup", methods={"GET", "POST"})
* * @Route("/appsumo/signup/{code}", name="app_marketing_appsumo_signup", methods={"GET", "POST"})
*/
public function signup_appsumo(
Request $request, LoginFormAuthenticator $authenticator,
UserPasswordEncoderInterface $passwordEncoder,
GuardAuthenticatorHandler $guardAuthenticatorHandler,
MarketerValidRedemptionCodesRepository $marketerValidRedemptionCodesRepository,
$code = ''
)
{
$now = new \DateTime();
$user = new User();
$form = $this->createForm(RegistrationAppsumoType::class, $user, [
'hascode' => !empty($code)
]);
$setformcode = false;
$marketerValidRedemptionCode = null;
$isValidCode = false;
if ($request->isMethod('post')) {
$vrcode = $_POST['registration_appsumo']['appsumoredemptioncode'];
$marketerValidRedemptionCode = $marketerValidRedemptionCodesRepository->findOneBy(['code' => $vrcode, 'status' => false]);
if ($marketerValidRedemptionCode == null) {
$form->get('appsumoredemptioncode')->addError(new FormError('Invalid Redemption Code!'));
} else {
$isValidCode = true;
}
} else if ($request->isMethod('get')) {
if (!empty($code)) {
$setformcode = true;
$vrcode = $code;
$marketerValidRedemptionCode = $marketerValidRedemptionCodesRepository->findOneBy(['code' => $vrcode, 'status' => false]);
if ($marketerValidRedemptionCode == null) {
$form->get('appsumoredemptioncode')->addError(new FormError('Invalid Redemption Code!'));
} else {
$isValidCode = true;
}
}
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid() && $isValidCode) {
$user = $form->getData();
$user->setPassword(
$passwordEncoder->encodePassword($user, $user->getPassword())
);
$roles = $user->getRoles();
$roles[] = 'ROLE_MARKETER';
$user->setRoles($roles);
$user->getMarketer()->setUser($user);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
$marketerValidRedemptionCode->setStatus(true);
$entityManager->persist($marketerValidRedemptionCode);
$entityManager->flush();
$marketerRedemptionCode = new MarketerRedemptionCode();
$marketerRedemptionCode->setMarketer($user->getMarketer());
$marketerRedemptionCode->setStatus(MarketerRedemptionCode::STATUS_ENABLED);
$marketerRedemptionCode->setDateAdded(clone $now);
$marketerRedemptionCode->setIpaddress($request->getClientIp());
$marketerRedemptionCode->setCode($code);
$entityManager->persist($marketerRedemptionCode);
$entityManager->flush();
$sucode = $this->generateRandomString();
$signUpCode = new SignUpCode();
$signUpCode->setCode($sucode);
$signUpCode->setCreatedAt($now);
$signUpCode->setStatus('new');
$signUpCode->setMarketer($user->getMarketer());
$signUpCode->setOriginallyMarketer($user->getMarketer());
$signUpCode->setMaxUsageCount(MarketerRedemptionCode::MAXUSAGECOUNT_1);
$signUpCode->setUsageCount(null);
$entityManager->persist($signUpCode);
$entityManager->flush();
return $guardAuthenticatorHandler->authenticateUserAndHandleSuccess(
$user, // the User object you just created
$request,
$authenticator, // authenticator whose onAuthenticationSuccess you want to use
'main' // the name of your firewall in security.yaml
);
} else if ($request->isMethod('post')) {
$errors = $this->getErrorMessages($form);
if (count($errors) > 0) {
foreach ($errors as $key => $message) {
$this->addFlash('error', gettype($message) == 'array' ? implode(' ', $message) : $message);
}
}
if (!$isValidCode) {
$this->addFlash('error', 'The code you entered is invalid!');
}
// error_log(__FILE__ . ': ' . __LINE__ . ': $errors = ' . var_export($errors, true));
} else if ($setformcode) {
$form->get('appsumoredemptioncode')->setData($code);
}
return $this->render('orc/views/marketing/signup_appsumo.html.twig', array(
'form' => $form->createView()
));
}
/**
* @Route("/marketing/requests/{id}/resend", name="app_marketing_request_resend", methods={"GET"})
*/
public function resend(
MarketerClientRequest $marketerClientRequest,
MarketerRequestMailer $marketerRequestMailer
)
{
$domain = $marketerClientRequest->getClient()->getDomain();
try {
$blnSent = $marketerRequestMailer->send($marketerClientRequest);
if ($blnSent) {
$this->addFlash('success', "Request re-sent to {$domain} owner.");
}
else {
$this->addFlash('error', "Unexpected error: Unable to send request to {$domain} owner.");
}
}
catch(TransportException $e) {
$this->addFlash('error', "Unable to re-send request to {$domain} owner. Maybe the email in their account is not valid.");
}
return $this->redirect($this->generateUrl(
'app_marketing_index'
));
}
/**
* @Route("/dashboard/marketing", name="app_client_marketing", methods={"GET"})
*/
public function clientMarketers(
Request $request, MarketingModel $marketingModel,
WorkerEnityModel $workerEntityModel
)
{
$client = $this->getClient();
$marketerRequests = $marketingModel->findNonDeniedByClient($client);
$totalItems = count($marketerRequests);
$worker = $workerEntityModel->findByUser($this->getUser());
if (!$worker) {
$worker = $workerEntityModel->findByUser($client->getUser());
}
return $this->render('orc/views/marketing/client/client-marketing.html.twig', array(
'site' => $client->getSite(),
'totalItems' => $totalItems,
'marketerRequests' => $marketerRequests,
'requestStatuses' => MarketerClientRequest::getStatuses(),
'worker' => $worker
));
}
/**
* @Route("/dashboard/client/revoke", name="app_marketing_client_revoke", methods={"GET"})
*/
public function revokeAccess(MarketingModel $marketingModel)
{
$client = $this->getClient();
$marketer = $marketingModel->revokeAccess($client);
$this->addFlash(
'success', 'Access revoked from marketer ' . $marketer->getName()
);
return $this->redirect($this->generateUrl('app_client_marketing'));
}
/**
* Convert string to match E.164 phone number pattern (e.g. +1234567890),
* otherwise return empty string.
*/
public function enforcePhoneNumberPattern($string) {
$hasplus = false;
if (strlen($string) > 0 && $string[0] === '+') {
$hasplus = true;
}
$newString = preg_replace("/[^0-9]/", "", $string);
if ($newString == '') {
return '';
}
if ($hasplus) {
$newString = "+$newString";
} else {
$newString = "+1$newString";
}
return $newString;
}
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;
}
}