<?php
namespace TomRockets\Subscriber;
use Shopware\Core\Checkout\Customer\CustomerEvents;
use Shopware\Core\Checkout\Order\Aggregate\OrderCustomer\OrderCustomerEntity;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Page\Account\Overview\AccountOverviewPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class AccountOverviewLoadedSubscriber implements EventSubscriberInterface
{
/** @var SystemConfigService */
private $config;
/** @var EntityRepository */
private $orderRepository;
/** @var EntityRepository */
private $groupRepository;
public function __construct(
SystemConfigService $config,
EntityRepository $orderRepository,
EntityRepository $groupRepository
)
{
$this->config = $config;
$this->orderRepository = $orderRepository;
$this->groupRepository = $groupRepository;
}
/**
* @inheritDoc
*/
public static function getSubscribedEvents()
{
return [
AccountOverviewPageLoadedEvent::class => "accountLoaded",
];
}
public function accountLoaded(AccountOverviewPageLoadedEvent $event){
$turnOver = self::getCustomerTurnOver($event->getPage()->getCustomer()->getId());
$amountOfOrders = self::getOrdersByCustomer($event->getPage()->getCustomer()->getId());
$categoryMore = $this->config->get("TomRockets.config.accountMore");
$result = [];
if ($turnOver['amount'] < 300){
$result['nextGroupTurnOver'] = 300 - $turnOver['amount'];
}elseif ($turnOver['amount'] >= 300 && $turnOver['amount'] < 600){
$result['nextGroupTurnOver'] = 600 - $turnOver['amount'];
}elseif ($turnOver['amount'] >= 600 && $turnOver['amount'] < 1200){
$result['nextGroupTurnOver'] = 1200 - $turnOver['amount'];
}elseif ($turnOver['amount'] >= 1200){
$result['nextGroupTurnOver'] = 0;
}
if ($amountOfOrders['amount'] < 12) {
$result['nextGroupAmountOfOrders'] = 12 - $amountOfOrders['amount'];
}elseif ($amountOfOrders['amount'] >= 12 && $amountOfOrders['amount'] < 24){
$result['nextGroupAmountOfOrders'] = 24 - $amountOfOrders['amount'];
}elseif ($amountOfOrders['amount'] >= 24 && $amountOfOrders['amount'] < 36){
$result['nextGroupAmountOfOrders'] = 36 - $amountOfOrders['amount'];
}elseif ($amountOfOrders['amount'] >= 36){
$result['nextGroupAmountOfOrders'] = 0;
}
$result['currentStatus'] = $turnOver['turnOver'];
$result['categoryMore'] = $categoryMore;
$result['currentGroup'] = self::getCustomerGroup($event->getPage()->getCustomer()->getGroupId());
$result['nextGroup'] = self::getNextGroup($result['currentStatus'], $result['currentGroup']);
$currentGroupStatus = '';
if ($result['currentStatus'] === 'bronze' && $result['currentGroup']->getId() !== $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
if ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
$currentGroupStatus = 'silver';
}elseif ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.goldCustomerGroup")){
$currentGroupStatus = 'gold';
}
}elseif ($result['currentStatus'] === 'silver' && $result['currentGroup']->getId() !== $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
if ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
$currentGroupStatus = 'bronze';
}elseif ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.goldCustomerGroup")){
$currentGroupStatus = 'gold';
}
}elseif ($result['currentStatus'] === 'gold' && $result['currentGroup']->getId() !== $this->config->get("TwigelBonusProgram.config.goldCustomerGroup")){
if ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
$currentGroupStatus = 'bronze';
}elseif ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
$currentGroupStatus = 'silver';
}
}elseif ($result['currentStatus'] === 0 && $result['currentGroup']->getId() !== $this->config->get("TwigelBonusProgram.config.goldCustomerGroup")){
if ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
$currentGroupStatus = 'bronze';
}elseif ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
$currentGroupStatus = 'silver';
}
}elseif ($result['currentStatus'] === 0 && $result['currentGroup']->getId() !== $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
if ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
$currentGroupStatus = 'bronze';
}elseif ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.goldCustomerGroup")){
$currentGroupStatus = 'gold';
}
}elseif($result['currentStatus'] === 'bronze' && $result['currentGroup']->getId() !== $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
if ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
$currentGroupStatus = 'silver';
}elseif ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.goldCustomerGroup")){
$currentGroupStatus = 'gold';
}
}
if ($currentGroupStatus === 'bronze'){
$result['nextGroupTurnOver'] = 600 - $turnOver['amount'];
$result['nextGroupAmountOfOrders'] = 24 - $amountOfOrders['amount'];
}elseif ($currentGroupStatus === 'silver'){
$result['nextGroupTurnOver'] = 1200 - $turnOver['amount'];
$result['nextGroupAmountOfOrders'] = 36 - $amountOfOrders['amount'];
}elseif ($currentGroupStatus === 'gold'){
$result['nextGroupTurnOver'] = $turnOver['amount'];
$result['nextGroupAmountOfOrders'] = $amountOfOrders['amount'];
}else{
$result['nextGroupTurnOver'] = 300 - $turnOver['amount'];
$result['nextGroupAmountOfOrders'] = 12 - $amountOfOrders['amount'];
}
$event->getPage()->assign(['customerAccountStatus' => $result]);
}
private function getCustomerGroup($groupId){
return $this->groupRepository->search(new Criteria([$groupId]), Context::createDefaultContext())->first();
}
private function getNextGroup($currentStatus, $currentGroup){
$groupId = $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup");
if($currentStatus === 'bronze'){
$groupId = $this->config->get("TwigelBonusProgram.config.silverCustomerGroup");
}elseif ($currentStatus === 'silver'){
$groupId = $this->config->get("TwigelBonusProgram.config.goldCustomerGroup");
}
if ($currentGroup->getId() === $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
$groupId = $this->config->get("TwigelBonusProgram.config.goldCustomerGroup");
}elseif ($currentGroup->getId() === $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
$groupId = $this->config->get("TwigelBonusProgram.config.silverCustomerGroup");
}
return $this->groupRepository->search(new Criteria([$groupId]), Context::createDefaultContext())->first();
}
private function getCustomerTurnOver($customerId){
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('customerId', $customerId));
$criteria->addAssociations(['order']);
$orders = $this->orderRepository->search($criteria, Context::createDefaultContext())->getElements();
$turnOver = 0;
/** @var OrderCustomerEntity $order */
foreach ($orders as $order) {
$turnOver += $order->getOrder()->getAmountTotal();
}
$status = [
'turnOver' => 0,
'amount' => $turnOver
];
if ($turnOver >= 300 && $turnOver < 600){
$status['turnOver'] = 'bronze';
}elseif ($turnOver >= 600 && $turnOver < 1200){
$status['turnOver'] = 'silver';
}elseif ($turnOver >= 1200){
$status['turnOver'] = 'gold';
}
return $status;
}
private function getOrdersByCustomer($customerId){
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('customerId', $customerId));
$orders = $this->orderRepository->search($criteria, Context::createDefaultContext())->getElements();
$amountOfOrders = count($orders);
$status = [
'amountOfOrders' => 0,
'amount' => $amountOfOrders
];
if ($amountOfOrders >= 12 && $amountOfOrders < 24){
$status['amountOfOrders'] = 'bronze';
}elseif ($amountOfOrders >= 24 && $amountOfOrders < 36){
$status['amountOfOrders'] = 'silver';
}elseif ($amountOfOrders >= 36){
$status['amountOfOrders'] = 'gold';
}
return $status;
}
}