custom/plugins/TomRocketsTheme/src/Subscriber/AccountOverviewLoadedSubscriber.php line 47

Open in your IDE?
  1. <?php
  2. namespace TomRockets\Subscriber;
  3. use Shopware\Core\Checkout\Customer\CustomerEvents;
  4. use Shopware\Core\Checkout\Order\Aggregate\OrderCustomer\OrderCustomerEntity;
  5. use Shopware\Core\Framework\Context;
  6. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  9. use Shopware\Core\System\SystemConfig\SystemConfigService;
  10. use Shopware\Storefront\Page\Account\Overview\AccountOverviewPageLoadedEvent;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. class AccountOverviewLoadedSubscriber implements EventSubscriberInterface
  13. {
  14.     /** @var SystemConfigService */
  15.     private $config;
  16.     /** @var EntityRepository */
  17.     private $orderRepository;
  18.     /** @var EntityRepository */
  19.     private $groupRepository;
  20.     public function __construct(
  21.         SystemConfigService $config,
  22.         EntityRepository $orderRepository,
  23.         EntityRepository $groupRepository
  24.     )
  25.     {
  26.         $this->config $config;
  27.         $this->orderRepository $orderRepository;
  28.         $this->groupRepository $groupRepository;
  29.     }
  30.     /**
  31.      * @inheritDoc
  32.      */
  33.     public static function getSubscribedEvents()
  34.     {
  35.         return [
  36.             AccountOverviewPageLoadedEvent::class => "accountLoaded",
  37.         ];
  38.     }
  39.     public function accountLoaded(AccountOverviewPageLoadedEvent $event){
  40.         $turnOver self::getCustomerTurnOver($event->getPage()->getCustomer()->getId());
  41.         $amountOfOrders self::getOrdersByCustomer($event->getPage()->getCustomer()->getId());
  42.         $categoryMore $this->config->get("TomRockets.config.accountMore");
  43.         $result = [];
  44.         if ($turnOver['amount'] < 300){
  45.             $result['nextGroupTurnOver'] = 300 $turnOver['amount'];
  46.         }elseif ($turnOver['amount'] >= 300 && $turnOver['amount'] < 600){
  47.             $result['nextGroupTurnOver'] = 600 $turnOver['amount'];
  48.         }elseif ($turnOver['amount'] >= 600 && $turnOver['amount'] < 1200){
  49.             $result['nextGroupTurnOver'] = 1200 $turnOver['amount'];
  50.         }elseif ($turnOver['amount'] >= 1200){
  51.             $result['nextGroupTurnOver'] = 0;
  52.         }
  53.         if ($amountOfOrders['amount'] < 12) {
  54.             $result['nextGroupAmountOfOrders'] = 12 $amountOfOrders['amount'];
  55.         }elseif ($amountOfOrders['amount'] >= 12 && $amountOfOrders['amount'] < 24){
  56.             $result['nextGroupAmountOfOrders'] = 24 $amountOfOrders['amount'];
  57.         }elseif ($amountOfOrders['amount'] >= 24 && $amountOfOrders['amount'] < 36){
  58.             $result['nextGroupAmountOfOrders'] = 36 $amountOfOrders['amount'];
  59.         }elseif ($amountOfOrders['amount'] >= 36){
  60.             $result['nextGroupAmountOfOrders'] = 0;
  61.         }
  62.         $result['currentStatus'] = $turnOver['turnOver'];
  63.         $result['categoryMore'] = $categoryMore;
  64.         $result['currentGroup'] = self::getCustomerGroup($event->getPage()->getCustomer()->getGroupId());
  65.         $result['nextGroup'] = self::getNextGroup($result['currentStatus'], $result['currentGroup']);
  66.         $currentGroupStatus '';
  67.         if ($result['currentStatus'] === 'bronze' && $result['currentGroup']->getId() !== $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
  68.             if ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
  69.                 $currentGroupStatus 'silver';
  70.             }elseif ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.goldCustomerGroup")){
  71.                 $currentGroupStatus 'gold';
  72.             }
  73.         }elseif ($result['currentStatus'] === 'silver' && $result['currentGroup']->getId() !== $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
  74.             if ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
  75.                 $currentGroupStatus 'bronze';
  76.             }elseif ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.goldCustomerGroup")){
  77.                 $currentGroupStatus 'gold';
  78.             }
  79.         }elseif ($result['currentStatus'] === 'gold' && $result['currentGroup']->getId() !== $this->config->get("TwigelBonusProgram.config.goldCustomerGroup")){
  80.             if ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
  81.                 $currentGroupStatus 'bronze';
  82.             }elseif ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
  83.                 $currentGroupStatus 'silver';
  84.             }
  85.         }elseif ($result['currentStatus'] === && $result['currentGroup']->getId() !== $this->config->get("TwigelBonusProgram.config.goldCustomerGroup")){
  86.             if ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
  87.                 $currentGroupStatus 'bronze';
  88.             }elseif ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
  89.                 $currentGroupStatus 'silver';
  90.             }
  91.         }elseif ($result['currentStatus'] === && $result['currentGroup']->getId() !== $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
  92.             if ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
  93.                 $currentGroupStatus 'bronze';
  94.             }elseif ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.goldCustomerGroup")){
  95.                 $currentGroupStatus 'gold';
  96.             }
  97.         }elseif($result['currentStatus'] === 'bronze' && $result['currentGroup']->getId() !== $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
  98.             if ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
  99.                 $currentGroupStatus 'silver';
  100.             }elseif ($result['currentGroup']->getId() === $this->config->get("TwigelBonusProgram.config.goldCustomerGroup")){
  101.                 $currentGroupStatus 'gold';
  102.             }
  103.         }
  104.         if ($currentGroupStatus === 'bronze'){
  105.             $result['nextGroupTurnOver'] = 600 $turnOver['amount'];
  106.             $result['nextGroupAmountOfOrders'] = 24 $amountOfOrders['amount'];
  107.         }elseif ($currentGroupStatus === 'silver'){
  108.             $result['nextGroupTurnOver'] = 1200 $turnOver['amount'];
  109.             $result['nextGroupAmountOfOrders'] = 36 $amountOfOrders['amount'];
  110.         }elseif ($currentGroupStatus === 'gold'){
  111.             $result['nextGroupTurnOver'] = $turnOver['amount'];
  112.             $result['nextGroupAmountOfOrders'] = $amountOfOrders['amount'];
  113.         }else{
  114.             $result['nextGroupTurnOver'] = 300 $turnOver['amount'];
  115.             $result['nextGroupAmountOfOrders'] = 12 $amountOfOrders['amount'];
  116.         }
  117.         $event->getPage()->assign(['customerAccountStatus' => $result]);
  118.     }
  119.     private function getCustomerGroup($groupId){
  120.         return $this->groupRepository->search(new Criteria([$groupId]), Context::createDefaultContext())->first();
  121.     }
  122.     private function getNextGroup($currentStatus$currentGroup){
  123.         $groupId $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup");
  124.         if($currentStatus === 'bronze'){
  125.             $groupId $this->config->get("TwigelBonusProgram.config.silverCustomerGroup");
  126.         }elseif ($currentStatus === 'silver'){
  127.             $groupId $this->config->get("TwigelBonusProgram.config.goldCustomerGroup");
  128.         }
  129.         if ($currentGroup->getId() === $this->config->get("TwigelBonusProgram.config.silverCustomerGroup")){
  130.             $groupId $this->config->get("TwigelBonusProgram.config.goldCustomerGroup");
  131.         }elseif ($currentGroup->getId() === $this->config->get("TwigelBonusProgram.config.bronzeCustomerGroup")){
  132.             $groupId $this->config->get("TwigelBonusProgram.config.silverCustomerGroup");
  133.         }
  134.         return $this->groupRepository->search(new Criteria([$groupId]), Context::createDefaultContext())->first();
  135.     }
  136.     private function getCustomerTurnOver($customerId){
  137.         $criteria = new Criteria();
  138.         $criteria->addFilter(new EqualsFilter('customerId'$customerId));
  139.         $criteria->addAssociations(['order']);
  140.         $orders $this->orderRepository->search($criteriaContext::createDefaultContext())->getElements();
  141.         $turnOver 0;
  142.         /** @var OrderCustomerEntity $order */
  143.         foreach ($orders as $order) {
  144.             $turnOver += $order->getOrder()->getAmountTotal();
  145.         }
  146.         $status = [
  147.             'turnOver' => 0,
  148.             'amount' => $turnOver
  149.         ];
  150.         if ($turnOver >= 300 && $turnOver 600){
  151.             $status['turnOver'] = 'bronze';
  152.         }elseif ($turnOver >= 600 && $turnOver 1200){
  153.             $status['turnOver'] = 'silver';
  154.         }elseif ($turnOver >= 1200){
  155.             $status['turnOver'] = 'gold';
  156.         }
  157.         return $status;
  158.     }
  159.     private function getOrdersByCustomer($customerId){
  160.         $criteria = new Criteria();
  161.         $criteria->addFilter(new EqualsFilter('customerId'$customerId));
  162.         $orders $this->orderRepository->search($criteriaContext::createDefaultContext())->getElements();
  163.         $amountOfOrders count($orders);
  164.         $status = [
  165.             'amountOfOrders' => 0,
  166.             'amount' => $amountOfOrders
  167.         ];
  168.         if ($amountOfOrders >= 12 && $amountOfOrders 24){
  169.             $status['amountOfOrders'] = 'bronze';
  170.         }elseif ($amountOfOrders >= 24 && $amountOfOrders 36){
  171.             $status['amountOfOrders'] = 'silver';
  172.         }elseif ($amountOfOrders >= 36){
  173.             $status['amountOfOrders'] = 'gold';
  174.         }
  175.         return $status;
  176.     }
  177. }