Example #1
0
 /**
  * @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);
 }
Example #2
0
 /**
  * @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));
 }
Example #3
0
 /**
  * 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)));
 }
Example #4
0
 /**
  * @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);
 }
Example #5
0
 /**
  * @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>');
     }
 }