Helper
[ class tree: Helper ] [ index: Helper ] [ all elements ]

Source for file SC_Helper_Purchase.php

Documentation is available at SC_Helper_Purchase.php

  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.lockon.co.jp/
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License
  11.  * as published by the Free Software Foundation; either version 2
  12.  * of the License, or (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  22.  */
  23.  
  24. /**
  25.  * 商品購入関連のヘルパークラス.
  26.  *
  27.  * TODO 購入時強制会員登録機能(#521)の実装を検討
  28.  * TODO dtb_customer.buy_times, dtb_customer.buy_total の更新
  29.  *
  30.  * @package Helper
  31.  * @author Kentaro Ohkouchi
  32.  * @version $Id: SC_Helper_Purchase.php 21303 2011-10-28 10:01:24Z shutta $
  33.  */
  34.  
  35.     /**
  36.      * 受注を完了する.
  37.      *
  38.      * 下記のフローで受注を完了する.
  39.      *
  40.      * 1. トランザクションを開始する
  41.      * 2. カートの内容を検証する.
  42.      * 3. 受注一時テーブルから受注データを読み込む
  43.      * 4. ユーザーがログインしている場合はその他の発送先へ登録する
  44.      * 5. 受注データを受注テーブルへ登録する
  45.      * 6. トランザクションをコミットする
  46.      *
  47.      * 実行中に, 何らかのエラーが発生した場合, 処理を中止しエラーページへ遷移する
  48.      *
  49.      * 決済モジュールを使用する場合は対応状況を「決済処理中」に設定し,
  50.      * 決済完了後「新規受付」に変更すること
  51.      *
  52.      * @param integer $orderStatus 受注処理を完了する際に設定する対応状況
  53.      * @return void 
  54.      */
  55.     function completeOrder($orderStatus ORDER_NEW{
  56.         $objQuery =SC_Query_Ex::getSingletonInstance();
  57.         $objSiteSession new SC_SiteSession_Ex();
  58.         $objCartSession new SC_CartSession_Ex();
  59.         $objCustomer new SC_Customer_Ex();
  60.         $customerId $objCustomer->getValue('customer_id');
  61.  
  62.         $objQuery->begin();
  63.         if (!$objSiteSession->isPrePage()) {
  64.             SC_Utils_Ex::sfDispSiteError(PAGE_ERROR$objSiteSession);
  65.         }
  66.  
  67.         $uniqId $objSiteSession->getUniqId();
  68.         $this->verifyChangeCart($uniqId$objCartSession);
  69.  
  70.         $orderTemp $this->getOrderTemp($uniqId);
  71.  
  72.         $orderTemp['status'$orderStatus;
  73.         $cartkey $objCartSession->getKey();
  74.         $orderId $this->registerOrderComplete($orderTemp$objCartSession,
  75.                                                 $cartkey);
  76.         $isMultiple SC_Helper_Purchase::isMultiple();
  77.         $shippingTemp =$this->getShippingTemp$isMultiple );
  78.         foreach ($shippingTemp as $shippingId => $val{
  79.             $this->registerShipmentItem($orderId$shippingId,
  80.                                         $val['shipment_item']);
  81.         }
  82.  
  83.         $this->registerShipping($orderId$shippingTemp);
  84.         $objQuery->commit();
  85.  
  86.         //会員情報の最終購入日、購入合計を更新
  87.         if($customerId 0){
  88.             SC_Customer_Ex::updateOrderSummary($customerId);
  89.         }
  90.  
  91.         $this->cleanupSession($orderId$objCartSession$objCustomer$cartkey);
  92.  
  93.         GC_Utils_Ex::gfFrontLog("order complete. customerId=" $customerId);
  94.  
  95.     }
  96.  
  97.     /**
  98.      * 受注をキャンセルする.
  99.      *
  100.      * 受注完了後の受注をキャンセルする.
  101.      * この関数は, 主に決済モジュールにて, 受注をキャンセルする場合に使用する.
  102.      *
  103.      * 対応状況を引数 $orderStatus で指定した値に変更する.
  104.      * (デフォルト ORDER_CANCEL)
  105.      * 引数 $is_delete が true の場合は, 受注データを論理削除する.
  106.      * 商品の在庫数は, 受注前の在庫数に戻される.
  107.      *
  108.      * @param integer $order_id 受注ID
  109.      * @param integer $orderStatus 対応状況
  110.      * @param boolean $is_delete 受注データを論理削除する場合 true
  111.      * @return void 
  112.      */
  113.     function cancelOrder($order_id$orderStatus ORDER_CANCEL$is_delete false{
  114.         $objQuery =SC_Query_Ex::getSingletonInstance();
  115.         $in_transaction $objQuery->inTransaction();
  116.         if (!$in_transaction{
  117.             $objQuery->begin();
  118.         }
  119.  
  120.         $arrParams['status'$orderStatus;
  121.         if ($is_delete{
  122.             $arrParams['del_flg'1;
  123.         }
  124.  
  125.         $this->registerOrder($order_id$arrParams);
  126.  
  127.         $arrOrderDetail $this->getOrderDetail($order_id);
  128.         foreach ($arrOrderDetail as $arrDetail{
  129.             $objQuery->update('dtb_products_class'array(),
  130.                               "product_class_id = ?"array($arrDetail['product_class_id']),
  131.                               array('stock' => 'stock + ?')array($arrDetail['quantity']));
  132.         }
  133.         if (!$in_transaction{
  134.             $objQuery->commit();
  135.         }
  136.     }
  137.  
  138.     /**
  139.      * 受注をキャンセルし, カートをロールバックして, 受注一時IDを返す.
  140.      *
  141.      * 受注完了後の受注をキャンセルし, カートの状態を受注前の状態へ戻す.
  142.      * この関数は, 主に, 決済モジュールに遷移した後, 購入確認画面へ戻る場合に使用する.
  143.      *
  144.      * 対応状況を引数 $orderStatus で指定した値に変更する.
  145.      * (デフォルト ORDER_CANCEL)
  146.      * 引数 $is_delete が true の場合は, 受注データを論理削除する.
  147.      * 商品の在庫数, カートの内容は受注前の状態に戻される.
  148.      *
  149.      * @param integer $order_id 受注ID
  150.      * @param integer $orderStatus 対応状況
  151.      * @param boolean $is_delete 受注データを論理削除する場合 true
  152.      * @return string 受注一時ID
  153.      */
  154.     function rollbackOrder($order_id$orderStatus ORDER_CANCEL$is_delete false{
  155.         $objQuery =SC_Query_Ex::getSingletonInstance();
  156.         $in_transaction $objQuery->inTransaction();
  157.         if (!$in_transaction{
  158.             $objQuery->begin();
  159.         }
  160.  
  161.         $this->cancelOrder($order_id$orderStatus$is_delete);
  162.         $arrOrderTemp $this->getOrderTempByOrderId($order_id);
  163.         $_SESSION array_merge($_SESSIONunserialize($arrOrderTemp['session']));
  164.  
  165.         $objSiteSession new SC_SiteSession_Ex();
  166.         $objCartSession new SC_CartSession_Ex();
  167.         $objCustomer new SC_Customer_Ex();
  168.  
  169.         // 新たに受注一時情報を保存する
  170.         $objSiteSession->unsetUniqId();
  171.         $uniqid $objSiteSession->getUniqId();
  172.         $arrOrderTemp['del_flg'0;
  173.         $this->saveOrderTemp($uniqid$arrOrderTemp$objCustomer);
  174.         $this->verifyChangeCart($uniqid$objCartSession);
  175.         $objSiteSession->setRegistFlag();
  176.  
  177.         if (!$in_transaction{
  178.             $objQuery->commit();
  179.         }
  180.         return $uniqid;
  181.     }
  182.  
  183.     /**
  184.      * カートに変化が無いか検証する.
  185.      *
  186.      * ユニークIDとセッションのユニークIDを比較し, 異なる場合は
  187.      * エラー画面を表示する.
  188.      *
  189.      * カートが空の場合, 購入ボタン押下後にカートが変更された場合は
  190.      * カート画面へ遷移する.
  191.      *
  192.      * @param string $uniqId ユニークID
  193.      * @param SC_CartSession $objCartSession 
  194.      * @return void 
  195.      */
  196.     function verifyChangeCart($uniqId&$objCartSession{
  197.         $cartKeys $objCartSession->getKeys();
  198.  
  199.         // カート内が空でないか
  200.         if (SC_Utils_Ex::isBlank($cartKeys)) {
  201.             SC_Response_Ex::sendRedirect(CART_URLPATH);
  202.             exit;
  203.         }
  204.  
  205.         foreach ($cartKeys as $cartKey{
  206.             // 初回のみカートの内容を保存
  207.             $objCartSession->saveCurrentCart($uniqId$cartKey);
  208.  
  209.             /*
  210.              * POSTのユニークIDとセッションのユニークIDを比較
  211.              *(ユニークIDがPOSTされていない場合はスルー)
  212.              */
  213.             if(!SC_SiteSession_Ex::checkUniqId()) {
  214.                 SC_Utils_Ex::sfDispSiteError(CANCEL_PURCHASE);
  215.                 exit;
  216.             }
  217.  
  218.             // 購入ボタンを押してから変化がないか
  219.             $quantity $objCartSession->getTotalQuantity($cartKey);
  220.             if($objCartSession->checkChangeCart($cartKey|| !($quantity 0)) {
  221.                 SC_Response_Ex::sendRedirect(CART_URLPATH);
  222.                 exit;
  223.             }
  224.         }
  225.     }
  226.  
  227.     /**
  228.      * 受注一時情報を取得する.
  229.      *
  230.      * @param integer $uniqId 受注一時情報ID
  231.      * @return array 受注一時情報の配列
  232.      */
  233.     function getOrderTemp($uniqId{
  234.         $objQuery =SC_Query_Ex::getSingletonInstance();
  235.         return $objQuery->getRow("*""dtb_order_temp""order_temp_id = ?",
  236.                                  array($uniqId));
  237.     }
  238.  
  239.     /**
  240.      * 受注IDをキーにして受注一時情報を取得する.
  241.      *
  242.      * @param integer $order_id 受注ID
  243.      * @return array 受注一時情報の配列
  244.      */
  245.     function getOrderTempByOrderId($order_id{
  246.         $objQuery =SC_Query_Ex::getSingletonInstance();
  247.         return $objQuery->getRow("*""dtb_order_temp""order_id = ?",
  248.                                  array($order_id));
  249.     }
  250.  
  251.     /**
  252.      * 受注一時情報を保存する.
  253.      *
  254.      * 既存のデータが存在しない場合は新規保存. 存在する場合は更新する.
  255.      * 既存のデータが存在せず, ユーザーがログインしている場合は,
  256.      * 会員情報をコピーする.
  257.      *
  258.      * @param integer $uniqId 受注一時情報ID
  259.      * @param array $params 登録する受注情報の配列
  260.      * @param SC_Customer $objCustomer SC_Customer インスタンス
  261.      * @return array void
  262.      */
  263.     function saveOrderTemp($uniqId$params&$objCustomer{
  264.         if (SC_Utils_Ex::isBlank($uniqId)) {
  265.             return;
  266.         }
  267.         $params['device_type_id'SC_Display_Ex::detectDevice();
  268.         $objQuery =SC_Query_Ex::getSingletonInstance();
  269.         // 存在するカラムのみを対象とする
  270.         $cols $objQuery->listTableFields('dtb_order_temp');
  271.         foreach ($params as $key => $val{
  272.             if (in_array($key$cols)) {
  273.                 $sqlval[$key$val;
  274.             }
  275.         }
  276.  
  277.         $sqlval['session'serialize($_SESSION);
  278.         $exists $this->getOrderTemp($uniqId);
  279.         if (SC_Utils_Ex::isBlank($exists)) {
  280.             $this->copyFromCustomer($sqlval$objCustomer);
  281.             $sqlval['order_temp_id'$uniqId;
  282.             $sqlval['create_date''CURRENT_TIMESTAMP';
  283.             $objQuery->insert("dtb_order_temp"$sqlval);
  284.         else {
  285.             $objQuery->update("dtb_order_temp"$sqlval'order_temp_id = ?',
  286.                               array($uniqId));
  287.         }
  288.     }
  289.  
  290.     /**
  291.      * 配送情報をセッションから取得する.
  292.      *
  293.      * @param bool $has_shipment_item 配送商品を保有している配送先のみ返す。
  294.      */
  295.     function getShippingTemp($has_shipment_item{
  296.         if ($has_shipment_item{
  297.             $arrReturn array();
  298.             foreach ($_SESSION['shipping'as $key => $arrVal{
  299.                 if (count($arrVal['shipment_item']== 0continue;
  300.                 $arrReturn[$key$arrVal;
  301.             }
  302.             return $arrReturn;
  303.         }
  304.  
  305.         return $_SESSION['shipping'];
  306.     }
  307.  
  308.     /**
  309.      * 配送商品をクリア(消去)する
  310.      *
  311.      * @param integer $shipping_id 配送先ID
  312.      * @return void 
  313.      */
  314.     function clearShipmentItemTemp($shipping_id null{
  315.         if (is_null($shipping_id)) {
  316.             unset($_SESSION['shipping']);
  317.         else {
  318.             unset($_SESSION['shipping'][$shipping_id]);
  319.         }
  320.     }
  321.  
  322.     /**
  323.      * 配送商品を設定する.
  324.      *
  325.      * @param integer $shipping_id 配送先ID
  326.      * @param integer $product_class_id 商品規格ID
  327.      * @param integer $quantity 数量
  328.      * @return void 
  329.      */
  330.     function setShipmentItemTemp($shipping_id$product_class_id$quantity{
  331.         // 配列が長くなるので, リファレンスを使用する
  332.         $arrItems =$_SESSION['shipping'][$shipping_id]['shipment_item'][$product_class_id];
  333.  
  334.         $arrItems['shipping_id'$shipping_id;
  335.         $arrItems['product_class_id'$product_class_id;
  336.         $arrItems['quantity'$quantity;
  337.  
  338.         $objProduct new SC_Product_Ex();
  339.  
  340.         // カート情報から読みこめば済むと思うが、一旦保留。むしろ、カート情報も含め、セッション情報を縮小すべきかもしれない。
  341.         /*
  342.         $objCartSession = new SC_CartSession_Ex();
  343.         $cartKey = $objCartSession->getKey();
  344.         // 詳細情報を取得
  345.         $cartItems = $objCartSession->getCartList($cartKey);
  346.         */
  347.  
  348.         if (empty($arrItems['productsClass'])) {
  349.             $product =$objProduct->getDetailAndProductsClass($product_class_id);
  350.             $arrItems['productsClass'$product;
  351.         }
  352.         $arrItems['price'$arrItems['productsClass']['price02'];
  353.         $inctax SC_Helper_DB_Ex::sfCalcIncTax($arrItems['price']);
  354.         $arrItems['total_inctax'$inctax $arrItems['quantity'];
  355.     }
  356.  
  357.     /**
  358.      * 配送先都道府県の配列を返す.
  359.      */
  360.     function getShippingPref($is_multiple{
  361.         $results array();
  362.         foreach (SC_Helper_Purchase_Ex::getShippingTemp($is_multipleas $val{
  363.             $results[$val['shipping_pref'];
  364.         }
  365.         return $results;
  366.     }
  367.  
  368.     /**
  369.      * 複数配送指定の購入かどうか.
  370.      *
  371.      * @return boolean 複数配送指定の購入の場合 true
  372.      */
  373.     function isMultiple({
  374.         return count(SC_Helper_Purchase_Ex::getShippingTemp(true)) >= 1;
  375.     }
  376.  
  377.     /**
  378.      * 配送情報をセッションに保存する.
  379.      *
  380.      * @param array $arrSrc 配送情報の連想配列
  381.      * @param integer $shipping_id 配送先ID
  382.      * @return void 
  383.      */
  384.     function saveShippingTemp($arrSrc$shipping_id 0{
  385.         // 配送商品は引き継がない
  386.         unset($arrSrc['shipment_item']);
  387.  
  388.         if (empty($_SESSION['shipping'][$shipping_id])) {
  389.             $_SESSION['shipping'][$shipping_id$arrSrc;
  390.             $_SESSION['shipping'][$shipping_id]['shipping_id'$shipping_id;
  391.         else {
  392.             $_SESSION['shipping'][$shipping_idarray_merge($_SESSION['shipping'][$shipping_id]$arrSrc);
  393.             $_SESSION['shipping'][$shipping_id]['shipping_id'$shipping_id;
  394.         }
  395.     }
  396.  
  397.     /**
  398.      * セッションの配送情報を破棄する.
  399.      */
  400.     function unsetShippingTemp({
  401.         unset($_SESSION['shipping']);
  402.         unset($_SESSION['multiple_temp']);
  403.     }
  404.  
  405.     /**
  406.      * 会員情報を受注情報にコピーする.
  407.      *
  408.      * ユーザーがログインしていない場合は何もしない.
  409.      * 会員情報を $dest の order_* へコピーする.
  410.      * customer_id は強制的にコピーされる.
  411.      *
  412.      * @param array $dest コピー先の配列
  413.      * @param SC_Customer $objCustomer SC_Customer インスタンス
  414.      * @param string $prefix コピー先の接頭辞. デフォルト order
  415.      * @param array $keys コピー対象のキー
  416.      * @return void 
  417.      */
  418.     function copyFromCustomer(&$dest&$objCustomer$prefix 'order',
  419.                               $keys array('name01''name02''kana01''kana02',
  420.                                             'sex''zip01''zip02''pref',
  421.                                             'addr01''addr02',
  422.                                             'tel01''tel02''tel03''job',
  423.                                             'birth''email')) {
  424.         if ($objCustomer->isLoginSuccess(true)) {
  425.  
  426.             foreach ($keys as $key{
  427.                 if (in_array($key$keys)) {
  428.                     $dest[$prefix '_' $key$objCustomer->getValue($key);
  429.                 }
  430.             }
  431.  
  432.             if ((SC_Display_Ex::detectDevice(== DEVICE_TYPE_MOBILE)
  433.                 && in_array('email'$keys)
  434.             {
  435.                 $email_mobile $objCustomer->getValue('email_mobile');
  436.                 if (empty($email_mobile)) {
  437.                     $dest[$prefix '_email'$objCustomer->getValue('email');
  438.                 else {
  439.                     $dest[$prefix '_email'$email_mobile;
  440.                 }
  441.             }
  442.  
  443.             $dest['customer_id'$objCustomer->getValue('customer_id');
  444.             $dest['update_date''CURRENT_TIMESTAMP';
  445.         }
  446.     }
  447.  
  448.     /**
  449.      * 受注情報を配送情報にコピーする.
  450.      *
  451.      * 受注情報($src)を $dest の order_* へコピーする.
  452.      *
  453.      * TODO 汎用的にして SC_Utils へ移動
  454.      *
  455.      * @param array $dest コピー先の配列
  456.      * @param array $src コピー元の配列
  457.      * @param array $keys コピー対象のキー
  458.      * @param string $prefix コピー先の接頭辞. デフォルト shipping
  459.      * @param string $src_prefix コピー元の接頭辞. デフォルト order
  460.      * @return void 
  461.      */
  462.     function copyFromOrder(&$dest$src,
  463.                            $prefix 'shipping'$src_prefix 'order',
  464.                            $keys array('name01''name02''kana01''kana02',
  465.                                          'sex''zip01''zip02''pref',
  466.                                          'addr01''addr02',
  467.                                          'tel01''tel02''tel03')) {
  468.         if (!SC_Utils_Ex::isBlank($prefix)) {
  469.             $prefix $prefix '_';
  470.         }
  471.         if (!SC_Utils_Ex::isBlank($src_prefix)) {
  472.             $src_prefix $src_prefix '_';
  473.         }
  474.         foreach ($keys as $key{
  475.             if (in_array($key$keys)) {
  476.                 $dest[$prefix $key$src[$src_prefix $key];
  477.             }
  478.         }
  479.     }
  480.  
  481.     /**
  482.      * 購入金額に応じた支払方法を取得する.
  483.      *
  484.      * @param integer $total 購入金額
  485.      * @param integer $deliv_id 配送業者ID
  486.      * @return array 購入金額に応じた支払方法の配列
  487.      */
  488.     function getPaymentsByPrice($total$deliv_id{
  489.  
  490.         $arrPaymentIds $this->getPayments($deliv_id);
  491.         if (SC_Utils_Ex::isBlank($arrPaymentIds)) {
  492.             return array();
  493.         }
  494.  
  495.         $objQuery =SC_Query_Ex::getSingletonInstance();
  496.  
  497.         // 削除されていない支払方法を取得
  498.         $where 'del_flg = 0 AND payment_id IN (' implode(', 'array_pad(array()count($arrPaymentIds)'?')) ')';
  499.         $objQuery->setOrder("rank DESC");
  500.         $payments $objQuery->select("payment_id, payment_method, rule, upper_rule, note, payment_image, charge""dtb_payment"$where$arrPaymentIds);
  501.         foreach ($payments as $data{
  502.             // 下限と上限が設定されている
  503.             if (strlen($data['rule']!= && strlen($data['upper_rule']!= 0{
  504.                 if ($data['rule'<= $total && $data['upper_rule'>= $total{
  505.                     $arrPayment[$data;
  506.                 }
  507.             }
  508.             // 下限のみ設定されている
  509.             elseif (strlen($data['rule']!= 0{
  510.                 if($data['rule'<= $total{
  511.                     $arrPayment[$data;
  512.                 }
  513.             }
  514.             // 上限のみ設定されている
  515.             elseif (strlen($data['upper_rule']!= 0{
  516.                 if($data['upper_rule'>= $total{
  517.                     $arrPayment[$data;
  518.                 }
  519.             }
  520.             // いずれも設定なし
  521.             else {
  522.                 $arrPayment[$data;
  523.             }
  524.           }
  525.         return $arrPayment;
  526.     }
  527.  
  528.     /**
  529.      * お届け日一覧を取得する.
  530.      */
  531.     function getDelivDate(&$objCartSess$productTypeId{
  532.         $cartList $objCartSess->getCartList($productTypeId);
  533.         $delivDateIds array();
  534.         foreach ($cartList as $item{
  535.             $delivDateIds[$item['productsClass']['deliv_date_id'];
  536.         }
  537.         $max_date max($delivDateIds);
  538.         //発送目安
  539.         switch($max_date{
  540.         //即日発送
  541.         case '1':
  542.             $start_day 1;
  543.             break;
  544.             //1-2日後
  545.         case '2':
  546.             $start_day 3;
  547.             break;
  548.             //3-4日後
  549.         case '3':
  550.             $start_day 5;
  551.             break;
  552.             //1週間以内
  553.         case '4':
  554.             $start_day 8;
  555.             break;
  556.             //2週間以内
  557.         case '5':
  558.             $start_day 15;
  559.             break;
  560.             //3週間以内
  561.         case '6':
  562.             $start_day 22;
  563.             break;
  564.             //1ヶ月以内
  565.         case '7':
  566.             $start_day 32;
  567.             break;
  568.             //2ヶ月以降
  569.         case '8':
  570.             $start_day 62;
  571.             break;
  572.             //お取り寄せ(商品入荷後)
  573.         case '9':
  574.             $start_day "";
  575.             break;
  576.         default:
  577.             //お届け日が設定されていない場合
  578.             $start_day "";
  579.         }
  580.         //お届け可能日のスタート値から、お届け日の配列を取得する
  581.         $arrDelivDate $this->getDateArray($start_dayDELIV_DATE_END_MAX);
  582.         return $arrDelivDate;
  583.     }
  584.  
  585.     /**
  586.      * お届け可能日のスタート値から, お届け日の配列を取得する.
  587.      */
  588.     function getDateArray($start_day$end_day{
  589.         $masterData new SC_DB_MasterData();
  590.         $arrWDAY $masterData->getMasterData("mtb_wday");
  591.         //お届け可能日のスタート値がセットされていれば
  592.         if($start_day >= 1{
  593.             $now_time time();
  594.             $max_day $start_day $end_day;
  595.             // 集計
  596.             for ($i $start_day$i $max_day$i++{
  597.                 // 基本時間から日数を追加していく
  598.                 $tmp_time $now_time ($i 24 3600);
  599.                 list($y$m$d$wexplode(" "date("Y m d w"$tmp_time));
  600.                 $val sprintf("%04d/%02d/%02d(%s)"$y$m$d$arrWDAY[$w]);
  601.                 $arrDate[$val$val;
  602.             }
  603.         else {
  604.             $arrDate false;
  605.         }
  606.         return $arrDate;
  607.     }
  608.  
  609.     /**
  610.      * 配送業者IDからお届け時間の配列を取得する.
  611.      *
  612.      * @param integer $deliv_id 配送業者ID
  613.      * @return array お届け時間の配列
  614.      */
  615.     function getDelivTime($deliv_id{
  616.         $objQuery =SC_Query_Ex::getSingletonInstance();
  617.         $objQuery->setOrder('time_id');
  618.         $results $objQuery->select('time_id, deliv_time',
  619.                                      'dtb_delivtime',
  620.                                      'deliv_id = ?'array($deliv_id));
  621.         $arrDelivTime array();
  622.         foreach ($results as $val{
  623.             $arrDelivTime[$val['time_id']] $val['deliv_time'];
  624.         }
  625.         return $arrDelivTime;
  626.     }
  627.  
  628.     /**
  629.      * 商品種別ID から配送業者を取得する.
  630.      *
  631.      * @param integer $product_type_id 商品種別ID
  632.      * @return array 配送業者の配列
  633.      */
  634.     function getDeliv($product_type_id{
  635.         $objQuery =SC_Query_Ex::getSingletonInstance();
  636.         $objQuery->setOrder('rank DESC');
  637.         return $objQuery->select('*''dtb_deliv''product_type_id = ? AND del_flg = 0',
  638.                                  array($product_type_id));
  639.     }
  640.  
  641.     /**
  642.      * 配送業者ID から, 有効な支払方法IDを取得する.
  643.      *
  644.      * @param integer $deliv_id 配送業者ID
  645.      * @return array 有効な支払方法IDの配列
  646.      */
  647.     function getPayments($deliv_id{
  648.         $objQuery =SC_Query_Ex::getSingletonInstance();
  649.         $objQuery->setOrder('rank');
  650.         return $objQuery->getCol('payment_id''dtb_payment_options',
  651.                                  'deliv_id = ?',
  652.                                  array($deliv_id)MDB2_FETCHMODE_ORDERED);
  653.     }
  654.  
  655.     /**
  656.      * 配送情報の登録を行う.
  657.      *
  658.      * $arrParam のうち, dtb_shipping テーブルに存在するカラムのみを登録する.
  659.      *
  660.      * TODO UPDATE/INSERT にする
  661.      *
  662.      * @param integer $order_id 受注ID
  663.      * @param array $arrParams 配送情報の連想配列
  664.      * @param boolean $convert_shipping_date yyyy/mm/dd(EEE) 形式の配送日付を変換する場合 true
  665.      * @return void 
  666.      */
  667.     function registerShipping($order_id$arrParams$convert_shipping_date true{
  668.         $objQuery =SC_Query_Ex::getSingletonInstance();
  669.         $table 'dtb_shipping';
  670.         $where 'order_id = ?';
  671.         $objQuery->delete($table$wherearray($order_id));
  672.  
  673.         foreach ($arrParams as $key => $arrShipping{
  674.  
  675.             $arrValues $objQuery->extractOnlyColsOf($table$arrShipping);
  676.  
  677.             // 配送日付を timestamp に変換
  678.             if (!SC_Utils_Ex::isBlank($arrValues['shipping_date'])
  679.                 && $convert_shipping_date{
  680.                 $d mb_strcut($arrValues["shipping_date"]010);
  681.                 $arrDate explode("/"$d);
  682.                 $ts mktime(000$arrDate[1]$arrDate[2]$arrDate[0]);
  683.                 $arrValues['shipping_date'date("Y-m-d"$ts);
  684.             }
  685.  
  686.             // 非会員購入の場合は shipping_id が存在しない
  687.             if (!isset($arrValues['shipping_id'])) {
  688.                 $arrValues['shipping_id'$key;
  689.             }
  690.             $arrValues['order_id'$order_id;
  691.             $arrValues['create_date''CURRENT_TIMESTAMP';
  692.             $arrValues['update_date''CURRENT_TIMESTAMP';
  693.             $objQuery->insert($table$arrValues);
  694.         }
  695.     }
  696.  
  697.     /**
  698.      * 配送商品を登録する.
  699.      *
  700.      * @param integer $order_id 受注ID
  701.      * @param integer $shipping_id 配送先ID
  702.      * @param array $arrParams 配送商品の配列
  703.      * @return void 
  704.      */
  705.     function registerShipmentItem($order_id$shipping_id$arrParams{
  706.         $objQuery =SC_Query_Ex::getSingletonInstance();
  707.         $table 'dtb_shipment_item';
  708.         $where 'order_id = ? AND shipping_id = ?';
  709.         $objQuery->delete($table$wherearray($order_id$shipping_id));
  710.  
  711.         $objProduct new SC_Product_Ex();
  712.         foreach ($arrParams as $arrValues{
  713.             if (SC_Utils_Ex::isBlank($arrValues['product_class_id'])) {
  714.                 continue;
  715.             }
  716.             $d $objProduct->getDetailAndProductsClass($arrValues['product_class_id']);
  717.             $name SC_Utils_Ex::isBlank($arrValues['product_name'])
  718.                 ? $d['name']
  719.                 : $arrValues['product_name'];
  720.  
  721.             $code SC_Utils_Ex::isBlank($arrValues['product_code'])
  722.                 ? $d['product_code']
  723.                 : $arrValues['product_code'];
  724.  
  725.             $cname1 SC_Utils_Ex::isBlank($arrValues['classcategory_name1'])
  726.                 ? $d['classcategory_name1']
  727.                 : $arrValues['classcategory_name1'];
  728.  
  729.             $cname2 SC_Utils_Ex::isBlank($arrValues['classcategory_name2'])
  730.                 ? $d['classcategory_name2']
  731.                 : $arrValues['classcategory_name2'];
  732.  
  733.             $price SC_Utils_Ex::isBlank($arrValues['price'])
  734.                 ? $d['price']
  735.                 : $arrValues['price'];
  736.  
  737.             $arrValues['order_id'$order_id;
  738.             $arrValues['shipping_id'$shipping_id;
  739.             $arrValues['product_name'$name;
  740.             $arrValues['product_code'$code;
  741.             $arrValues['classcategory_name1'$cname1;
  742.             $arrValues['classcategory_name2'$cname2;
  743.             $arrValues['price'$price;
  744.  
  745.             $arrExtractValues $objQuery->extractOnlyColsOf($table$arrValues);
  746.             $objQuery->insert($table$arrExtractValues);
  747.         }
  748.     }
  749.  
  750.     /**
  751.      * 受注登録を完了する.
  752.      *
  753.      * 引数の受注情報を受注テーブル及び受注詳細テーブルに登録する.
  754.      * 登録後, 受注一時テーブルに削除フラグを立てる.
  755.      *
  756.      * @param array $orderParams 登録する受注情報の配列
  757.      * @param SC_CartSession $objCartSession カート情報のインスタンス
  758.      * @param integer $cartKey 登録を行うカート情報のキー
  759.      * @param integer 受注ID
  760.      */
  761.     function registerOrderComplete($orderParams&$objCartSession$cartKey{
  762.         $objQuery =SC_Query_Ex::getSingletonInstance();
  763.  
  764.         // 不要な変数を unset
  765.         $unsets array('mailmaga_flg''deliv_check''point_check''password',
  766.                         'reminder''reminder_answer''mail_flag''session');
  767.         foreach ($unsets as $unset{
  768.             unset($orderParams[$unset]);
  769.         }
  770.  
  771.         // 対応状況の指定が無い場合は新規受付
  772.         if(SC_Utils_Ex::isBlank($orderParams['status'])) {
  773.             $orderParams['status'ORDER_NEW;
  774.         }
  775.  
  776.         $orderParams['create_date''CURRENT_TIMESTAMP';
  777.         $orderParams['update_date''CURRENT_TIMESTAMP';
  778.  
  779.         $this->registerOrder($orderParams['order_id']$orderParams);
  780.  
  781.         // 詳細情報を取得
  782.         $cartItems $objCartSession->getCartList($cartKey);
  783.  
  784.         // 詳細情報を生成
  785.         $objProduct new SC_Product_Ex();
  786.         $i 0;
  787.         foreach ($cartItems as $item{
  788.             $p =$item['productsClass'];
  789.             $arrDetail[$i]['order_id'$orderParams['order_id'];
  790.             $arrDetail[$i]['product_id'$p['product_id'];
  791.             $arrDetail[$i]['product_class_id'$p['product_class_id'];
  792.             $arrDetail[$i]['product_name'$p['name'];
  793.             $arrDetail[$i]['product_code'$p['product_code'];
  794.             $arrDetail[$i]['classcategory_name1'$p['classcategory_name1'];
  795.             $arrDetail[$i]['classcategory_name2'$p['classcategory_name2'];
  796.             $arrDetail[$i]['point_rate'$item['point_rate'];
  797.             $arrDetail[$i]['price'$item['price'];
  798.             $arrDetail[$i]['quantity'$item['quantity'];
  799.  
  800.             // 在庫の減少処理
  801.             if (!$objProduct->reduceStock($p['product_class_id']$item['quantity'])) {
  802.                 $objQuery->rollback();
  803.                 SC_Utils_Ex::sfDispSiteError(SOLD_OUT""true);
  804.             }
  805.             $i++;
  806.         }
  807.         $this->registerOrderDetail($orderParams['order_id']$arrDetail);
  808.  
  809.         $objQuery->update("dtb_order_temp"array('del_flg' => 1),
  810.                           "order_temp_id = ?",
  811.                           array(SC_SiteSession_Ex::getUniqId()));
  812.         
  813.         
  814.         
  815.         return $orderParams['order_id'];
  816.     }
  817.  
  818.     /**
  819.      * 受注情報を登録する.
  820.      *
  821.      * 既に受注IDが存在する場合は, 受注情報を更新する.
  822.      * 引数の受注IDが, 空白又は null の場合は, 新しく受注IDを発行して登録する.
  823.      *
  824.      * @param integer $order_id 受注ID
  825.      * @param array $arrParams 受注情報の連想配列
  826.      * @return integer 受注ID
  827.      */
  828.     function registerOrder($order_id$arrParams{
  829.         $table 'dtb_order';
  830.         $where 'order_id = ?';
  831.         $objQuery SC_Query_Ex::getSingletonInstance();
  832.         $arrValues $objQuery->extractOnlyColsOf($table$arrParams);
  833.  
  834.         $exists $objQuery->count($table$wherearray($order_id));
  835.         if ($exists 0{
  836.  
  837.             $this->sfUpdateOrderStatus($order_id$arrValues['status'],
  838.                                        $arrValues['add_point'],
  839.                                        $arrValues['use_point'],
  840.                                        $arrValues);
  841.             $this->sfUpdateOrderNameCol($order_id);
  842.  
  843.             $arrValues['update_date''CURRENT_TIMESTAMP';
  844.             $objQuery->update($table$arrValues$wherearray($order_id));
  845.         else {
  846.             if (SC_Utils_Ex::isBlank($order_id)) {
  847.                 $order_id $objQuery->nextVal('dtb_order_order_id');
  848.             }
  849.             /*
  850.              * 新規受付の場合は対応状況 null で insert し,
  851.              * sfUpdateOrderStatus で ORDER_NEW に変更する.
  852.              */
  853.             $status $arrValues['status'];
  854.             $arrValues['status'null;
  855.             $arrValues['order_id'$order_id;
  856.             $arrValues['customer_id'=
  857.                     SC_Utils_Ex::isBlank($arrValues['customer_id'])
  858.                     ? $arrValues['customer_id'];
  859.             $arrValues['create_date''CURRENT_TIMESTAMP';
  860.             $arrValues['update_date''CURRENT_TIMESTAMP';
  861.             $objQuery->insert($table$arrValues);
  862.  
  863.             $this->sfUpdateOrderStatus($order_id$status,
  864.                                        $arrValues['add_point'],
  865.                                        $arrValues['use_point'],
  866.                                        $arrValues);
  867.             $this->sfUpdateOrderNameCol($order_id);
  868.  
  869.         }
  870.         return $order_id;
  871.     }
  872.  
  873.     /**
  874.      * 受注詳細情報を登録する.
  875.      *
  876.      * 既に, 該当の受注が存在する場合は, 受注情報を削除し, 登録する.
  877.      *
  878.      * @param integer $order_id 受注ID
  879.      * @param array $arrParams 受注情報の連想配列
  880.      * @return void 
  881.      */
  882.     function registerOrderDetail($order_id$arrParams{
  883.         $table 'dtb_order_detail';
  884.         $where 'order_id = ?';
  885.         $objQuery SC_Query_Ex::getSingletonInstance();
  886.  
  887.         $objQuery->delete($table$wherearray($order_id));
  888.         foreach ($arrParams as $arrDetail{
  889.             $arrValues $objQuery->extractOnlyColsOf($table$arrDetail);
  890.             $arrValues['order_detail_id'$objQuery->nextVal('dtb_order_detail_order_detail_id');
  891.             $arrValues['order_id'$order_id;
  892.             $objQuery->insert($table$arrValues);
  893.         }
  894.     }
  895.  
  896.     /**
  897.      * 受注情報を取得する.
  898.      *
  899.      * @param integer $order_id 受注ID
  900.      * @param integer $customer_id 顧客ID
  901.      * @return array 受注情報の配列
  902.      */
  903.     function getOrder($order_id$customer_id null{
  904.         $objQuery =SC_Query_Ex::getSingletonInstance();
  905.         $where 'order_id = ?';
  906.         $arrValues array($order_id);
  907.         if (!SC_Utils_Ex::isBlank($customer_id)) {
  908.             $where .= ' AND customer_id = ?';
  909.             $arrValues[$customer_id;
  910.         }
  911.         return $objQuery->getRow('*''dtb_order'$where$arrValues);
  912.     }
  913.  
  914.     /**
  915.      * 受注詳細を取得する.
  916.      *
  917.      * @param integer $order_id 受注ID
  918.      * @param boolean $has_order_status 対応状況, 入金日も含める場合 true
  919.      * @return array 受注詳細の配列
  920.      */
  921.     function getOrderDetail($order_id$has_order_status true{
  922.         $objQuery =SC_Query_Ex::getSingletonInstance();
  923.         $dbFactory  SC_DB_DBFactory_Ex::getInstance();
  924.         $col = <<< __EOS__
  925.             T3.product_id,
  926.             T3.product_class_id as product_class_id,
  927.             T3.product_type_id AS product_type_id,
  928.             T2.product_code,
  929.             T2.product_name,
  930.             T2.classcategory_name1 AS classcategory_name1,
  931.             T2.classcategory_name2 AS classcategory_name2,
  932.             T2.price,
  933.             T2.quantity,
  934.             T2.point_rate,
  935. __EOS__;
  936.         if ($has_order_status{
  937.             $col .= 'T1.status AS status, T1.payment_date AS payment_date,';
  938.  
  939.         }
  940.         $col .= <<< __EOS__
  941.  
  942.             CASE WHEN EXISTS(
  943.                     SELECT * FROM dtb_products
  944.                      WHERE product_id = T3.product_id
  945.                        AND del_flg = 0
  946.                        AND status = 1)
  947.                  THEN '1' ELSE '0'
  948.                   END AS enable,
  949. __EOS__;
  950.         $col .= $dbFactory->getDownloadableDaysWhereSql('T1'' AS effective';
  951.         $from = <<< __EOS__
  952.                       dtb_order T1
  953.                  JOIN dtb_order_detail T2
  954.                    ON T1.order_id = T2.order_id
  955.             LEFT JOIN dtb_products_class T3
  956.                    ON T2.product_class_id = T3.product_class_id
  957. __EOS__;
  958.         $objQuery->setOrder('T2.order_detail_id');
  959.         return $objQuery->select($col$from'T1.order_id = ?'array($order_id));
  960.     }
  961.  
  962.     /**
  963.      * ダウンロード可能フラグを, 受注詳細に設定する.
  964.      *
  965.      * ダウンロード可能と判断されるのは, 以下の通り.
  966.      *
  967.      * 1. ダウンロード可能期限が期限内かつ, 入金日が入力されている
  968.      * 2. 販売価格が 0 円である
  969.      *
  970.      * 受注詳細行には, is_downloadable という真偽値が設定される.
  971.      * @param array 受注詳細の配列
  972.      * @return void 
  973.      */
  974.     function setDownloadableFlgTo(&$arrOrderDetail{
  975.         foreach (array_keys($arrOrderDetailas $key{
  976.             // 販売価格が 0 円
  977.             if ($arrOrderDetail[$key]['price'== '0'{
  978.                 $arrOrderDetail[$key]['is_downloadable'true;
  979.             }
  980.             // ダウンロード期限内かつ, 入金日あり
  981.             elseif ($arrOrderDetail[$key]['effective'== '1'
  982.                     && !SC_Utils_Ex::isBlank($arrOrderDetail[$key]['payment_date'])) {
  983.                 $arrOrderDetail[$key]['is_downloadable'true;
  984.             else {
  985.                 $arrOrderDetail[$key]['is_downloadable'false;
  986.             }
  987.         }
  988.     }
  989.  
  990.     /**
  991.      * 配送情報を取得する.
  992.      *
  993.      * @param integer $order_id 受注ID
  994.      * @param boolean $has_items 結果に配送商品も含める場合 true
  995.      * @return array 配送情報の配列
  996.      */
  997.     function getShippings($order_id$has_items true{
  998.         $objQuery =SC_Query_Ex::getSingletonInstance();
  999.         $arrResults array();
  1000.         $objQuery->setOrder('shipping_id');
  1001.         $arrShippings $objQuery->select("*""dtb_shipping""order_id = ?",
  1002.                                           array($order_id));
  1003.         // shipping_id ごとの配列を生成する
  1004.         foreach ($arrShippings as $shipping{
  1005.             foreach ($shipping as $key => $val{
  1006.                 $arrResults[$shipping['shipping_id']][$key$val;
  1007.             }
  1008.         }
  1009.  
  1010.         if ($has_items{
  1011.             $objProduct new SC_Product_Ex();
  1012.             foreach (array_keys($arrResultsas $shipping_id{
  1013.                 $arrResults[$shipping_id]['shipment_item']
  1014.                         =$this->getShipmentItems($order_id$shipping_id);
  1015.             }
  1016.         }
  1017.         return $arrResults;
  1018.     }
  1019.  
  1020.     /**
  1021.      * 配送商品を取得する.
  1022.      *
  1023.      * @param integer $order_id 受注ID
  1024.      * @param integer $shipping_id 配送先ID
  1025.      * @param boolean $has_detail 商品詳細も取得する場合 true
  1026.      * @return array 商品規格IDをキーにした配送商品の配列
  1027.      */
  1028.     function getShipmentItems($order_id$shipping_id$has_detail true{
  1029.         $objQuery =SC_Query_Ex::getSingletonInstance();
  1030.         $objProduct new SC_Product_Ex();
  1031.         $arrResults array();
  1032.         $arrItems $objQuery->select("*""dtb_shipment_item",
  1033.                                       "order_id = ? AND shipping_id = ?",
  1034.                                       array($order_id$shipping_id));
  1035.  
  1036.         foreach ($arrItems as $key => $arrItem{
  1037.             $product_class_id $arrItem['product_class_id'];
  1038.  
  1039.             foreach ($arrItem as $detailKey => $detailVal{
  1040.                 $arrResults[$key][$detailKey$detailVal;
  1041.             }
  1042.             // 商品詳細を関連づける
  1043.             if ($has_detail{
  1044.                 $arrResults[$key]['productsClass']
  1045.                     =$objProduct->getDetailAndProductsClass($product_class_id);
  1046.             }
  1047.         }
  1048.         return $arrResults;
  1049.     }
  1050.  
  1051.     /**
  1052.      * 受注完了メールを送信する.
  1053.      *
  1054.      * HTTP_USER_AGENT の種別により, 携帯電話の場合は携帯用の文面,
  1055.      * PC の場合は PC 用の文面でメールを送信する.
  1056.      *
  1057.      * @param integer $orderId 受注ID
  1058.      * @return void 
  1059.      */
  1060.     function sendOrderMail($orderId{
  1061.         $mailHelper new SC_Helper_Mail_Ex();
  1062.         $template_id =
  1063.             SC_Display_Ex::detectDevice(== DEVICE_TYPE_MOBILE 1;
  1064.         $mailHelper->sfSendOrderMail($orderId$template_id);
  1065.     }
  1066.  
  1067.     /**
  1068.      * 受注.対応状況の更新
  1069.      *
  1070.      * 必ず呼び出し元でトランザクションブロックを開いておくこと。
  1071.      *
  1072.      * @param integer $orderId 注文番号
  1073.      * @param integer|null$newStatus 対応状況 (null=変更無し)
  1074.      * @param integer|null$newAddPoint 加算ポイント (null=変更無し)
  1075.      * @param integer|null$newUsePoint 使用ポイント (null=変更無し)
  1076.      * @param array $sqlval 更新後の値をリファレンスさせるためのパラメーター
  1077.      * @return void 
  1078.      */
  1079.     function sfUpdateOrderStatus($orderId$newStatus null$newAddPoint null$newUsePoint null&$sqlval{
  1080.         $objQuery =SC_Query_Ex::getSingletonInstance();
  1081.         $arrOrderOld $objQuery->getRow('status, add_point, use_point, customer_id''dtb_order''order_id = ?'array($orderId));
  1082.  
  1083.         // 対応状況が変更無しの場合、DB値を引き継ぐ
  1084.         if (is_null($newStatus)) {
  1085.             $newStatus $arrOrderOld['status'];
  1086.         }
  1087.  
  1088.         // 使用ポイント、DB値を引き継ぐ
  1089.         if (is_null($newUsePoint)) {
  1090.             $newUsePoint $arrOrderOld['use_point'];
  1091.         }
  1092.  
  1093.         // 加算ポイント、DB値を引き継ぐ
  1094.         if (is_null($newAddPoint)) {
  1095.             $newAddPoint $arrOrderOld['add_point'];
  1096.         }
  1097.  
  1098.         if (USE_POINT !== false{
  1099.             // 会員.ポイントの加減値
  1100.             $addCustomerPoint 0;
  1101.  
  1102.             // ▼使用ポイント
  1103.             // 変更前の対応状況が利用対象の場合、変更前の使用ポイント分を戻す
  1104.             if ($this->isUsePoint($arrOrderOld['status'])) {
  1105.                 $addCustomerPoint += $arrOrderOld['use_point'];
  1106.             }
  1107.  
  1108.             // 変更後の対応状況が利用対象の場合、変更後の使用ポイント分を引く
  1109.             if ($this->isUsePoint($newStatus)) {
  1110.                 $addCustomerPoint -= $newUsePoint;
  1111.             }
  1112.  
  1113.             // ▲使用ポイント
  1114.  
  1115.             // ▼加算ポイント
  1116.             // 変更前の対応状況が加算対象の場合、変更前の加算ポイント分を戻す
  1117.             if ($this->isAddPoint($arrOrderOld['status'])) {
  1118.                 $addCustomerPoint -= $arrOrderOld['add_point'];
  1119.             }
  1120.  
  1121.             // 変更後の対応状況が加算対象の場合、変更後の加算ポイント分を足す
  1122.             if ($this->isAddPoint($newStatus)) {
  1123.                 $addCustomerPoint += $newAddPoint;
  1124.             }
  1125.             // ▲加算ポイント
  1126.  
  1127.             if ($addCustomerPoint != 0{
  1128.                 // ▼会員テーブルの更新
  1129.                 $objQuery->update('dtb_customer'array('update_date' => 'CURRENT_TIMESTAMP'),
  1130.                                   'customer_id = ?'array($arrOrderOld['customer_id']),
  1131.                                   array('point' => 'point + ?')array($addCustomerPoint));
  1132.                 // ▲会員テーブルの更新
  1133.  
  1134.                 // 会員.ポイントをマイナスした場合、
  1135.                 if ($addCustomerPoint 0{
  1136.                     $sql 'SELECT point FROM dtb_customer WHERE customer_id = ?';
  1137.                     $point $objQuery->getOne($sqlarray($arrOrderOld['customer_id']));
  1138.                     // 変更後の会員.ポイントがマイナスの場合、
  1139.                     if ($point 0{
  1140.                         // ロールバック
  1141.                         $objQuery->rollback();
  1142.                         // エラー
  1143.                         SC_Utils_Ex::sfDispSiteError(LACK_POINT);
  1144.                     }
  1145.                 }
  1146.             }
  1147.         }
  1148.  
  1149.         // ▼受注テーブルの更新
  1150.         if (empty($sqlval)) {
  1151.             $sqlval array();
  1152.         }
  1153.  
  1154.         if (USE_POINT !== false{
  1155.             $sqlval['add_point'$newAddPoint;
  1156.             $sqlval['use_point'$newUsePoint;
  1157.         }
  1158.         // 対応状況が発送済みに変更の場合、発送日を更新
  1159.         if ($arrOrderOld['status'!= ORDER_DELIV && $newStatus == ORDER_DELIV{
  1160.             $sqlval['commit_date''CURRENT_TIMESTAMP';
  1161.         }
  1162.         // 対応状況が入金済みに変更の場合、入金日を更新
  1163.         elseif ($arrOrderOld['status'!= ORDER_PRE_END && $newStatus == ORDER_PRE_END{
  1164.             $sqlval['payment_date''CURRENT_TIMESTAMP';
  1165.         }
  1166.  
  1167.         $sqlval['status'$newStatus;
  1168.         $sqlval['update_date''CURRENT_TIMESTAMP';
  1169.  
  1170.         $dest $objQuery->extractOnlyColsOf('dtb_order'$sqlval);
  1171.         $objQuery->update('dtb_order'$dest'order_id = ?'array($orderId));
  1172.         // ▲受注テーブルの更新
  1173.  
  1174.         //会員情報の最終購入日、購入合計を更新
  1175.         if($arrOrderOld['customer_id'and $arrOrderOld['status'!= $newStatus){
  1176.             SC_Customer_Ex::updateOrderSummary($arrOrderOld['customer_id']);
  1177.         }
  1178.     }
  1179.  
  1180.     /**
  1181.      * 受注の名称列を更新する
  1182.      *
  1183.      * @param integer $order_id 更新対象の注文番号
  1184.      * @param boolean $temp_table 更新対象は「受注_Temp」か
  1185.      * @static
  1186.      */
  1187.     function sfUpdateOrderNameCol($order_id$temp_table false{
  1188.         $objQuery =SC_Query_Ex::getSingletonInstance();
  1189.  
  1190.         if ($temp_table{
  1191.             $tgt_table 'dtb_order_temp';
  1192.             $sql_where 'order_temp_id = ?';
  1193.         else {
  1194.             $tgt_table 'dtb_order';
  1195.             $sql_where 'order_id = ?';
  1196.  
  1197.             $objQuery->update('dtb_shipping'array(),
  1198.                               $sql_where,
  1199.                               array($order_id),
  1200.                               array('shipping_time' =>
  1201.                                     "(SELECT deliv_time FROM dtb_delivtime WHERE time_id = dtb_shipping.time_id AND deliv_id = dtb_shipping.deliv_id)"));
  1202.  
  1203.         }
  1204.  
  1205.         $objQuery->update($tgt_tablearray(),
  1206.                           $sql_where,
  1207.                           array($order_id),
  1208.                           array('payment_method' =>
  1209.                                 "(SELECT payment_method FROM dtb_payment WHERE payment_id = " $tgt_table ".payment_id)"));
  1210.     }
  1211.  
  1212.     /**
  1213.      * ポイント使用するかの判定
  1214.      *
  1215.      * $status が null の場合は false を返す.
  1216.      *
  1217.      * @param integer $status 対応状況
  1218.      * @return boolean 使用するか(会員テーブルから減算するか)
  1219.      */
  1220.     function isUsePoint($status{
  1221.         if ($status == null{
  1222.             return false;
  1223.         }
  1224.         switch ($status{
  1225.             case ORDER_CANCEL:      // キャンセル
  1226.                 return false;
  1227.             default:
  1228.                 break;
  1229.         }
  1230.  
  1231.         return true;
  1232.     }
  1233.  
  1234.     /**
  1235.      * ポイント加算するかの判定
  1236.      *
  1237.      * @param integer $status 対応状況
  1238.      * @return boolean 加算するか
  1239.      */
  1240.     function isAddPoint($status{
  1241.         switch ($status{
  1242.             case ORDER_NEW:         // 新規注文
  1243.             case ORDER_PAY_WAIT:    // 入金待ち
  1244.             case ORDER_PRE_END:     // 入金済み
  1245.             case ORDER_CANCEL:      // キャンセル
  1246.             case ORDER_BACK_ORDER:  // 取り寄せ中
  1247.                 return false;
  1248.  
  1249.             case ORDER_DELIV:       // 発送済み
  1250.                 return true;
  1251.  
  1252.             default:
  1253.                 break;
  1254.         }
  1255.  
  1256.         return false;
  1257.     }
  1258.  
  1259.     /**
  1260.      * セッションに保持している情報を破棄する.
  1261.      *
  1262.      * 通常、受注処理(completeOrder)完了後に呼び出され、
  1263.      * セッション情報を破棄する.
  1264.      *
  1265.      * 決済モジュール画面から確認画面に「戻る」場合を考慮し、
  1266.      * セッション情報を破棄しないカスタマイズを、モジュール側で
  1267.      * 加える機会を与える.
  1268.      *
  1269.      * @param integer $orderId 注文番号
  1270.      * @param SC_CartSession $objCartSession カート情報のインスタンス
  1271.      * @param SC_Customer $objCustomer SC_Customer インスタンス
  1272.      * @param integer $cartKey 登録を行うカート情報のキー
  1273.      */
  1274.     function cleanupSession($orderId&$objCartSession&$objCustomer$cartKey{
  1275.         // カートの内容を削除する.
  1276.         $objCartSession->delAllProducts($cartKey);
  1277.         SC_SiteSession_Ex::unsetUniqId();
  1278.  
  1279.         // セッションの配送情報を破棄する.
  1280.         $this->unsetShippingTemp();
  1281.         $objCustomer->updateSession();
  1282.     }
  1283. }

Documentation generated on Fri, 24 Feb 2012 14:02:48 +0900 by Seasoft