app/Plugin/TaxManagement42/Event.php line 288

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