<?php
/*
* Plugin Name : DeliveryCool4
*
* 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\DeliveryCool42\Event;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Master\OrderItemType;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Event\TemplateEvent;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\DeliveryFeeRepository;
use Eccube\Repository\OrderItemRepository;
use Plugin\DeliveryCool42\Entity\DeliveryCoolConfig;
use Plugin\DeliveryCool42\Repository\ConfigRepository;
use Plugin\DeliveryCool42\Repository\DeliveryColdFeeRepository;
use Plugin\DeliveryCool42\Repository\DeliveryCoolFeeRepository;
use Plugin\DeliveryCool42\Service\DeliveryCoolService;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class AdminOrderEvent implements EventSubscriberInterface
{
private $entityManager;
private $eventDispatcher;
private $container;
private $requestStack;
private $orderItemRepository;
private $BaseInfo;
private $deliveryFeeRepository;
private $deliveryCoolFeeRepository;
private $deliveryColdFeeRepository;
private $configRepository;
public function __construct(
EntityManagerInterface $entityManager,
EventDispatcherInterface $eventDispatcher,
ContainerInterface $container,
RequestStack $requestStack,
BaseInfoRepository $baseInfoRepository,
DeliveryFeeRepository $deliveryFeeRepository,
OrderItemRepository $orderItemRepository,
DeliveryCoolFeeRepository $deliveryCoolFeeRepository,
DeliveryColdFeeRepository $deliveryColdFeeRepository,
ConfigRepository $configRepository
)
{
$this->entityManager = $entityManager;
$this->eventDispatcher = $eventDispatcher;
$this->container = $container;
$this->requestStack = $requestStack;
$this->BaseInfo = $baseInfoRepository->get();
$this->deliveryFeeRepository = $deliveryFeeRepository;
$this->orderItemRepository = $orderItemRepository;
$this->deliveryCoolFeeRepository = $deliveryCoolFeeRepository;
$this->deliveryColdFeeRepository = $deliveryColdFeeRepository;
$this->configRepository = $configRepository;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'@admin/Order/index.twig' => 'onTemplateAdminOrderIndex',
'@admin/Order/edit.twig' => 'onTemplateAdminOrderEdit',
'@admin/Order/shipping.twig' => 'onTemplateAdminShippingEdit',
EccubeEvents::ADMIN_ORDER_CSV_EXPORT_ORDER => 'hookAdminOrderCsvExport',
];
}
public function onTemplateAdminOrderIndex(TemplateEvent $event)
{
$twig = '@DeliveryCool42/admin/Order/shipping_index_cool_type.twig';
$event->addSnippet($twig);
$js = '@DeliveryCool42/admin/Order/shipping_index_cool_type.js';
$event->addAsset($js);
}
public function onTemplateAdminOrderEdit(TemplateEvent $event)
{
$request = $this->requestStack->getMasterRequest();
$parameters = $event->getParameters();
$Order = $parameters['Order'];
$form = $parameters['form'];
if(count($Order->getShippings()) == 1){
$twig = '@DeliveryCool42/admin/Order/order_cool_type.twig';
$event->addSnippet($twig);
$js = '@DeliveryCool42/admin/Order/order_cool_type.js';
$event->addAsset($js);
}
$Config = $this->configRepository->find(['name' => 'method']);
$method = DeliveryCoolConfig::FREE_ALL;
if($Config){
$method = $Config->getValue();
}
$feeArray = [];
$feeTotal = 0;
foreach($form['OrderItems'] as $index => $formItem){
$OrderItem = $formItem->vars['value'];
if($OrderItem->getOrderItemType()->getId() == OrderItemType::DELIVERY_FEE){
$fee = 0;
$Shipping = $OrderItem->getShipping();
if(is_null($Shipping))continue;
$Delivery = $Shipping->getDelivery();
$Pref = $Shipping->getPref();
$DeliveryFee = $this->deliveryFeeRepository->findOneBy([
'Delivery' => $Delivery,
'Pref' => $Pref,
]);
if($DeliveryFee){
$fee += $DeliveryFee->getFee();
}
$type = $Shipping->getDeliveryCoolType();
if($type == DeliveryCoolService::COOL_SHIPPING){
$deliveryCoolFee = $this->deliveryCoolFeeRepository->findOneBy([
'Delivery' => $Delivery,
'Pref' => $Pref
]);
if($deliveryCoolFee){
$fee += $deliveryCoolFee->getCoolFee();
}
}elseif($type == DeliveryCoolService::COLD_SHIPPING){
$deliveryColdFee = $this->deliveryColdFeeRepository->findOneBy([
'Delivery' => $Delivery,
'Pref' => $Pref
]);
if($deliveryColdFee){
$fee += $deliveryColdFee->getColdFee();
}
}
$isFree = false;
$total = 0;
$quantity = 0;
$shippingOrderItems = $this->orderItemRepository->findBy(['Shipping' => $Shipping]);
foreach ($shippingOrderItems as $Item) {
if($Item->getOrderItemType()->getId() == OrderItemType::PRODUCT){
$total += $Item->getPriceIncTax() * $Item->getQuantity();
$quantity += $Item->getQuantity();
}
if($Item->getOrderItemType()->getId() == OrderItemType::DELIVERY_FEE){
$deliveryFeeItem = $Item;
}
}
// 送料無料(金額)を超えている
if ($this->BaseInfo->getDeliveryFreeAmount()) {
if ($total >= $this->BaseInfo->getDeliveryFreeAmount()) {
$isFree = true;
}
}
// 送料無料(個数)を超えている
if ($this->BaseInfo->getDeliveryFreeQuantity()) {
if ($quantity >= $this->BaseInfo->getDeliveryFreeQuantity()) {
$isFree = true;
}
}
$fee_event = new EventArgs(
[
'Shipping' => $Shipping,
'isFree' => $isFree,
]
);
$this->eventDispatcher->dispatch( $fee_event, 'deliverycool.delivery_free.condition');
$isFree = $fee_event->getArgument('isFree');
$quantity = null;
if ($isFree) {
if($method == DeliveryCoolConfig::FREE_ALL){
$quantity = 0;
}elseif($method == DeliveryCoolConfig::FREE_REGULAR_ALL){
if($DeliveryFee){
if($fee - $DeliveryFee->getFee()){
$fee -= $DeliveryFee->getFee();
$quantity = 1;
}else{
$quantity = 0;
}
}
}elseif($method == DeliveryCoolConfig::FREE_ADD_ALL){
$type = $Shipping->getDeliveryCoolType();
if($type == DeliveryCoolService::COOL_SHIPPING){
if($deliveryCoolFee){
if($fee - $deliveryCoolFee->getCoolFee() > 0){
$fee -= $deliveryCoolFee->getCoolFee();
$quantity = 1;
}else{
$quantity = 0;
}
}
}elseif($type == DeliveryCoolService::COLD_SHIPPING){
if($deliveryColdFee){
if($fee - $deliveryColdFee->getColdFee() > 0){
$fee -= $deliveryColdFee->getColdFee();
$quantity = 1;
}else{
$quantity = 0;
}
}
}
}
}
$feeArray[$index]['price'] = (int)$fee;
$feeArray[$index]['quantity'] = $quantity;
$feeTotal += $fee * $quantity;
if(isset($deliveryFeeItem)){
if(is_null($quantity))$quantity = $deliveryFeeItem->getQuantity();
if($request->get('mode') == 'fee_calc'){
$deliveryFeeItem->setPrice($fee);
$deliveryFeeItem->setQuantity($quantity);
}
}
}
}
$parameters['feeArray'] = $feeArray;
$fee_calc = 0;
if($request->get('mode') == 'fee_calc'){
$fee_calc = 1;
$originFee = $Order->getDeliveryFeeTotal();
$diffFee = $originFee - $feeTotal;
$Order->setDeliveryFeeTotal($feeTotal);
$Order->setTotal($Order->getTotal() - $diffFee);
$Order->setPaymentTotal($Order->getPaymentTotal() - $diffFee);
}
$parameters['fee_calc'] = $fee_calc;
$event->setParameters($parameters);
$twig = '@DeliveryCool42/admin/Order/fee_calculate.twig';
$event->addSnippet($twig);
$js = '@DeliveryCool42/admin/Order/fee_calculate.js';
$event->addSnippet($js);
}
public function onTemplateAdminShippingEdit(TemplateEvent $event)
{
$source = $event->getSource();
if(preg_match("/\{\{\sform\_errors\(shippingForm\.Delivery\)\s\}\}[\n|\r\n|\r]\s*\<\/div\>[\n|\r\n|\r]\s*\<\/div\>/",$source, $result)){
$search = $result[0];
$replace = file_get_contents($this->container->getParameter('plugin_realdir'). '/DeliveryCool42/Resource/template/admin/Order/shipping_cool_type.twig');
$source = str_replace($search, $search . $replace, $source);
}
$event->setSource($source);
}
public function hookAdminOrderCsvExport(EventArgs $event)
{
$arrTYPE = [];
$arrTYPE[DeliveryCoolService::REGULAR_SHIPPING] = trans('deliverycool.const.shipping.temptype.normal');
$arrTYPE[DeliveryCoolService::COOL_SHIPPING] = trans('deliverycool.const.shipping.temptype.cool');
$arrTYPE[DeliveryCoolService::COLD_SHIPPING] = trans('deliverycool.const.shipping.temptype.cold');
$ExportCsvRow = $event->getArgument('ExportCsvRow');
if ($ExportCsvRow->isDataNull()) {
$OrderItem = $event->getArgument('OrderItem');
$Shipping = $OrderItem->getShipping();
$Csv = $event->getArgument('Csv');
if($Shipping){
$csvEntityName = str_replace('\\\\', '\\', $Csv->getEntityName());
if($csvEntityName == 'Eccube\Entity\Shipping' && $Csv->getFieldName() == 'delivery_cool_disp_name'){
$type = $Shipping->getDeliveryCoolType();
if(is_null($type))return;
$data = $arrTYPE[$type];
$ExportCsvRow->setData($data);
}
}
}
}
}