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

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.         $builder
  145.             ->add($builder->create('order_item_type'HiddenType::class)
  146.                 ->addModelTransformer(new DataTransformer\EntityToIdTransformer(
  147.                     $this->entityManager,
  148.                     OrderItemTypeMaster::class
  149.                 )))
  150.             ->add($builder->create('tax_type'HiddenType::class)
  151.                 ->addModelTransformer(new DataTransformer\EntityToIdTransformer(
  152.                     $this->entityManager,
  153.                     TaxType::class
  154.                 )))
  155.             ->add($builder->create('ProductClass'HiddenType::class)
  156.                 ->addModelTransformer(new DataTransformer\EntityToIdTransformer(
  157.                     $this->entityManager,
  158.                     ProductClass::class
  159.                 )));
  160.         // 受注明細フォームの税率を補完する
  161.         $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
  162.             $OrderItem $event->getData();
  163.             if (!isset($OrderItem['tax_rate']) || StringUtil::isBlank($OrderItem['tax_rate'])) {
  164.                 $orderItemTypeId $OrderItem['order_item_type'];
  165.                 if ($orderItemTypeId == OrderItemTypeMaster::PRODUCT) {
  166.                     /** @var ProductClass $ProductClass */
  167.                     $ProductClass $this->productClassRepository->find($OrderItem['ProductClass']);
  168.                     $Product $ProductClass->getProduct();
  169.                     $TaxRule $this->taxRuleRepository->getByRule($Product$ProductClass);
  170.                     if (!isset($OrderItem['tax_type']) || StringUtil::isBlank($OrderItem['tax_type'])) {
  171.                         $OrderItem['tax_type'] = TaxType::TAXATION;
  172.                     }
  173.                 } else {
  174.                     if ($orderItemTypeId == OrderItemTypeMaster::DISCOUNT && $OrderItem['tax_type'] == TaxType::NON_TAXABLE) {
  175.                         $OrderItem['tax_rate'] = '0';
  176.                         $event->setData($OrderItem);
  177.                         return;
  178.                     }
  179.                     $TaxRule $this->taxRuleRepository->getByRule();
  180.                 }
  181.                 $OrderItem['tax_rate'] = $TaxRule->getTaxRate();
  182.                 $event->setData($OrderItem);
  183.             }
  184.         });
  185.         $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
  186.             /** @var OrderItem $OrderItem */
  187.             $OrderItem $event->getData();
  188.             $OrderItemType $OrderItem->getOrderItemType();
  189.             switch ($OrderItemType->getId()) {
  190.                 case OrderItemTypeMaster::PRODUCT:
  191.                     $ProductClass $OrderItem->getProductClass();
  192.                     $Product $ProductClass->getProduct();
  193.                     $OrderItem->setProduct($Product);
  194.                     if (null === $OrderItem->getPrice()) {
  195.                         $OrderItem->setPrice($ProductClass->getPrice02());
  196.                     }
  197.                     if (null === $OrderItem->getProductCode()) {
  198.                         $OrderItem->setProductCode($ProductClass->getCode());
  199.                     }
  200.                     if (null === $OrderItem->getClassName1() && $ProductClass->hasClassCategory1()) {
  201.                         $ClassCategory1 $ProductClass->getClassCategory1();
  202.                         $OrderItem->setClassName1($ClassCategory1->getClassName()->getName());
  203.                         $OrderItem->setClassCategoryName1($ClassCategory1->getName());
  204.                     }
  205.                     if (null === $OrderItem->getClassName2() && $ProductClass->hasClassCategory2()) {
  206.                         if ($ClassCategory2 $ProductClass->getClassCategory2()) {
  207.                             $OrderItem->setClassName2($ClassCategory2->getClassName()->getName());
  208.                             $OrderItem->setClassCategoryName2($ClassCategory2->getName());
  209.                         }
  210.                     }
  211.                     if (null === $OrderItem->getRoundingType()) {
  212.                         $TaxRule $this->taxRuleRepository->getByRule($Product$ProductClass);
  213.                         $OrderItem->setRoundingType($TaxRule->getRoundingType())
  214.                             ->setTaxAdjust($TaxRule->getTaxAdjust());
  215.                     }
  216.                     break;
  217.                 default:
  218.                     if (null === $OrderItem->getRoundingType()) {
  219.                         $TaxRule $this->taxRuleRepository->getByRule();
  220.                         $OrderItem->setRoundingType($TaxRule->getRoundingType())
  221.                             ->setTaxAdjust($TaxRule->getTaxAdjust());
  222.                     }
  223.             }
  224.         });
  225.         // price, quantityのバリデーション
  226.         $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
  227.             $form $event->getForm();
  228.             /** @var OrderItem $OrderItem */
  229.             $OrderItem $event->getData();
  230.             $OrderItemType $OrderItem->getOrderItemType();
  231.             switch ($OrderItemType->getId()) {
  232.                 // 商品明細: 金額 -> 正, 個数 -> 正負
  233.                 case OrderItemTypeMaster::PRODUCT:
  234.                     $errors $this->validator->validate($OrderItem->getPrice(), [new Assert\GreaterThanOrEqual(0)]);
  235.                     $this->addErrorsIfExists($form['price'], $errors);
  236.                     break;
  237.                 // 値引き明細: 金額 -> 負, 個数 -> 正
  238.                 case OrderItemTypeMaster::DISCOUNT:
  239.                     $errors $this->validator->validate($OrderItem->getPrice(), [new Assert\LessThanOrEqual(0)]);
  240.                     $this->addErrorsIfExists($form['price'], $errors);
  241.                     $errors $this->validator->validate($OrderItem->getQuantity(), [new Assert\GreaterThanOrEqual(0)]);
  242.                     $this->addErrorsIfExists($form['quantity'], $errors);
  243.                     break;
  244.                 // 送料, 手数料: 金額 -> 正, 個数 -> 正
  245.                 case OrderItemTypeMaster::DELIVERY_FEE:
  246.                 case OrderItemTypeMaster::CHARGE:
  247.                     $errors $this->validator->validate($OrderItem->getPrice(), [new Assert\GreaterThanOrEqual(0)]);
  248.                     $this->addErrorsIfExists($form['price'], $errors);
  249.                     $errors $this->validator->validate($OrderItem->getQuantity(), [new Assert\GreaterThanOrEqual(0)]);
  250.                     $this->addErrorsIfExists($form['quantity'], $errors);
  251.                     break;
  252.                 default:
  253.                     break;
  254.             }
  255.         });
  256.     }
  257.     /**
  258.      * {@inheritdoc}
  259.      */
  260.     public function configureOptions(OptionsResolver $resolver)
  261.     {
  262.         $resolver->setDefaults([
  263.             'data_class' => OrderItem::class,
  264.         ]);
  265.     }
  266.     /**
  267.      * {@inheritdoc}
  268.      */
  269.     public function getBlockPrefix()
  270.     {
  271.         return 'order_item';
  272.     }
  273.     /**
  274.      * @param FormInterface $form
  275.      * @param ConstraintViolationListInterface $errors
  276.      */
  277.     protected function addErrorsIfExists(FormInterface $formConstraintViolationListInterface $errors)
  278.     {
  279.         if (empty($errors)) {
  280.             return;
  281.         }
  282.         foreach ($errors as $error) {
  283.             $form->addError(new FormError(
  284.                 $error->getMessage(),
  285.                 $error->getMessageTemplate(),
  286.                 $error->getParameters(),
  287.                 $error->getPlural()));
  288.         }
  289.     }
  290. }