public function setUp()
 {
     parent::setUp();
     $faker = $this->getFaker();
     $this->Member = $this->app['eccube.repository.member']->find(2);
     $this->Customer = $this->createCustomer();
     $this->Order = $this->createOrder($this->Customer);
     $this->Product = $this->createProduct();
     $ProductClasses = $this->Product->getProductClasses();
     $this->ProductClass = $ProductClasses[0];
     $quantity = 3;
     $TaxRule = $this->app['eccube.repository.tax_rule']->getByRule();
     // デフォルト課税規則
     $OrderDetail = new OrderDetail();
     $OrderDetail->setProduct($this->Product)->setProductClass($this->ProductClass)->setProductName($this->Product->getName())->setProductCode($this->ProductClass->getCode())->setPrice($this->ProductClass->getPrice02())->setQuantity($quantity)->setTaxRule($TaxRule->getCalcRule()->getId())->setTaxRate($TaxRule->getTaxRate());
     $this->app['orm.em']->persist($OrderDetail);
     $OrderDetail->setOrder($this->Order);
     $this->Order->addOrderDetail($OrderDetail);
     // 1個ずつ別のお届け先に届ける
     for ($i = 0; $i < $quantity; $i++) {
         $Shipping = new Shipping();
         $Shipping->copyProperties($this->Customer);
         $Shipping->setName01($faker->lastName)->setName02($faker->firstName)->setKana01('セイ');
         $this->Order->addShipping($Shipping);
         $Shipping->setOrder($this->Order);
         $this->app['orm.em']->persist($Shipping);
         $ShipmentItem = new ShipmentItem();
         $ShipmentItem->setShipping($Shipping)->setOrder($this->Order)->setProductClass($this->ProductClass)->setProduct($this->Product)->setProductName($this->Product->getName())->setProductCode($this->ProductClass->getCode())->setPrice($this->ProductClass->getPrice02())->setQuantity(1);
         $this->app['orm.em']->persist($ShipmentItem);
     }
     $subTotal = 0;
     foreach ($this->Order->getOrderDetails() as $OrderDetail) {
         $subTotal += $OrderDetail->getPriceIncTax() * $OrderDetail->getQuantity();
     }
     $this->Order->setSubTotal($subTotal);
     $this->Order->setTotal($subTotal);
     $this->Order->setPaymentTotal($subTotal);
     $this->app['orm.em']->flush();
 }
Beispiel #2
0
 public function index(Application $app, Request $request, $id = null)
 {
     $TargetOrder = null;
     $OriginOrder = null;
     if (is_null($id)) {
         // 空のエンティティを作成.
         $TargetOrder = $this->newOrder();
     } else {
         $TargetOrder = $app['eccube.repository.order']->find($id);
         if (is_null($TargetOrder)) {
             throw new NotFoundHttpException();
         }
     }
     // 編集前の受注情報を保持
     $OriginOrder = clone $TargetOrder;
     $OriginalOrderDetails = new ArrayCollection();
     foreach ($TargetOrder->getOrderDetails() as $OrderDetail) {
         $OriginalOrderDetails->add($OrderDetail);
     }
     $builder = $app['form.factory']->createBuilder('order', $TargetOrder);
     $form = $builder->getForm();
     if ('POST' === $request->getMethod()) {
         $form->handleRequest($request);
         // 入力情報にもとづいて再計算.
         $this->calculate($app, $TargetOrder);
         // 登録ボタン押下
         switch ($request->get('mode')) {
             case 'register':
                 if ($TargetOrder->getTotal() > $app['config']['max_total_fee']) {
                     $form['charge']->addError(new FormError('合計金額の上限を超えております。'));
                 } elseif ($form->isValid()) {
                     $BaseInfo = $app['eccube.repository.base_info']->get();
                     // お支払い方法の更新
                     $TargetOrder->setPaymentMethod($TargetOrder->getPayment()->getMethod());
                     // 配送業者・お届け時間の更新
                     $Shippings = $TargetOrder->getShippings();
                     foreach ($Shippings as $Shipping) {
                         $Shipping->setShippingDeliveryName($Shipping->getDelivery()->getName());
                         if (!is_null($Shipping->getDeliveryTime())) {
                             $Shipping->setShippingDeliveryTime($Shipping->getDeliveryTime()->getDeliveryTime());
                         } else {
                             $Shipping->setShippingDeliveryTime(null);
                         }
                     }
                     // 受注日/発送日/入金日の更新.
                     $this->updateDate($app, $TargetOrder, $OriginOrder);
                     // 受注明細で削除されているものをremove
                     foreach ($OriginalOrderDetails as $OrderDetail) {
                         if (false === $TargetOrder->getOrderDetails()->contains($OrderDetail)) {
                             $app['orm.em']->remove($OrderDetail);
                         }
                     }
                     if ($BaseInfo->getOptionMultipleShipping() == Constant::ENABLED) {
                         foreach ($TargetOrder->getOrderDetails() as $OrderDetail) {
                             /** @var $OrderDetail \Eccube\Entity\OrderDetail */
                             $OrderDetail->setOrder($TargetOrder);
                         }
                         /** @var \Eccube\Entity\Shipping $Shipping */
                         foreach ($Shippings as $Shipping) {
                             $shipmentItems = $Shipping->getShipmentItems();
                             /** @var \Eccube\Entity\ShipmentItem $ShipmentItem */
                             foreach ($shipmentItems as $ShipmentItem) {
                                 $ShipmentItem->setOrder($TargetOrder);
                                 $ShipmentItem->setShipping($Shipping);
                                 $app['orm.em']->persist($ShipmentItem);
                             }
                             $Shipping->setOrder($TargetOrder);
                             $app['orm.em']->persist($Shipping);
                         }
                     } else {
                         $NewShipmentItems = new ArrayCollection();
                         foreach ($TargetOrder->getOrderDetails() as $OrderDetail) {
                             /** @var $OrderDetail \Eccube\Entity\OrderDetail */
                             $OrderDetail->setOrder($TargetOrder);
                             $NewShipmentItem = new ShipmentItem();
                             $NewShipmentItem->setProduct($OrderDetail->getProduct())->setProductClass($OrderDetail->getProductClass())->setProductName($OrderDetail->getProduct()->getName())->setProductCode($OrderDetail->getProductClass()->getCode())->setClassCategoryName1($OrderDetail->getClassCategoryName1())->setClassCategoryName2($OrderDetail->getClassCategoryName2())->setClassName1($OrderDetail->getClassName1())->setClassName2($OrderDetail->getClassName2())->setPrice($OrderDetail->getPrice())->setQuantity($OrderDetail->getQuantity())->setOrder($TargetOrder);
                             $NewShipmentItems[] = $NewShipmentItem;
                         }
                         // 配送商品の更新. delete/insert.
                         $Shippings = $TargetOrder->getShippings();
                         foreach ($Shippings as $Shipping) {
                             $ShipmentItems = $Shipping->getShipmentItems();
                             foreach ($ShipmentItems as $ShipmentItem) {
                                 $app['orm.em']->remove($ShipmentItem);
                             }
                             $ShipmentItems->clear();
                             foreach ($NewShipmentItems as $NewShipmentItem) {
                                 $NewShipmentItem->setShipping($Shipping);
                                 $ShipmentItems->add($NewShipmentItem);
                             }
                         }
                     }
                     $app['orm.em']->persist($TargetOrder);
                     $app['orm.em']->flush();
                     $Customer = $TargetOrder->getCustomer();
                     if ($Customer) {
                         // 会員の場合、購入回数、購入金額などを更新
                         $app['eccube.repository.customer']->updateBuyData($app, $Customer, $TargetOrder->getOrderStatus()->getId());
                     }
                     $app->addSuccess('admin.order.save.complete', 'admin');
                     return $app->redirect($app->url('admin_order_edit', array('id' => $TargetOrder->getId())));
                 }
                 break;
             case 'add_delivery':
                 // お届け先情報の新規追加
                 $form = $builder->getForm();
                 $Shipping = new \Eccube\Entity\Shipping();
                 $Shipping->setDelFlg(Constant::DISABLED);
                 $TargetOrder->addShipping($Shipping);
                 $Shipping->setOrder($TargetOrder);
                 $form->setData($TargetOrder);
                 break;
             default:
                 break;
         }
     }
     // 会員検索フォーム
     $searchCustomerModalForm = $app['form.factory']->createBuilder('admin_search_customer')->getForm();
     // 商品検索フォーム
     $searchProductModalForm = $app['form.factory']->createBuilder('admin_search_product')->getForm();
     // 配送業者のお届け時間
     $times = array();
     $deliveries = $app['eccube.repository.delivery']->findAll();
     foreach ($deliveries as $Delivery) {
         $deliveryTiems = $Delivery->getDeliveryTimes();
         foreach ($deliveryTiems as $DeliveryTime) {
             $times[$Delivery->getId()][$DeliveryTime->getId()] = $DeliveryTime->getDeliveryTime();
         }
     }
     return $app->render('Order/edit.twig', array('form' => $form->createView(), 'searchCustomerModalForm' => $searchCustomerModalForm->createView(), 'searchProductModalForm' => $searchProductModalForm->createView(), 'Order' => $TargetOrder, 'id' => $id, 'shippingDeliveryTimes' => $app['serializer']->serialize($times, 'json')));
 }
Beispiel #3
0
 /**
  * 配送商品情報を作成
  *
  * @param Order $Order
  * @param Product $Product
  * @param ProductClass $ProductClass
  * @param $quantity
  * @return \Eccube\Entity\ShipmentItem
  */
 public function getNewShipmentItem(Order $Order, Product $Product, ProductClass $ProductClass, $quantity)
 {
     $ShipmentItem = new ShipmentItem();
     $shippings = $Order->getShippings();
     // 選択された商品がどのお届け先情報と関連するかチェック
     $Shipping = null;
     foreach ($shippings as $s) {
         if ($s->getDelivery()->getProductType()->getId() == $ProductClass->getProductType()->getId()) {
             // 商品種別が同一のお届け先情報と関連させる
             $Shipping = $s;
             break;
         }
     }
     if (is_null($Shipping)) {
         // お届け先情報と関連していない場合、エラー
         throw new CartException('shopping.delivery.not.producttype');
     }
     // 商品ごとの配送料合計
     $productDeliveryFeeTotal = 0;
     if (!is_null($this->BaseInfo->getOptionProductDeliveryFee())) {
         $productDeliveryFeeTotal = $ProductClass->getDeliveryFee() * $quantity;
     }
     $Shipping->setShippingDeliveryFee($Shipping->getShippingDeliveryFee() + $productDeliveryFeeTotal);
     $ShipmentItem->setShipping($Shipping)->setOrder($Order)->setProductClass($ProductClass)->setProduct($Product)->setProductName($Product->getName())->setProductCode($ProductClass->getCode())->setPrice($ProductClass->getPrice02())->setQuantity($quantity);
     $ClassCategory1 = $ProductClass->getClassCategory1();
     if (!is_null($ClassCategory1)) {
         $ShipmentItem->setClasscategoryName1($ClassCategory1->getName());
         $ShipmentItem->setClassName1($ClassCategory1->getClassName()->getName());
     }
     $ClassCategory2 = $ProductClass->getClassCategory2();
     if (!is_null($ClassCategory2)) {
         $ShipmentItem->setClasscategoryName2($ClassCategory2->getName());
         $ShipmentItem->setClassName2($ClassCategory2->getClassName()->getName());
     }
     $Shipping->addShipmentItem($ShipmentItem);
     $this->em->persist($ShipmentItem);
     return $ShipmentItem;
 }
Beispiel #4
0
 public function index(Application $app, Request $request, $id = null)
 {
     $TargetOrder = null;
     $OriginOrder = null;
     if (is_null($id)) {
         // 空のエンティティを作成.
         $TargetOrder = $this->newOrder();
     } else {
         $TargetOrder = $app['eccube.repository.order']->find($id);
         if (is_null($TargetOrder)) {
             throw new NotFoundHttpException();
         }
     }
     // 編集前の受注情報を保持
     $OriginOrder = clone $TargetOrder;
     $OriginalOrderDetails = new ArrayCollection();
     foreach ($TargetOrder->getOrderDetails() as $OrderDetail) {
         $OriginalOrderDetails->add($OrderDetail);
     }
     $form = $app['form.factory']->createBuilder('order', $TargetOrder)->getForm();
     if ('POST' === $request->getMethod()) {
         $form->handleRequest($request);
         // 入力情報にもとづいて再計算.
         $this->calculate($app, $TargetOrder);
         if ($form->isValid()) {
             if ('register' === $request->get('mode')) {
                 // 受注日/発送日/入金日の更新.
                 $this->updateDate($TargetOrder, $OriginOrder);
                 // 受注明細で削除されているものをremove
                 foreach ($OriginalOrderDetails as $OrderDetail) {
                     if (false === $TargetOrder->getOrderDetails()->contains($OrderDetail)) {
                         $app['orm.em']->remove($OrderDetail);
                     }
                 }
                 $NewShipimentItems = new ArrayCollection();
                 foreach ($TargetOrder->getOrderDetails() as $OrderDetail) {
                     /** @var $OrderDetail \Eccube\Entity\OrderDetail */
                     $OrderDetail->setOrder($TargetOrder);
                     $NewShipmentItem = new ShipmentItem();
                     $NewShipmentItem->setProduct($OrderDetail->getProduct())->setProductClass($OrderDetail->getProductClass())->setProductName($OrderDetail->getProduct()->getName())->setProductCode($OrderDetail->getProductClass()->getCode())->setClassCategoryName1($OrderDetail->getClassCategoryName1())->setClassCategoryName2($OrderDetail->getClassCategoryName2())->setClassName1($OrderDetail->getClassName1())->setClassName2($OrderDetail->getClassName2())->setPrice($OrderDetail->getPrice())->setQuantity($OrderDetail->getQuantity())->setOrder($TargetOrder);
                     $NewShipimentItems[] = $NewShipmentItem;
                 }
                 // 配送商品の更新. delete/insert.
                 $Shippings = $TargetOrder->getShippings();
                 foreach ($Shippings as $Shipping) {
                     $ShipimentItems = $Shipping->getShipmentItems();
                     foreach ($ShipimentItems as $ShipmentItem) {
                         $app['orm.em']->remove($ShipmentItem);
                     }
                     $ShipimentItems->clear();
                     foreach ($NewShipimentItems as $NewShipimentItem) {
                         $NewShipimentItem->setShipping($Shipping);
                         $ShipimentItems->add($NewShipimentItem);
                     }
                 }
                 $app['orm.em']->persist($TargetOrder);
                 $app['orm.em']->flush();
                 $app->addSuccess('admin.order.save.complete', 'admin');
                 return $app->redirect($app->url('admin_order_edit', array('id' => $TargetOrder->getId())));
             }
         }
     }
     // 会員検索フォーム
     $searchCustomerModalForm = $app['form.factory']->createBuilder('admin_search_customer')->getForm();
     // 商品検索フォーム
     $searchProductModalForm = $app['form.factory']->createBuilder('admin_search_product')->getForm();
     return $app->render('Order/edit.twig', array('form' => $form->createView(), 'searchCustomerModalForm' => $searchCustomerModalForm->createView(), 'searchProductModalForm' => $searchProductModalForm->createView(), 'Order' => $TargetOrder, 'id' => $id));
 }
 /**
  * 複数配送処理
  */
 public function shippingMultiple(Application $app, Request $request)
 {
     $cartService = $app['eccube.service.cart'];
     // カートチェック
     if (!$cartService->isLocked()) {
         // カートが存在しない、カートがロックされていない時はエラー
         return $app->redirect($app->url('cart'));
     }
     // カートチェック
     if (count($cartService->getCart()->getCartItems()) <= 0) {
         // カートが存在しない時はエラー
         return $app->redirect($app->url('cart'));
     }
     $Order = $app['eccube.service.shopping']->getOrder($app['config']['order_processing']);
     if (!$Order) {
         $app->addError('front.shopping.order.error');
         return $app->redirect($app->url('shopping_error'));
     }
     // 複数配送時は商品毎でお届け先を設定する為、商品をまとめた数量を設定
     $compItemQuantities = array();
     foreach ($Order->getShippings() as $Shipping) {
         foreach ($Shipping->getShipmentItems() as $ShipmentItem) {
             $itemId = $ShipmentItem->getProductClass()->getId();
             $quantity = $ShipmentItem->getQuantity();
             if (array_key_exists($itemId, $compItemQuantities)) {
                 $compItemQuantities[$itemId] = $compItemQuantities[$itemId] + $quantity;
             } else {
                 $compItemQuantities[$itemId] = $quantity;
             }
         }
     }
     // 商品に紐づく商品情報を取得
     $shipmentItems = array();
     $productClassIds = array();
     foreach ($Order->getShippings() as $Shipping) {
         foreach ($Shipping->getShipmentItems() as $ShipmentItem) {
             if (!in_array($ShipmentItem->getProductClass()->getId(), $productClassIds)) {
                 $shipmentItems[] = $ShipmentItem;
             }
             $productClassIds[] = $ShipmentItem->getProductClass()->getId();
         }
     }
     $form = $app->form()->getForm();
     $form->add('shipping_multiple', 'collection', array('type' => 'shipping_multiple', 'data' => $shipmentItems, 'allow_add' => true, 'allow_delete' => true));
     $form->handleRequest($request);
     $errors = array();
     if ($form->isSubmitted() && $form->isValid()) {
         $data = $form['shipping_multiple'];
         // 数量が超えていないか、同一でないとエラー
         $itemQuantities = array();
         foreach ($data as $mulitples) {
             /** @var \Eccube\Entity\ShipmentItem $multipleItem */
             $multipleItem = $mulitples->getData();
             foreach ($mulitples as $items) {
                 foreach ($items as $item) {
                     $quantity = $item['quantity']->getData();
                     $itemId = $multipleItem->getProductClass()->getId();
                     if (array_key_exists($itemId, $itemQuantities)) {
                         $itemQuantities[$itemId] = $itemQuantities[$itemId] + $quantity;
                     } else {
                         $itemQuantities[$itemId] = $quantity;
                     }
                 }
             }
         }
         foreach ($compItemQuantities as $key => $value) {
             if (array_key_exists($key, $itemQuantities)) {
                 if ($itemQuantities[$key] != $value) {
                     $errors[] = array('message' => '数量の数が異なっています。');
                     // 対象がなければエラー
                     return $app->render('Shopping/shipping_multiple.twig', array('form' => $form->createView(), 'shipmentItems' => $shipmentItems, 'compItemQuantities' => $compItemQuantities, 'errors' => $errors));
                 }
             }
         }
         // お届け先情報をdelete/insert
         $shippings = $Order->getShippings();
         foreach ($shippings as $Shipping) {
             $Order->removeShipping($Shipping);
             $app['orm.em']->remove($Shipping);
         }
         foreach ($data as $mulitples) {
             /** @var \Eccube\Entity\ShipmentItem $multipleItem */
             $multipleItem = $mulitples->getData();
             foreach ($mulitples as $items) {
                 foreach ($items as $item) {
                     // 追加された配送先情報を作成
                     $Delivery = $multipleItem->getShipping()->getDelivery();
                     // 選択された情報を取得
                     $data = $item['customer_address']->getData();
                     if ($data instanceof CustomerAddress) {
                         // 会員の場合、CustomerAddressオブジェクトを取得
                         $CustomerAddress = $data;
                     } else {
                         // 非会員の場合、選択されたindexが取得される
                         $customerAddresses = $app['session']->get($this->sessionCustomerAddressKey);
                         $customerAddresses = unserialize($customerAddresses);
                         $CustomerAddress = $customerAddresses[$data];
                         $pref = $app['eccube.repository.master.pref']->find($CustomerAddress->getPref()->getId());
                         $CustomerAddress->setPref($pref);
                     }
                     $Shipping = new Shipping();
                     $Shipping->setFromCustomerAddress($CustomerAddress)->setDelivery($Delivery)->setDelFlg(Constant::DISABLED)->setOrder($Order);
                     $app['orm.em']->persist($Shipping);
                     $ProductClass = $multipleItem->getProductClass();
                     $Product = $multipleItem->getProduct();
                     $quantity = $item['quantity']->getData();
                     $ShipmentItem = new ShipmentItem();
                     $ShipmentItem->setShipping($Shipping)->setOrder($Order)->setProductClass($ProductClass)->setProduct($Product)->setProductName($Product->getName())->setProductCode($ProductClass->getCode())->setPrice($ProductClass->getPrice02())->setQuantity($quantity);
                     $ClassCategory1 = $ProductClass->getClassCategory1();
                     if (!is_null($ClassCategory1)) {
                         $ShipmentItem->setClasscategoryName1($ClassCategory1->getName());
                         $ShipmentItem->setClassName1($ClassCategory1->getClassName()->getName());
                     }
                     $ClassCategory2 = $ProductClass->getClassCategory2();
                     if (!is_null($ClassCategory2)) {
                         $ShipmentItem->setClasscategoryName2($ClassCategory2->getName());
                         $ShipmentItem->setClassName2($ClassCategory2->getClassName()->getName());
                     }
                     $Shipping->addShipmentItem($ShipmentItem);
                     $app['orm.em']->persist($ShipmentItem);
                     // 配送料金の設定
                     $app['eccube.service.shopping']->setShippingDeliveryFee($Shipping);
                 }
             }
         }
         // 配送先を更新
         $app['orm.em']->flush();
         return $app->redirect($app->url('shopping'));
     }
     return $app->render('Shopping/shipping_multiple.twig', array('form' => $form->createView(), 'shipmentItems' => $shipmentItems, 'compItemQuantities' => $compItemQuantities, 'errors' => $errors));
 }
Beispiel #6
0
 /**
  * Order オブジェクトを生成して返す.
  *
  * @param \Eccube\Entity\Customer $Customer Customer インスタンス
  * @param array $ProductClasses 明細行となる ProductClass の配列
  * @return \Eccube\Entity\Order
  */
 public function createOrder(Customer $Customer, array $ProductClasses = array())
 {
     $faker = $this->getFaker();
     $quantity = $faker->randomNumber(2);
     $Pref = $this->app['eccube.repository.master.pref']->find(1);
     $Order = new Order($this->app['eccube.repository.order_status']->find($this->app['config']['order_processing']));
     $Order->setCustomer($Customer);
     $Order->copyProperties($Customer);
     $Order->setPref($Pref);
     $this->app['orm.em']->persist($Order);
     $this->app['orm.em']->flush($Order);
     $Delivery = $this->app['eccube.repository.delivery']->find(1);
     $Shipping = new Shipping();
     $Shipping->copyProperties($Customer);
     $Shipping->setPref($Pref)->setDelivery($Delivery);
     $Order->addShipping($Shipping);
     $Shipping->setOrder($Order);
     $this->app['orm.em']->persist($Shipping);
     $this->app['orm.em']->flush($Shipping);
     if (empty($ProductClassess)) {
         $Product = $this->createProduct();
         $ProductClasses = $Product->getProductClasses();
     }
     $subTotal = 0;
     foreach ($ProductClasses as $ProductClass) {
         $Product = $ProductClass->getProduct();
         $OrderDetail = new OrderDetail();
         $TaxRule = $this->app['eccube.repository.tax_rule']->getByRule();
         // デフォルト課税規則
         $OrderDetail->setProduct($Product)->setProductClass($ProductClass)->setProductName($Product->getName())->setProductCode($ProductClass->getCode())->setPrice($ProductClass->getPrice02())->setQuantity($quantity)->setTaxRule($TaxRule->getCalcRule()->getId())->setTaxRate($TaxRule->getTaxRate());
         $this->app['orm.em']->persist($OrderDetail);
         $OrderDetail->setOrder($Order);
         $this->app['orm.em']->flush($OrderDetail);
         $Order->addOrderDetail($OrderDetail);
         $ShipmentItem = new ShipmentItem();
         $ShipmentItem->setShipping($Shipping)->setOrder($Order)->setProductClass($ProductClass)->setProduct($Product)->setProductName($Product->getName())->setProductCode($ProductClass->getCode())->setPrice($ProductClass->getPrice02())->setQuantity($quantity);
         $Shipping->addShipmentItem($ShipmentItem);
         $this->app['orm.em']->persist($ShipmentItem);
         $this->app['orm.em']->flush($ShipmentItem);
         $subTotal += $OrderDetail->getPriceIncTax() * $OrderDetail->getQuantity();
     }
     // TODO 送料, 手数料の加算
     $Order->setSubTotal($subTotal);
     $Order->setTotal($subTotal);
     $Order->setPaymentTotal($subTotal);
     $this->app['orm.em']->flush($Order);
     return $Order;
 }
 /**
  * Order オブジェクトを生成して返す.
  *
  * @param \Eccube\Entity\Customer $Customer Customer インスタンス
  * @return \Eccube\Entity\Order
  */
 public function createOrder(Customer $Customer)
 {
     $faker = $this->getFaker();
     $quantity = $faker->randomNumber(2);
     $Order = new Order();
     $Order->setCustomer($Customer)->setCharge(0)->setDeliveryFeeTotal(0)->setDiscount(0)->setOrderStatus($this->app['eccube.repository.order_status']->find($this->app['config']['order_processing']))->setDelFlg(Constant::DISABLED);
     $Order->copyProperties($Customer);
     $this->app['orm.em']->persist($Order);
     $this->app['orm.em']->flush();
     $Shipping = new Shipping();
     $Shipping->copyProperties($Customer);
     $Order->addShipping($Shipping);
     $Shipping->setOrder($Order);
     $this->app['orm.em']->persist($Shipping);
     $Product = $this->createProduct();
     $ProductClasses = $Product->getProductClasses();
     $ProductClass = $ProductClasses[0];
     $OrderDetail = new OrderDetail();
     $TaxRule = $this->app['eccube.repository.tax_rule']->getByRule();
     // デフォルト課税規則
     $OrderDetail->setProduct($Product)->setProductClass($ProductClass)->setProductName($Product->getName())->setProductCode($ProductClass->getCode())->setPrice($ProductClass->getPrice02())->setQuantity($quantity)->setTaxRule($TaxRule->getCalcRule()->getId())->setTaxRate($TaxRule->getTaxRate());
     $this->app['orm.em']->persist($OrderDetail);
     $OrderDetail->setOrder($Order);
     $Order->addOrderDetail($OrderDetail);
     $ShipmentItem = new ShipmentItem();
     $ShipmentItem->setShipping($Shipping)->setOrder($Order)->setProductClass($ProductClass)->setProduct($Product)->setProductName($Product->getName())->setProductCode($ProductClass->getCode())->setPrice($ProductClass->getPrice02())->setQuantity($quantity);
     $this->app['orm.em']->persist($ShipmentItem);
     $subTotal = $OrderDetail->getPriceIncTax() * $OrderDetail->getQuantity();
     // TODO 送料, 手数料の加算
     $Order->setSubTotal($subTotal);
     $Order->setTotal($subTotal);
     $Order->setPaymentTotal($subTotal);
     $this->app['orm.em']->flush();
     return $Order;
 }
Beispiel #8
0
 /**
  * Order オブジェクトを生成して返す.
  *
  * @param \Eccube\Entity\Customer $Customer Customer インスタンス
  * @param array $ProductClasses 明細行となる ProductClass の配列
  * @param \Eccube\Entity\Delivery $Delivery Delivery インスタンス
  * @param integer $add_charge Order に加算される手数料
  * @param integer $add_discount Order に加算される値引き額
  * @return \Eccube\Entity\Order
  */
 public function createOrder(Customer $Customer, array $ProductClasses = array(), Delivery $Delivery = null, $add_charge = 0, $add_discount = 0, $statusType = null)
 {
     $faker = $this->getFaker();
     $quantity = $faker->randomNumber(2);
     $Pref = $this->app['eccube.repository.master.pref']->find($faker->numberBetween(1, 47));
     $Payments = $this->app['eccube.repository.payment']->findAll();
     if (!$statusType) {
         $statusType = 'order_processing';
     }
     $OrderStatus = $this->app['eccube.repository.order_status']->find($this->app['config'][$statusType]);
     $Order = new Order($OrderStatus);
     $Order->setCustomer($Customer);
     $Order->copyProperties($Customer);
     $Order->setPref($Pref)->setPayment($Payments[$faker->numberBetween(0, count($Payments) - 1)])->setPaymentMethod($Order->getPayment()->getMethod())->setMessage($faker->text())->setNote($faker->text());
     $this->app['orm.em']->persist($Order);
     $this->app['orm.em']->flush($Order);
     if (!is_object($Delivery)) {
         $Delivery = $this->createDelivery();
         foreach ($Payments as $Payment) {
             $PaymentOption = new PaymentOption();
             $PaymentOption->setDeliveryId($Delivery->getId())->setPaymentId($Payment->getId())->setDelivery($Delivery)->setPayment($Payment);
             $Payment->addPaymentOption($PaymentOption);
             $this->app['orm.em']->persist($PaymentOption);
             $this->app['orm.em']->flush($PaymentOption);
         }
         $this->app['orm.em']->flush($Payment);
     }
     $DeliveryFee = $this->app['eccube.repository.delivery_fee']->findOneBy(array('Delivery' => $Delivery, 'Pref' => $Pref));
     $fee = 0;
     if (is_object($DeliveryFee)) {
         $fee = $DeliveryFee->getFee();
     }
     $Shipping = new Shipping();
     $Shipping->copyProperties($Customer);
     $Shipping->setPref($Pref)->setDelivery($Delivery)->setDeliveryFee($DeliveryFee)->setShippingDeliveryFee($fee)->setShippingDeliveryName($Delivery->getName());
     $Order->addShipping($Shipping);
     $Shipping->setOrder($Order);
     $this->app['orm.em']->persist($Shipping);
     $this->app['orm.em']->flush($Shipping);
     if (empty($ProductClasses)) {
         $Product = $this->createProduct();
         $ProductClasses = $Product->getProductClasses();
     }
     foreach ($ProductClasses as $ProductClass) {
         $Product = $ProductClass->getProduct();
         $OrderDetail = new OrderDetail();
         $TaxRule = $this->app['eccube.repository.tax_rule']->getByRule();
         // デフォルト課税規則
         $OrderDetail->setProduct($Product)->setProductClass($ProductClass)->setProductName($Product->getName())->setProductCode($ProductClass->getCode())->setPrice($ProductClass->getPrice02())->setQuantity($quantity)->setTaxRule($TaxRule->getCalcRule()->getId())->setTaxRate($TaxRule->getTaxRate());
         $this->app['orm.em']->persist($OrderDetail);
         $OrderDetail->setOrder($Order);
         $this->app['orm.em']->flush($OrderDetail);
         $Order->addOrderDetail($OrderDetail);
         $ShipmentItem = new ShipmentItem();
         $ShipmentItem->setShipping($Shipping)->setOrder($Order)->setProductClass($ProductClass)->setProduct($Product)->setProductName($Product->getName())->setProductCode($ProductClass->getCode())->setPrice($ProductClass->getPrice02())->setQuantity($quantity);
         $Shipping->addShipmentItem($ShipmentItem);
         $this->app['orm.em']->persist($ShipmentItem);
         $this->app['orm.em']->flush($ShipmentItem);
     }
     $subTotal = $Order->calculateSubTotal();
     // TODO 送料無料条件は考慮していない. 必要であれば Order から再集計すること.
     $Order->setDeliveryFeeTotal($Shipping->getShippingDeliveryFee());
     $Order->setSubTotal($subTotal);
     $Order->setCharge($Order->getCharge() + $add_charge);
     $Order->setDiscount($Order->getDiscount() + $add_discount);
     $total = $Order->getTotalPrice();
     $Order->setTotal($total);
     $Order->setPaymentTotal($total);
     $tax = $Order->calculateTotalTax();
     $Order->setTax($tax);
     $this->app['orm.em']->flush($Order);
     return $Order;
 }