app/Plugin/TeikiOrder42/EventSubscriber/Controller/Admin/AdminControllerSubscriber.php line 45

Open in your IDE?
  1. <?php
  2. namespace Plugin\TeikiOrder42\EventSubscriber\Controller\Admin;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Eccube\Common\EccubeConfig;
  5. use Eccube\Event\TemplateEvent;
  6. use Eccube\Event\EventArgs;
  7. use Eccube\Event\EccubeEvents;
  8. use Eccube\Entity\Master\OrderStatus;
  9. use Eccube\Repository\OrderRepository;
  10. class AdminControllerSubscriber implements EventSubscriberInterface
  11. {
  12.     /**
  13.      * @var OrderRepository
  14.      */
  15.     protected $orderRepository;
  16.     /**
  17.      * @var array 売り上げ状況用受注状況
  18.      */
  19.     private $excludes = [OrderStatus::CANCELOrderStatus::PENDINGOrderStatus::PROCESSINGOrderStatus::RETURNEDOrderStatus::BOOKSTORE_PURCHASE];
  20.     public function __construct(
  21.         OrderRepository $orderRepository
  22.     ) {
  23.         $this->orderRepository $orderRepository;
  24.     }
  25.     /**
  26.      * @return array
  27.      */
  28.     public static function getSubscribedEvents()
  29.     {
  30.         return [
  31.             '@admin/index.twig' => ['AdminIndex'1],
  32.         ];
  33.     }
  34.     /**
  35.      * @param TemplateEvent $event
  36.      */
  37.     public function AdminIndex(TemplateEvent $event)
  38.     {
  39.         // 今日の売上/件数
  40.         $salesToday $this->getSalesByDay(new \DateTime());
  41.         // 昨日の売上/件数
  42.         $salesYesterday $this->getSalesByDay(new \DateTime('-1 day'));
  43.         // 今月の売上/件数
  44.         $salesThisMonth $this->getSalesByMonth(new \DateTime());
  45.         $parameters $event->getParameters();
  46.         $parameters['salesToday'] = $salesToday;
  47.         $parameters['salesYesterday'] = $salesYesterday;
  48.         $parameters['salesThisMonth'] = $salesThisMonth;
  49.         $event->setParameters($parameters);
  50.     }
  51.     /**
  52.      * @param \DateTime $dateTime
  53.      *
  54.      * @return array|mixed
  55.      *
  56.      * @throws \Doctrine\ORM\NonUniqueResultException
  57.      */
  58.     protected function getSalesByDay($dateTime)
  59.     {
  60.         $dateTimeStart = clone $dateTime;
  61.         $dateTimeStart->setTime(0000);
  62.         $dateTimeEnd = clone $dateTimeStart;
  63.         $dateTimeEnd->modify('+1 days');
  64.         $qb $this->orderRepository
  65.             ->createQueryBuilder('o')
  66.             ->select('
  67.             SUM(o.payment_total) AS order_amount,
  68.             COUNT(o) AS order_count')
  69.             ->setParameter(':excludes'$this->excludes)
  70.             ->setParameter(':targetDateStart'$dateTimeStart)
  71.             ->setParameter(':targetDateEnd'$dateTimeEnd)
  72.             ->andWhere(':targetDateStart <= o.order_date and o.order_date < :targetDateEnd')
  73.             ->andWhere('o.OrderStatus NOT IN (:excludes)');
  74.         $q $qb->getQuery();
  75.         $result = [];
  76.         try {
  77.             $result $q->getSingleResult();
  78.         } catch (NoResultException $e) {
  79.             // 結果がない場合は空の配列を返す.
  80.         }
  81.         return $result;
  82.     }
  83.     /**
  84.      * @param \DateTime $dateTime
  85.      *
  86.      * @return array|mixed
  87.      *
  88.      * @throws \Doctrine\ORM\NonUniqueResultException
  89.      */
  90.     protected function getSalesByMonth($dateTime)
  91.     {
  92.         $dateTimeStart = clone $dateTime;
  93.         $dateTimeStart->setTime(0000);
  94.         $dateTimeStart->modify('first day of this month');
  95.         $dateTimeEnd = clone $dateTime;
  96.         $dateTimeEnd->setTime(0000);
  97.         $dateTimeEnd->modify('first day of 1 month');
  98.         $qb $this->orderRepository
  99.             ->createQueryBuilder('o')
  100.             ->select('
  101.             SUM(o.payment_total) AS order_amount,
  102.             COUNT(o) AS order_count')
  103.             ->setParameter(':excludes'$this->excludes)
  104.             ->setParameter(':targetDateStart'$dateTimeStart)
  105.             ->setParameter(':targetDateEnd'$dateTimeEnd)
  106.             ->andWhere(':targetDateStart <= o.order_date and o.order_date < :targetDateEnd')
  107.             ->andWhere('o.OrderStatus NOT IN (:excludes)');
  108.         $q $qb->getQuery();
  109.         $result = [];
  110.         try {
  111.             $result $q->getSingleResult();
  112.         } catch (NoResultException $e) {
  113.             // 結果がない場合は空の配列を返す.
  114.         }
  115.         return $result;
  116.     }
  117. }