tpl_mainpage = "shopping/payment.tpl";
$this->tpl_column_num = 1;
$this->tpl_onload = "fnCheckInputPoint(); fnSetDelivTime('payment','payment_id','deliv_time_id');";
$this->tpl_title = "お支払方法・お届け時間等の指定";
}
/**
* Page のプロセス.
*
* @return void
*/
function process() {
global $objCampaignSess;
$objView = new SC_SiteView();
$objSiteSess = new SC_SiteSession();
$objCartSess = new SC_CartSession();
$objCampaignSess = new SC_CampaignSession();
$objDb = new SC_Helper_DB_Ex();
$this->objCustomer = new SC_Customer();
// パラメータ管理クラス
$this->objFormParam = new SC_FormParam();
// パラメータ情報の初期化
$this->lfInitParam();
// POST値の取得
$this->objFormParam->setParam($_POST);
// ユーザユニークIDの取得と購入状態の正当性をチェック
$uniqid = SC_Utils_Ex::sfCheckNormalAccess($objSiteSess, $objCartSess);
// ユニークIDを引き継ぐ
$this->tpl_uniqid = $uniqid;
//ダウンロード商品判定
$this->cartdown = $objDb->chkCartDown($objCartSess);
// 会員ログインチェック
if($this->objCustomer->isLoginSuccess()) {
$this->tpl_login = '1';
$this->tpl_user_point = $this->objCustomer->getValue('point');
//戻り先URL
if ($this->cartdown == 2) {
// ダウンロード商品のみの場合はカート画面へ戻る
$this->tpl_back_url = URL_CART_TOP;
} else {
$this->tpl_back_url = URL_DELIV_TOP;
}
} else {
$this->tpl_back_url = URL_SHOP_TOP . "?from=nonmember";
}
// 一時受注テーブルの読込
$arrOrderTemp = $objDb->sfGetOrderTemp($uniqid);
//不正遷移チェック(正常に受注情報が格納されていない場合は一旦カート画面まで戻す)
if (!$arrOrderTemp) {
$this->sendRedirect($this->getLocation(URL_CART_TOP));
exit;
}
// カート内商品の集計処理を行う
$objDb->sfTotalCart($this, $objCartSess);
if (strlen($this->tpl_message) >= 1) {
SC_Utils_Ex::sfDispSiteError(SOLD_OUT, '', true);
}
$this->arrData = $objDb->sfTotalConfirm(array(), $this, $objCartSess);
if (!isset($_POST['mode'])) $_POST['mode'] = "";
switch($_POST['mode']) {
case 'confirm':
// 入力値の変換
$this->objFormParam->convParam();
$this->arrErr = $this->lfCheckError($this->arrData);
// 入力エラーなし
if(count($this->arrErr) == 0) {
// DBへのデータ登録
$this->lfRegistData($uniqid);
// 正常に登録されたことを記録しておく
$objSiteSess->setRegistFlag();
// 確認ページへ移動
$this->sendRedirect($this->getLocation(URL_SHOP_CONFIRM, array(), true));
exit;
}else{
// ユーザユニークIDの取得
$uniqid = $objSiteSess->getUniqId();
// 受注一時テーブルからの情報を格納
$this->lfSetOrderTempData($uniqid);
}
break;
// 前のページに戻る
case 'return':
// 非会員の場合
// 正常な推移であることを記録しておく
$objSiteSess->setRegistFlag();
$this->sendRedirect(URL_SHOP_TOP);
exit;
break;
// 支払い方法が変更された場合
case 'payment':
// 配送時間の配列を生成
$this->lfSetDelivTime();
break;
default:
// 受注一時テーブルからの情報を格納
$this->lfSetOrderTempData($uniqid);
break;
}
// 購入金額の取得得
$total_pretax = $objCartSess->getAllProductsTotal();
// 支払い方法の取得
$this->arrPayment = $this->lfGetPayment($total_pretax);
// 支払い方法の画像があるなしを取得($img_show true:ある false:なし)
$this->img_show = $this->lfGetImgShow($this->arrPayment);
// お届け日一覧の取得
$this->arrDelivDate = $this->lfGetDelivDate();
$this->arrForm = $this->objFormParam->getFormParamList();
$objView->assignobj($this);
// フレームを選択(キャンペーンページから遷移なら変更)
$objCampaignSess->pageView($objView);
}
/**
* モバイルページを初期化する.
*
* @return void
*/
function mobileInit() {
$this->init();
}
/**
* Page のプロセス(モバイル).
*
* @return void
*/
function mobileProcess() {
$objView = new SC_MobileView();
$objSiteSess = new SC_SiteSession();
$objCartSess = new SC_CartSession();
$this->objCustomer = new SC_Customer();
$objDb = new SC_Helper_DB_Ex();
// パラメータ管理クラス
$this->objFormParam = new SC_FormParam();
// パラメータ情報の初期化
$this->lfInitParam();
// POST値の取得
$this->objFormParam->setParam($_POST);
// ユーザユニークIDの取得と購入状態の正当性をチェック
$uniqid = SC_Utils_Ex::sfCheckNormalAccess($objSiteSess, $objCartSess);
// ユニークIDを引き継ぐ
$this->tpl_uniqid = $uniqid;
//ダウンロード商品判定
$this->cartdown = $objDb->chkCartDown($objCartSess);
// 会員ログインチェック
if($this->objCustomer->isLoginSuccess(true)) {
$this->tpl_login = '1';
$this->tpl_user_point = $this->objCustomer->getValue('point');
}
// 一時受注テーブルの読込
$arrOrderTemp = $objDb->sfGetOrderTemp($uniqid);
//不正遷移チェック(正常に受注情報が格納されていない場合は一旦カート画面まで戻す)
if (!$arrOrderTemp) {
$this->sendRedirect($this->getLocation(MOBILE_URL_CART_TOP));
exit;
}
// 金額の取得 (購入途中で売り切れた場合にはこの関数内にてその商品の数量が0になる)
$objDb->sfTotalCart($this, $objCartSess);
if (strlen($this->tpl_message) >= 1) {
SC_Utils_Ex::sfDispSiteError(SOLD_OUT, '', true);
}
$this->arrData = $objDb->sfTotalConfirm(array(), $this, $objCartSess);
if (!isset($_POST['mode'])) $_POST['mode'] = "";
// 戻るボタンの処理
if (!empty($_POST['return'])) {
switch ($_POST['mode']) {
case 'confirm':
$_POST['mode'] = 'payment';
break;
default:
// 正常な推移であることを記録しておく
$objSiteSess->setRegistFlag();
if ($this->cartdown == 2) {
// ダウンロード商品のみの場合はカート画面へ戻る
$this->sendRedirect($this->getLocation(MOBILE_URL_CART_TOP), true);
} else {
$this->sendRedirect(MOBILE_URL_SHOP_TOP, true);
}
exit;
}
}
// ダウンロード商品のみで、モードがお届け日時指定の場合はモードを変更
if ($this->cartdown == 2 && $_POST['mode'] == 'deliv_date') {
$_POST['mode'] = 'confirm';
}
switch($_POST['mode']) {
// 支払い方法指定 → お届け日時指定
case 'deliv_date':
// 入力値の変換
$this->objFormParam->convParam();
$this->arrErr = $this->lfCheckError($this->arrData);
if (!isset($this->arrErr['payment_id'])) {
// 支払い方法の入力エラーなし
$this->tpl_mainpage = 'shopping/deliv_date.tpl';
$this->tpl_title = "お届け日時指定";
break;
} else {
// ユーザユニークIDの取得
$uniqid = $objSiteSess->getUniqId();
// 受注一時テーブルからの情報を格納
$this->lfSetOrderTempData($uniqid);
}
break;
case 'confirm':
// 入力値の変換
$this->objFormParam->convParam();
$this->arrErr = $this->lfCheckError($this->arrData);
// 入力エラーなし
if(count($this->arrErr) == 0) {
// DBへのデータ登録
$this->lfRegistData($uniqid);
// 正常に登録されたことを記録しておく
$objSiteSess->setRegistFlag();
// 確認ページへ移動
$this->sendRedirect($this->getLocation(MOBILE_URL_SHOP_CONFIRM), true);
exit;
}else{
// ユーザユニークIDの取得
$uniqid = $objSiteSess->getUniqId();
// 受注一時テーブルからの情報を格納
$this->lfSetOrderTempData($uniqid);
if (!isset($this->arrErr['payment_id'])) {
// 支払い方法の入力エラーなし
$this->tpl_mainpage = 'shopping/deliv_date.tpl';
$this->tpl_title = "お届け日時指定";
}
}
break;
// 前のページに戻る
case 'return':
// 非会員の場合
// 正常な推移であることを記録しておく
$objSiteSess->setRegistFlag();
$this->sendRedirect(MOBILE_URL_SHOP_TOP, true);
exit;
break;
// 支払い方法が変更された場合
case 'payment':
// ここのbreakは、意味があるので外さないで下さい。
break;
default:
// 受注一時テーブルからの情報を格納
$this->lfSetOrderTempData($uniqid);
break;
}
// 購入金額の取得得
$total_pretax = $objCartSess->getAllProductsTotal();
// 支払い方法の取得
$this->arrPayment = $this->lfGetPayment($total_pretax);
// お届け時間の取得
$arrRet = $objDb->sfGetDelivTime($this->objFormParam->getValue('payment_id'));
$this->arrDelivTime = SC_Utils_Ex::sfArrKeyValue($arrRet, 'time_id', 'deliv_time');
// お届け日一覧の取得
$this->arrDelivDate = $this->lfGetDelivDate();
$this->arrForm = $this->objFormParam->getFormParamList();
$objView->assignobj($this);
$objView->display(SITE_FRAME);
}
/**
* デストラクタ.
*
* @return void
*/
function destroy() {
parent::destroy();
}
/* パラメータ情報の初期化 */
function lfInitParam() {
$this->objFormParam->addParam("お支払い方法", "payment_id", INT_LEN, "n", array("EXIST_CHECK", "MAX_LENGTH_CHECK", "NUM_CHECK"));
$this->objFormParam->addParam("ポイント", "use_point", INT_LEN, "n", array("MAX_LENGTH_CHECK", "NUM_CHECK", "ZERO_START"));
$this->objFormParam->addParam("お届け時間", "deliv_time_id", INT_LEN, "n", array("MAX_LENGTH_CHECK", "NUM_CHECK"));
$this->objFormParam->addParam("ご質問", "message", LTEXT_LEN, "KVa", array("SPTAB_CHECK", "MAX_LENGTH_CHECK"));
$this->objFormParam->addParam("ポイントを使用する", "point_check", INT_LEN, "n", array("MAX_LENGTH_CHECK", "NUM_CHECK"), '2');
$this->objFormParam->addParam("お届け日", "deliv_date", STEXT_LEN, "KVa", array("MAX_LENGTH_CHECK"));
}
function lfGetPayment($total_pretax) {
$objQuery = new SC_Query();
$objQuery->setOrder("rank DESC");
//削除されていない支払方法を取得
$where = "del_flg = 0 AND deliv_id IN (SELECT deliv_id FROM dtb_deliv WHERE del_flg = 0) ";
//ダウンロード商品の有無判定
if($this->cartdown != 0){
//ダウンロード商品を含む場合は、クレジット決済以外は選択できない。
$where .= "AND payment_id = " . CREDIT_PAYMENT;
}
// 削除されていない支払方法を取得
$arrRet = $objQuery->select("payment_id, payment_method, rule, upper_rule, note, payment_image", "dtb_payment", $where);
// 配列初期化
$data = array();
// 選択可能な支払方法を判定
foreach($arrRet as $data) {
//ダウンロード販売に対する注意追加
if($this->cartdown != 0){
$data['payment_method'] = $data['payment_method'] . " (ダウンロード商品を含む場合、クレジット決済のみ選択可能です)";
}
// 下限と上限が設定されている
if (strlen($data['rule']) != 0 && strlen($data['upper_rule']) != 0) {
if ($data['rule'] <= $total_pretax && $data['upper_rule'] >= $total_pretax) {
$arrPayment[] = $data;
}
}
// 下限のみ設定されている
elseif (strlen($data['rule']) != 0) {
if($data['rule'] <= $total_pretax) {
$arrPayment[] = $data;
}
}
// 上限のみ設定されている
elseif (strlen($data['upper_rule']) != 0) {
if($data['upper_rule'] >= $total_pretax) {
$arrPayment[] = $data;
}
}
// いずれも設定なし
else {
$arrPayment[] = $data;
}
}
return $arrPayment;
}
/* 入力内容のチェック */
function lfCheckError($arrData) {
// 入力データを渡す。
$arrRet = $this->objFormParam->getHashArray();
$objErr = new SC_CheckError($arrRet);
$objErr->arrErr = $this->objFormParam->checkError();
if (USE_POINT === false) {
$_POST['point_check'] = "";
$_POST['use_point'] = "0";
}
if (!isset($_POST['point_check'])) $_POST['point_check'] = "";
if($_POST['point_check'] == '1') {
$objErr->doFunc(array("ポイントを使用する", "point_check"), array("EXIST_CHECK"));
$objErr->doFunc(array("ポイント", "use_point"), array("EXIST_CHECK"));
$max_point = $this->objCustomer->getValue('point');
if($max_point == "") {
$max_point = 0;
}
// FIXME mobile 互換のため br は閉じない...
if($arrRet['use_point'] > $max_point) {
$objErr->arrErr['use_point'] = "※ ご利用ポイントが所持ポイントを超えています。
";
}
if(($arrRet['use_point'] * POINT_VALUE) > $arrData['subtotal']) {
$objErr->arrErr['use_point'] = "※ ご利用ポイントがご購入金額を超えています。
";
}
}
$objCartSess = new SC_CartSession();
// 購入金額の取得得
$total_pretax = $objCartSess->getAllProductsTotal();
// 支払い方法の取得
$arrPayment = $this->lfGetPayment($total_pretax);
$pay_flag = true;
foreach ($arrPayment as $key => $payment) {
if ($payment['payment_id'] == $arrRet['payment_id']) {
$pay_flag = false;
break;
}
}
if ($pay_flag && $arrRet['payment_id'] != "") {
SC_Utils_Ex::sfDispSiteError(CUSTOMER_ERROR);
}
return $objErr->arrErr;
}
/* 支払い方法文字列の取得 */
function lfGetPaymentInfo($payment_id) {
$objQuery = new SC_Query();
$where = "payment_id = ?";
$arrRet = $objQuery->select("charge, deliv_id", "dtb_payment", $where, array($payment_id));
return (array($arrRet[0]['charge'], $arrRet[0]['deliv_id']));
}
/* DBへデータの登録 */
function lfRegistData($uniqid) {
$objDb = new SC_Helper_DB_Ex();
$sqlval = $this->objFormParam->getDbArray();
// 登録データの作成
$sqlval['order_temp_id'] = $uniqid;
$sqlval['update_date'] = 'Now()';
if (strlen($sqlval['payment_id']) >= 1) {
list($sqlval['charge'], $sqlval['deliv_id']) = $this->lfGetPaymentInfo($sqlval['payment_id']);
}
// 使用ポイントの設定
if($sqlval['point_check'] != '1') {
$sqlval['use_point'] = 0;
}
// 受注_Tempテーブルに登録
$objDb->sfRegistTempOrder($uniqid, $sqlval);
}
/* お届け日一覧を取得する */
function lfGetDelivDate() {
$objCartSess = new SC_CartSession();
$objQuery = new SC_Query();
// 商品IDの取得
$max = $objCartSess->getMax();
for($i = 1; $i <= $max; $i++) {
if($_SESSION[$objCartSess->key][$i]['id'][0] != "") {
$arrID['product_id'][$i] = $_SESSION[$objCartSess->key][$i]['id'][0];
}
}
if(count($arrID['product_id']) > 0) {
$id = implode(",", $arrID['product_id']);
//商品から発送目安の取得
$deliv_date = $objQuery->get("dtb_products", "MAX(deliv_date_id)", "product_id IN (".$id.")");
//発送目安
switch($deliv_date) {
//即日発送
case '1':
$start_day = 1;
break;
//1-2日後
case '2':
$start_day = 3;
break;
//3-4日後
case '3':
$start_day = 5;
break;
//1週間以内
case '4':
$start_day = 8;
break;
//2週間以内
case '5':
$start_day = 15;
break;
//3週間以内
case '6':
$start_day = 22;
break;
//1ヶ月以内
case '7':
$start_day = 32;
break;
//2ヶ月以降
case '8':
$start_day = 62;
break;
//お取り寄せ(商品入荷後)
case '9':
$start_day = "";
break;
default:
//お届け日が設定されていない場合
$start_day = "";
break;
}
//お届け可能日のスタート値から、お届け日の配列を取得する
$arrDelivDate = $this->lfGetDateArray($start_day, DELIV_DATE_END_MAX);
}
return $arrDelivDate;
}
//お届け可能日のスタート値から、お届け日の配列を取得する
function lfGetDateArray($start_day, $end_day) {
$masterData = new SC_DB_MasterData();
$arrWDAY = $masterData->getMasterData("mtb_wday");
//お届け可能日のスタート値がセットされていれば
if($start_day >= 1) {
$now_time = time();
$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) = split(" ", date("y m d w", $tmp_time));
$val = sprintf("%02d/%02d/%02d(%s)", $y, $m, $d, $arrWDAY[$w]);
$arrDate[$val] = $val;
}
} else {
$arrDate = false;
}
return $arrDate;
}
//一時受注テーブルからの情報を格納する
function lfSetOrderTempData($uniqid) {
$objQuery = new SC_Query();
$col = "payment_id, use_point, deliv_time_id, message, point_check, deliv_date";
$from = "dtb_order_temp";
$where = "order_temp_id = ?";
$arrRet = $objQuery->select($col, $from, $where, array($uniqid));
// DB値の取得
$this->objFormParam->setParam($arrRet[0]);
return $this->objFormParam;
}
/* 支払い方法の画像があるなしを取得($img_show true:ある false:なし) */
function lfGetImgShow($arrPayment) {
$img_show = false;
foreach ($this->arrPayment as $payment) {
if (strlen($payment["payment_image"]) > 0 ){
$img_show = true;
break;
}
}
return $img_show;
}
/* 配送時間の配列を生成 */
function lfSetDelivTime() {
$objDb = new SC_Helper_DB_Ex();
$objJson = new Services_JSON;
// 配送時間の取得
$arrRet = $objDb->sfGetDelivTime($this->objFormParam->getValue('payment_id'));
// JSONエンコード
echo $objJson->encode($arrRet);
exit;
}
}
?>