<?php
/*
* Plugin Name : PointExpired
*
* Copyright (C) BraTech Co., Ltd. All Rights Reserved.
* http://www.bratech.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Plugin\PointExpired42\Event;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Master\OrderStatus;
use Plugin\PointExpired42\Service\PointExpiredService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Workflow\Event\Event;
class OrderStateEvent implements EventSubscriberInterface
{
private $entityManager;
private $pointexpiredService;
public function __construct(
EntityManagerInterface $entityManager,
PointExpiredService $pointExpiredService
)
{
$this->entityManager = $entityManager;
$this->pointexpiredService = $pointExpiredService;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'workflow.order.transition.cancel' => 'rollbackPeriod',
'workflow.order.transition.back_to_in_progress' => 'extendPeriod',
'workflow.order.transition.return' => 'rollbackPeriod',
'workflow.order.transition.cancel_return' => 'extendPeriod',
'workflow.order.transition.ship' => 'extendPeriod',
];
}
public function extendPeriod(Event $event)
{
$Order = $event->getSubject()->getOrder();
$Customer = $Order->getCustomer();
if ($Customer) {
$prevPeriod = $Order->getExtensionPeriod();
if(is_null($prevPeriod)){
$period = $this->pointexpiredService->getExpiredPeriod($Customer);
}else{
$period = $prevPeriod;
}
if(!is_null($period)){
$orderDate = $Order->getOrderDate();
if(is_null($orderDate))return;
$date = clone($orderDate);
$date->modify('+ '. $period .' days');
$expiredDate = $Customer->getPointExpiredDate();
if(is_null($prevPeriod)){
$Order->setExtensionPeriod($period);
}
$this->entityManager->persist($Order);
$this->entityManager->flush($Order);
if($expiredDate instanceof \DateTime){
if($date > $expiredDate){
$Order->setPrevPointExpiredDate($expiredDate)
->setExtensionFlag(true);
$Customer->setPointExpiredDate($date);
}
}else{
$Order->setPrevPointExpiredDate(null)
->setExtensionFlag(true);
$Customer->setPointExpiredDate($date);
}
}
}
}
public function rollbackPeriod(Event $event)
{
$Order = $event->getSubject()->getOrder();
$Customer = $Order->getCustomer();
$flag = $Order->getExtensionFlag();
if ($Customer && $flag) {
$expiredDate = $Order->getPrevPointExpiredDate();
$LatestOrder = $this->getLatestOrder($Customer);
if(is_null($LatestOrder))return;
if($LatestOrder->getId() != $Order->getId() && $LatestOrder->getOrderDate() > $Order->getOrderDate())return;
if($expiredDate instanceof \DateTime || is_null($expiredDate)){
$Customer->setPointExpiredDate($expiredDate);
}
$Order->setExtensionFlag(false);
}
}
private function getLatestOrder($Customer)
{
$excludes = [
OrderStatus::CANCEL,
OrderStatus::RETURNED,
OrderStatus::PENDING,
OrderStatus::PROCESSING
];
$qb = $this->entityManager->createQueryBuilder();
$qb
->select('o')
->from('Eccube\Entity\Order','o')
->andWhere('o.order_date IS NOT NULL')
->andwhere('o.Customer = :Customer')
->andWhere('o.OrderStatus NOT IN (:excludes)')
->setParameter(':Customer',$Customer)
->setParameter(':excludes',$excludes)
->orderBy('o.order_date', 'DESC')
->setMaxResults(1);
$result = $qb->getQuery()->getResult();
if($result){
return $result[0];
}
return null;
}
}