<?php
namespace App\Controller\AAR;
use App\Controller\Master\DefaultController as DefaultController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use App\Entity\Purchase;
use App\Entity\PurchaseItem;
use App\Entity\User;
use App\Entity\Contact;
use App\Utils\ContentHelper;
use App\Utils\UserHelper;
use App\Utils\ContactHelper;
use App\Utils\EmailHelper;
use App\Utils\OrderHelper;
use App\Utils\LeadHelper;
use App\Security\WordPressPasswordEncoder;
use App\Exception\ResourceNotFoundException;
use Symfony\Bridge\Doctrine\Security\RememberMe\DoctrineTokenProvider;
use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentToken;
use Symfony\Component\HttpFoundation\Cookie;
class AuthController extends DefaultController
{
/**
* @Route("/sign-in",
* name="sign-in-post_aar",
* defaults={"message": ""},
* methods={"POST"}
* )
*/
public function signInPost(
Request $request,
$message = "",
UserHelper $userHelper,
EmailHelper $emailHelper,
DoctrineTokenProvider $doctrineTokenProvider
)
{
$username = $request->get("_username");
$password = $request->get("_password");
if(!$emailHelper->checkCaptcha($request->get("g-recaptcha-response"))) {
$this->addFlash("warning", "The reCAPTCHA was invalid. Please try again.");
$message = array (
"type" => "warning",
"text" => "The reCAPTCHA was invalid. Please try again.",
);
return $this->defaultRender("forms/sign-in.html.twig", [
"message" => $message,
]);
}
$session = $request->getSession();
$nRoute = $session->get("non_sign_in_route");
$path = !empty($nRoute["path"]) ? $nRoute["path"] : "/";
$result = $userHelper->signIn(
$username,
$password,
//$this->get("security.token_storage"),
//$this->get("event_dispatcher")
);
if(is_array($result) && $result["status"] == 2) {
return new RedirectResponse("/mfa/{$result['uid']}/{$result['token']}");
}
elseif (is_array($result) && $result["status"] == 1) {
$this->addFlash("success", "You have successfully logged in.");
$response = new RedirectResponse($path);
$response = $this->setRememberMe($request, $response, $doctrineTokenProvider, $username);
}
else {
$message = array (
"type" => "warning",
"text" => "Invalid credentials provided.",
);
return $this->defaultRender("forms/sign-in.html.twig", [
"message" => $message,
]);
}
return $response;
}
/**
* @Route("/sign-in",
* name="sign-in_aar",
* defaults={"message": ""}
* )
*/
public function signIn(Request $request, AuthenticationUtils $authUtils, $message = "", WordPressPasswordEncoder $wpEncoder)
{
//just testing: $message = $wpEncoder->encodePassword("M0byd1ck771!");
//$message = null;
$message = $request->query->get("message") ?? "";
$error = $authUtils->getLastAuthenticationError();
$lastUsername = $authUtils->getLastUsername();
if ($error) {
$message = array (
"type" => "warning",
"text" => "Invalid credentials.",
);
}
return $this->defaultRender("forms/sign-in.html.twig", [
"last_username" => $lastUsername,
// "error" => $error,
"message" => $message,
]);
}
/**
* @Route("/forgot-password", name="forgot-password_aar")
*/
public function forgotPassword (
Request $request,
UserHelper $userHelper,
EmailHelper $emailHelper
) {
// should we rate limit ??
$username = $request->request->get("username");
$message = array ();
if ($username) {
$rsp = $userHelper->forgotPassword($username);
$message = array(
"type" => $rsp["status"] ? "success" : "warning",
"text" => $rsp["message"],
);
}
return $this->defaultRender("forms/forgot-password.html.twig", [
"message" => $message,
]);
}
/**
* @Route("/forgot-username", name="forgot-username_aar", methods={"POST"})
*/
public function forgotUsername (
Request $request,
UserHelper $userHelper
) {
$email = $request->get("email");
$rsp = $userHelper->forgotUsername($email);
$msg = array ();
if ($rsp["status"]) {
$msg = array (
"type" => "success",
"text" => $rsp["message"],
);
}
else {
sleep (3);
$msg = array (
"type" => "warning",
"text" => $rsp["message"],
);
}
return $this->defaultRender("forms/forgot-username.html.twig", [
"message" => $msg
]);
/*
try {
$user = $userHelper->getUserByEmail($email);
$username = $user->getUsername();
return $this->defaultRender("forms/sign-in.html.twig", [
"message" => [
"type" => "success",
"text" => "The username linked to that account is <strong>{$username}</strong>.",
]
]);
} catch (ResourceNotFoundException $e) {
sleep(3);
return $this->defaultRender("forms/forgot-username.html.twig", [
"message" => [
"type" => "warning",
"text" => "That e-mail address was not found in the system.",
]
]);
}
*/
}
/**
* @Route("/forgot-username", name="forgot-username-form_aar")
*/
public function viewForgotUsername (
) {
return $this->defaultRender("forms/forgot-username.html.twig", [
"message" => array ()
]);
}
/**
* @Route("/rcs-reset-password/{id}/{token}", name="reset-password-form_aar", defaults={"message": ""})
*/
public function viewResetPassword (
UserHelper $userHelper,
$id,
$token,
$message = ""
) {
try {
$user = $userHelper->getUserById($id);
// if token does not match
if ($token != $user->getResetPwToken()) {
return $this->defaultRender("errors/404.html.twig");
}
return $this->defaultRender("forms/reset-password.html.twig", [
"user" => $user,
"id" => $id,
"token" => $token,
"message" => $message
]);
} catch (ResourceNotFoundException $e) {
}
}
/**
* @Route("/rcs-reset-password", name="reset-password_aar", methods={"POST"})
*/
public function resetPassword (
Request $request,
WordPressPasswordEncoder $wpEncoder,
UserHelper $userHelper
) {
$id = $request->get("id");
$token = $request->get("token");
$password1 = $request->get("password1");
$password2 = $request->get("password2");
$rsp = $userHelper->resetPassword(
$id,
$token,
$password1,
$password2
);
$msg = array ();
if ($rsp["status"]) {
$msg = array (
"type" => "success",
"text" => $rsp["message"],
);
return $this->redirectToRoute("sign-in_aar", [
"message" => $msg
]);
}
else {
$msg = array (
"type" => "warning",
"text" => $rsp["message"],
);
return $this->redirectToRoute("reset-password-form_aar", [
"id" => $id,
"token" => $token,
"message" => $msg
]);
}
}
/**
* @Route("/sign-up", name="sign-up_aar", methods={"POST"})
*/
public function signUp (
Request $request,
UserHelper $userHelper,
EmailHelper $emailHelper,
LeadHelper $leadHelper
) {
$username = $request->get("username");
$email = $request->get("email");
$email = trim($email);
$firstname = $request->get("firstname");
$lastname = $request->get("lastname");
$address1 = $request->get("address1");
$address2 = $request->get("address2");
$city = $request->get("city");
$state = $request->get("state");
$zip = $request->get("zip");
if($emailHelper->checkCaptcha($request->get("g-recaptcha-response"))) {
$password1 = $request->get("password1");
$password2 = $request->get("password2");
$lead["username"] = $username;
$lead["email"] = $email;
$lead["firstname"] = $firstname;
$lead["lastname"] = $lastname;
$lead["address1"] = $address1;
$lead["address2"] = $address2;
$lead["city"] = $city;
$lead["state"] = $state;
$lead["zip"] = $zip;
$lead = $leadHelper->saveLead($lead, null, $request);
$em = $this->getDoctrine()->getManager();
$em->persist($lead);
$em->flush();
$rsp = $userHelper->signUp(
"bypass",
"bypass",
$username,
$email,
$password1,
$password2
);
if ($rsp["status"]) {
return $this->defaultRender("forms/sign-in.html.twig", [
"message" => $rsp["message"],
]);
}
return $this->defaultRender("forms/sign-up.html.twig", [
"username" => $username,
"email" => $email,
"firstname" => $firstname,
"lastname" => $lastname,
"address1" => $address1,
"address2" => $address2,
"city" => $city,
"state" => $state,
"zip" => $zip,
"message" => $rsp["message"],
]);
}
else {
return $this->defaultRender("forms/sign-up.html.twig", [
"username" => $username,
"email" => $email,
"firstname" => $firstname,
"lastname" => $lastname,
"address1" => $address1,
"address2" => $address2,
"city" => $city,
"state" => $state,
"zip" => $zip,
"message" => [
"type" => "warning",
"text" => "The reCAPTCHA was invalid. Please try again.",
],
]);
}
}
/**
* @Route("/sign-up", name="sign-up-form_aar")
*/
public function viewSignUp (
) {
return $this->defaultRender("forms/sign-up.html.twig", [
"username" => "",
"email" => "",
"message" => array (
)
]);
}
/**
* @Route("/activate-account", name="activate_aar", methods={"POST"})
*/
public function activateAccount (
Request $request,
UserHelper $userHelper
) {
$id = $request->get("id");
$token = $request->get("token");
$rsp = $userHelper->activateAccount($id, $token);
if ($rsp["status"]) {
/*return $this->defaultRender("/", [
"message" => array (
"type" => "success",
"text" => $rsp["message"],
)
]);*/
$this->addFlash("success", $rsp["message"]);
return $this->redirect("/");
//$this->addFlash("success", $rsp["message"]);
//return $this->redirect('http://staging.rooferscoffeeshop.com/post-a-classified-ad/2');
}
else {
return $this->defaultRender("forms/send-activation.html.twig", [
"type" => "warning",
"text" => $rsp["message"],
]);
}
/*
try {
$id = $request->get("id");
$token = $request->get("token");
$user = $userHelper->getUserById($id);
$expires = $user->getActivationExpires();
if ($user->getActivationToken() == $token &&
new \DateTime("now") < $expires
) {
$user->setActivationToken(null);
$user->setActivationExpires(null);
// $user->setIsActive(1);
$user->setStatus(1);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
$em->clear();
return $this->defaultRender("forms/sign-in.html.twig", [
"message" => array (
"type" => "success",
"text" => "The account has been activated. You may now sign in.",
),
]);
}
}
catch (ResourceNotFoundException $e) {
// ... ignore
}
return $this->defaultRender("forms/send-activation.html.twig", [
"message" => array (
"type" => "warning",
"text" => "The provided token was not found in the system. It is possible that it has expired. If the token has expired, you will need to sign up again.",
),
]);
*/
}
/**
* @Route("/activate-account/{id}/{token}", name="view-activation-form_aar")
*/
public function viewActivateAccount (
UserHelper $userHelper,
$id = "",
$token = ""
) {
try {
$user = $userHelper->getUserById($id);
$expires = $user->getActivationExpires();
if ($token == $user->getActivationToken() &&
new \DateTime("now") < $expires
) {
return $this->defaultRender("forms/activate.html.twig", [
"username" => $user->getUsername(),
"id" => $id,
"token" => $token,
]);
}
} catch (ResourceNotFoundException $e) {
// ... ignore
}
return $this->defaultRender("forms/send-activation.html.twig", [
"message" => array (
"type" => "warning",
"text" => "The provided token was not found in the system. It is possible that it has expired. If the token has expired, you will need to sign up again or re-send the activation link.",
),
]);
}
/**
* @Route("/send-activation", name="send-activation_aar", methods={"POST"})
*/
public function sendActivation (
Request $request,
UserHelper $userHelper,
EmailHelper $emailHelper
) {
$email = $request->get("email");
$resp = $userHelper->sendActivation($email);
if ($resp["status"]) {
return $this->defaultRender("forms/send-activation.html.twig", [
"message" => array (
"type" => "success",
"text" => $resp["message"],
)
]);
}
return $this->defaultRender("forms/send-activation.html.twig", [
"message" => array (
"type" => "warning",
"text" => $resp["message"],
)
]);
/*
try {
$email = $request->get("email");
$user = $userHelper->getUserByEmail($email);
$uid = $user->getId();
$token = $user->getActivationToken();
$expires = $user->getActivationExpires();
$pooled = $emailHelper->sendEmail($email, "Account Activation Link", [
["p" => "Hello {$user->getFullName()},"],
["p" => "You recently requested to receive an activation link for your RoofersCoffeeShop account. Click the button below to activate it."],
["button" => [
"text" => "Activate Account",
"href" => "https://rooferscoffeeshop.com/activate-account/{$uid}/{$token}",
]],
["p" => "If you did not request a password reset, please ignore this email or reply to let us know. This password reset link is only valid for the next 2 hours."],
]);
if ($pooled) {
return $this->defaultRender("forms/send-activation.html.twig", [
"message" => array (
"type" => "success",
"text" => "The activation link has been sent to that e-mail address.",
)
]);
}
return $this->defaultRender("forms/send-activation.html.twig", [
"message" => array (
"type" => "warning",
"text" => "An error occurred while trying to send a system e-mail. If this error continues to occur please contact support.",
)
]);
} catch (ResourceNotFoundException $e) {
}
return $this->defaultRender("forms/send-activation.html.twig", [
"message" => array (
"type" => "warning",
"text" => "No account found matching that criteria.",
)
]);
*/
}
/**
* @Route("/send-activation", name="send-activation-form_aar")
*/
public function viewSendActivation (
UserHelper $userHelper
) {
return $this->defaultRender("forms/send-activation.html.twig", [
"message" => array (),
]);
}
/**
* @Route("/mfa/{id}/{token}", name="view-mfa-form_aar")
*/
public function viewMfa (
UserHelper $userHelper,
$id = "",
$token = ""
) {
try {
$user = $userHelper->getUserById($id);
$expires = $user->getMfaTokenExpires();
if ($token == $user->getMfaToken() &&
new \DateTime("now") < $expires
) {
return $this->defaultRender("forms/mfa.html.twig", [
"username" => $user->getUsername(),
"id" => $id,
"token" => $token,
]);
}
} catch (ResourceNotFoundException $e) {
// ... ignore
}
return $this->defaultRender("forms/sign-in.html.twig", [
"message" => array (
"type" => "warning",
"text" => "The provided token was not found in the system. It is possible that it has expired. Try signing in again.",
),
]);
}
/**
* @Route("/mfasignin", name="mfasignin_aar", methods={"POST"})
*/
public function mfaSignIn (
Request $request,
UserHelper $userHelper,
DoctrineTokenProvider $doctrineTokenProvider
) {
$id = $request->get("id");
$token = $request->get("token");
$code = $request->get("code");
$rsp = $userHelper->signInMfa($id, $token, $code);
if ($rsp["status"]) {
/*return $this->defaultRender("/", [
"message" => array (
"type" => "success",
"text" => $rsp["message"],
)
]);*/
$session = $request->getSession();
$nRoute = $session->get("non_sign_in_route");
$path = !empty($nRoute["path"]) ? $nRoute["path"] : "/";
$user = $userHelper->getUserById($id);
$username = $user->getUsername();
$this->addFlash("success", "You have successfully logged in.");
$response = new RedirectResponse($path);
$response = $this->setRememberMe($request, $response, $doctrineTokenProvider, $username);
return $response;
//return $this->redirect("/");
//$this->addFlash("success", $rsp["message"]);
//return $this->redirect('http://staging.rooferscoffeeshop.com/post-a-classified-ad/2');
}
else {
return $this->defaultRender("forms/mfa.html.twig", [
//"username" => $user->getUsername(),
"id" => $id,
"token" => $token,
"message" => array (
"type" => "warning",
"text" => $rsp["message"],
)
]);
}
}
public function setRememberMe(
$request,
$response,
$doctrineTokenProvider,
$username
) {
$series = base64_encode(random_bytes(64));
$tokenValue = base64_encode(random_bytes(64));
$user = $this->user;
$doctrineTokenProvider->createNewToken(
new PersistentToken(
User::class,
//$user->getUsername(),
$username,
$series,
$tokenValue,
new \DateTime()
)
);
$options = [
'name' => 'REMEMBERME',
'lifetime' => 604800,
'path' => '/',
//'domain' => 'staging.rooferscoffeeshop.com',
'domain' => null,
'secure' => true,
'httponly' => true,
'samesite' => 'strict',
];
//samesite =
//public const SAMESITE_NONE = 'none';
//public const SAMESITE_LAX = 'lax';
//public const SAMESITE_STRICT = 'strict';
$cookieParts = [$series, $tokenValue];
foreach ($cookieParts as $cookiePart) {
if (str_contains($cookiePart, ":")) {
throw new \InvalidArgumentException(sprintf('$cookieParts should not contain the cookie delimiter "%s".', ":"));
}
}
$encodedCookie = base64_encode(implode(":", $cookieParts));
//$response = new Response();
$response->headers->setCookie(
new Cookie(
$options['name'],
//$this->encodeCookie([$series, $tokenValue]),
$encodedCookie,
time() + $options['lifetime'],
$options['path'],
$options['domain'],
$options['secure'] ?? $request->isSecure(),
$options['httponly'],
false,
$options['samesite']
)
);
return $response;
}
/**
* @Route("/account", methods={"POST"}, name="post-account_aar")
*/
public function updateAccount (
Request $request,
UserHelper $userHelper
) {
// if we have a current user
if ($this->user) {
// grab the fields
$data = [];
if ($request->get("firstname")) {
$data["firstname"] = $request->get("firstname");
}
if ($request->get("lastname")) {
$data["lastname"] = $request->get("lastname");
}
if ($request->get("displayname")) {
$data["displayname"] = $request->get("displayname");
}
if ($request->get("username")) {
$data["username"] = $request->get("username");
}
if ($request->get("email")) {
$data["email"] = $request->get("email");
}
if ($request->get("password1")) {
$data["password1"] = $request->get("password1");
$data["password2"] = $request->get("password2");
$data["password3"] = $request->get("password3");
}
// user avatar
if ($request->files->get("avatar")) {
$data["avatar"] = $request->files->get("avatar");
}
else if ($request->get("remove_avatar")) {
$data["remove_avatar"] = true;
}
//Update notifications
$data["usermeta"] = [];
$notifications = $request->get("notifications");
if(empty($notifications)) {
$notifications = [];
}
$data["usermeta"]["member_notification_forum"] = in_array("forum", $notifications);
$data["usermeta"]["member_notification_page"] = in_array("page", $notifications);
$data["usermeta"]["member_notification_classifieds"] = in_array("classifieds", $notifications);
$rsp = $userHelper->updateAccount(
$this->user->getId(),
$data
);
$this->addFlash($rsp["type"], $rsp["message"]);
}
return $this->redirectToRoute("account_aar");
}
/**
* @Route("/account/profile", methods={"POST"}, name="post-account-profile_aar")
*/
public function updateAccountProfile (
Request $request,
ContactHelper $contactHelper,
EmailHelper $emailHelper
) {
$user = $this->user;
// if we have a current user
if($user) {
$contact = $user->getContact();
if(!$contact) {
$contact = new Contact();
$user->setContact($contact);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
}
$contactHelper->updateContact($contact->getId(), $request->request->all());
$this->addFlash("success", "Profile updated.");
$emailHelper->sendEmail(
["rcs@rooferscoffeeshop.com"],
"Profile Updated - {$user->getUsername()}",
[
["p" => "{$user->getUsername()} has updated their account's profile information."],
["p" => "Visit the User Dashboard to view these changes."],
["button" => [
"text" => "User Dashboard",
"href" => "https://www.rooferscoffeeshop.com/user-dashboard",
]],
]
);
}
return $this->redirectToRoute("account_aar", [
"slug" => "profile",
]);
}
/**
* @Route("/account/content/{type}", name="account-content-filter_aar")
*/
public function viewAccountContentType (
Request $request,
UserHelper $userHelper,
$type = ""
) {
if (!$this->user) {
return $this->redirect("/sign-in");
}
$user = $this->user;
return $this->defaultRender("forms/user-account.html.twig", [
"user" => $user,
"slug" => "content",
"type" => $type,
"meta" => [
"breadcrumbs" => [
[
"title" => "Your Account",
"href" => "/account",
]
]
]
]);
}
/**
* @Route("/account/membership/cancel", methods={"POST"}, name="post-account-membership-cancel_aar")
*/
public function cancelAccountMembership (
Request $request,
UserHelper $userHelper,
OrderHelper $orderHelper
) {
if (!$this->user) {
return $this->redirect("/sign-in");
}
$user = $this->user;
$manager = $this->getDoctrine()->getManager();
$item = $manager->getRepository(PurchaseItem::class)
->findOneBy([
"id" => $request->get("item_id"),
]);
$item->setStatus(PurchaseItem::STATUS_ACTIVE);
$manager->persist($item);
$manager->flush();
$this->addFlash("success", "Your membership has been cancelled and will not auto-renew.");
return $this->redirectToRoute("account_aar", [
"slug" => "membership",
]);
}
/**
* @Route("/account/membership/continue", methods={"POST"}, name="post-account-membership-continue_aar")
*/
public function continueAccountMembership (
Request $request,
UserHelper $userHelper,
OrderHelper $orderHelper
) {
if (!$this->user) {
return $this->redirect("/sign-in");
}
$user = $this->user;
$manager = $this->getDoctrine()->getManager();
$item = $manager->getRepository(PurchaseItem::class)
->findOneBy([
"id" => $request->get("item_id"),
]);
$item->setStatus($item->getPaymentFailed() ? PurchaseItem::STATUS_ACTIVE_RENEWING_FINAL : PurchaseItem::STATUS_ACTIVE_RENEWING);
$manager->persist($item);
$manager->flush();
$this->addFlash("success", "Your membership has been re-activated and will now automatically renew.");
return $this->redirectToRoute("account_aar", [
"slug" => "membership",
]);
}
/**
* @Route("/account/membership", methods={"POST"}, name="post-account-membership_aar")
*/
public function updateAccountMembership (
Request $request,
UserHelper $userHelper,
OrderHelper $orderHelper
) {
if (!$this->user) {
return $this->redirect("/sign-in");
}
$user = $this->user;
$payment = $request->get("payment");
$card = $request->get("card");
//expiration date
$card["card_expires"] = $card["card_expires_month"].$card["card_expires_year"];
if (!$payment || !isset($payment["terms"])) {
$this->addFlash("warning", "You must accept the terms and conditions.");
return $this->redirectToRoute("account_aar", [
"slug" => "membership",
]);
}
$result = $orderHelper->generateToken(
$payment["firstname"],
$payment["lastname"],
$payment["company"],
$payment["address1"],
$payment["address2"],
$payment["city"],
$payment["state"],
$payment["zip"],
$payment["country"],
$payment["email"],
$payment["phone"],
$_SERVER["REMOTE_ADDR"],
$card["card_number"],
$card["card_expires"],
$card["card_csc"]
);
if ($result["result"] == "APPROVAL" || $result["result"] == "APPROVED") {
$last4 = $card["card_number"];
$last4 = preg_replace("/[^0-9]/", '', $last4);
$last4 = substr($last4, -4);
$user->setUsermetum("has_payment_info", "1");
$user->setUsermetum("payment_first_name", $payment["firstname"]);
$user->setUsermetum("payment_last_name", $payment["lastname"]);
$user->setUsermetum("payment_company", $payment["company"]);
$user->setUsermetum("payment_address_line_1", $payment["address1"]);
$user->setUsermetum("payment_address_line_2", $payment["address2"]);
$user->setUsermetum("payment_city", $payment["city"]);
$user->setUsermetum("payment_state_province", $payment["state"]);
$user->setUsermetum("payment_postal_code", $payment["zip"]);
$user->setUsermetum("payment_country", $payment["country"]);
$user->setUsermetum("payment_email", $payment["email"]);
$user->setUsermetum("payment_phone", $payment["phone"]);
$user->setUsermetum("payment_last4", $last4);
$user->setUsermetum("payment_exp", $card["card_expires"]);
//$user->setUsermetum("payment_cvv2", $card["card_csc"]);
$user->setUsermetum("payment_token", $result["token"]);
$user->setUsermetum("payment_token_response", $result["token_response"]);
$manager = $this->getDoctrine()->getManager();
$manager->persist($user);
$manager->flush();
$this->addFlash("success", "Membership settings updated.");
return $this->redirectToRoute("account_aar", [
//"slug" => "membership",
]);
}
else {
$this->addFlash("warning", "Their was an error while updating your payment information. Response: {$result["result"]}");
return $this->redirectToRoute("account_aar", [
"slug" => "membership",
]);
}
}
/**
* @Route("/account/{slug}/{id}",
* name="account_aar",
* defaults={"slug": "", "id": ""}
* )
*/
public function viewAccount (
UserHelper $userHelper,
Request $request,
$slug = "",
$id = ""
) {
if (!$this->user) {
return $this->redirect("/sign-in");
}
$user = $this->user;
$manager = $this->getDoctrine()->getManager();
$purchases = $user->getPurchases();
$purchase = null;
if (!$slug) {
$slug = "account";
}
if ($slug == "order" && $id) {
// show the order details
$purchase = $manager->getRepository(Purchase::class)
->findOneBy([
"id" => $id
]);
if (!$purchase || $purchase->getUser()->getId() != $user->getId()) {
$purchase = null;
}
}
$customers = $user->getCompanies();
$membership_item = "";
$membership_product = "";
$will_renew = false;
//Get the current purchase item used to activate the user's membership
if($user->isMember()) {
$now = new \DateTime();
foreach($purchases as $p) {
$items = $p->getItems();
foreach($items as $item) {
if(($item->getStatus() >= PurchaseItem::STATUS_ACTIVE) && ($item->getType() == PurchaseItem::TYPE_MEMBERSHIP) && ($item->getExpiresAt() > $now)) {
$membership_item = $item;
$membership_product = $item->getProduct();
$will_renew = ($item->getStatus() >= PurchaseItem::STATUS_ACTIVE_RENEWING ? true : false);
}
}
}
}
$payment = false;
if($slug == "membership") {
if($user->getUserMetaValueByKey("has_payment_info")) {
$payment = [];
$payment["firstname"] = $user->getUserMetaValueByKey("payment_first_name");
$payment["lastname"] = $user->getUserMetaValueByKey("payment_last_name");
$payment["company"] = $user->getUserMetaValueByKey("payment_company");
$payment["address1"] = $user->getUserMetaValueByKey("payment_address_line_1");
$payment["address2"] = $user->getUserMetaValueByKey("payment_address_line_2");
$payment["city"] = $user->getUserMetaValueByKey("payment_city");
$payment["state"] = $user->getUserMetaValueByKey("payment_state_province");
$payment["zip"] = $user->getUserMetaValueByKey("payment_postal_code");
$payment["country"] = $user->getUserMetaValueByKey("payment_country");
$payment["email"] = $user->getUserMetaValueByKey("payment_email");
$payment["phone"] = $user->getUserMetaValueByKey("payment_phone");
}
}
return $this->defaultRender("forms/user-account.html.twig", [
"user" => $user,
"purchases" => $purchases,
"purchase" => $purchase,
"slug" => $slug,
"customers" => $customers,
"membership_item" => $membership_item,
"membership_product" => $membership_product,
"will_renew" => $will_renew,
"payment" => $payment,
"meta" => [
"breadcrumbs" => [
[
"title" => "Your Account",
"href" => "/account",
]
]
]
]);
}
/**
* @Route("/admin-account/membership/{id}", name="admin-account-membership_aar")
*/
public function adminAccountMembership(
Request $request,
UserHelper $userHelper,
$id = ""
) {
//Admin check
$access = false;
if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
$user = $this->getUser();
if($user) {
if($user->isAdmin()) {
$access = true;
}
}
}
if(!$access) {
$this->addFlash("warning", "This page is only accessible to site administrators.");
return $this->redirectToRoute("/");
}
$member = "";
if($id) {
$member = $userHelper->getUserById($id);
}
$manager = $this->getDoctrine()->getManager();
$purchases = $member->getPurchases();
$purchase = null;
$membership_item = "";
$membership_product = "";
$will_renew = false;
//Get the current purchase item used to activate the user's membership
if($member->isMember()) {
$now = new \DateTime();
foreach($purchases as $p) {
$items = $p->getItems();
foreach($items as $item) {
if(($item->getStatus() >= PurchaseItem::STATUS_ACTIVE) && ($item->getType() == PurchaseItem::TYPE_MEMBERSHIP) && ($item->getExpiresAt() > $now)) {
$membership_item = $item;
$membership_product = $item->getProduct();
$will_renew = ($item->getStatus() >= PurchaseItem::STATUS_ACTIVE_RENEWING ? true : false);
}
}
}
}
return $this->defaultRender("forms/account/admin-membership.html.twig", [
"id" => $id,
"member" => $member,
"purchases" => $purchases,
"purchase" => $purchase,
"membership_item" => $membership_item,
"membership_product" => $membership_product,
"will_renew" => $will_renew,
]);
}
/**
* @Route("/admin-account/membership-cancel", methods={"POST"}, name="post-admin-account-membership-cancel_aar")
*/
public function adminCancelAccountMembership (
Request $request,
UserHelper $userHelper,
OrderHelper $orderHelper
) {
$user_id = $request->get("user_id");
$user = $userHelper->getUserById($user_id);
$manager = $this->getDoctrine()->getManager();
$item = $manager->getRepository(PurchaseItem::class)
->findOneBy([
"id" => $request->get("item_id"),
]);
$item->setStatus(PurchaseItem::STATUS_ACTIVE);
$manager->persist($item);
$manager->flush();
$this->addFlash("success", "Membership has been cancelled and will not auto-renew.");
return $this->redirectToRoute("admin-account-membership_aar", [
"id" => $user_id,
]);
}
/**
* @Route("/admin-account/membership-continue", methods={"POST"}, name="post-admin-account-membership-continue_aar")
*/
public function adminContinueAccountMembership (
Request $request,
UserHelper $userHelper,
OrderHelper $orderHelper
) {
$user_id = $request->get("user_id");
$user = $userHelper->getUserById($user_id);
$manager = $this->getDoctrine()->getManager();
$item = $manager->getRepository(PurchaseItem::class)
->findOneBy([
"id" => $request->get("item_id"),
]);
$item->setStatus($item->getPaymentFailed() ? PurchaseItem::STATUS_ACTIVE_RENEWING_FINAL : PurchaseItem::STATUS_ACTIVE_RENEWING);
$manager->persist($item);
$manager->flush();
$this->addFlash("success", "Membership has been re-activated and will now automatically renew.");
return $this->redirectToRoute("admin-account-membership_aar", [
"id" => $user_id,
]);
}
}