/** * @Route("/purchase", name="admin_purchase", options={"expose"=true}) * @Method("POST") */ public function purchaseAction(Request $request) { $em = $this->getDoctrine()->getManager(); $em->getConnection()->beginTransaction(); $user = $this->get('security.token_storage')->getToken()->getUser(); if (!is_object($user)) { throw new \Exception('Session timeout'); } $ids = array(); $options = $this->getOptions($request, $em, $user); $options['user'] = $user; $sculper = $this->get('sculper.clue'); $sculper->initPurchaseIn(); $dispatcher = $this->get('event_dispatcher'); $event = new PurchaseEvent($options); $dispatcher->dispatch(StoreEvents::STORE_PURCHASE_IN, $event); $products = $event->getProducts(); try { foreach ($products as $product) { $em->persist($product); } foreach ($event->getOpes() as $ope) { $em->persist($ope); } $em->flush(); foreach ($products as $product) { $product->setSn($product->genSn($user->getStore()->getSn())); } $imgFactory = $this->get('factory.img'); $imgFactory->create(array('file' => $request->files->get('img'), 'products' => $products, 'user' => $user)); if ($img = $imgFactory->getImg()) { $em->persist($img); } $desimgFactory = $this->get('factory.desimg'); $desimgFactory->create(array('file' => $request->files->get('desimg'), 'products' => $products, 'user' => $user)); if ($desimg = $desimgFactory->getDesimg()) { $em->persist($desimg); } foreach ($products as $product) { $product->setSn($product->genSn($user->getStore()->getSn()))->setImg($img)->setDesimg($desimg); $em->persist($product); } foreach ($event->getOrders() as $order) { $clue = new AvenueClue(); $clue->setUser($user)->setContent($sculper->setAfter($order)->getContent()); $em->persist($clue); $em->persist($order); } $em->flush(); $em->getConnection()->commit(); } catch (Exception $e) { $em->getConnection()->rollback(); throw $e; } foreach ($products as $product) { $ids[] = $product->getId(); } return new JsonResponse($ids); }
/** * @Route("/{id}/date", requirements={"id" = "\d+"}, name="update_ope_datetime",options={"expose"=true}) * @ParamConverter("ope", class="WoojinOrderBundle:Ope") * @Method("PUT") * * @ApiDoc( * resource=true, * description="根據傳入的 id 更新指定記錄(ope)", * requirements={{"name"="id", "dataType"="integer", "required"=true, "description"="操作記錄的 id "}}, * statusCodes={ * 200="Returned when successful", * 404={ * "Returned when something else is not found" * }, * 500={ * "Please contact author to fix it" * } * } * ) */ public function updateDateAction(Request $request, Ope $ope) { $em = $this->getDoctrine()->getManager(); $date = $request->request->get('update_at'); $sculper = $this->get('sculper.clue'); $sculper->initModifyOpeDatetime(); $sculper->setBefore($ope); $user = $this->get('security.token_storage')->getToken()->getUser(); $roleId = $user->getTheRoles()->getId(); $ope->setDatetime(new \DateTime($date)); $sculper->setAfter($ope); $clue = new AvenueClue(); $clue->setUser($user)->setContent($sculper->getContent()); $em->persist($clue); $em->persist($ope); $em->flush(); return new JsonResponse(array('status' => 1)); }
/** * Event: * -> emit updateProductEvent * -> paramHandler * -> updateHandler * -> logHandler * -> imgHandler * -> desimgHandler * * GenParamPool, UpdateService, MetaService,ImgService, DesImgService * * @Route("/edit/{id}/v2/update", requirements={"id" = "\d+"}, name="goods_update_v2", options={"expose"=true}) * @ParamConverter("goods", class="WoojinGoodsBundle:GoodsPassport") * @Template() * @Method("POST") */ public function updateV2Action(Request $request, GoodsPassport $goods) { $em = $this->getDoctrine()->getManager(); $em->getConnection()->beginTransaction(); try { /** * 商品成本 * * @var integer */ $cost = (int) $request->request->get('goods_cost', $goods->getCost()); /** * 商品售價 * * @var integer */ $price = (int) $request->request->get('goods_price', $goods->getPrice()); $isPriceDiff = (int) $cost !== (int) $goods->getCost() || (int) $price !== (int) $goods->getPrice(); /** * 目前登入的使用者實體 * * @var \Woojin\UserBundle\Entity\User */ $user = $this->get('security.token_storage')->getToken()->getUser(); if ($isPriceDiff) { $clue = new AvenueClue(); $clue->setUser($user); $sculp = $this->get('sculper.clue'); $sculp->initProductModify()->setBefore($goods); } /** * 目前使用者的所屬店家 * * @var \Woojin\UserBundle\Entity\Store */ $store = $user->getStore(); /** * 貨幣符號 * * @var string */ $sym = $this->get('base_method')->getSymbol(); /** * 產編換算使用位數 * * @var integer */ $minDigit = $sym == 'NT' ? self::SN_RATE : 10; /** * 商品id * * @var integer */ $id = $goods->getId(); /** * 產編是否會有更動 * * @var boolean */ $isSnDiff = $goods->getCost() !== $cost || $goods->getPrice() !== $price; /** * 網路售價 * * @var integer */ $webPrice = $request->request->get('web_price', $goods->getWebPrice()); //$webPrice = ($webPrice > $price) ? $price : $webPrice; //echo $webPrice; exit(); /** * 型號 * * @var string */ $model = $request->request->get('model', $goods->getModel()); /** * 品名 * * @var string */ $name = $request->request->get('goods_name', $goods->getName()); /** * 品牌序號 * * @var string */ $colorSn = $request->request->get('color_sn', $goods->getColorSn()); /** * 自定義品牌內碼 * * @var string */ $customSn = $request->request->get('custom_sn', $goods->getCustomSn()); /** * 品牌序號 * * @var string */ $orgSn = $request->request->get('org_sn', $goods->getOrgSn()); /** * 商品備註 * * @var string */ $memo = $request->request->get('goods_memo', $goods->getMemo()); /** * 進貨時間 * * @var datetime */ $createAt = is_null($goods->getCreatedAt()) ? null : $goods->getCreatedAt()->format('Y-m-d'); /** * 商品新舊實體 * * @var \Woojin\GoodsBundle\Entity\GoodsLevel */ $level = $em->find('WoojinGoodsBundle:GoodsLevel', $request->request->get('level')); /** * 商品材質實體 * * @var \Woojin\GoodsBundle\Entity\GoodsMT */ $mt = $em->find('WoojinGoodsBundle:GoodsMT', $request->request->get('mt')); /** * 商品來源實體 * * @var \Woojin\GoodsBundle\Entity\GoodsSource */ if ($goods->getSource()) { $source = $em->find('WoojinGoodsBundle:GoodsSource', $request->request->get('source', $goods->getSource()->getId())); } else { if (!$request->request->get('source')) { $source = null; } } /** * 顏色實體 * * @var \Woojin\GoodsBundle\Entity\Color */ $color = $em->find('WoojinGoodsBundle:Color', $request->request->get('color')); /** * 款式實體 * * @var \Woojin\GoodsBundle\Entity\Pattern */ $pattern = $em->find('WoojinGoodsBundle:Pattern', $request->request->get('pattern')); /** * 品牌實體 * * @var \Woojin\GoodsBundle\Entity\Brand */ $brand = $em->find('WoojinGoodsBundle:Brand', $request->request->get('brand')); /** * 圖片實體 * * @var \Woojin\GoodsBundle\Entity\Img */ $img = $goods->getImg(); /** * 副圖實體 * * @var \Woojin\GoodsBundle\Entity\Img */ $desimg = $goods->getDesimg(); /** * 是否允許官網上架 * * @var boolean */ $isAllowWeb = $request->request->get('isAllowWeb', null) == 1 ? true : false; /** * 是否允許刷卡付費 * * @var boolean */ $isAllowCreditCard = $request->request->get('isAllowCreditCard', null) == 1 ? true : false; /** * 是否允許競拍 * * @var boolean */ $isAllowAuction = $request->request->get('isAllowAuction', null) == 1 ? true : false; /** * 是否為Alan進貨 * * @var boolean */ $isAlanIn = $request->request->get('isAlanIn', null) == 1 ? true : false; /** * 上傳的圖片檔案 * * @var \Symfony\Component\HttpFoundation\File\UploadedFile */ $files = $request->files->get('img'); /** * 上傳的副圖片檔案 * * @var \Symfony\Component\HttpFoundation\File\UploadedFile */ $desFiles = $request->files->get('desimg'); /** * 商品描述 * @var [text/html] */ $_description = $request->request->get('description', '<p>待補</p>'); if (!($description = $goods->getDescription())) { $description = new Description($_description); $goods->setDescription($description); } $description->setContent($_description); $em->persist($description); /** * 賣點 * @var [string] */ $_brief = trim($request->request->get('brief', '<p>待補</p>')); if (!($brief = $goods->getBrief())) { $brief = new Brief($_brief); $goods->setBrief($brief); } $brief->setContent($_brief); $em->persist($brief); /** * POST 過來的category ids * * @var [array] */ $postCategoryIds = $request->request->get('category', array()); $goodsCategorys = $goods->getCategorys(); $postCategorys = array(); foreach ($goodsCategorys as $category) { if (!in_array($category->getId(), $postCategoryIds)) { $goods->removeCategory($category); } } if (!empty($postCategoryIds)) { $qb = $em->createQueryBuilder(); $postCategorys = $qb->select('c')->from('WoojinGoodsBundle:Category', 'c')->where($qb->expr()->in('c.id', $postCategoryIds))->getQuery()->getResult(); } foreach ($postCategorys as $category) { if (!$goods->hasCategory($category)) { $goods->addCategory($category); } } $isDiffMoney = false; if ($price != $goods->getPrice() || $cost != $goods->getCost()) { $isDiffMoney = true; } // 更改商品屬性 $goods->setSeoSlogan($em->find('WoojinGoodsBundle:SeoSlogan', $request->request->get('seoSlogan_id')))->setSeoSlogan2($em->find('WoojinGoodsBundle:SeoSlogan', $request->request->get('seoSlogan2_id')))->setSeoWord($request->request->get('seoWord'))->setColor($color)->setPattern($pattern)->setColorSn($colorSn)->setCustomSn($customSn)->setModel($model)->setBrand($brand)->setLevel($level)->setSource($source)->setName($name)->setOrgSn($orgSn)->setCost($cost)->setPrice($price)->setMt($mt)->setCreatedAt(new \DateTime($createAt))->setMemo($memo)->setIsAllowWeb($isAllowWeb)->setIsAllowCreditCard($isAllowCreditCard)->setWebPrice($webPrice); if (in_array($goods->getStatus()->getId(), array(constant('Woojin\\Utility\\Avenue\\Avenue::GS_ONSALE'), constant('Woojin\\Utility\\Avenue\\Avenue::GS_ACTIVITY')))) { $goods->setIsAllowAuction($isAllowAuction)->setIsAlanIn($isAlanIn)->setBsoCustomPercentage($request->request->get('bso_custom_percentage', Auction::DEFAULT_CUSTOM_PERCENTAGE)); } /** * 商品產編 * * @var string */ $sn = $goods->genSn(substr($goods->getSn(), 0, 1)); if ($isDiffMoney) { $goods->setSn($sn); } /** * 商品變更記錄儲存 * * @var [object] */ $metaRecorder = $this->get('my_meta_record_method'); $metaRecorder->recordMeta($this->createGoodsUpdateMsg($goods, $sn, $cost, $price, $model, $createAt)); $rootDir = $request->server->get('DOCUMENT_ROOT'); $sepDir = $goods->getImgRelDir($user); $comDir = $rootDir . $sepDir; //--- 圖片路徑更動 ---// if (!is_dir($comDir)) { mkdir($comDir, 0777, true); } //--- 新的圖片蓋掉舊的圖片 ---// // 如果有上傳主圖 if (is_object($files)) { /** * 根據上傳檔案取得圖片名稱 * * @var string */ $fileName = $goods->getImgName($files); /** * 存放的圖片路徑 * * @var string */ $srcPath = $sepDir . '/' . $fileName; /** * 如果原本沒有圖片,新增一個圖片實體 */ if (!$img) { $goods->setImg($img = new Img()); $inherits = $goods->getInherits(); foreach ($inherits as $inherit) { $inherit->setImg($img); $em->persist($inherit); } if ($files->move($comDir, $fileName)) { $img->setPath($srcPath); $em->persist($img); } } else { if (file_exists($request->server->get('DOCUMENT_ROOT') . $img->getPath())) { unlink($request->server->get('DOCUMENT_ROOT') . $img->getPath()); $files->move($request->server->get('DOCUMENT_ROOT') . $img->getPurePath(), $img->getName()); } else { if ($files->move($comDir, $fileName)) { $img->setPath($srcPath); $em->persist($img); } } } $imgFactory = $this->get('factory.img'); $imgFactory->createRemoveBorder($img); } if (is_object($desFiles)) { $fileName = $goods->getImgName($desFiles, 'des'); $srcPath = $sepDir . '/' . $fileName; if (!$desimg) { $goods->setDesimg($desimg = new Desimg()); $inherits = $goods->getInherits(); foreach ($inherits as $inherit) { $inherit->setDesimg($desimg); $em->persist($inherit); } if ($desFiles->move($comDir, $fileName)) { $desimg->setPath($srcPath); $em->persist($desimg); } } else { if (file_exists($request->server->get('DOCUMENT_ROOT') . $desimg->getPath())) { unlink($request->server->get('DOCUMENT_ROOT') . $desimg->getPath()); $desFiles->move($request->server->get('DOCUMENT_ROOT') . $desimg->getPurePath(), $desimg->getName()); } else { if ($desFiles->move($comDir, $fileName)) { $desimg->setPath($srcPath); $em->persist($desimg); } } } } //--- End 新的圖片蓋掉舊的圖片 ---// if ($isPriceDiff) { $sculp->setAfter($goods); $clue->setContent($sculp->getContent()); $em->persist($clue); } $em->persist($goods); $em->flush(); $em->getConnection()->commit(); } catch (Exception $e) { $em->getConnection()->rollback(); throw $e; } // 若產編有更動,同步更新yahoo商城資訊 if ($isSnDiff && $goods->getYahooId()) { $apiClient = $this->get('yahoo.api.client'); $apiClient->updateMain($apiClient->getProvider()->genR($goods)->getR($goods)); } $this->get('passport.syncer')->sync($goods); return $this->redirect($this->generateUrl('goods_edit_v2', array('id' => $id))); }
/** * @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); }
/** * @Route("/multisale/sell", name="order_multisale_sell", options={"expose"=true}) */ public function orderMultieSell(Request $request) { foreach ($request->request->keys() as $key) { ${$key} = $request->request->get($key); } $successProducts = array(); $user = $this->get('security.token_storage')->getToken()->getUser(); $opeLogger = $this->get('logger.ope'); $dc = $this->getDoctrine(); $em = $dc->getManager(); $em->getConnection()->beginTransaction(); try { // 訂單id陣列 $rRollback = array(); // 金額總計 $nTotal = 0; // 回傳產編字串 $returnSn = ''; // 取得付款方式 $paytype = $em->find('WoojinOrderBundle:PayType', $nPayTypeId); // 根據付款方式取得折扣 $nDisRate = $paytype->getDiscount(); // 取得訂單狀態 $orderKind = $em->find('WoojinOrderBundle:OrdersKind', $nOrdersKindId); // 取得商品狀態 $productStatus = $em->find('WoojinGoodsBundle:GoodsStatus', Avenue::GS_SOLDOUT); // 取得客戶 $oCustom = $dc->getRepository('WoojinOrderBundle:Custom')->findOneBy(array('mobil' => $mobil == '' ? '00000' : $mobil, 'store' => $user->getStore()->getId())); // 若找尋的客戶不存在, 回覆錯誤訊息 if (!is_object($oCustom)) { return new Response('<div class="alert alert-block alert-danger fade in"> <button type="button" class="close" data-dismiss="alert">×</button> <h4 class="alert-heading">手機號碼不存在</h4> </div>'); } // 檢查有無傳入資料 if (!isset($rId)) { return new Response('<div class="alert alert-block alert-danger fade in"> <button type="button" class="close" data-dismiss="alert">×</button> <h4 class="alert-heading">無傳入資料</h4> </div>'); } if (!is_array($rId)) { return new Response('<div class="alert alert-block alert-danger fade in"> <button type="button" class="close" data-dismiss="alert">×</button> <h4 class="alert-heading">無傳入資料</h4> </div>'); } // 移除重複的id $rId = array_unique($rId); /** * 新增一張發票 * * @var Invoice */ $invoice = new Invoice(); $invoice->setHasPrint(false)->setSn(md5(time())); $em->persist($invoice); // 根據傳入的 rId 迭代 foreach ($rId as $key => $id) { // 取得商品 $product = $dc->getRepository('WoojinGoodsBundle:GoodsPassport')->find($id); if ($product->getStatus()->getId() != Avenue::GS_ONSALE) { continue; } // 更新商品狀態 $product->setStatus($productStatus); $em->persist($product); // 計算折扣後的應付金額 $nOrdersRequired = $rOrdersRequired[$key] * $nDisRate; // 根據應付金額與實付金額決定訂單狀態 $nOrdersStatusId = $nOrdersRequired - $rOrdersRequired[$key] != 0 ? Avenue::OS_HANDLING : Avenue::OS_COMPLETE; $orderStatus = $em->find('WoojinOrderBundle:OrdersStatus', $nOrdersStatusId); // 成立新的訂單 $order = new Orders(); // 設定新的訂單資料 $order->setGoodsPassport($product)->setCustom($oCustom)->setPayType($paytype)->setKind($orderKind)->setStatus($orderStatus)->setRequired($nOrdersRequired)->setPaid($nOrdersRequired)->setOrgRequired($nOrdersRequired)->setOrgPaid($nOrdersRequired)->setInvoice($invoice); $em->persist($order); $nTotal += $nOrdersRequired; $opeLogger->log($order, $user, $paytype, $nOrdersRequired, '成立' . $orderKind->getName() . '訂單[' . $rOrdersRequired[$key] . '元][' . $paytype->getName() . ']'); $em->persist($opeLogger->getOpe()); $sculper->setAfter($opeLogger->getOpe()); $clue = new AvenueClue(); $clue->setUser($user)->setContent($sculper->getContent()); $em->persist($clue); $em->flush(); // 存入rollback陣列 array_push($rRollback, $order->getId()); if ($product->getYahooId()) { $successProducts[] = $product; } $returnSn .= "<a href=\"" . $this->get('router')->generate('goods_edit_v2', array('id' => $product->getId())) . "?iframe=true&width=100%&height=100%\" rel=\"prettyPhoto[iframes]\">" . $rGoodsSn[$key] . ($product->getColor() ? $product->getColor()->getName() : '') . '</a>,'; } // Yahoo同步刪除 if (!empty($successProducts)) { $adapter = $this->get('yahoo.syncer'); $adapter->delete($successProducts); } $em->getConnection()->commit(); } catch (Exception $e) { $em->getConnection()->rollback(); throw $e; } if (empty($returnSn)) { return new Response('<div class="alert alert-block alert-warning fade in"> <button type="button" class="close" data-dismiss="alert">×</button> <h4 class="alert-heading">此次操作無任何商品結帳完成</h4></div>'); } else { return new Response('<div class="alert alert-block alert-success fade in"> <button type="button" class="close" data-dismiss="alert">×</button> <h4 class="alert-heading">' . substr($returnSn, 0, -1) . '結帳完成, 合計' . $nTotal . '元</h4> <a class="btn btn-primary" href="' . $this->get('router')->generate('invoice_print', array('id' => $invoice->getId(), 'page' => 1)) . '" target="_blank">銷貨單列印</a><button type="button" class="rollback btn btn-inverse" data-roll="' . json_encode($rRollback) . '">取消販售</button></div>'); } }