#!/usr/bin/perl
#--NetShopOwner-CGI-version:4.2.6.0--

;#
;# basket.cgi
;# [PC]カートの中画面
;# Copyright (c) 2004- Increment P Corp. All rights reserved.
;#
;# 2009/09/30 NSO4対応
;# last modified 2010/05/11 Y.motai SBPS決済対応
;#

use strict;
use uselib;
use defnsopath_shop;
use NsoVersionPC 1.00;
use Design::TemplBasket;
use Lib::SiteStatus;
use Lib::Basket;
use Lib::ExpensesGoods;
use Lib::StockUtil;

&ReadParse();
my %in    = %main::in;
my %incfn = %main::incfn;
my %inct  = %main::inct;

# インスタンス定義
my $objConfigSystem = Config::NsoSystem->newShop();
my $objConfigMaster = Config::NsoMaster->new();
my $NsoMisc       = NsoMisc->new();
my $ExpensesGoods;

# コンフィグレーションのキャッシュ
my %ConfigSystem = $objConfigSystem->cache_config();
my %ConfigMaster = $objConfigMaster->cache_config();

my $status_err;

FUNC:{
	my $func = $in{func} || 'main';
	my %function = (
		main       => \&main,
		insert     => \&insert,
		update     => \&update,
		delete_one => \&delete_one,
		delete_all => \&delete_all,
		logout     => \&logout,
	);
	
	&check_order_finish;
	&check_closing();
	
	if ($function{$func}){
		$function{$func}->();
	}else{
		&main();
	}
}
exit();

;#
;# 開店・閉店状態検査
;#
sub check_closing {
	my $SiteStatus = Lib::SiteStatus->new({ ConfigSystem=>\%ConfigSystem });
	$SiteStatus->CheckClosing();
}

;#
;# メイン処理
;#
sub main {

	# 商品代金・諸経費演算
	$ExpensesGoods = Lib::ExpensesGoods->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster });
	my $eg_err = $ExpensesGoods->ParseBasket();

	# エラーメッセージを取得
	my $status_err_param = $in{ErrorStatus};
	$status_err .= &error_message( $status_err_param ) if ( $status_err_param );

	if($eg_err ne ""){
		$status_err .= $eg_err;
	}

	# システムテンプレートクラスインスタンス
	my $TemplBasket  = Design::TemplBasket->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster, KickBack=>$in{KickBack}, ExpensesGoods=>$ExpensesGoods, status_err=>$status_err, insert=>$in{fc}, GoodsID=>$in{GoodsID} });
	
	# 置換内容
	my $contents = $TemplBasket->RelpaceSystemTempl();
	
	# システムテンプレート置換
	print $NsoMisc->print_header();
	print $contents;
	exit();
}

;#
;# 商品追加
;#
sub insert {
	my $Basket = Lib::Basket->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster });
	my %params = (
		CategoryID => $in{CategoryID},
		GoodsID    => $in{GoodsID},
		Units      => $in{Units},
		Variation1 => $in{Variation1},
		Variation2 => $in{Variation2},
		Variation3 => $in{Variation3},
		Variation4 => $in{Variation4},
		BackUrl    => $in{KickBack},
	);
	$status_err = $Basket->Insert(\%params);
	&main();
}

;#
;# 商品更新
;#
sub update {
	my $Basket = Lib::Basket->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster });
	my %params = (
		BasketID   => $in{BasketID},
		CategoryID => $in{CategoryID},
		GoodsID    => $in{GoodsID},
		Units      => $in{Units},
		Variation1 => $in{Variation1},
		Variation2 => $in{Variation2},
		Variation3 => $in{Variation3},
		Variation4 => $in{Variation4},
	);
	$status_err = $Basket->Update(\%params);
	&main();
}

;#
;# 1商品削除
;#
sub delete_one {
	my $Basket = Lib::Basket->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster });
	my %params = (
		BasketID   => $in{BasketID},
	);
	$Basket->DeleteOne(\%params);
}

;#
;# 全商品削除
;#
sub delete_all {
	my $Basket = Lib::Basket->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster });
	my %params = ();
	$Basket->DeleteAll(\%params);
}

;#
;# iPCOSSチェック処理
;#
sub check_order_finish {
	# 注文IDクッキー読み取り
	require DB::NsoOrderIDDB;
	my $OrderIdDB = NsoOrderIDDB->new();
	my $OrderID   = $OrderIdDB->Read_OrderID();

	# 注文IDクッキーが残っていた場合
	if ($OrderID ne ""){
		require Lib::IpcossCheck;
		my $IpcossCheck = Lib::IpcossCheck->new( {ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster, ExpensesGoods=>$ExpensesGoods} );
		# ipcoss Checkを行う。
		my $IpcCheckFlag = $IpcossCheck->check_ipcoss();
		# okとngの場合の処理
		if ($IpcCheckFlag eq 0){
			# ngだったときの処理
			$IpcossCheck->ipcoss_ng();
		} else {
			# ok だったときの処理
			my $contents = $IpcossCheck->RelpaceSystemTempl();
			print $NsoMisc->print_header();
			print $contents;
			exit ();
		}
	}
}

;#
;# ログアウト処理
;#
sub logout {
	# ログイン情報を削除
	require DB::NsoLoginTempDB;
	my $LoginTempDB = NsoLoginTempDB->new();
	$LoginTempDB->delete_no_lock();

	# ログイン用Cookieを削除
	$LoginTempDB->delete_cookie();
	
	# 注文情報を削除
	require DB::NsoOrderTempDB;
	my $OrderTempDB = NsoOrderTempDB->new();
	$OrderTempDB->delete_no_lock();
	
	# 注文情報用Cookieを削除
	$OrderTempDB->delete_cookie();
	
	&main();
}

;#
;# エラーメッセージ取得処理
;#
sub error_message {

	my %ErrorMessageHash = (
		login_error						=> qq(<p>メールアドレスまたはパスワードに誤りがあります。<br>よくお確かめの上、もう一度入力してください。</p>),
		logged_in_error					=> qq(<p>会員情報が見つかりませんでした。</p>),
		no_approval_member				=> qq(<p>まだ、会員登録が承認されていません。承認するまで、今しばらくお待ちください。</p>),
		logged_in_no_approval_member	=> qq(<p>会員登録が承認されていません。</p>),
		logged_in						=> qq(<p>ログインしてからしばらく時間が経ったため、ログインの有効期限が過ぎています。<br>お手数ですが、もう一度ログインしてください。</p>),
		no_member_service				=> qq(<p>現在、会員サービスは使用できません。</p>),
		only_member_service				=> qq(<p>申\し訳ございませんが、ご購入は会員のお客様に限らせていただいております。</p>),
		no_orderTemp					=> qq(<p>しばらく時間が経ったため、有効期限が過ぎています。<br>お手数ですが、もう一度購入手続きを行ってください。</p>),
		same_period_id_error			=> qq(<p>お手数ですが、もう一度購入手続きを行ってください。</p>),
		db_access_error101				=> qq(<p>データベース接続中にエラーが発生しました。(エラーコード：101)<br>お手数ですが、ショップ運営者へお問い合わせください。</p>),
		db_access_error102				=> qq(<p>データベース接続中にエラーが発生しました。(エラーコード：102)<br>お手数ですが、ショップ運営者へお問い合わせください。</p>),
		db_access_error103				=> qq(<p>データベース接続中にエラーが発生しました。(エラーコード：103)<br>お手数ですが、ショップ運営者へお問い合わせください。</p>),

		# SBPS用決済用エラーコード(Basketにリダイレクト系)
		sbps_logged_in_error				=> qq(<p>会員情報が見つかりませんでした。（sbps_error）</p>),
		sbps_logged_in_no_approval_member	=> qq(<p>会員登録が承認されていません。（sbps_error）</p>),
		sbps_logged_in						=> qq(<p>ログインしてからしばらく時間が経ったため、ログインの有効期限が過ぎています。<br>お手数ですが、もう一度ログインしてください。（sbps_error）</p>),
		sbps_no_member_service				=> qq(<p>現在、会員サービスは使用できません。（sbps_error）</p>),
		sbps_only_member_service			=> qq(<p>申\し訳ございませんが、ご購入は会員のお客様に限らせていただいております。（sbps_error）</p>),
		sbps_no_orderTemp					=> qq(<p>しばらく時間が経ったため、有効期限が過ぎています。<br>お手数ですが、もう一度購入手続きを行ってください。（sbps_error）</p>),
		sbps_same_period_id_error			=> qq(<p>お手数ですが、もう一度購入手続きを行ってください。（sbps_error）</p>),
		sbps_db_access_error101				=> qq(<p>データベース接続中にエラーが発生しました。(エラーコード：101)<br>お手数ですが、ショップ運営者へお問い合わせください。（sbps_error）</p>),
		sbps_db_access_error102				=> qq(<p>データベース接続中にエラーが発生しました。(エラーコード：102)<br>お手数ですが、ショップ運営者へお問い合わせください。（sbps_error）</p>),
		sbps_req_method_error               => qq(<p>SBPS決済が正常に完了しませんでした。<br />メソ\ッドが不正です。（sbps_error）</p>),
		sbps_common_error					=> qq(<p>SBPS決済が正常に完了しませんでした。</p>),
	);

	my $error_code = shift @_;
	return ( exists $ErrorMessageHash{$error_code} )? $ErrorMessageHash{$error_code}: qq();
}


















