Source for file SC_Helper_Purchase.php
Documentation is available at SC_Helper_Purchase.php
* This file is part of EC-CUBE
* Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
* http://www.lockon.co.jp/
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* TODO 購入時強制会員登録機能(#521)の実装を検討
* TODO dtb_customer.buy_times, dtb_customer.buy_total の更新
* @author Kentaro Ohkouchi
* @version $Id: SC_Helper_Purchase.php 21303 2011-10-28 10:01:24Z shutta $
* 3. 受注一時テーブルから受注データを読み込む
* 4. ユーザーがログインしている場合はその他の発送先へ登録する
* 実行中に, 何らかのエラーが発生した場合, 処理を中止しエラーページへ遷移する
* 決済モジュールを使用する場合は対応状況を「決済処理中」に設定し,
* @param integer $orderStatus 受注処理を完了する際に設定する対応状況
$objQuery = & SC_Query_Ex::getSingletonInstance();
$objSiteSession = new SC_SiteSession_Ex();
$objCartSession = new SC_CartSession_Ex();
$objCustomer = new SC_Customer_Ex();
$customerId = $objCustomer->getValue('customer_id');
if (!$objSiteSession->isPrePage()) {
SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, $objSiteSession);
$uniqId = $objSiteSession->getUniqId();
$orderTemp['status'] = $orderStatus;
$cartkey = $objCartSession->getKey();
foreach ($shippingTemp as $shippingId => $val) {
SC_Customer_Ex::updateOrderSummary($customerId);
$this->cleanupSession($orderId, $objCartSession, $objCustomer, $cartkey);
GC_Utils_Ex::gfFrontLog("order complete. customerId=" . $customerId);
* この関数は, 主に決済モジュールにて, 受注をキャンセルする場合に使用する.
* 対応状況を引数 $orderStatus で指定した値に変更する.
* 引数 $is_delete が true の場合は, 受注データを論理削除する.
* @param integer $order_id 受注ID
* @param integer $orderStatus 対応状況
* @param boolean $is_delete 受注データを論理削除する場合 true
function cancelOrder($order_id, $orderStatus = ORDER_CANCEL, $is_delete = false) {
$objQuery = & SC_Query_Ex::getSingletonInstance();
$in_transaction = $objQuery->inTransaction();
$arrParams['status'] = $orderStatus;
$arrParams['del_flg'] = 1;
foreach ($arrOrderDetail as $arrDetail) {
$objQuery->update('dtb_products_class', array(),
"product_class_id = ?", array($arrDetail['product_class_id']),
array('stock' => 'stock + ?'), array($arrDetail['quantity']));
* 受注をキャンセルし, カートをロールバックして, 受注一時IDを返す.
* 受注完了後の受注をキャンセルし, カートの状態を受注前の状態へ戻す.
* この関数は, 主に, 決済モジュールに遷移した後, 購入確認画面へ戻る場合に使用する.
* 対応状況を引数 $orderStatus で指定した値に変更する.
* 引数 $is_delete が true の場合は, 受注データを論理削除する.
* 商品の在庫数, カートの内容は受注前の状態に戻される.
* @param integer $order_id 受注ID
* @param integer $orderStatus 対応状況
* @param boolean $is_delete 受注データを論理削除する場合 true
function rollbackOrder($order_id, $orderStatus = ORDER_CANCEL, $is_delete = false) {
$objQuery = & SC_Query_Ex::getSingletonInstance();
$in_transaction = $objQuery->inTransaction();
$this->cancelOrder($order_id, $orderStatus, $is_delete);
$objSiteSession = new SC_SiteSession_Ex();
$objCartSession = new SC_CartSession_Ex();
$objCustomer = new SC_Customer_Ex();
$objSiteSession->unsetUniqId();
$uniqid = $objSiteSession->getUniqId();
$arrOrderTemp['del_flg'] = 0;
$objSiteSession->setRegistFlag();
* ユニークIDとセッションのユニークIDを比較し, 異なる場合は
* カートが空の場合, 購入ボタン押下後にカートが変更された場合は
* @param string $uniqId ユニークID
* @param SC_CartSession $objCartSession
$cartKeys = $objCartSession->getKeys();
if (SC_Utils_Ex::isBlank($cartKeys)) {
SC_Response_Ex::sendRedirect(CART_URLPATH);
foreach ($cartKeys as $cartKey) {
$objCartSession->saveCurrentCart($uniqId, $cartKey);
* POSTのユニークIDとセッションのユニークIDを比較
*(ユニークIDがPOSTされていない場合はスルー)
if(!SC_SiteSession_Ex::checkUniqId()) {
SC_Utils_Ex::sfDispSiteError(CANCEL_PURCHASE);
$quantity = $objCartSession->getTotalQuantity($cartKey);
if($objCartSession->checkChangeCart($cartKey) || !($quantity > 0)) {
SC_Response_Ex::sendRedirect(CART_URLPATH);
* @param integer $uniqId 受注一時情報ID
* @return array 受注一時情報の配列
$objQuery = & SC_Query_Ex::getSingletonInstance();
return $objQuery->getRow("*", "dtb_order_temp", "order_temp_id = ?",
* @param integer $order_id 受注ID
* @return array 受注一時情報の配列
$objQuery = & SC_Query_Ex::getSingletonInstance();
return $objQuery->getRow("*", "dtb_order_temp", "order_id = ?",
* 既存のデータが存在しない場合は新規保存. 存在する場合は更新する.
* 既存のデータが存在せず, ユーザーがログインしている場合は,
* @param integer $uniqId 受注一時情報ID
* @param array $params 登録する受注情報の配列
* @param SC_Customer $objCustomer SC_Customer インスタンス
if (SC_Utils_Ex::isBlank($uniqId)) {
$params['device_type_id'] = SC_Display_Ex::detectDevice();
$objQuery = & SC_Query_Ex::getSingletonInstance();
$cols = $objQuery->listTableFields('dtb_order_temp');
foreach ($params as $key => $val) {
if (SC_Utils_Ex::isBlank($exists)) {
$sqlval['order_temp_id'] = $uniqId;
$sqlval['create_date'] = 'CURRENT_TIMESTAMP';
$objQuery->insert("dtb_order_temp", $sqlval);
$objQuery->update("dtb_order_temp", $sqlval, 'order_temp_id = ?',
* @param bool $has_shipment_item 配送商品を保有している配送先のみ返す。
if ($has_shipment_item) {
foreach ($_SESSION['shipping'] as $key => $arrVal) {
if (count($arrVal['shipment_item']) == 0) continue;
$arrReturn[$key] = $arrVal;
return $_SESSION['shipping'];
* @param integer $shipping_id 配送先ID
unset ($_SESSION['shipping']);
unset ($_SESSION['shipping'][$shipping_id]);
* @param integer $shipping_id 配送先ID
* @param integer $product_class_id 商品規格ID
* @param integer $quantity 数量
// 配列が長くなるので, リファレンスを使用する
$arrItems = & $_SESSION['shipping'][$shipping_id]['shipment_item'][$product_class_id];
$arrItems['shipping_id'] = $shipping_id;
$arrItems['product_class_id'] = $product_class_id;
$arrItems['quantity'] = $quantity;
$objProduct = new SC_Product_Ex();
// カート情報から読みこめば済むと思うが、一旦保留。むしろ、カート情報も含め、セッション情報を縮小すべきかもしれない。
$objCartSession = new SC_CartSession_Ex();
$cartKey = $objCartSession->getKey();
$cartItems = $objCartSession->getCartList($cartKey);
if (empty($arrItems['productsClass'])) {
$product = & $objProduct->getDetailAndProductsClass($product_class_id);
$arrItems['productsClass'] = $product;
$arrItems['price'] = $arrItems['productsClass']['price02'];
$inctax = SC_Helper_DB_Ex::sfCalcIncTax($arrItems['price']);
$arrItems['total_inctax'] = $inctax * $arrItems['quantity'];
foreach (SC_Helper_Purchase_Ex::getShippingTemp($is_multiple) as $val) {
$results[] = $val['shipping_pref'];
* @return boolean 複数配送指定の購入の場合 true
return count(SC_Helper_Purchase_Ex::getShippingTemp(true)) >= 1;
* @param array $arrSrc 配送情報の連想配列
* @param integer $shipping_id 配送先ID
unset ($arrSrc['shipment_item']);
if (empty($_SESSION['shipping'][$shipping_id])) {
$_SESSION['shipping'][$shipping_id] = $arrSrc;
$_SESSION['shipping'][$shipping_id]['shipping_id'] = $shipping_id;
$_SESSION['shipping'][$shipping_id] = array_merge($_SESSION['shipping'][$shipping_id], $arrSrc);
$_SESSION['shipping'][$shipping_id]['shipping_id'] = $shipping_id;
unset ($_SESSION['shipping']);
unset ($_SESSION['multiple_temp']);
* ユーザーがログインしていない場合は何もしない.
* 会員情報を $dest の order_* へコピーする.
* customer_id は強制的にコピーされる.
* @param array $dest コピー先の配列
* @param SC_Customer $objCustomer SC_Customer インスタンス
* @param string $prefix コピー先の接頭辞. デフォルト order
* @param array $keys コピー対象のキー
$keys = array('name01', 'name02', 'kana01', 'kana02',
'sex', 'zip01', 'zip02', 'pref',
'tel01', 'tel02', 'tel03', 'job',
if ($objCustomer->isLoginSuccess(true)) {
foreach ($keys as $key) {
$dest[$prefix . '_' . $key] = $objCustomer->getValue($key);
if ((SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE)
$email_mobile = $objCustomer->getValue('email_mobile');
if (empty($email_mobile)) {
$dest[$prefix . '_email'] = $objCustomer->getValue('email');
$dest[$prefix . '_email'] = $email_mobile;
$dest['customer_id'] = $objCustomer->getValue('customer_id');
$dest['update_date'] = 'CURRENT_TIMESTAMP';
* 受注情報($src)を $dest の order_* へコピーする.
* TODO 汎用的にして SC_Utils へ移動
* @param array $dest コピー先の配列
* @param array $src コピー元の配列
* @param array $keys コピー対象のキー
* @param string $prefix コピー先の接頭辞. デフォルト shipping
* @param string $src_prefix コピー元の接頭辞. デフォルト order
$prefix = 'shipping', $src_prefix = 'order',
$keys = array('name01', 'name02', 'kana01', 'kana02',
'sex', 'zip01', 'zip02', 'pref',
'tel01', 'tel02', 'tel03')) {
if (!SC_Utils_Ex::isBlank($prefix)) {
if (!SC_Utils_Ex::isBlank($src_prefix)) {
$src_prefix = $src_prefix . '_';
foreach ($keys as $key) {
$dest[$prefix . $key] = $src[$src_prefix . $key];
* @param integer $total 購入金額
* @param integer $deliv_id 配送業者ID
* @return array 購入金額に応じた支払方法の配列
if (SC_Utils_Ex::isBlank($arrPaymentIds)) {
$objQuery = & SC_Query_Ex::getSingletonInstance();
$where = 'del_flg = 0 AND payment_id IN (' . implode(', ', array_pad(array(), count($arrPaymentIds), '?')) . ')';
$objQuery->setOrder("rank DESC");
$payments = $objQuery->select("payment_id, payment_method, rule, upper_rule, note, payment_image, charge", "dtb_payment", $where, $arrPaymentIds);
foreach ($payments as $data) {
if (strlen($data['rule']) != 0 && strlen($data['upper_rule']) != 0) {
if ($data['rule'] <= $total && $data['upper_rule'] >= $total) {
elseif (strlen($data['rule']) != 0) {
if($data['rule'] <= $total) {
elseif (strlen($data['upper_rule']) != 0) {
if($data['upper_rule'] >= $total) {
$cartList = $objCartSess->getCartList($productTypeId);
foreach ($cartList as $item) {
$delivDateIds[] = $item['productsClass']['deliv_date_id'];
$max_date = max($delivDateIds);
//お届け可能日のスタート値から、お届け日の配列を取得する
$arrDelivDate = $this->getDateArray($start_day, DELIV_DATE_END_MAX);
* お届け可能日のスタート値から, お届け日の配列を取得する.
$arrWDAY = $masterData->getMasterData("mtb_wday");
$max_day = $start_day + $end_day;
for ($i = $start_day; $i < $max_day; $i++ ) {
$tmp_time = $now_time + ($i * 24 * 3600);
list ($y, $m, $d, $w) = explode(" ", date("Y m d w", $tmp_time));
$val = sprintf("%04d/%02d/%02d(%s)", $y, $m, $d, $arrWDAY[$w]);
* @param integer $deliv_id 配送業者ID
$objQuery = & SC_Query_Ex::getSingletonInstance();
$objQuery->setOrder('time_id');
$results = $objQuery->select('time_id, deliv_time',
'deliv_id = ?', array($deliv_id));
foreach ($results as $val) {
$arrDelivTime[$val['time_id']] = $val['deliv_time'];
* @param integer $product_type_id 商品種別ID
$objQuery = & SC_Query_Ex::getSingletonInstance();
$objQuery->setOrder('rank DESC');
return $objQuery->select('*', 'dtb_deliv', 'product_type_id = ? AND del_flg = 0',
array($product_type_id));
* 配送業者ID から, 有効な支払方法IDを取得する.
* @param integer $deliv_id 配送業者ID
* @return array 有効な支払方法IDの配列
$objQuery = & SC_Query_Ex::getSingletonInstance();
$objQuery->setOrder('rank');
return $objQuery->getCol('payment_id', 'dtb_payment_options',
array($deliv_id), MDB2_FETCHMODE_ORDERED);
* $arrParam のうち, dtb_shipping テーブルに存在するカラムのみを登録する.
* @param integer $order_id 受注ID
* @param array $arrParams 配送情報の連想配列
* @param boolean $convert_shipping_date yyyy/mm/dd(EEE) 形式の配送日付を変換する場合 true
function registerShipping($order_id, $arrParams, $convert_shipping_date = true) {
$objQuery = & SC_Query_Ex::getSingletonInstance();
$objQuery->delete($table, $where, array($order_id));
foreach ($arrParams as $key => $arrShipping) {
$arrValues = $objQuery->extractOnlyColsOf($table, $arrShipping);
if (!SC_Utils_Ex::isBlank($arrValues['shipping_date'])
&& $convert_shipping_date) {
$d = mb_strcut($arrValues["shipping_date"], 0, 10);
$ts = mktime(0, 0, 0, $arrDate[1], $arrDate[2], $arrDate[0]);
$arrValues['shipping_date'] = date("Y-m-d", $ts);
// 非会員購入の場合は shipping_id が存在しない
if (!isset ($arrValues['shipping_id'])) {
$arrValues['shipping_id'] = $key;
$arrValues['order_id'] = $order_id;
$arrValues['create_date'] = 'CURRENT_TIMESTAMP';
$arrValues['update_date'] = 'CURRENT_TIMESTAMP';
$objQuery->insert($table, $arrValues);
* @param integer $order_id 受注ID
* @param integer $shipping_id 配送先ID
* @param array $arrParams 配送商品の配列
$objQuery = & SC_Query_Ex::getSingletonInstance();
$table = 'dtb_shipment_item';
$where = 'order_id = ? AND shipping_id = ?';
$objQuery->delete($table, $where, array($order_id, $shipping_id));
$objProduct = new SC_Product_Ex();
foreach ($arrParams as $arrValues) {
if (SC_Utils_Ex::isBlank($arrValues['product_class_id'])) {
$d = $objProduct->getDetailAndProductsClass($arrValues['product_class_id']);
$name = SC_Utils_Ex::isBlank($arrValues['product_name'])
: $arrValues['product_name'];
$code = SC_Utils_Ex::isBlank($arrValues['product_code'])
: $arrValues['product_code'];
$cname1 = SC_Utils_Ex::isBlank($arrValues['classcategory_name1'])
? $d['classcategory_name1']
: $arrValues['classcategory_name1'];
$cname2 = SC_Utils_Ex::isBlank($arrValues['classcategory_name2'])
? $d['classcategory_name2']
: $arrValues['classcategory_name2'];
$price = SC_Utils_Ex::isBlank($arrValues['price'])
$arrValues['order_id'] = $order_id;
$arrValues['shipping_id'] = $shipping_id;
$arrValues['product_name'] = $name;
$arrValues['product_code'] = $code;
$arrValues['classcategory_name1'] = $cname1;
$arrValues['classcategory_name2'] = $cname2;
$arrValues['price'] = $price;
$arrExtractValues = $objQuery->extractOnlyColsOf($table, $arrValues);
$objQuery->insert($table, $arrExtractValues);
* 引数の受注情報を受注テーブル及び受注詳細テーブルに登録する.
* 登録後, 受注一時テーブルに削除フラグを立てる.
* @param array $orderParams 登録する受注情報の配列
* @param SC_CartSession $objCartSession カート情報のインスタンス
* @param integer $cartKey 登録を行うカート情報のキー
$objQuery = & SC_Query_Ex::getSingletonInstance();
$unsets = array('mailmaga_flg', 'deliv_check', 'point_check', 'password',
'reminder', 'reminder_answer', 'mail_flag', 'session');
foreach ($unsets as $unset) {
unset ($orderParams[$unset]);
if(SC_Utils_Ex::isBlank($orderParams['status'])) {
$orderParams['status'] = ORDER_NEW;
$orderParams['create_date'] = 'CURRENT_TIMESTAMP';
$orderParams['update_date'] = 'CURRENT_TIMESTAMP';
$cartItems = $objCartSession->getCartList($cartKey);
$objProduct = new SC_Product_Ex();
foreach ($cartItems as $item) {
$p = & $item['productsClass'];
$arrDetail[$i]['order_id'] = $orderParams['order_id'];
$arrDetail[$i]['product_id'] = $p['product_id'];
$arrDetail[$i]['product_class_id'] = $p['product_class_id'];
$arrDetail[$i]['product_name'] = $p['name'];
$arrDetail[$i]['product_code'] = $p['product_code'];
$arrDetail[$i]['classcategory_name1'] = $p['classcategory_name1'];
$arrDetail[$i]['classcategory_name2'] = $p['classcategory_name2'];
$arrDetail[$i]['point_rate'] = $item['point_rate'];
$arrDetail[$i]['price'] = $item['price'];
$arrDetail[$i]['quantity'] = $item['quantity'];
if (!$objProduct->reduceStock($p['product_class_id'], $item['quantity'])) {
SC_Utils_Ex::sfDispSiteError(SOLD_OUT, "", true);
$objQuery->update("dtb_order_temp", array('del_flg' => 1),
array(SC_SiteSession_Ex::getUniqId()));
return $orderParams['order_id'];
* 既に受注IDが存在する場合は, 受注情報を更新する.
* 引数の受注IDが, 空白又は null の場合は, 新しく受注IDを発行して登録する.
* @param integer $order_id 受注ID
* @param array $arrParams 受注情報の連想配列
$objQuery = SC_Query_Ex::getSingletonInstance();
$arrValues = $objQuery->extractOnlyColsOf($table, $arrParams);
$exists = $objQuery->count($table, $where, array($order_id));
$arrValues['update_date'] = 'CURRENT_TIMESTAMP';
$objQuery->update($table, $arrValues, $where, array($order_id));
if (SC_Utils_Ex::isBlank($order_id)) {
$order_id = $objQuery->nextVal('dtb_order_order_id');
* 新規受付の場合は対応状況 null で insert し,
* sfUpdateOrderStatus で ORDER_NEW に変更する.
$status = $arrValues['status'];
$arrValues['status'] = null;
$arrValues['order_id'] = $order_id;
$arrValues['customer_id'] =
SC_Utils_Ex::isBlank($arrValues['customer_id'])
? 0 : $arrValues['customer_id'];
$arrValues['create_date'] = 'CURRENT_TIMESTAMP';
$arrValues['update_date'] = 'CURRENT_TIMESTAMP';
$objQuery->insert($table, $arrValues);
* 既に, 該当の受注が存在する場合は, 受注情報を削除し, 登録する.
* @param integer $order_id 受注ID
* @param array $arrParams 受注情報の連想配列
$table = 'dtb_order_detail';
$objQuery = SC_Query_Ex::getSingletonInstance();
$objQuery->delete($table, $where, array($order_id));
foreach ($arrParams as $arrDetail) {
$arrValues = $objQuery->extractOnlyColsOf($table, $arrDetail);
$arrValues['order_detail_id'] = $objQuery->nextVal('dtb_order_detail_order_detail_id');
$arrValues['order_id'] = $order_id;
$objQuery->insert($table, $arrValues);
* @param integer $order_id 受注ID
* @param integer $customer_id 顧客ID
function getOrder($order_id, $customer_id = null) {
$objQuery = & SC_Query_Ex::getSingletonInstance();
$arrValues = array($order_id);
if (!SC_Utils_Ex::isBlank($customer_id)) {
$where .= ' AND customer_id = ?';
$arrValues[] = $customer_id;
return $objQuery->getRow('*', 'dtb_order', $where, $arrValues);
* @param integer $order_id 受注ID
* @param boolean $has_order_status 対応状況, 入金日も含める場合 true
$objQuery = & SC_Query_Ex::getSingletonInstance();
$dbFactory = SC_DB_DBFactory_Ex::getInstance();
T3.product_class_id as product_class_id,
T3.product_type_id AS product_type_id,
T2.classcategory_name1 AS classcategory_name1,
T2.classcategory_name2 AS classcategory_name2,
$col .= 'T1.status AS status, T1.payment_date AS payment_date,';
SELECT * FROM dtb_products
WHERE product_id = T3.product_id
$col .= $dbFactory->getDownloadableDaysWhereSql('T1') . ' AS effective';
ON T1.order_id = T2.order_id
LEFT JOIN dtb_products_class T3
ON T2.product_class_id = T3.product_class_id
$objQuery->setOrder('T2.order_detail_id');
return $objQuery->select($col, $from, 'T1.order_id = ?', array($order_id));
* ダウンロード可能フラグを, 受注詳細に設定する.
* ダウンロード可能と判断されるのは, 以下の通り.
* 1. ダウンロード可能期限が期限内かつ, 入金日が入力されている
* 受注詳細行には, is_downloadable という真偽値が設定される.
if ($arrOrderDetail[$key]['price'] == '0') {
$arrOrderDetail[$key]['is_downloadable'] = true;
elseif ($arrOrderDetail[$key]['effective'] == '1'
&& !SC_Utils_Ex::isBlank($arrOrderDetail[$key]['payment_date'])) {
$arrOrderDetail[$key]['is_downloadable'] = true;
$arrOrderDetail[$key]['is_downloadable'] = false;
* @param integer $order_id 受注ID
* @param boolean $has_items 結果に配送商品も含める場合 true
$objQuery = & SC_Query_Ex::getSingletonInstance();
$objQuery->setOrder('shipping_id');
$arrShippings = $objQuery->select("*", "dtb_shipping", "order_id = ?",
// shipping_id ごとの配列を生成する
foreach ($arrShippings as $shipping) {
foreach ($shipping as $key => $val) {
$arrResults[$shipping['shipping_id']][$key] = $val;
$objProduct = new SC_Product_Ex();
foreach (array_keys($arrResults) as $shipping_id) {
$arrResults[$shipping_id]['shipment_item']
* @param integer $order_id 受注ID
* @param integer $shipping_id 配送先ID
* @param boolean $has_detail 商品詳細も取得する場合 true
* @return array 商品規格IDをキーにした配送商品の配列
$objQuery = & SC_Query_Ex::getSingletonInstance();
$objProduct = new SC_Product_Ex();
$arrItems = $objQuery->select("*", "dtb_shipment_item",
"order_id = ? AND shipping_id = ?",
array($order_id, $shipping_id));
foreach ($arrItems as $key => $arrItem) {
$product_class_id = $arrItem['product_class_id'];
foreach ($arrItem as $detailKey => $detailVal) {
$arrResults[$key][$detailKey] = $detailVal;
$arrResults[$key]['productsClass']
= & $objProduct->getDetailAndProductsClass($product_class_id);
* HTTP_USER_AGENT の種別により, 携帯電話の場合は携帯用の文面,
* PC の場合は PC 用の文面でメールを送信する.
* @param integer $orderId 受注ID
$mailHelper = new SC_Helper_Mail_Ex();
SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE ? 2 : 1;
$mailHelper->sfSendOrderMail($orderId, $template_id);
* 必ず呼び出し元でトランザクションブロックを開いておくこと。
* @param integer $orderId 注文番号
* @param integer|null$newStatus 対応状況 (null=変更無し)
* @param integer|null$newAddPoint 加算ポイント (null=変更無し)
* @param integer|null$newUsePoint 使用ポイント (null=変更無し)
* @param array $sqlval 更新後の値をリファレンスさせるためのパラメーター
function sfUpdateOrderStatus($orderId, $newStatus = null, $newAddPoint = null, $newUsePoint = null, &$sqlval) {
$objQuery = & SC_Query_Ex::getSingletonInstance();
$arrOrderOld = $objQuery->getRow('status, add_point, use_point, customer_id', 'dtb_order', 'order_id = ?', array($orderId));
$newStatus = $arrOrderOld['status'];
$newUsePoint = $arrOrderOld['use_point'];
$newAddPoint = $arrOrderOld['add_point'];
if (USE_POINT !== false) {
// 変更前の対応状況が利用対象の場合、変更前の使用ポイント分を戻す
$addCustomerPoint += $arrOrderOld['use_point'];
// 変更後の対応状況が利用対象の場合、変更後の使用ポイント分を引く
$addCustomerPoint -= $newUsePoint;
// 変更前の対応状況が加算対象の場合、変更前の加算ポイント分を戻す
$addCustomerPoint -= $arrOrderOld['add_point'];
// 変更後の対応状況が加算対象の場合、変更後の加算ポイント分を足す
$addCustomerPoint += $newAddPoint;
if ($addCustomerPoint != 0) {
$objQuery->update('dtb_customer', array('update_date' => 'CURRENT_TIMESTAMP'),
'customer_id = ?', array($arrOrderOld['customer_id']),
array('point' => 'point + ?'), array($addCustomerPoint));
if ($addCustomerPoint < 0) {
$sql = 'SELECT point FROM dtb_customer WHERE customer_id = ?';
$point = $objQuery->getOne($sql, array($arrOrderOld['customer_id']));
SC_Utils_Ex::sfDispSiteError(LACK_POINT);
if (USE_POINT !== false) {
$sqlval['add_point'] = $newAddPoint;
$sqlval['use_point'] = $newUsePoint;
// 対応状況が発送済みに変更の場合、発送日を更新
if ($arrOrderOld['status'] != ORDER_DELIV && $newStatus == ORDER_DELIV) {
$sqlval['commit_date'] = 'CURRENT_TIMESTAMP';
// 対応状況が入金済みに変更の場合、入金日を更新
elseif ($arrOrderOld['status'] != ORDER_PRE_END && $newStatus == ORDER_PRE_END) {
$sqlval['payment_date'] = 'CURRENT_TIMESTAMP';
$sqlval['status'] = $newStatus;
$sqlval['update_date'] = 'CURRENT_TIMESTAMP';
$dest = $objQuery->extractOnlyColsOf('dtb_order', $sqlval);
$objQuery->update('dtb_order', $dest, 'order_id = ?', array($orderId));
if($arrOrderOld['customer_id'] > 0 and $arrOrderOld['status'] != $newStatus){
SC_Customer_Ex::updateOrderSummary($arrOrderOld['customer_id']);
* @param integer $order_id 更新対象の注文番号
* @param boolean $temp_table 更新対象は「受注_Temp」か
$objQuery = & SC_Query_Ex::getSingletonInstance();
$tgt_table = 'dtb_order_temp';
$sql_where = 'order_temp_id = ?';
$tgt_table = 'dtb_order';
$sql_where = 'order_id = ?';
$objQuery->update('dtb_shipping', array(),
"(SELECT deliv_time FROM dtb_delivtime WHERE time_id = dtb_shipping.time_id AND deliv_id = dtb_shipping.deliv_id)"));
$objQuery->update($tgt_table, array(),
array('payment_method' =>
"(SELECT payment_method FROM dtb_payment WHERE payment_id = " . $tgt_table . ".payment_id)"));
* $status が null の場合は false を返す.
* @param integer $status 対応状況
* @return boolean 使用するか(会員テーブルから減算するか)
case ORDER_CANCEL: // キャンセル
* @param integer $status 対応状況
case ORDER_PAY_WAIT: // 入金待ち
case ORDER_PRE_END: // 入金済み
case ORDER_CANCEL: // キャンセル
case ORDER_BACK_ORDER: // 取り寄せ中
case ORDER_DELIV: // 発送済み
* 通常、受注処理(completeOrder)完了後に呼び出され、
* 決済モジュール画面から確認画面に「戻る」場合を考慮し、
* セッション情報を破棄しないカスタマイズを、モジュール側で
* @param integer $orderId 注文番号
* @param SC_CartSession $objCartSession カート情報のインスタンス
* @param SC_Customer $objCustomer SC_Customer インスタンス
* @param integer $cartKey 登録を行うカート情報のキー
function cleanupSession($orderId, &$objCartSession, &$objCustomer, $cartKey) {
$objCartSession->delAllProducts($cartKey);
SC_SiteSession_Ex::unsetUniqId();
$objCustomer->updateSession();
Documentation generated on Fri, 24 Feb 2012 14:02:48 +0900 by Seasoft
|