src/Eccube/Form/Type/Admin/OrderItemType.php line 289

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.ec-cube.co.jp/
  8.  *
  9.  * For the full copyright and license information, please view the LICENSE
  10.  * file that was distributed with this source code.
  11.  */
  12. namespace Eccube\Form\Type\Admin;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Eccube\Common\EccubeConfig;
  15. use Eccube\Entity\BaseInfo;
  16. use Eccube\Entity\Master\OrderItemType as OrderItemTypeMaster;
  17. use Eccube\Entity\Master\TaxType;
  18. use Eccube\Entity\OrderItem;
  19. use Eccube\Entity\ProductClass;
  20. use Eccube\Form\DataTransformer;
  21. use Eccube\Form\Type\PriceType;
  22. use Eccube\Repository\BaseInfoRepository;
  23. use Eccube\Repository\Master\OrderItemTypeRepository;
  24. use Eccube\Repository\OrderItemRepository;
  25. use Eccube\Repository\ProductClassRepository;
  26. use Eccube\Repository\TaxRuleRepository;
  27. use Eccube\Util\StringUtil;
  28. use Symfony\Component\Form\AbstractType;
  29. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  30. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  31. use Symfony\Component\Form\Extension\Core\Type\TextType;
  32. use Symfony\Component\Form\FormBuilderInterface;
  33. use Symfony\Component\Form\FormError;
  34. use Symfony\Component\Form\FormEvent;
  35. use Symfony\Component\Form\FormEvents;
  36. use Symfony\Component\Form\FormInterface;
  37. use Symfony\Component\OptionsResolver\OptionsResolver;
  38. use Symfony\Component\Validator\Constraints as Assert;
  39. use Symfony\Component\Validator\ConstraintViolationListInterface;
  40. use Symfony\Component\Validator\Validator\ValidatorInterface;
  41. class OrderItemType extends AbstractType
  42. {
  43.     /**
  44.      * @var EntityManagerInterface
  45.      */
  46.     protected $entityManager;
  47.     /**
  48.      * @var EccubeConfig
  49.      */
  50.     protected $eccubeConfig;
  51.     /**
  52.      * @var BaseInfo
  53.      */
  54.     protected $BaseInfo;
  55.     /**
  56.      * @var ProductClassRepository
  57.      */
  58.     protected $productClassRepository;
  59.     /**
  60.      * @var OrderItemRepository
  61.      */
  62.     protected $orderItemRepository;
  63.     /**
  64.      * @var OrderItemTypeRepository
  65.      */
  66.     protected $orderItemTypeRepository;
  67.     /**
  68.      * @var TaxRuleRepository
  69.      */
  70.     protected $taxRuleRepository;
  71.     /**
  72.      * @var ValidatorInterface
  73.      */
  74.     protected $validator;
  75.     /**
  76.      * OrderItemType constructor.
  77.      *
  78.      * @param EntityManagerInterface $entityManager
  79.      * @param EccubeConfig $eccubeConfig
  80.      * @param BaseInfoRepository $baseInfoRepository
  81.      * @param ProductClassRepository $productClassRepository
  82.      * @param OrderItemRepository $orderItemRepository
  83.      * @param OrderItemTypeRepository $orderItemTypeRepository
  84.      * @param TaxRuleRepository $taxRuleRepository
  85.      * @param ValidatorInterface $validator
  86.      *
  87.      * @throws \Exception
  88.      */
  89.     public function __construct(
  90.         EntityManagerInterface $entityManager,
  91.         EccubeConfig $eccubeConfig,
  92.         BaseInfoRepository $baseInfoRepository,
  93.         ProductClassRepository $productClassRepository,
  94.         OrderItemRepository $orderItemRepository,
  95.         OrderItemTypeRepository $orderItemTypeRepository,
  96.         TaxRuleRepository $taxRuleRepository,
  97.         ValidatorInterface $validator
  98.     ) {
  99.         $this->entityManager $entityManager;
  100.         $this->eccubeConfig $eccubeConfig;
  101.         $this->BaseInfo $baseInfoRepository->get();
  102.         $this->productClassRepository $productClassRepository;
  103.         $this->orderItemRepository $orderItemRepository;
  104.         $this->orderItemTypeRepository $orderItemTypeRepository;
  105.         $this->taxRuleRepository $taxRuleRepository;
  106.         $this->validator $validator;
  107.     }
  108.     /**
  109.      * {@inheritdoc}
  110.      */
  111.     public function buildForm(FormBuilderInterface $builder, array $options)
  112.     {
  113.         $builder
  114.             ->add('product_name'TextType::class, [
  115.                 'constraints' => [
  116.                     new Assert\NotBlank(),
  117.                     new Assert\Length([
  118.                         'max' => $this->eccubeConfig['eccube_mtext_len'],
  119.                     ]),
  120.                 ],
  121.             ])
  122.             ->add('price'PriceType::class, [
  123.                 'accept_minus' => true,
  124.             ])
  125.             ->add('quantity'IntegerType::class, [
  126.                 'constraints' => [
  127.                     new Assert\NotBlank(),
  128.                     new Assert\Length([
  129.                         'max' => $this->eccubeConfig['eccube_int_len'],
  130.                     ]),
  131.                 ],
  132.             ])
  133.             ->add('tax_rate'IntegerType::class, [
  134.                 'required' => true,
  135.                 'constraints' => [
  136.                     new Assert\NotBlank(),
  137.                     new Assert\Range(['min' => 0]),
  138.                     new Assert\Regex([
  139.                         'pattern' => "/^\d+(\.\d+)?$/u",
  140.                         'message' => 'form_error.float_only',
  141.                     ]),
  142.                 ],
  143.             ])
  144.             ->add('point_rate'HiddenType::class, [
  145.                 'required' => false,
  146.                 'constraints' => [
  147.                     new Assert\Range(['min' => 0]),
  148.                     new Assert\Regex([
  149.                         'pattern' => "/^\d+(\.\d+)?$/u",
  150.                         'message' => 'form_error.float_only',
  151.                     ]),
  152.                 ],
  153.             ])
  154.             ;
  155.         $builder
  156.             ->add($builder->create('order_item_type'HiddenType::class)
  157.                 ->addModelTransformer(new DataTransformer\EntityToIdTransformer(
  158.                     $this->entityManager,
  159.                     OrderItemTypeMaster::class
  160.                 )))
  161.             ->add($builder->create('tax_type'HiddenType::class)
  162.                 ->addModelTransformer(new DataTransformer\EntityToIdTransformer(
  163.                     $this->entityManager,
  164.                     TaxType::class
  165.                 )))
  166.             ->add($builder->create('ProductClass'HiddenType::class)
  167.                 ->addModelTransformer(new DataTransformer\EntityToIdTransformer(
  168.                     $this->entityManager,
  169.                     ProductClass::class
  170.                 )));
  171.         // 受注明細フォームの税率を補完する
  172.         $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
  173.             $OrderItem $event->getData();
  174.             if (!isset($OrderItem['tax_rate']) || StringUtil::isBlank($OrderItem['tax_rate'])) {
  175.                 $orderItemTypeId $OrderItem['order_item_type'];
  176.                 if ($orderItemTypeId == OrderItemTypeMaster::PRODUCT) {
  177.                     /** @var ProductClass $ProductClass */
  178.                     $ProductClass $this->productClassRepository->find($OrderItem['ProductClass']);
  179.                     $Product $ProductClass->getProduct();
  180.                     $TaxRule $this->taxRuleRepository->getByRule($Product$ProductClass);
  181.                     if (!isset($OrderItem['tax_type']) || StringUtil::isBlank($OrderItem['tax_type'])) {
  182.                         $OrderItem['tax_type'] = TaxType::TAXATION;
  183.                     }
  184.                 } else {
  185.                     if ($orderItemTypeId == OrderItemTypeMaster::DISCOUNT && $OrderItem['tax_type'] == TaxType::NON_TAXABLE) {
  186.                         $OrderItem['tax_rate'] = '0';
  187.                         $event->setData($OrderItem);
  188.                         return;
  189.                     }
  190.                     $TaxRule $this->taxRuleRepository->getByRule();
  191.                 }
  192.                 $OrderItem['tax_rate'] = $TaxRule->getTaxRate();
  193.                 $event->setData($OrderItem);
  194.             }
  195.         });
  196.         $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
  197.             /** @var OrderItem $OrderItem */
  198.             $OrderItem $event->getData();
  199.             $OrderItemType $OrderItem->getOrderItemType();
  200.             switch ($OrderItemType->getId()) {
  201.                 case OrderItemTypeMaster::PRODUCT:
  202.                     $ProductClass $OrderItem->getProductClass();
  203.                     $Product $ProductClass->getProduct();
  204.                     $OrderItem->setProduct($Product);
  205.                     if (null === $OrderItem->getPrice()) {
  206.                         $OrderItem->setPrice($ProductClass->getPrice02());
  207.                     }
  208.                     if (null === $OrderItem->getProductCode()) {
  209.                         $OrderItem->setProductCode($ProductClass->getCode());
  210.                     }
  211.                     if (null === $OrderItem->getClassName1() && $ProductClass->hasClassCategory1()) {
  212.                         $ClassCategory1 $ProductClass->getClassCategory1();
  213.                         $OrderItem->setClassName1($ClassCategory1->getClassName()->getName());
  214.                         $OrderItem->setClassCategoryName1($ClassCategory1->getName());
  215.                     }
  216.                     if (null === $OrderItem->getClassName2() && $ProductClass->hasClassCategory2()) {
  217.                         if ($ClassCategory2 $ProductClass->getClassCategory2()) {
  218.                             $OrderItem->setClassName2($ClassCategory2->getClassName()->getName());
  219.                             $OrderItem->setClassCategoryName2($ClassCategory2->getName());
  220.                         }
  221.                     }
  222.                     if (null === $OrderItem->getRoundingType()) {
  223.                         $TaxRule $this->taxRuleRepository->getByRule($Product$ProductClass);
  224.                         $OrderItem->setRoundingType($TaxRule->getRoundingType())
  225.                             ->setTaxAdjust($TaxRule->getTaxAdjust());
  226.                     }
  227.                     break;
  228.                 default:
  229.                     if (null === $OrderItem->getRoundingType()) {
  230.                         $TaxRule $this->taxRuleRepository->getByRule();
  231.                         $OrderItem->setRoundingType($TaxRule->getRoundingType())
  232.                             ->setTaxAdjust($TaxRule->getTaxAdjust());
  233.                     }
  234.             }
  235.         });
  236.         // price, quantityのバリデーション
  237.         $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
  238.             $form $event->getForm();
  239.             /** @var OrderItem $OrderItem */
  240.             $OrderItem $event->getData();
  241.             $OrderItemType $OrderItem->getOrderItemType();
  242.             switch ($OrderItemType->getId()) {
  243.                 // 商品明細: 金額 -> 正, 個数 -> 正負
  244.                 case OrderItemTypeMaster::PRODUCT:
  245.                     $errors $this->validator->validate($OrderItem->getPrice(), [new Assert\GreaterThanOrEqual(0)]);
  246.                     $this->addErrorsIfExists($form['price'], $errors);
  247.                     break;
  248.                 // 値引き明細: 金額 -> 負, 個数 -> 正
  249.                 case OrderItemTypeMaster::DISCOUNT:
  250.                     $errors $this->validator->validate($OrderItem->getPrice(), [new Assert\LessThanOrEqual(0)]);
  251.                     $this->addErrorsIfExists($form['price'], $errors);
  252.                     $errors $this->validator->validate($OrderItem->getQuantity(), [new Assert\GreaterThanOrEqual(0)]);
  253.                     $this->addErrorsIfExists($form['quantity'], $errors);
  254.                     break;
  255.                 // 送料, 手数料: 金額 -> 正, 個数 -> 正
  256.                 case OrderItemTypeMaster::DELIVERY_FEE:
  257.                 case OrderItemTypeMaster::CHARGE:
  258.                     $errors $this->validator->validate($OrderItem->getPrice(), [new Assert\GreaterThanOrEqual(0)]);
  259.                     $this->addErrorsIfExists($form['price'], $errors);
  260.                     $errors $this->validator->validate($OrderItem->getQuantity(), [new Assert\GreaterThanOrEqual(0)]);
  261.                     $this->addErrorsIfExists($form['quantity'], $errors);
  262.                     break;
  263.                 default:
  264.                     break;
  265.             }
  266.         });
  267.     }
  268.     /**
  269.      * {@inheritdoc}
  270.      */
  271.     public function configureOptions(OptionsResolver $resolver)
  272.     {
  273.         $resolver->setDefaults([
  274.             'data_class' => OrderItem::class,
  275.         ]);
  276.     }
  277.     /**
  278.      * {@inheritdoc}
  279.      */
  280.     public function getBlockPrefix()
  281.     {
  282.         return 'order_item';
  283.     }
  284.     /**
  285.      * @param FormInterface $form
  286.      * @param ConstraintViolationListInterface $errors
  287.      */
  288.     protected function addErrorsIfExists(FormInterface $formConstraintViolationListInterface $errors)
  289.     {
  290.         if (count($errors) < 1) {
  291.             return;
  292.         }
  293.         foreach ($errors as $error) {
  294.             $form->addError(new FormError(
  295.                 $error->getMessage(),
  296.                 $error->getMessageTemplate(),
  297.                 $error->getParameters(),
  298.                 $error->getPlural()));
  299.         }
  300.     }
  301. }