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

;#
;# order2.cgi
;# [PC]注文者情報確認画面
;# Copyright (c) 2004- Increment P Corp. All rights reserved.
;#
;# 2009/09/30 NSO4対応
;# last modified 2010/04/22 T.Hinohara SBPS決済対応
;#

use strict;
use uselib;
use defnsopath_shop;
use NsoVersionPC 1.00;
use Design::TemplOrder2;
use Lib::SiteStatus;
use Lib::ExpensesGoods;

&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 $SamePeriodID    = "";	# 同期ID
my $PossessionPoint = 0;	# 保有ポイント数
my $PointExpireDate = "";	# ポイント有効期限

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

my $status_err;

FUNC:{
	my $func = $in{func} || 'main';
	my %function = (
		main       => \&main,
	);

	&check_order_finish;
	&check_member_order();
	&check_request_method();
	&check_http_referer();
	&check_closing();
	
	if ($function{$func}){
		$function{$func}->();
	}else{
		&main();
	}
}
exit();

;#
;# リクエストメソッド検査
;#
sub check_request_method {
	unless ($ENV{REQUEST_METHOD} eq 'POST'){
		my $order1URL = $ConfigSystem{base_href}{cgishop}.$ConfigSystem{shop_script_name}{order1};
		my $queryString = ( $SamePeriodID ne "" )?
		                    $NsoMisc->make_query_string({ func=>'logged_in' }, 'get'): '';
		print $NsoMisc->redirect( join("", $NsoMisc->getChangedURL({url=>$order1URL, key=>'AfterCart'}), $queryString) );
		exit();
	}
}

;#
;# HTTP_REFERER検査
;#
sub check_http_referer {
	return if( !$ConfigSystem{Default}{Referer}{Check} );
	my $cgiroot =  $NsoMisc->getChangedURL({url=>$ConfigSystem{base_href}{cgishop}, key=>'AfterCart'});
	my $order1URL = $ConfigSystem{base_href}{cgishop}.$ConfigSystem{shop_script_name}{order1};
	
	unless ($ENV{HTTP_REFERER} =~ /$cgiroot/i){
		my $queryString = ( $SamePeriodID ne "" )?
		                    $NsoMisc->make_query_string({ func=>'logged_in' }, 'get'): '';
		print $NsoMisc->redirect( join("", $NsoMisc->getChangedURL({url=>$order1URL, key=>'AfterCart'}), $queryString) );
		exit();
	}
}

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

;#
;# メイン処理
;#
sub main {
	# 都道府県ID
	my $StateID = ($in{DeliveryFlag}) ? $in{OrderPersonStateID} : $in{OrderDeliveryStateID};
	
	# 商品代金・諸経費演算
	my $isMember = ( $SamePeriodID eq "" )? 0: 1;
	my $ExpensesGoods = Lib::ExpensesGoods->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster, StateID=>$StateID, PaymentClassID=>$in{PaymentClassID},
                                                  IsMember=>$isMember, 					# 会員フラグ
                                                  PossessionPoint=>$PossessionPoint,	# 保有ポイント
                                                  PointExpireDate=>$PointExpireDate });	# ポイント有効期限
	
	# システムテンプレートクラスインスタンス
	my $TemplOrder2  = Design::TemplOrder2->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster, KickBack=>$in{KickBack}, ExpensesGoods=>$ExpensesGoods, status_err=>$status_err, Query=>\%in, SamePeriodID=>$SamePeriodID });
	
	# 置換内容
	my $contents = $TemplOrder2->RelpaceSystemTempl();
	
	# システムテンプレート置換
	print $NsoMisc->print_header();
	print $contents;
	exit();
}

;#
;# 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 check_member_order {

	my $orderSamePeriodID = "";
	my $loginSamePeriodID = "";

	# 注文情報を取得
	require DB::NsoOrderTempDB;
	my %where = ( OrderTempID=>1 );
	my $OrderTempDB = NsoOrderTempDB->new();
	$OrderTempDB->load_data_no_lock({ where=>\%where });

	# 2010/04/22 T.Hinohara start
	# Cookieの有効期限を更新
	$OrderTempDB->update_expiration_cookie();
	# 注文情報DBを更新(最終更新日時変更のため)
	$OrderTempDB->update_no_lock();
	# 2010/04/22 T.Hinohara end

	# 注文情報が存在しない場合、カート画面へ
	if ( $OrderTempDB->{RecordCount} == 0 ) {
		&redirectBasketUrl({ ErrorStatus=>'no_orderTemp' });
	}
	
	my @arrOrderTemp = @{$OrderTempDB->{RecordList}};
	my %recOrderTemp = %{$arrOrderTemp[0]};
	$orderSamePeriodID = $recOrderTemp{SamePeriodID};
	
	if ( $orderSamePeriodID eq "" ) {	# 同期IDが存在しない場合
	
		# 会員機能使用有無/会員制設定を取得
		my $memberUseFlag      = $ConfigMaster{adm_member_master}{member}{UseFlag};
		my $memberSubscription = $ConfigMaster{adm_member_master}{member}{Subscription};

		# 会員機能使用 かつ 会員のみ購入可能な場合、カート画面へ
		if ( $memberUseFlag == 1 and $memberSubscription == 1 ) {
			&redirectBasketUrl({ ErrorStatus=>'only_member_service' });
		}
	} else {	# 同期IDが存在する場合
	
		# 会員機能使用有無を取得
		my $memberUseFlag = $ConfigMaster{adm_member_master}{member}{UseFlag};

		# 会員機能未使用の場合、カート画面へ
		if ( $memberUseFlag == 0 ) {
			&redirectBasketUrl({ ErrorStatus=>'no_member_service' });
		}
		
		# ログイン情報を取得
		require DB::NsoLoginTempDB;
		my %where = ( LoginTempID=>1 );
		my $LoginTempDB = NsoLoginTempDB->new();
		$LoginTempDB->load_data_no_lock({ where=>\%where });
		
		# ログイン情報が存在しない場合、カート画面へ
		if ( $LoginTempDB->{RecordCount} == 0 ) {
			&redirectBasketUrl({ ErrorStatus=>'logged_in' });
		}
		
		my @arrLoginTemp = @{$LoginTempDB->{RecordList}};
		my %recLoginTemp = %{$arrLoginTemp[0]};
		$loginSamePeriodID = $recLoginTemp{SamePeriodID};
		
		# 注文情報とログイン情報の同期IDが異なる場合、カート画面へ
		if ( $orderSamePeriodID ne $loginSamePeriodID ) {
			&redirectBasketUrl({ ErrorStatus=>'same_period_id_error' });
		}
		
		# 会員情報を取得 (SamePeriodID)
		require DB::NsoMemberDB;
		my $MemberDB = NsoMemberDB->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster });
		if ( $MemberDB->{resultDbConnect} ne "" ) {
			&redirectBasketUrl({ ErrorStatus=>'db_access_error101' });
		}
		my %resultMemberDB = $MemberDB->Member_Select_ID_Query({ SamePeriodID=>$loginSamePeriodID });
		if ( $resultMemberDB{status_err} ne "" ) {
			&redirectBasketUrl({ ErrorStatus=>'db_access_error102' });
		}
		
		# 会員情報が取得できなかった場合、カート画面へ
		if ( $resultMemberDB{RecordCount} == 0 ) {
			&redirectBasketUrl({ ErrorStatus=>'logged_in_error' });
		}
		my %recMember = %{$resultMemberDB{RecordList}};
		
		# 会員区分＝承認待ちの場合、カート画面へ
		unless ( $recMember{MemberFlag} == 3 ) {
			&redirectBasketUrl({ ErrorStatus=>'logged_in_no_approval_member' });
		}
		
		# ログイン情報を更新(最終更新日時変更のため)
		$LoginTempDB->update_no_lock(\%recLoginTemp);
		
		# Cookieの有効期限を更新
		$LoginTempDB->update_expiration_cookie();
		
		# 同期IDを保持
		$SamePeriodID = $loginSamePeriodID;
		# 保有ポイント数を保持
		$PossessionPoint = $recMember{Point};
		# ポイント有効期限を保持
		$PointExpireDate = $recMember{PointExpireDate};
	}
}

;#
;# カート画面へリダイレクト
;#
sub redirectBasketUrl {
	my ($queryHash) = shift if @_;
	
	# カート画面ページURL
	my $basketUrl = $ConfigSystem{base_href}{cgishop}.$ConfigSystem{shop_script_name}{basket};
	# SSL状況に応じてURLを置換する
	$basketUrl = $NsoMisc->getChangedURL({url=>$basketUrl, key=>'AfterCart'});

	my $queryString = $NsoMisc->make_query_string($queryHash, 'get');

	print $NsoMisc->redirect(join("", $basketUrl, $queryString));
	exit();
}












