/** * 調出貨請求確認 * * @Route("/backOrder/{id}/confirm", name="order_backOrder_confirm", options={"expose"=true}) * @ParamConverter("move", class="WoojinGoodsBundle:Move") * @Method("GET") */ public function backOrderConfirmAction(Request $request, Move $move) { if (!$move->isModifyble()) { return new \Exception("請求已經為終止狀態,不可更改!"); } $user = $this->get('security.token_storage')->getToken()->getUser(); $session = $this->get('session'); $em = $this->getDoctrine()->getManager(); $qb = $em->createQueryBuilder(); $em->getConnection()->beginTransaction(); try { $oGoodsStatus = $em->find('WoojinGoodsBundle:GoodsStatus', Avenue::GS_OTHERSTORE); $oGoodsStatusIn = $em->find('WoojinGoodsBundle:GoodsStatus', Avenue::GS_ONSALE); // 從調貨請求出抓出被調出的商品 $product = $move->getOrgGoods(); // 將商品狀態設定為他店 $product->setStatus($oGoodsStatus); // 尋找是否已經存在屬於該店的護照(產編字首和商品指紋) $qb->select('gd')->from('WoojinGoodsBundle:GoodsPassport', 'gd')->where($qb->expr()->andX($qb->expr()->eq('SUBSTRING(gd.sn, 1, 1)', $qb->expr()->literal($user->getStore()->getSn())), $qb->expr()->eq('gd.parent', $product->getParent()->getId()))); // Query 結果為調進貨的商品,若不存在該商品則反為 NULL $newProducts = $qb->getQuery()->getResult(); // 如果為空則建立新護照, 直接將原本護照的內容copy到新護照上 if (empty($newProducts)) { $productFactory = $this->get('factory.product'); // 複製調出商品實體 $productFactory->_clone($product); // 從工廠提取複製品 $newProduct = $productFactory->getProduct(); // 改變複製品的產編和狀態(上架) $newProduct->setSn($newProduct->genSn($user->getStore()->getSn()))->setStatus($oGoodsStatusIn); $em->persist($newProduct); $em->flush(); } else { // 若不為空則直接使用取得的舊護照 /* * 商品回國將狀態改為國內( 上架 ), * 寄賣金額改為0 表示不用做二段通知 */ // 取得護照 $newProduct = $newProducts[0]; // 將商品狀態改為上架 $newProduct->setStatus($oGoodsStatusIn); $em->persist($newProduct); // 取得該護照的所有訂單記錄 $newOrders = $newProduct->getOrders(); // 依照訂單記錄進行迭代 foreach ($newOrders as $key => $order) { if (Avenue::OK_FEEDBACK === $order->getId()) { // 將寄賣金額從 -1 改為 0 $order->setPaid(0); $em->persist($order); break; } } } $move->setStatus($em->find('WoojinGoodsBundle:MoveStatus', Avenue::MV_COMPLETE))->setNewGoods($newProduct)->setCatcher($user); $em->persist($move); $complete = $em->find('WoojinOrderBundle:OrdersStatus', Avenue::OS_COMPLETE); $cashType = $em->find('WoojinOrderBundle:PayType', Avenue::PT_CASH); $ordersMoveOut = new Orders(); $ordersMoveOut->setStatus($complete)->setPaid($product->getCost())->setRequired($product->getCost())->setPayType($cashType)->setKind($em->find('WoojinOrderBundle:OrdersKind', Avenue::OK_MOVE_OUT))->setGoodsPassport($product); $ordersMoveIn = new Orders(); $ordersMoveIn->setStatus($complete)->setPaid($product->getCost())->setRequired($product->getCost())->setPayType($cashType)->setKind($em->find('WoojinOrderBundle:OrdersKind', Avenue::OK_MOVE_IN))->setGoodsPassport($newProduct); $ordersMoveIn->addRelate($ordersMoveOut); $ordersMoveOut->setParent($ordersMoveIn); $em->persist($ordersMoveIn); $em->persist($ordersMoveOut); // 記錄調貨進操作記錄 $opeIn = new Ope(); $opeOut = new Ope(); $opeIn->setUser($move->getCatcher())->setDatetime(new \DateTime(date('Y-m-d H:i:s')))->setOrders($ordersMoveIn)->setAct('成立調進貨訂單'); $opeOut->setUser($move->getThrower())->setDatetime(new \DateTime(date('Y-m-d H:i:s')))->setOrders($ordersMoveOut)->setAct('成立調出貨訂單'); $newProduct->setSn($newProduct->genSn($user->getStore()->getSn())); $em->persist($opeIn); $em->persist($opeOut); $em->persist($newProduct); $em->flush(); $em->getConnection()->commit(); $session->getFlashBag()->add('success', $product->getSn() . ' -> ' . $newProduct->getSn()); } catch (Exception $e) { $em->getConnection()->rollback(); throw $e; } // 若已經上傳至yahoo, if ($newProduct->getYahooId()) { $apiClient = $this->get('yahoo.api.client'); $apiClient->updateMain($apiClient->getProvider()->genR($newProduct)->getR()); $session->getFlashBag()->add('success', 'Yahoo商城同步更新完成'); $product->setYahooId(NULL); $em->persist($product); $em->flush(); } else { $session->getFlashBag()->add('error', 'Yahoo商城同步未進行'); } return $this->redirect($this->generateUrl('move')); }
/** * @Route("/v2/getback/{id}", requirements={"id" = "\d+"}, name="orders_v2_getback", options={"expose"=true}) * @ParamConverter("order", class="WoojinOrderBundle:Orders") * @Method("PUT") */ public function v2GetBackAction(Request $request, Orders $order) { $user = $this->get('security.token_storage')->getToken()->getUser(); $em = $this->getDoctrine()->getManager(); $em->getConnection()->beginTransaction(); try { $redirectUrl = $this->generateUrl('goods_edit_v2', array('id' => $order->getProduct()->getId())); $session = $this->get('session'); $cancel = $em->find('WoojinOrderBundle:OrdersStatus', Avenue::OS_CANCEL); $getback = $em->find('WoojinGoodsBundle:GoodsStatus', Avenue::GS_GETBACK); if (Avenue::OK_CONSIGN_IN !== $order->getKind()->getId()) { $session->getFlashBag()->add('error', '此訂單非寄賣訂單!'); return $this->redirect($redirectUrl); } $product = $order->getProduct(); if (in_array($product->getStatus()->getId(), array(Avenue::GS_SOLDOUT, Avenue::GS_OFFSALE, Avenue::GS_BEHALF, Avenue::GS_GETBACK))) { $session->getFlashBag()->add('error', $product->getSn() . '商品不在店內!'); return $this->redirect($redirectUrl); } // 根據商品id和訂單種類找到其關連訂單 $relate = $this->getDoctrine()->getRepository('WoojinOrderBundle:Orders')->findOneBy(array('goods_passport' => $product->getId(), 'kind' => Avenue::OK_FEEDBACK)); // 若沒找到則回應錯誤訊息 if (!$relate) { $session->getFlashBag()->add('error', $product->getSn() . '未找到寄賣請款訂單!'); return $this->redirect($redirectUrl); } $order->setStatus($cancel); $em->persist($order); // 改變關連訂單狀態 $relate->setStatus($cancel); $em->persist($relate); $product->setStatus($getback); $em->persist($product); $em->flush(); $sculper = $this->get('sculper.clue'); $sculper->initCustomGetBack(); $sculper->setAfter($order); $clue = new AvenueClue(); $clue->setUser($user)->setContent($sculper->getContent()); $em->persist($clue); $session->getFlashBag()->add('success', $product->getSn() . '客戶寄賣取回!'); if ($product->getYahooId()) { $apiClient = $this->get('yahoo.api.client'); $apiClient->delete($product); $session->getFlashBag()->add('success', 'Yahoo商城同步下架刪除完成!'); } $opeLogger = $this->get('logger.ope'); $opeLogger->recordOpe($relate, '客寄取回'); $em->getConnection()->commit(); } catch (\Exception $e) { $em->getConnection()->rollback(); throw $e; } return $this->redirect($redirectUrl); }