src/Eccube/Repository/OrderRepository.php line 47

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\Repository;
  13. use Doctrine\ORM\NoResultException;
  14. use Doctrine\ORM\QueryBuilder;
  15. use Eccube\Doctrine\Query\Queries;
  16. use Eccube\Entity\Customer;
  17. use Eccube\Entity\Master\OrderStatus;
  18. use Eccube\Entity\Order;
  19. use Eccube\Entity\Shipping;
  20. use Eccube\Util\StringUtil;
  21. use Symfony\Bridge\Doctrine\RegistryInterface;
  22. /**
  23.  * OrderRepository
  24.  *
  25.  * This class was generated by the Doctrine ORM. Add your own custom
  26.  * repository methods below.
  27.  */
  28. class OrderRepository extends AbstractRepository
  29. {
  30.     /**
  31.      * @var Queries
  32.      */
  33.     protected $queries;
  34.     /**
  35.      * OrderRepository constructor.
  36.      *
  37.      * @param RegistryInterface $registry
  38.      * @param Queries $queries
  39.      */
  40.     public function __construct(RegistryInterface $registryQueries $queries)
  41.     {
  42.         parent::__construct($registryOrder::class);
  43.         $this->queries $queries;
  44.     }
  45.     /**
  46.      * @param int $orderId
  47.      * @param OrderStatus $Status
  48.      */
  49.     public function changeStatus($orderId, \Eccube\Entity\Master\OrderStatus $Status)
  50.     {
  51.         $Order $this
  52.             ->find($orderId)
  53.             ->setOrderStatus($Status)
  54.         ;
  55.         switch ($Status->getId()) {
  56.             case '6'// 入金済へ
  57.                 $Order->setPaymentDate(new \DateTime());
  58.                 break;
  59.         }
  60.         $em $this->getEntityManager();
  61.         $em->persist($Order);
  62.         $em->flush();
  63.     }
  64.     /**
  65.      * @param  array        $searchData
  66.      *
  67.      * @return QueryBuilder
  68.      */
  69.     public function getQueryBuilderBySearchDataForAdmin($searchData)
  70.     {
  71.         $qb $this->createQueryBuilder('o')
  72.             ->select('o, s')
  73.             ->addSelect('oi''pref')
  74.             ->leftJoin('o.OrderItems''oi')
  75.             ->leftJoin('o.Pref''pref')
  76.             ->innerJoin('o.Shippings''s');
  77.         // order_id_start
  78.         if (isset($searchData['order_id']) && StringUtil::isNotBlank($searchData['order_id'])) {
  79.             $qb
  80.                 ->andWhere('o.id = :order_id')
  81.                 ->setParameter('order_id'$searchData['order_id']);
  82.         }
  83.         // order_no
  84.         if (isset($searchData['order_no']) && StringUtil::isNotBlank($searchData['order_no'])) {
  85.             $qb
  86.                 ->andWhere('o.order_no = :order_no')
  87.                 ->setParameter('order_no'$searchData['order_no']);
  88.         }
  89.         // order_id_start
  90.         if (isset($searchData['order_id_start']) && StringUtil::isNotBlank($searchData['order_id_start'])) {
  91.             $qb
  92.                 ->andWhere('o.id >= :order_id_start')
  93.                 ->setParameter('order_id_start'$searchData['order_id_start']);
  94.         }
  95.         // multi
  96.         if (isset($searchData['multi']) && StringUtil::isNotBlank($searchData['multi'])) {
  97.             $multi preg_match('/^\d{0,10}$/'$searchData['multi']) ? $searchData['multi'] : null;
  98.             if ($multi && $multi '2147483647' && $this->isPostgreSQL()) {
  99.                 $multi null;
  100.             }
  101.             $qb
  102.                 ->andWhere('o.id = :multi OR o.name01 LIKE :likemulti OR o.name02 LIKE :likemulti OR '.
  103.                             'o.kana01 LIKE :likemulti OR o.kana02 LIKE :likemulti OR o.company_name LIKE :likemulti OR '.
  104.                             'o.order_no LIKE :likemulti OR o.email LIKE :likemulti OR o.phone_number LIKE :likemulti')
  105.                 ->setParameter('multi'$multi)
  106.                 ->setParameter('likemulti''%'.$searchData['multi'].'%');
  107.         }
  108.         // order_id_end
  109.         if (isset($searchData['order_id_end']) && StringUtil::isNotBlank($searchData['order_id_end'])) {
  110.             $qb
  111.                 ->andWhere('o.id <= :order_id_end')
  112.                 ->setParameter('order_id_end'$searchData['order_id_end']);
  113.         }
  114.         // status
  115.         $filterStatus false;
  116.         if (!empty($searchData['status']) && count($searchData['status'])) {
  117.             $qb
  118.                 ->andWhere($qb->expr()->in('o.OrderStatus'':status'))
  119.                 ->setParameter('status'$searchData['status']);
  120.             $filterStatus true;
  121.         }
  122.         if (!$filterStatus) {
  123.             // 購入処理中, 決済処理中は検索対象から除外
  124.             $qb->andWhere($qb->expr()->notIn('o.OrderStatus'':status'))
  125.                 ->setParameter('status', [OrderStatus::PROCESSINGOrderStatus::PENDING]);
  126.         }
  127.         // company_name
  128.         if (isset($searchData['company_name']) && StringUtil::isNotBlank($searchData['company_name'])) {
  129.             $qb
  130.                 ->andWhere('o.company_name LIKE :company_name')
  131.                 ->setParameter('company_name''%'.$searchData['company_name'].'%');
  132.         }
  133.         // name
  134.         if (isset($searchData['name']) && StringUtil::isNotBlank($searchData['name'])) {
  135.             $qb
  136.                 ->andWhere('CONCAT(o.name01, o.name02) LIKE :name')
  137.                 ->setParameter('name''%'.$searchData['name'].'%');
  138.         }
  139.         // kana
  140.         if (isset($searchData['kana']) && StringUtil::isNotBlank($searchData['kana'])) {
  141.             $qb
  142.                 ->andWhere('CONCAT(o.kana01, o.kana02) LIKE :kana')
  143.                 ->setParameter('kana''%'.$searchData['kana'].'%');
  144.         }
  145.         // email
  146.         if (isset($searchData['email']) && StringUtil::isNotBlank($searchData['email'])) {
  147.             $qb
  148.                 ->andWhere('o.email like :email')
  149.                 ->setParameter('email''%'.$searchData['email'].'%');
  150.         }
  151.         // tel
  152.         if (isset($searchData['phone_number']) && StringUtil::isNotBlank($searchData['phone_number'])) {
  153.             $tel preg_replace('/[^0-9]/ '''$searchData['phone_number']);
  154.             $qb
  155.                 ->andWhere('o.phone_number LIKE :phone_number')
  156.                 ->setParameter('phone_number''%'.$tel.'%');
  157.         }
  158.         // sex
  159.         if (!empty($searchData['sex']) && count($searchData['sex']) > 0) {
  160.             $qb
  161.                 ->andWhere($qb->expr()->in('o.Sex'':sex'))
  162.                 ->setParameter('sex'$searchData['sex']->toArray());
  163.         }
  164.         // payment
  165.         if (!empty($searchData['payment']) && count($searchData['payment'])) {
  166.             $payments = [];
  167.             foreach ($searchData['payment'] as $payment) {
  168.                 $payments[] = $payment->getId();
  169.             }
  170.             $qb
  171.                 ->leftJoin('o.Payment''p')
  172.                 ->andWhere($qb->expr()->in('p.id'':payments'))
  173.                 ->setParameter('payments'$payments);
  174.         }
  175.         // oreder_date
  176.         if (!empty($searchData['order_datetime_start']) && $searchData['order_datetime_start']) {
  177.             $date $searchData['order_datetime_start'];
  178.             $qb
  179.                 ->andWhere('o.order_date >= :order_date_start')
  180.                 ->setParameter('order_date_start'$date);
  181.         } elseif (!empty($searchData['order_date_start']) && $searchData['order_date_start']) {
  182.             $date $searchData['order_date_start'];
  183.             $qb
  184.                 ->andWhere('o.order_date >= :order_date_start')
  185.                 ->setParameter('order_date_start'$date);
  186.         }
  187.         if (!empty($searchData['order_datetime_end']) && $searchData['order_datetime_end']) {
  188.             $date $searchData['order_datetime_end'];
  189.             $qb
  190.                 ->andWhere('o.order_date < :order_date_end')
  191.                 ->setParameter('order_date_end'$date);
  192.         } elseif (!empty($searchData['order_date_end']) && $searchData['order_date_end']) {
  193.             $date = clone $searchData['order_date_end'];
  194.             $date $date
  195.                 ->modify('+1 days');
  196.             $qb
  197.                 ->andWhere('o.order_date < :order_date_end')
  198.                 ->setParameter('order_date_end'$date);
  199.         }
  200.         // payment_date
  201.         if (!empty($searchData['payment_datetime_start']) && $searchData['payment_datetime_start']) {
  202.             $date $searchData['payment_datetime_start'];
  203.             $qb
  204.                 ->andWhere('o.payment_date >= :payment_date_start')
  205.                 ->setParameter('payment_date_start'$date);
  206.         } elseif (!empty($searchData['payment_date_start']) && $searchData['payment_date_start']) {
  207.             $date $searchData['payment_date_start'];
  208.             $qb
  209.                 ->andWhere('o.payment_date >= :payment_date_start')
  210.                 ->setParameter('payment_date_start'$date);
  211.         }
  212.         if (!empty($searchData['payment_datetime_end']) && $searchData['payment_datetime_end']) {
  213.             $date $searchData['payment_datetime_end'];
  214.             $qb
  215.                 ->andWhere('o.payment_date < :payment_date_end')
  216.                 ->setParameter('payment_date_end'$date);
  217.         } elseif (!empty($searchData['payment_date_end']) && $searchData['payment_date_end']) {
  218.             $date = clone $searchData['payment_date_end'];
  219.             $date $date
  220.                 ->modify('+1 days');
  221.             $qb
  222.                 ->andWhere('o.payment_date < :payment_date_end')
  223.                 ->setParameter('payment_date_end'$date);
  224.         }
  225.         // update_date
  226.         if (!empty($searchData['update_datetime_start']) && $searchData['update_datetime_start']) {
  227.             $date $searchData['update_datetime_start'];
  228.             $qb
  229.                 ->andWhere('o.update_date >= :update_date_start')
  230.                 ->setParameter('update_date_start'$date);
  231.         } elseif (!empty($searchData['update_date_start']) && $searchData['update_date_start']) {
  232.             $date $searchData['update_date_start'];
  233.             $qb
  234.                 ->andWhere('o.update_date >= :update_date_start')
  235.                 ->setParameter('update_date_start'$date);
  236.         }
  237.         if (!empty($searchData['update_datetime_end']) && $searchData['update_datetime_end']) {
  238.             $date $searchData['update_datetime_end'];
  239.             $qb
  240.                 ->andWhere('o.update_date < :update_date_end')
  241.                 ->setParameter('update_date_end'$date);
  242.         } elseif (!empty($searchData['update_date_end']) && $searchData['update_date_end']) {
  243.             $date = clone $searchData['update_date_end'];
  244.             $date $date
  245.                 ->modify('+1 days');
  246.             $qb
  247.                 ->andWhere('o.update_date < :update_date_end')
  248.                 ->setParameter('update_date_end'$date);
  249.         }
  250.         // payment_total
  251.         if (isset($searchData['payment_total_start']) && StringUtil::isNotBlank($searchData['payment_total_start'])) {
  252.             $qb
  253.                 ->andWhere('o.payment_total >= :payment_total_start')
  254.                 ->setParameter('payment_total_start'$searchData['payment_total_start']);
  255.         }
  256.         if (isset($searchData['payment_total_end']) && StringUtil::isNotBlank($searchData['payment_total_end'])) {
  257.             $qb
  258.                 ->andWhere('o.payment_total <= :payment_total_end')
  259.                 ->setParameter('payment_total_end'$searchData['payment_total_end']);
  260.         }
  261.         // buy_product_name
  262.         if (isset($searchData['buy_product_name']) && StringUtil::isNotBlank($searchData['buy_product_name'])) {
  263.             $qb
  264.                 ->andWhere('oi.product_name LIKE :buy_product_name')
  265.                 ->setParameter('buy_product_name''%'.$searchData['buy_product_name'].'%');
  266.         }
  267.         // 発送メール送信/未送信.
  268.         if (isset($searchData['shipping_mail']) && $count count($searchData['shipping_mail'])) {
  269.             // 送信済/未送信両方にチェックされている場合は検索条件に追加しない
  270.             if ($count 2) {
  271.                 $checked current($searchData['shipping_mail']);
  272.                 if ($checked == Shipping::SHIPPING_MAIL_UNSENT) {
  273.                     // 未送信
  274.                     $qb
  275.                         ->andWhere('s.mail_send_date IS NULL');
  276.                 } elseif ($checked == Shipping::SHIPPING_MAIL_SENT) {
  277.                     // 送信
  278.                     $qb
  279.                         ->andWhere('s.mail_send_date IS NOT NULL');
  280.                 }
  281.             }
  282.         }
  283.         // 送り状番号.
  284.         if (!empty($searchData['tracking_number'])) {
  285.             $qb
  286.                 ->andWhere('s.tracking_number = :tracking_number')
  287.                 ->setParameter('tracking_number'$searchData['tracking_number']);
  288.         }
  289.         // お届け予定日(Shipping.delivery_date)
  290.         if (!empty($searchData['shipping_delivery_datetime_start']) && $searchData['shipping_delivery_datetime_start']) {
  291.             $date $searchData['shipping_delivery_datetime_start'];
  292.             $qb
  293.                 ->andWhere('s.shipping_delivery_date >= :shipping_delivery_date_start')
  294.                 ->setParameter('shipping_delivery_date_start'$date);
  295.         } elseif (!empty($searchData['shipping_delivery_date_start']) && $searchData['shipping_delivery_date_start']) {
  296.             $date $searchData['shipping_delivery_date_start'];
  297.             $qb
  298.                 ->andWhere('s.shipping_delivery_date >= :shipping_delivery_date_start')
  299.                 ->setParameter('shipping_delivery_date_start'$date);
  300.         }
  301.         if (!empty($searchData['shipping_delivery_datetime_end']) && $searchData['shipping_delivery_datetime_end']) {
  302.             $date $searchData['shipping_delivery_datetime_end'];
  303.             $qb
  304.                 ->andWhere('s.shipping_delivery_date < :shipping_delivery_date_end')
  305.                 ->setParameter('shipping_delivery_date_end'$date);
  306.         } elseif (!empty($searchData['shipping_delivery_date_end']) && $searchData['shipping_delivery_date_end']) {
  307.             $date = clone $searchData['shipping_delivery_date_end'];
  308.             $date $date
  309.                 ->modify('+1 days');
  310.             $qb
  311.                 ->andWhere('s.shipping_delivery_date < :shipping_delivery_date_end')
  312.                 ->setParameter('shipping_delivery_date_end'$date);
  313.         }
  314.         // Order By
  315.         $qb->orderBy('o.update_date''DESC');
  316.         $qb->addorderBy('o.id''DESC');
  317.         return $this->queries->customize(QueryKey::ORDER_SEARCH_ADMIN$qb$searchData);
  318.     }
  319.     /**
  320.      * @param  \Eccube\Entity\Customer $Customer
  321.      *
  322.      * @return QueryBuilder
  323.      */
  324.     public function getQueryBuilderByCustomer(\Eccube\Entity\Customer $Customer)
  325.     {
  326.         $qb $this->createQueryBuilder('o')
  327.             ->where('o.Customer = :Customer')
  328.             ->setParameter('Customer'$Customer);
  329.         // Order By
  330.         $qb->addOrderBy('o.id''DESC');
  331.         return $this->queries->customize(QueryKey::ORDER_SEARCH_BY_CUSTOMER$qb, ['customer' => $Customer]);
  332.     }
  333.     /**
  334.      * ステータスごとの受注件数を取得する.
  335.      *
  336.      * @param integer $OrderStatusOrId
  337.      *
  338.      * @return int
  339.      *
  340.      * @throws \Doctrine\ORM\NoResultException
  341.      * @throws \Doctrine\ORM\NonUniqueResultException
  342.      */
  343.     public function countByOrderStatus($OrderStatusOrId)
  344.     {
  345.         return (int) $this->createQueryBuilder('o')
  346.             ->select('COALESCE(COUNT(o.id), 0)')
  347.             ->where('o.OrderStatus = :OrderStatus')
  348.             ->setParameter('OrderStatus'$OrderStatusOrId)
  349.             ->getQuery()
  350.             ->getSingleScalarResult();
  351.     }
  352.     /**
  353.      * 会員の購入金額, 購入回数, 初回購入日, 最終購入費を更新する
  354.      *
  355.      * @param Customer $Customer
  356.      * @param array $OrderStatuses
  357.      */
  358.     public function updateOrderSummary(Customer $Customer, array $OrderStatuses = [OrderStatus::NEW, OrderStatus::PAIDOrderStatus::DELIVEREDOrderStatus::IN_PROGRESS])
  359.     {
  360.         try {
  361.             $result $this->createQueryBuilder('o')
  362.                 ->select('COUNT(o.id) AS buy_times, SUM(o.total) AS buy_total, MIN(o.id) AS first_order_id, MAX(o.id) AS last_order_id')
  363.                 ->where('o.Customer = :Customer')
  364.                 ->andWhere('o.OrderStatus in (:OrderStatuses)')
  365.                 ->setParameter('Customer'$Customer)
  366.                 ->setParameter('OrderStatuses'$OrderStatuses)
  367.                 ->groupBy('o.Customer')
  368.                 ->getQuery()
  369.                 ->getSingleResult();
  370.         } catch (NoResultException $e) {
  371.             // 受注データが存在しなければ初期化
  372.             $Customer->setFirstBuyDate(null);
  373.             $Customer->setLastBuyDate(null);
  374.             $Customer->setBuyTimes(0);
  375.             $Customer->setBuyTotal(0);
  376.             return;
  377.         }
  378.         $FirstOrder $this->find(['id' => $result['first_order_id']]);
  379.         $LastOrder $this->find(['id' => $result['last_order_id']]);
  380.         $Customer->setBuyTimes($result['buy_times']);
  381.         $Customer->setBuyTotal($result['buy_total']);
  382.         $Customer->setFirstBuyDate($FirstOrder->getOrderDate());
  383.         $Customer->setLastBuyDate($LastOrder->getOrderDate());
  384.     }
  385. }