app/Plugin/TaxManagement42/Event.php line 131

Open in your IDE?
  1. <?php
  2. namespace Plugin\TaxManagement42;
  3. use Eccube\Entity\Product;
  4. use Eccube\Event\TemplateEvent;
  5. use Eccube\Event\EventArgs;
  6. use Symfony\Component\HttpFoundation\RequestStack;
  7. use Twig\Environment;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Plugin\TaxManagement42\Repository\ConfigRepository;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Plugin\TaxManagement42\Services\Simple_html_dom;
  12. class Event implements EventSubscriberInterface
  13. {
  14.     private $requestStack;
  15.     private $twig;
  16.     private $entityManager;
  17.     /**
  18.      * @var ConfigRepository
  19.      */
  20.      protected $configRepository;
  21.     
  22.     const DETAIL_PRICE_TAG "<span class=\"ec-price__tax\">{{ '税込'|trans }}</span>";
  23.     
  24.     const LIST_PRICE_TAG "{{ Product.getPrice02IncTaxMin|price }}";
  25.     const EC_CUBE_LIST_SALE_PRICE_TAG_REGEX '/class=(("|"([^"]*)\s)price02-default("|\s([^"]*)"))/m';
  26.     const TAX_MANAGEMENT_SALE_PRICE_CLASSNAME '.tax_management-sale_price';
  27.     const TAX_MANAGEMENT_SALE_PRICE_TAG_REGEX '/class=(("|"([^"]*)\s)tax_management-sale_price("|\s([^"]*)"))/m';
  28.     const TAX_MANAGEMENT_DISCOUNT_RATE_TAG_REGEX '/class=(("|"([^"]*)\s)tax_management-discount_rate("|\s([^"]*)"))/m';
  29.     /**
  30.      * SynchronizeReviewDataEvent constructor.
  31.      *
  32.      * @param ContainerInterface $container
  33.      */
  34.     public function __construct(
  35.         RequestStack $requestStack,
  36.         Environment $twig,
  37.         EntityManagerInterface $entityManager,
  38.         ConfigRepository $configRepository)
  39.     {
  40.         $this->requestStack $requestStack;
  41.         $this->twig $twig;
  42.         $this->entityManager $entityManager;
  43.         $this->configRepository $configRepository;
  44.     }
  45.     
  46.     /**
  47.      * @return array
  48.      */
  49.     public static function getSubscribedEvents()
  50.     {
  51.         return [
  52.             'Product/detail.twig' => 'onProductDetailTwig',
  53.             'Product/list.twig' => 'onProductListTwig',
  54.             '@admin/Store/plugin.twig' => 'onAdminStorePluginIndexTwig'
  55.         ];
  56.     }
  57.     
  58.     /**
  59.      * 商品詳細ページ 割引率の表示
  60.      * @param TemplateEvent $event
  61.      */
  62.     public function onProductDetailTwig(TemplateEvent $event)
  63.     {
  64.         
  65.         $parameters $event->getParameters();
  66.         
  67.         if (is_null($parameters['Product'])) {
  68.             return;
  69.         }
  70.         $Product $parameters['Product'];
  71.         $TaxManagementConfig $this->configRepository->get();
  72.         $request method_exists($this->requestStack'getMainRequest')
  73.             ? $this->requestStack->getMainRequest()
  74.             : $this->requestStack->getMasterRequest();
  75.         $request->attributes->set('TaxManagementConfig'$TaxManagementConfig);
  76.         try {
  77.             if($TaxManagementConfig !== null) {
  78.                 $parameters['TaxManagementConfig'] = $TaxManagementConfig;
  79.             
  80.                 $source $event->getSource();
  81.                 $twig $this->twig;
  82.                 
  83.                 $search1 '/({# 通常価格 #})[\s\S]+?({# 商品コード #})/s';
  84.                 preg_match($search1$source$matches);
  85.                 if($matches) {
  86.                     $source preg_replace($search1'<!-- tax_management_通常価格 -->' '$0' '<!-- tax_management_商品コード -->'$source);
  87.                     $event->setSource($source);
  88.                 }
  89.                 $discountRates $this->calculateDiscountRates($Product$TaxManagementConfig->isDiscountRateFlag());
  90.                 $Product->discountRatesJson json_encode($discountRates['class_categories']);
  91.                 $Product->discountRateMax $discountRates['discountRateMax'];
  92.                 $Product->discountRateMin $discountRates['discountRateMin'];
  93.                 $Product->price02Values json_encode(
  94.                     array(
  95.                     'price02NoTaxMin' => number_format($Product->getPrice02Min()),
  96.                     'price02NoTaxMax' => number_format($Product->getPrice02Max()),
  97.                     'price02IncTaxMin' => number_format($Product->getPrice02IncTaxMin()),
  98.                     'price02IncTaxMax' => number_format($Product->getPrice02IncTaxMax()))
  99.                 );
  100.                 $Product->price01Values json_encode(
  101.                     array(
  102.                     'price01NoTaxMin' => $Product->getPrice01Min() !== null number_format($Product->getPrice01Min()): null,
  103.                     'price01NoTaxMax' => $Product->getPrice01Min() !== null number_format($Product->getPrice01Max()): null,
  104.                     'price01IncTaxMin' => $Product->getPrice01Min() !== null number_format($Product->getPrice01IncTaxMin()): null,
  105.                     'price01IncTaxMax' => $Product->getPrice01Min() !== null number_format($Product->getPrice01IncTaxMax()): null)
  106.                 );
  107.                 $parameters['Product'] = $Product;
  108.                 $event->setParameters($parameters);
  109.                 $event->addAsset('@TaxManagement42/default/Product/detail_discount_rate_style.twig');
  110.                 $event->addSnippet('@TaxManagement42/default/Product/detail_discount_rate_script.twig');
  111.             }
  112.         } catch (\Throwable $th) {
  113.             log_error($th);
  114.         }
  115.         
  116.     }
  117.     
  118.     public function onProductListTwig(TemplateEvent $event)
  119.     {
  120.         $parameters $event->getParameters();
  121.         if (is_null($parameters['pagination'])){
  122.             return;
  123.         }
  124.         $pagination $parameters['pagination'];
  125.         $TaxManagementConfig $this->configRepository->get();
  126.         $request method_exists($this->requestStack'getMainRequest')
  127.             ? $this->requestStack->getMainRequest()
  128.             : $this->requestStack->getMasterRequest();
  129.         $request->attributes->set('TaxManagementConfig'$TaxManagementConfig);
  130.         $source $event->getSource();
  131.         
  132.         $source preg_replace_callback(self::EC_CUBE_LIST_SALE_PRICE_TAG_REGEX, function ($matches) {
  133.             $classNames explode('"'$matches[1]);
  134.             if(isset($classNames[1]) && strpos($classNames[1], ' tax_management_id_{{Product.id}}') === false) {
  135.                 $matches[0] = str_replace($matches[1], '"' $classNames[1] . ' tax_management_id_{{Product.id}}"'$matches[0]);
  136.             }
  137.             return $matches[0];
  138.         }, $source);
  139.         
  140.         $source preg_replace_callback(self::TAX_MANAGEMENT_SALE_PRICE_TAG_REGEX, function ($matches) {
  141.             $classNames explode('"'$matches[1]);
  142.             if(isset($classNames[1]) && strpos($classNames[1], ' tax_management_id_{{Product.id}}') === false) {
  143.                 $matches[0] = str_replace($matches[1], '"' $classNames[1] . ' tax_management_id_{{Product.id}}"'$matches[0]);
  144.             }
  145.             return $matches[0];
  146.         }, $source);
  147.         $event->setSource($source);
  148.         
  149.         
  150.         try {
  151.             if($TaxManagementConfig !== null) {
  152.                 $parameters['TaxManagementConfig'] = $TaxManagementConfig;
  153.                 foreach ($pagination as $Product) {
  154.                     // 01:通常価格, 02:販売価格
  155.                     $discountRates $this->calculateDiscountRates($Product$TaxManagementConfig->isDiscountRateFlag());
  156.                     $Product->discountRatesJson json_encode($discountRates['class_categories']);
  157.                     $Product->discountRateMax $discountRates['discountRateMax'];
  158.                     $Product->discountRateMin $discountRates['discountRateMin'];
  159.                     $Product->price02Values json_encode(
  160.                         array(
  161.                         'price02NoTaxMin' => number_format($Product->getPrice02Min()),
  162.                         'price02NoTaxMax' => number_format($Product->getPrice02Max()),
  163.                         'price02IncTaxMin' => number_format($Product->getPrice02IncTaxMin()),
  164.                         'price02IncTaxMax' => number_format($Product->getPrice02IncTaxMax()))
  165.                     );
  166.                     $Product->price01Values json_encode(
  167.                         array(
  168.                             'price01NoTaxMin' => $Product->getPrice01Min() != null number_format($Product->getPrice01Min()) : null,
  169.                             'price01NoTaxMax' => $Product->getPrice01Min() != null number_format($Product->getPrice01Max()) : null,
  170.                             'price01IncTaxMin' => $Product->getPrice01Min() != null number_format($Product->getPrice01IncTaxMin()) : null,
  171.                             'price01IncTaxMax' => $Product->getPrice01Min() != null number_format($Product->getPrice01IncTaxMax()) : null
  172.                         )
  173.                     );
  174.                 }
  175.                 //set parameter for twig files
  176.                 $parameters['pagination'] = $pagination;
  177.                 $event->setParameters($parameters);
  178.                 
  179.                 $request->attributes->set('tax_management_products'$pagination);
  180.                 $event->addAsset('@TaxManagement42/default/Product/list_discount_rate_style.twig');
  181.                 $event->addSnippet('@TaxManagement42/default/Product/list_discount_rate_script.twig');
  182.             }
  183.         } catch (\Throwable $th) {
  184.             log_error($th);
  185.         }
  186.         
  187.     }
  188.     
  189.     /**
  190.      * calculate discount rate max and discount rate min
  191.      * they will be a number in range (1,99) or null 
  192.      *
  193.      * @param Eccube\Entity\Product $Product
  194.      * @param bool $discountRateFlag
  195.      * @return array()
  196.      * 
  197.      */
  198.     private function calculateDiscountRates($Product$discountRateFlag) {
  199.         
  200.         $class_categories = [
  201.             '__unselected' => [
  202.                 '__unselected' => [
  203.                     'name' => trans('common.select'),
  204.                     'product_class_id' => '',
  205.                 ],
  206.             ],
  207.         ];
  208.         $minDiscountRate 0
  209.         $maxDiscountRate 0;
  210.         
  211.         foreach ($Product->getProductClasses() as $ProductClass) {
  212.             /** @var ProductClass $ProductClass */
  213.             if (!$ProductClass->isVisible()) {
  214.                 continue;
  215.             }
  216.             /* @var $ProductClass \Eccube\Entity\ProductClass */
  217.             $ClassCategory1 $ProductClass->getClassCategory1();
  218.             $ClassCategory2 $ProductClass->getClassCategory2();
  219.             if ($ClassCategory2 && !$ClassCategory2->isVisible()) {
  220.                 continue;
  221.             }
  222.             $price01 $ProductClass->getPrice01();
  223.             $price02 $ProductClass->getPrice02();
  224.             $discountRate 0;
  225.             if ((int)$price01 ) {
  226.                 $rate sprintf('%.3f', (1.0 - ($price02 $price01)) * 100.0);
  227.                 $TaxManagementConfig $this->configRepository->get();
  228.                 // 0: round up for discount value
  229.                 // 1: round down for discount value
  230.                 // 2: display decimal value with round for discount value
  231.                 if ($TaxManagementConfig->getDisplayDiscountType() === 1) {
  232.                     $discountRate = (int)floor($rate);
  233.                 } elseif ($TaxManagementConfig->getDisplayDiscountType() === 2) {
  234.                     $discountRate = (int)round($rate);
  235.                 } else {
  236.                     $discountRate = (int)ceil($rate);
  237.                 }
  238.                 
  239.                 if ($discountRate <= or $discountRate >= 100 or !$discountRateFlag) {
  240.                     $discountRate 0;
  241.                 }
  242.                 if($discountRate <= $minDiscountRate || $minDiscountRate == 0) {
  243.                     $minDiscountRate $discountRate;
  244.                 }
  245.                 if($discountRate >= $maxDiscountRate || $maxDiscountRate == 0) {
  246.                     $maxDiscountRate $discountRate;
  247.                 }
  248.             }
  249.             $class_category_id1 $ClassCategory1 ? (string) $ClassCategory1->getId() : '__unselected2';
  250.             $class_category_id2 $ClassCategory2 ? (string) $ClassCategory2->getId() : '';
  251.             $class_categories[$class_category_id1]['#'] = array(
  252.                 'classcategory_id2' => '',
  253.                 'name' => trans('common.select'),
  254.                 'product_class_id' => '',
  255.             );
  256.             $class_categories[$class_category_id1]['#'.$class_category_id2] = array(
  257.                 'classcategory_id2' => $class_category_id2,
  258.                 'discount_rate' => $discountRate
  259.             );
  260.         }
  261.         
  262.         $result = array(
  263.             'class_categories' => $class_categories,
  264.             'discountRateMax' => $maxDiscountRate,
  265.             'discountRateMin' => $minDiscountRate,
  266.         );
  267.         
  268.         return $result;
  269.     }
  270.     
  271.     public function onAdminStorePluginIndexTwig(TemplateEvent $event)
  272.     {
  273.         $em $this->entityManager;
  274.         $conn $em->getConnection();
  275.         
  276.         $driver '';
  277.         $conn $em->getConnection();
  278.         $params $conn->getParams();
  279.         if (isset($params['driver'])){
  280.             $driver $params['driver'];
  281.         }
  282.         
  283.         if ($driver == 'pdo_mysql') {
  284.                 
  285.         } elseif ($driver == 'pdo_pgsql') {
  286.             // shop_name_top_flg
  287.             $stmt $conn->executeQuery("SELECT column_name FROM information_schema.columns WHERE table_name='plg_tax_management_config' and column_name='display_discount_type'");
  288.             $cnt $stmt->fetchOne();
  289.             if (!$cnt) {
  290.                 $stmt $conn->executeQuery("ALTER TABLE plg_tax_management_config ADD COLUMN display_discount_type INT DEFAULT 0");
  291.             }    
  292.         }
  293.     }
  294. }