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($_SESSION, unserialize($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']) == 0) continue;
  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_multiple) as $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_id] = array_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']) != 0 && 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_day, DELIV_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, $w) = explode(" ", 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, $where, array($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"], 0, 10);
  681.                 $arrDate = explode("/", $d);
  682.                 $ts = mktime(0, 0, 0, $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, $where, array($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, $where, array($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, $where, array($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.                     ? 0 : $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, $where, array($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($arrOrderDetail) as $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($arrResults) as $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 ? 2 : 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($sql, array($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'] > 0 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_table, array(),
  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