<?php
namespace Plugin\TeikiOrder42\EventSubscriber\Controller\Admin;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Eccube\Common\EccubeConfig;
use Eccube\Event\TemplateEvent;
use Eccube\Event\EventArgs;
use Eccube\Event\EccubeEvents;
use Eccube\Entity\Master\OrderStatus;
use Eccube\Repository\OrderRepository;
class AdminControllerSubscriber implements EventSubscriberInterface
{
/**
* @var OrderRepository
*/
protected $orderRepository;
/**
* @var array 売り上げ状況用受注状況
*/
private $excludes = [OrderStatus::CANCEL, OrderStatus::PENDING, OrderStatus::PROCESSING, OrderStatus::RETURNED, OrderStatus::BOOKSTORE_PURCHASE];
public function __construct(
OrderRepository $orderRepository
) {
$this->orderRepository = $orderRepository;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'@admin/index.twig' => ['AdminIndex', 1],
];
}
/**
* @param TemplateEvent $event
*/
public function AdminIndex(TemplateEvent $event)
{
// 今日の売上/件数
$salesToday = $this->getSalesByDay(new \DateTime());
// 昨日の売上/件数
$salesYesterday = $this->getSalesByDay(new \DateTime('-1 day'));
// 今月の売上/件数
$salesThisMonth = $this->getSalesByMonth(new \DateTime());
$parameters = $event->getParameters();
$parameters['salesToday'] = $salesToday;
$parameters['salesYesterday'] = $salesYesterday;
$parameters['salesThisMonth'] = $salesThisMonth;
$event->setParameters($parameters);
}
/**
* @param \DateTime $dateTime
*
* @return array|mixed
*
* @throws \Doctrine\ORM\NonUniqueResultException
*/
protected function getSalesByDay($dateTime)
{
$dateTimeStart = clone $dateTime;
$dateTimeStart->setTime(0, 0, 0, 0);
$dateTimeEnd = clone $dateTimeStart;
$dateTimeEnd->modify('+1 days');
$qb = $this->orderRepository
->createQueryBuilder('o')
->select('
SUM(o.payment_total) AS order_amount,
COUNT(o) AS order_count')
->setParameter(':excludes', $this->excludes)
->setParameter(':targetDateStart', $dateTimeStart)
->setParameter(':targetDateEnd', $dateTimeEnd)
->andWhere(':targetDateStart <= o.order_date and o.order_date < :targetDateEnd')
->andWhere('o.OrderStatus NOT IN (:excludes)');
$q = $qb->getQuery();
$result = [];
try {
$result = $q->getSingleResult();
} catch (NoResultException $e) {
// 結果がない場合は空の配列を返す.
}
return $result;
}
/**
* @param \DateTime $dateTime
*
* @return array|mixed
*
* @throws \Doctrine\ORM\NonUniqueResultException
*/
protected function getSalesByMonth($dateTime)
{
$dateTimeStart = clone $dateTime;
$dateTimeStart->setTime(0, 0, 0, 0);
$dateTimeStart->modify('first day of this month');
$dateTimeEnd = clone $dateTime;
$dateTimeEnd->setTime(0, 0, 0, 0);
$dateTimeEnd->modify('first day of 1 month');
$qb = $this->orderRepository
->createQueryBuilder('o')
->select('
SUM(o.payment_total) AS order_amount,
COUNT(o) AS order_count')
->setParameter(':excludes', $this->excludes)
->setParameter(':targetDateStart', $dateTimeStart)
->setParameter(':targetDateEnd', $dateTimeEnd)
->andWhere(':targetDateStart <= o.order_date and o.order_date < :targetDateEnd')
->andWhere('o.OrderStatus NOT IN (:excludes)');
$q = $qb->getQuery();
$result = [];
try {
$result = $q->getSingleResult();
} catch (NoResultException $e) {
// 結果がない場合は空の配列を返す.
}
return $result;
}
}