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

;#
;# dbgw_relay.cgi
;# DB接続中継モジュール
;# Copyright (c) 2004- Increment P Corp. All rights reserved
;#
;# 2009/09/30 NSO4対応
;# 2010/02/24 Y.Motai NSO4【NSO4 変更依頼票 No.005】修正
;# last modified 2010/06/25 DVC3対応
;#

use strict;
use uselib;
use defnsopath_shop;
use NsoVersionPC 1.00;
use Lib::DbConnect;
use NsoSyncRelayCall;
use NsoCsvCapcher;
use Digest::MD5 'md5_hex';

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

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

my $DbConnect = Lib::DbConnect->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster});
my $NsoSyncRelayCall = NsoSyncRelayCall->new();
my $NsoCsvCapcher = NsoCsvCapcher->new();

#----- 各種パス -----#
# 商品情報ファイルのパス
my $goods_pass = "./nsoDB/goods/";
# その他CSVファイルのパス
my $csv_pass = "./nsoDB/sync/";

my $LockDir   = "./nsoDB/lock/";
my $Lock      = "dbgw_relay.cgi.lock";
# ロック時間5分
my $LockLimit = 5 * 60;
my $LockFlag  = 0;

#----- 各パラメータ -----#
# 処理区分
my $file_kbn = undef;
# ファイル名
my $filename1  = "file1";
my $filename2  = "file2";
my $filename3  = "file3";
my $filename4  = "file4";
my $filename5  = "file5";
my $filename6  = "file6";
# 20100625 Y.Motai start
my $filename7  = "file7";
# 20100625 Y.Motai end
my $certifykey = undef;
#------------------------#

#----- エラーコード定義 -----#
my $db_connect_error          = "00";		# データベース接続エラー
my $cliant_param_error        = "01";		# パラメータ異常エラー
my $cliant_csv_error          = "02";		# CSVファイル未存在エラー
my $making_table_error        = "03";		# サーバデータベース環境初期化実行エラー
my $csv_analyzeing_error      = "04";		# CSVファイル解析エラー
my $mk_temp_table_error       = "05";		# テンポラリテーブル作成エラー
my $goods_db_add_error        = "06";		# 商品情報反映時エラー
my $stock_db_add_error        = "07";		# 在庫情報反映時エラー
my $related_db_add_error      = "08";		# 関連商品情報反映時エラー
my $art_category_db_add_error = "09";		# 商品所属カテゴリ情報反映時エラー
my $temp_rename_error         = "10";		# テンポラリテーブルのリネームエラー
my $member_del_error          = "11";		# 顧客情報削除エラー
my $memberflag_modify_error   = "12";		# 会員区分一括変更エラー
my $point_change_error        = "13";		# ポイント数変更エラー
my $point_expire_error        = "14";		# ポイント有効期限切れ確認エラー
my $point_decision_error      = "15";		# ポイント確定エラー
my $coupon_update_db_error    = "16";		# クーポン情報反映時エラー
my $member_save_error         = "17";		# 顧客情報保存エラー
my $member_one_modify_error   = "18";		# 会員データ個別更新エラー
my $member_all_modify_error   = "19";		# 会員データ全更新エラー
my $member_csv_import_error   = "20";		# 顧客CSVインポートエラー
my $variation_db_add_error    = "21";		# バリエーション情報反映時エラー
my $category_db_add_error     = "22";		# カテゴリ情報反映時エラー
# 20100708 Y.Motais start
my $goods_url_db_add_error    = "23";		# 商品詳細ページ用URL情報反映時エラー
# 20100708 Y.Motais end
my $certification_file_error  = "96";		# 認証キーファイル未存在エラー
my $certification_key_error   = "97";		# 認証エラー
my $duplicate_startup_error   = "98";		# 二重起動エラー
my $user_agent_error          = "99";		# ユーザエージェントエラー
#----------------------------#

# エラーコード
my $ErrorCode = undef;
# エラーデータ
my @ErrorData;
my @ErrorData2;
# エラー詳細
my @ErrorMessage;

main();
# 終了
exit;


;#
;# main処理
;#
sub main{
#----- ユーザエージェントのチェック -----#
	# ユーザエージェントの取得
	my $agent = $ENV{'HTTP_USER_AGENT'};
	# md5ハッシュ暗号化
	my $MD5agent = md5_hex $agent;
	# ユーザエージェントのチェック
	if( $MD5agent ne "4f1cd31158277cbc70b5f1b434292677" ) {
		$ErrorCode = $user_agent_error;
		push(@ErrorData, "");
		push(@ErrorMessage, "アクセス許可がありません。");
		html_out( "NG" , $ErrorCode );
	}
#----------------------------------------#

	# パラメータを抽出
	my $buffer = $ENV{'QUERY_STRING'};

	# 抽出した文字列を分割
	my @pairs = split( /&/, $buffer );
	foreach my $pair ( @pairs ) {
		my ( $name, $value ) = split( /=/, $pair );

		# 分割した文字列を内容ごとに分ける
		# 処理区分
		if( $name eq "param" ) {
			$file_kbn = $value;
		}
		# ファイル名1
		elsif( $name eq "file1" ) {
			$filename1 = ($value) ? $value : "" ;
		}
		# ファイル名2
		elsif( $name eq "file2" ) {
			$filename2 = ($value) ? $value : "" ;
		}
		# ファイル名3
		elsif( $name eq "file3" ) {
			$filename3 = ($value) ? $value : "" ;
		}
		# ファイル名4
		elsif( $name eq "file4" ) {
			$filename4 = ($value) ? $value : "" ;
		}
		# ファイル名5
		elsif( $name eq "file5" ) {
			$filename5 = ($value) ? $value : "" ;
		}
		# ファイル名6
		elsif( $name eq "file6" ) {
			$filename6 = ($value) ? $value : "" ;
		}
		# 20100625 Y.Motai start
		# ファイル名7
		elsif( $name eq "file7" ) {
			$filename7 = ($value) ? $value : "" ;
		}
		# 20100625 Y.Motai end
		# 認証キー
		elsif( $name eq "key" ) {
			$certifykey = $value;
		}
	}

#----- 認証キーのチェック -----#
	my $KeyFilePath = "$csv_pass"."Certificationkey.log.cgi";

	# 認証キーファイルのチェック
	unless ( -e $KeyFilePath ){
		$ErrorCode = $certification_file_error;
		push(@ErrorData, "");
		push(@ErrorMessage, "認証ファイルが見つかりません。");
		html_out( "NG" , $ErrorCode );
	}
	# 認証キーの有無チェック
	if( $certifykey eq undef ) {
		$ErrorCode = $certification_key_error;
		push(@ErrorData, "");
		push(@ErrorMessage, "認証キーがありません。");
		## 認証キーファイル削除
		my $ulchk = unlink($KeyFilePath);
		html_out( "NG" , $ErrorCode );
	} else {
		# 認証キーファイルのオープン
		open(INFO, $KeyFilePath );
			my $line = <INFO>;
			chomp($line);
		close(INFO);
		# 認証キーの一致チェック
		unless ( $certifykey eq $line ){
			$ErrorCode = $certification_key_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "認証キーが不正です。");
			## 認証キーファイル削除
			my $ulchk = unlink($KeyFilePath);
			html_out( "NG" , $ErrorCode );
		}
		## 認証キーファイル削除
		my $ulchk = unlink($KeyFilePath);
	}
#------------------------------#
	
	# 必須項目のチェック（処理区分）
	if ($file_kbn eq undef){
		$ErrorCode = $cliant_param_error;
		push(@ErrorData, "");
		push(@ErrorMessage, "パラメータが不正です。");
		html_out( "NG" , $ErrorCode );
	}
	#----- 処理区分毎の項目のチェック -----#
	# 顧客情報保存処理
	if ( $file_kbn eq "SaveCustomerInfo" ){
		# 正しいパラメータでない場合はエラー
		# unless ( $filename1 eq "SaveCustomerInfo.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" ){
		unless ( $filename1 eq "SaveCustomerInfo.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" && $filename7 eq "" ){
			$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "パラメータが不正です。");
			html_out( "NG" , $ErrorCode );
		}
		# 必要なファイルが存在していない場合はエラー
		unless ( -e "$csv_pass"."SaveCustomerInfo.csv" ){
			$ErrorCode = $cliant_csv_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "ファイルが見つかりません。");
			html_out( "NG" , $ErrorCode );
		}

		# 顧客情報保存の実行
		member_save_csv_reflection();
	}
	# 顧客情報削除
	elsif ( $file_kbn eq "DeleteCustomerInfo" ){
		# 正しいパラメータでない場合はエラー
		# unless ( $filename1 eq "DeleteCustomerInfo.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" ){
		unless ( $filename1 eq "DeleteCustomerInfo.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" && $filename7 eq "" ){
			$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "パラメータが不正です。");
			html_out( "NG" , $ErrorCode );
		}
		# 必要なファイルが存在していない場合はエラー
		unless ( -e "$csv_pass"."DeleteCustomerInfo.csv" ){
			$ErrorCode = $cliant_csv_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "ファイルが見つかりません。");
			html_out( "NG" , $ErrorCode );
		}

		# 顧客情報削除の実行
		member_del_csv_reflection();
	}
	# 会員区分一括変更
	elsif ( $file_kbn eq "ChangeAllMemberFlag" ){
		# 正しいパラメータでない場合はエラー
		# unless ( $filename1 eq "ChangeAllMemberFlag.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" ){
		unless ( $filename1 eq "ChangeAllMemberFlag.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" && $filename7 eq "" ){
			$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "パラメータが不正です。");
			html_out( "NG" , $ErrorCode );
		}
		# 必要なファイルが存在していない場合はエラー
		unless ( -e "$csv_pass"."ChangeAllMemberFlag.csv" ){
			$ErrorCode = $cliant_csv_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "ファイルが見つかりません。");
			html_out( "NG" , $ErrorCode );
		}
		
		# 会員区分一括変更の実行
		member_flag_csv_reflection();
	}
	# ポイント数変更
	elsif ( $file_kbn eq "ChangePoint" ){
		# 正しいパラメータでない場合はエラー
		# unless ( $filename1 eq "ChangePoint.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" ){
		unless ( $filename1 eq "ChangePoint.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" && $filename7 eq "" ){
			$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "パラメータが不正です。");
			html_out( "NG" , $ErrorCode );
		}
		# 必要なファイルが存在していない場合はエラー
		unless ( -e "$csv_pass"."ChangePoint.csv" ){
			$ErrorCode = $cliant_csv_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "ファイルが見つかりません。");
			html_out( "NG" , $ErrorCode );
		}
		
		# ポイント数変更の実行
		change_point_csv_reflection();
	}
	# ポイント有効期限切れ確認
	elsif ( $file_kbn eq "ConfirmPointExpireDate" ){
		# 正しいパラメータでない場合はエラー
		# unless ( $filename1 eq "ConfirmPointExpireDate.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" ){
		unless ( $filename1 eq "ConfirmPointExpireDate.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" && $filename7 eq "" ){
			$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "パラメータが不正です。");
			html_out( "NG" , $ErrorCode );
		}
		# 必要なファイルが存在していない場合はエラー
		unless ( -e "$csv_pass"."ConfirmPointExpireDate.csv" ){
			$ErrorCode = $cliant_csv_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "ファイルが見つかりません。");
			html_out( "NG" , $ErrorCode );
		}
		
		# ポイント有効期限切れ確認の実行
		point_expire_csv_reflection();
	}
	# 会員データ個別更新
	elsif ( $file_kbn eq "UpdateSeparatelyMemberData" ){
		# 正しいパラメータでない場合はエラー
		# unless ( $filename1 eq "UpdateSeparatelyMemberData.csv" && $filename2 eq "UpdateSeparatelyPointHistory.csv" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" ){
		unless ( $filename1 eq "UpdateSeparatelyMemberData.csv" && $filename2 eq "UpdateSeparatelyPointHistory.csv" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" && $filename7 eq "" ){
			$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "パラメータが不正です。");
			html_out( "NG" , $ErrorCode );
		}
		# 必要なファイルが存在していない場合はエラー
		unless ( -e "$csv_pass"."UpdateSeparatelyMemberData.csv" && -e "$csv_pass"."UpdateSeparatelyPointHistory.csv" ){
			$ErrorCode = $cliant_csv_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "ファイルが見つかりません。");
			html_out( "NG" , $ErrorCode );
		}

		# 会員データ個別更新の実行
		member_separately_up_csv_reflection();
	}
	# 会員データ全更新
	elsif ( $file_kbn eq "UpdateAllMemberData" ){
		# 正しいパラメータでない場合はエラー
		# unless ( $filename1 eq "UpdateAllMemberData.csv" && $filename2 eq "UpdateAllPointHistory.csv" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" ){
		unless ( $filename1 eq "UpdateAllMemberData.csv" && $filename2 eq "UpdateAllPointHistory.csv" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" && $filename7 eq "" ){
			$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "パラメータが不正です。");
			html_out( "NG" , $ErrorCode );
		}
		# 必要なファイルが存在していない場合はエラー
		unless ( -e "$csv_pass"."UpdateAllMemberData.csv" && -e "$csv_pass"."UpdateAllPointHistory.csv" ){
			$ErrorCode = $cliant_csv_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "ファイルが見つかりません。");
			html_out( "NG" , $ErrorCode );
		}

		# 会員データ全更新の実行
		member_all_up_csv_reflection();
	}
	# 顧客CSVインポート
	elsif ( $file_kbn eq "ImportCustomer" ){
		# 正しいパラメータでない場合はエラー
		# unless ( $filename1 eq "ImportCustomer.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" ){
		unless ( $filename1 eq "ImportCustomer.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" && $filename7 eq "" ){
			$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "パラメータが不正です。");
			html_out( "NG" , $ErrorCode );
		}
		# 必要なファイルが存在していない場合はエラー
		unless ( -e "$csv_pass"."ImportCustomer.csv" ){
			$ErrorCode = $cliant_csv_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "ファイルが見つかりません。");
			html_out( "NG" , $ErrorCode );
		}
		
		# 顧客CSVインポートの実行
		member_import_csv_reflection();
	}
	# ポイント確定
	elsif ( $file_kbn eq "DecisionPoint" ){
		# 正しいパラメータでない場合はエラー
		# unless ( $filename1 eq "DecisionPoint.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" ){
		unless ( $filename1 eq "DecisionPoint.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" && $filename7 eq "" ){
			$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "パラメータが不正です。");
			html_out( "NG" , $ErrorCode );
		}
		# 必要なファイルが存在していない場合はエラー
		unless ( -e "$csv_pass"."DecisionPoint.csv" ){
			$ErrorCode = $cliant_csv_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "ファイルが見つかりません。");
			html_out( "NG" , $ErrorCode );
		}
		
		# ポイント確定の実行
		point_decision_csv_reflection();
	}
	# クーポン情報反映
	elsif ( $file_kbn eq "UploadFtpCoupon" ){
		# 正しいパラメータでない場合はエラー
		# unless ( $filename1 eq "UploadFtpCoupon.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" ){
		unless ( $filename1 eq "UploadFtpCoupon.csv" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" && $filename7 eq "" ){
			$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "パラメータが不正です。");
			html_out( "NG" , $ErrorCode );
		}
		# 必要なファイルが存在していない場合はエラー
		unless ( -e "$csv_pass"."UploadFtpCoupon.csv" ){
			$ErrorCode = $cliant_csv_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "ファイルが見つかりません。");
			html_out( "NG" , $ErrorCode );
		}
		
		# クーポン情報反映の実行
		update_Coupon_csv_reflection();
	}
	# 商品情報反映
	elsif ( $file_kbn eq "UploadFtpArticle" ){
		# 正しいパラメータでない場合はエラー
		# unless ( $filename1 eq "M_Goods.log.cgi" && $filename2 eq "D_GoodsStock.log.cgi" && $filename3 eq "D_GoodsRelated.log.cgi" && $filename4 eq "D_GoodsCategory.log.cgi" && $filename5 eq "D_GoodsVariation.log.cgi" && $filename6 eq "M_Category.log.cgi" ){
		unless ( $filename1 eq "M_Goods.log.cgi" && $filename2 eq "D_GoodsStock.log.cgi" && $filename3 eq "D_GoodsRelated.log.cgi" && $filename4 eq "D_GoodsCategory.log.cgi" && $filename5 eq "D_GoodsVariation.log.cgi" && $filename6 eq "M_Category.log.cgi" && $filename7 eq "D_GoodsUrl.log.cgi" ){
			$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "パラメータが不正です。");
			html_out( "NG" , $ErrorCode );
		}
		# 必要なファイルが存在していない場合はエラー
		# unless ( -e "$goods_pass"."M_Goods.log.cgi" &&  -e "$goods_pass"."D_GoodsStock.log.cgi" && -e "$goods_pass"."D_GoodsRelated.log.cgi" && -e "$goods_pass"."D_GoodsCategory.log.cgi" && -e "$goods_pass"."D_GoodsVariation.log.cgi" && -e "$goods_pass"."M_Category.log.cgi" ){
		unless ( -e "$goods_pass"."M_Goods.log.cgi" &&  -e "$goods_pass"."D_GoodsStock.log.cgi" && -e "$goods_pass"."D_GoodsRelated.log.cgi" && -e "$goods_pass"."D_GoodsCategory.log.cgi" && -e "$goods_pass"."D_GoodsVariation.log.cgi" && -e "$goods_pass"."M_Category.log.cgi" && -e "$goods_pass"."D_GoodsUrl.log.cgi" ){
			$ErrorCode = $cliant_csv_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "ファイルが見つかりません。");
			html_out( "NG" , $ErrorCode );
		}
		
		# 商品情報反映の実行
		goods_csv_reflection();
	}
	# サーバデータベース環境初期化
	elsif ( $file_kbn eq "MakingTable" ){
		# 正しいパラメータでない場合はエラー
		# unless ( $filename1 eq "" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" ){
		unless ( $filename1 eq "" && $filename2 eq "" && $filename3 eq "" && $filename4 eq "" && $filename5 eq "" && $filename6 eq "" && $filename7 eq "" ){
			$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
			push(@ErrorMessage, "パラメータが不正です。");
			html_out( "NG" , $ErrorCode );
		}
		
		# サーバデータベース環境初期化の実行
		dbtbl_init_wks();
	}
	# それ以外
	else{
		$ErrorCode = $cliant_param_error;
			push(@ErrorData, "");
		push(@ErrorMessage, "パラメータが不正です。");
		html_out( "NG" , $ErrorCode );
	}
}


;# 
;# サーバデータベース環境初期化の実行
;# 引数：なし
;# 戻り値：なし
sub dbtbl_init_wks{
	
	my $self = shift;
	
	my $SQL_MakedQuery;
	my %SQL_MakedQuery;
	my $SQL_names;
	my $SQL_query;
	
	my $rows;
	
	# 排他チェック (排他開始)
	$LockFlag = lock_cgi();

	# クエリ作成
	$SQL_MakedQuery = $NsoSyncRelayCall->make_relaymktblsQuery();
	
	# DB接続
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		push(@ErrorData, "");
		push(@ErrorMessage, "データベース接続中にエラーが発生しました。");
		$ErrorCode = $db_connect_error;
		html_out( "NG" , $ErrorCode );
	}
	
	#ハッシュで格納してあるSQL群を取り出して、1本づつ実行
	foreach $SQL_names (sort keys %$SQL_MakedQuery ) {
		$SQL_query = $$SQL_MakedQuery{$SQL_names};
		
		#$SQL_names(ハッシュ上のSQL呼出名)に"Drop_"が
		#入っていればテーブル削除、なければテーブル作成
		my %db;
		if (index($SQL_names, 'Drop_',0) == 0) {
			# クエリ発行
			%db = $DbConnect->DbTableDrop($SQL_query);
		} else {
			# クエリ発行
			%db = $DbConnect->DbTableCreate($SQL_query);
		}
		# SQL 結果取得
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" ){
			push(@ErrorData, $SQL_names);
			push(@ErrorMessage, "SQL実行中にエラーが発生しました。");
			$ErrorCode = $making_table_error;
			html_out( "NG" , $ErrorCode );
		}
	}
	# 処理結果の出力
	html_out( "OK" , $ErrorCode );
}


;# 
;# 商品情報反映
;# 引数：なし
;# 戻り値：なし
sub goods_csv_reflection{
	
	my $self = shift;
	my $SQL_MakedQuery;
	my %SQL_MakedQuery;
	my $SQL_names;
	my $SQL_query;
	my $rows;
	
	# 排他チェック (排他開始)
	$LockFlag = lock_cgi();

#-------------CSV解析
	# 解析前の準備
	my %NsoCsvCapcher;
	my $ResultCode;
	
	# "M_Goods.log.cgi"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($goods_pass, $filename1);
	my $NsoCsvCapcher_M_Goods = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename1);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
	# "D_GoodsStock.log.cgi"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($goods_pass, $filename2);
	my $NsoCsvCapcher_D_GoodsStock = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename2);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
	# "D_GoodsRelated.log.cgi"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($goods_pass, $filename3);
	my $NsoCsvCapcher_D_GoodsRelated = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename3);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
	# "D_GoodsCategory.log.cgi"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($goods_pass, $filename4);
	my $NsoCsvCapcher_D_GoodsCategory = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename4);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
	# "D_GoodsVariation.log.cgi"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($goods_pass, $filename5);
	my $NsoCsvCapcher_D_GoodsVariation = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename5);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}

	# "M_Category.log.cgi"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($goods_pass, $filename6);
	my $NsoCsvCapcher_M_Category = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename6);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
	# 20100625 Y.Motai start
	# "D_GoodsUrl.log.cgi"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($goods_pass, $filename7);
	my $NsoCsvCapcher_D_GoodsUrl = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename7);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	# 20100625 Y.Motai end
#-------------

	# DB接続(エラーの時はメッセージを累積格納、return/SQL実施せずエラー画面に遷移)
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		push(@ErrorData, "");
		push(@ErrorMessage, "データベース接続中にエラーが発生しました。");
		$ErrorCode = $db_connect_error;
		html_out( "NG" , $ErrorCode );
	}

#-------------TemporaryTableの作成
	# クエリ作成
	$SQL_MakedQuery = $NsoSyncRelayCall->make_relaytmptblsQuery();
		
	#ハッシュで格納してあるSQL群を取り出して、1本づつ実行
	foreach $SQL_names (sort keys %$SQL_MakedQuery ) {

		$SQL_query = $$SQL_MakedQuery{$SQL_names};
		
		#$SQL_names(ハッシュ上のSQL呼出名)に"Drop_"が
		#入っていればテーブル削除、なければテーブル作成
		my %db;
		if (index($SQL_names, 'Drop_',0) == 0) {

			# クエリ発行
			%db = $DbConnect->DbTableDrop($SQL_query);
		} else {

			# クエリ発行
			%db = $DbConnect->DbTableCreate($SQL_query);
		}
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" ){
			push(@ErrorData, $SQL_names);
			push(@ErrorMessage, "SQL実行中にエラーが発生しました。");
			$ErrorCode = $mk_temp_table_error;
			html_out( "NG" , $ErrorCode );
		}
	}
#-------------

#-------------商品情報を反映
	my %sqlesc = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_M_Goods ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

		$SQL_query = $NsoSyncRelayCall->add_M_Goods_relaytmpdataQuery(\%sqlesc);
		
		# クエリ発行
		my %db;
		%db = $DbConnect->DbInsert($SQL_query);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" ){
			push(@ErrorData, "商品ID[$$CsvCap_Line{ArticleID}]：商品番号[$$CsvCap_Line{ArticleNo}]：商品名[$$CsvCap_Line{ArticleName}]");
			push(@ErrorMessage, "商品情報追加中にエラーが発生しました。");
			$ErrorCode = $goods_db_add_error;
			html_out( "NG" , $ErrorCode );
		}
	}
#-------------

#-------------在庫情報を反映
	my %sqlesc2 = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_D_GoodsStock ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc2{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

		$SQL_query = $NsoSyncRelayCall->add_D_GoodsStock_relaytmpdataQuery(\%sqlesc2);
		
		# クエリ発行
		my %db;
		%db = $DbConnect->DbInsert($SQL_query);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" ){
			push(@ErrorData, "商品ID[$$CsvCap_Line{ArticleID}]");
			push(@ErrorMessage, "在庫情報追加中にエラーが発生しました。");
			$ErrorCode = $stock_db_add_error;
			html_out( "NG" , $ErrorCode );
		}
	}
#-------------

#-------------関連商品情報を反映
	my %sqlesc3 = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_D_GoodsRelated ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc3{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

		$SQL_query = $NsoSyncRelayCall->add_D_GoodsRelated_relaytmpdataQuery(\%sqlesc3);
		
		# クエリ発行
		my %db;
		%db = $DbConnect->DbInsert($SQL_query);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" ){
			push(@ErrorData, "商品ID[$$CsvCap_Line{ArticleID}]：関連商品ID[$$CsvCap_Line{ReletedArticleID}]");
			push(@ErrorMessage, "関連商品情報追加中にエラーが発生しました。");
			$ErrorCode = $related_db_add_error;
			html_out( "NG" , $ErrorCode );
		}
	}
#-------------

#-------------商品所属カテゴリ情報を反映
	my %sqlesc4 = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_D_GoodsCategory ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc4{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

		$SQL_query = $NsoSyncRelayCall->add_D_GoodsCategory_relaytmpdataQuery(\%sqlesc4);
		
		# クエリ発行
		my %db;
		%db = $DbConnect->DbInsert($SQL_query);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" ){
			push(@ErrorData, "商品ID[$$CsvCap_Line{ArticleID}]：商品カテゴリID[$$CsvCap_Line{ArticleCategoryID}]");
			push(@ErrorMessage, "カテゴリ情報追加中にエラーが発生しました。");
			$ErrorCode = $art_category_db_add_error;
			html_out( "NG" , $ErrorCode );
		}
	}
#-------------

#-------------バリエーション情報を反映
	my %sqlesc5 = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_D_GoodsVariation ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc5{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

		$SQL_query = $NsoSyncRelayCall->add_D_GoodsVariation_relaytmpdataQuery(\%sqlesc5);
		
		# クエリ発行
		my %db;
		%db = $DbConnect->DbInsert($SQL_query);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" ){
			push(@ErrorData, "商品ID[$$CsvCap_Line{ArticleID}]:バリエーション種別ID[$$CsvCap_Line{VariationTypeID}]:バリエーション項目ID[$$CsvCap_Line{VariationID}]");
			push(@ErrorMessage, "バリエーション情報追加中にエラーが発生しました。");
			$ErrorCode = $variation_db_add_error;
			html_out( "NG" , $ErrorCode );
		}
	}
#-------------

#-------------カテゴリ情報を反映
	my %sqlesc6 = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_M_Category ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc6{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

		$SQL_query = $NsoSyncRelayCall->add_M_Category_relaytmpdataQuery(\%sqlesc6);
		
		# クエリ発行
		my %db;
		%db = $DbConnect->DbInsert($SQL_query);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" ){
			push(@ErrorData, "商品カテゴリID[$$CsvCap_Line{ArticleCategoryID}]");
			push(@ErrorMessage, "カテゴリ情報追加中にエラーが発生しました。");
			$ErrorCode = $category_db_add_error;
			html_out( "NG" , $ErrorCode );
		}
	}
#-------------

# 20100625 Y.Motai start
#-------------商品詳細ページ用URL情報を反映
	my %sqlesc7 = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_D_GoodsUrl ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc7{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

		$SQL_query = $NsoSyncRelayCall->add_D_ArticleDetailUrl_relaytmpdataQuery(\%sqlesc7);
		
		# クエリ発行
		my %db;
		%db = $DbConnect->DbInsert($SQL_query);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" ){
			push(@ErrorData, "商品ID[$$CsvCap_Line{ArticleID}]");
			push(@ErrorMessage, "商品詳細ページ用URL情報追加中にエラーが発生しました。");
			$ErrorCode = $goods_url_db_add_error;
			html_out( "NG" , $ErrorCode );
		}
	}
#-------------
# 20100625 Y.Motai end

#-------------テンポラリテーブルのリネーム処理
	# クエリ作成
	$SQL_MakedQuery = $NsoSyncRelayCall->rename_relaytmptblsQuery();
		
	#ハッシュで格納してあるSQL群を取り出して、1本づつ実行
	foreach $SQL_names (sort keys %$SQL_MakedQuery ) {

		$SQL_query = $$SQL_MakedQuery{$SQL_names};

		# クエリ発行
		my %db;
		%db = $DbConnect->DbRename($SQL_query);

		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" ){
			push(@ErrorData, $SQL_names);
			push(@ErrorMessage, "SQL実行中にエラーが発生しました。");
			$ErrorCode = $temp_rename_error;
			html_out( "NG" , $ErrorCode );
		}
	}
#-------------

	# 処理結果の出力
	html_out( "OK" , $ErrorCode );
}


;# 
;# 顧客削除
;# 引数：なし
;# 戻り値：なし
sub member_del_csv_reflection{
	
	my $self = shift;
	my $SQL_query;
	my $SQL_query2;
	my $rows;
	
	# 排他チェック (排他開始)
	$LockFlag = lock_cgi();

#-------------CSV解析
	# 解析前の準備
	my %NsoCsvCapcher;
	my $ResultCode;
	
	# "DeleteCustomerInfo.csv"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($csv_pass, $filename1);
	my $NsoCsvCapcher_DeleteCustomerInfo = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename1);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
#-------------

	# DB接続(エラーの時はメッセージを累積格納、return/SQL実施せずエラー画面に遷移)
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		push(@ErrorData, "");
		push(@ErrorMessage, "データベース接続中にエラーが発生しました。");
		$ErrorCode = $db_connect_error;
		html_out( "NG" , $ErrorCode );
	}


#-------------顧客情報、ポイント履歴削除
	# クエリ作成
	my %sqlesc = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_DeleteCustomerInfo ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}
	#-------------顧客情報削除
		$SQL_query = $NsoSyncRelayCall->Del_Customer_relayQuery(\%sqlesc);

		# クエリ発行
		my %db;
		%db = $DbConnect->DbDelete($SQL_query);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" ){
			push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
			push(@ErrorMessage, "顧客情報削除中にエラーが発生しました。");
			$ErrorCode = $member_del_error;
		}

	#-------------ポイント履歴削除
		$SQL_query2 = $NsoSyncRelayCall->Del_point_relayQuery(\%sqlesc);

		# クエリ発行
		my %db2;
		%db2 = $DbConnect->DbDelete($SQL_query2);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db2->{rows};
		my $queryError = %db2->{status_err};
		if ( $queryError ne "" ){
			push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
			push(@ErrorMessage, "ポイント履歴削除中にエラーが発生しました。");
			$ErrorCode = $member_del_error;
		}
	}
#-------------

	# 処理結果の出力
	if ( $ErrorCode ne "" ){
		html_out( "NG" , $ErrorCode );
	} else {
		html_out( "OK" , $ErrorCode );
	}
}


;# 
;# 会員区分変更
;# 引数：なし
;# 戻り値：なし
sub member_flag_csv_reflection{
	
	my $self = shift;
	my $SQL_query;
	my $rows;
	
	# 排他チェック (排他開始)
	$LockFlag = lock_cgi();

#-------------CSV解析
	# 解析前の準備
	my %NsoCsvCapcher;
	my $ResultCode;
	
	# "ChangeAllMemberFlag.csv"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($csv_pass, $filename1);
	my $NsoCsvCapcher_ChangeAllMemberFlag = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename1);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
#-------------

	# DB接続(エラーの時はメッセージを累積格納、return/SQL実施せずエラー画面に遷移)
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		push(@ErrorData, "");
		push(@ErrorMessage, "データベース接続中にエラーが発生しました。");
		$ErrorCode = $db_connect_error;
		html_out( "NG" , $ErrorCode );
	}

#-------------会員区分変更
	# クエリ作成
	my %sqlesc = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_ChangeAllMemberFlag ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

		$SQL_query = $NsoSyncRelayCall->Change_MemFlag_relayQuery(\%sqlesc);

		# クエリ発行
		my %db;
		%db = $DbConnect->DbUpdate($SQL_query);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
			push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
			push(@ErrorMessage, "会員区分変更中にエラーが発生しました。");
			$ErrorCode = $memberflag_modify_error;
		}
	}
#-------------

	# 処理結果の出力
	if ( $ErrorCode ne "" ){
		html_out( "NG" , $ErrorCode );
	} else {
		html_out( "OK" , $ErrorCode );
	}
}


;# 
;# ポイント数変更
;# 引数：なし
;# 戻り値：なし
sub change_point_csv_reflection{
	
	my $self = shift;
	my $SQL_query;
	my $SQL_query2;
	my $SQL_query3;
	my $SQL_query4;
	my $rows;
	my $RecordList;
	my $RecordCount;
	
	# 排他チェック (排他開始)
	$LockFlag = lock_cgi();

#-------------CSV解析
	# 解析前の準備
	my %NsoCsvCapcher;
	my $ResultCode;
	
	# "ChangePoint.csv"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($csv_pass, $filename1);
	my $NsoCsvCapcher_ChangePoint = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename1);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
#-------------

	# DB接続(エラーの時はメッセージを累積格納、return/SQL実施せずエラー画面に遷移)
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		push(@ErrorData, "");
		push(@ErrorMessage, "データベース接続中にエラーが発生しました。");
		$ErrorCode = $db_connect_error;
		html_out( "NG" , $ErrorCode );
	}

#-------------ポイント数変更、ポイント履歴追加
	# クエリ作成
	my %sqlesc = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_ChangePoint ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}
	#-------------ポイント数変更
		# クエリ発行
		$SQL_query = $NsoSyncRelayCall->Change_Point_relayQuery(\%sqlesc);

		my %db;
		%db = $DbConnect->DbUpdate($SQL_query);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
			push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
			push(@ErrorMessage, "ポイント数変更中にエラーが発生しました。");
			$ErrorCode = $point_change_error;
		} else {

		#-------------ポイント履歴追加([ポイント数変更]クエリが正常に実行された場合のみ)

			my %RecordHash2 = (
				ChangeTime				=>	$sqlesc{'ChangeTime'},		# 変更日時
				SamePeriodID			=>	$sqlesc{'SamePeriodID'},	# 同期ID
				ChangeType				=>	$sqlesc{'ChangeType'},		# 変更区分
				ChangePoint				=>	$sqlesc{'ChangePoint'},		# 変更ポイント数
			);

			$SQL_query2 = $NsoSyncRelayCall->Point_add_relayQuery(\%RecordHash2);

			my %db2;
			%db2 = $DbConnect->DbInsert($SQL_query2);
			
			# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
			$rows = %db2->{rows};
			my $queryError = %db2->{status_err};
			if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
				push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
				push(@ErrorMessage, "ポイント履歴追加中にエラーが発生しました。");
				$ErrorCode = $point_change_error;
			}

		#-------------ポイント履歴取得
			
			my %RecordHash3 = (
				SamePeriodID			=>	$sqlesc{'SamePeriodID'},	# 同期ID
			);
			
			# クエリ発行
			$SQL_query3 = $NsoSyncRelayCall->Point_select_relayQuery(\%RecordHash3);

			my %db3;
			%db3 = $DbConnect->DbSelect($SQL_query3);

			# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
			my $queryError = %db3->{status_err};
			if ( $queryError ne ""){
				push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
				push(@ErrorMessage, "ポイント履歴取得中にエラーが発生しました。");
				$ErrorCode = $point_change_error;
			}
			
		#-------------ポイント履歴削除(ポイント履歴が6件以上の場合)
			$RecordList = %db3->{RecordList};
			$RecordCount = scalar @$RecordList;

			if ( $RecordCount > 5){

				my $i = 1;
				foreach my $Record (@{$RecordList}){
					my $cnt = 0;
					# DBから取得したデータはEUCなので、デコードなしエスケープ
					my %RecordHash = (
						ChangeTime					=>	$DbConnect->Sql_Escape_non_decode($$Record[$cnt++]),		# 変更日時
						SamePeriodID				=>	$DbConnect->Sql_Escape_non_decode($$Record[$cnt++]),		# 同期ID
						ChangePoint					=>	$DbConnect->Sql_Escape_non_decode($$Record[$cnt++]),		# 変更ポイント数
						ChangeType					=>	$DbConnect->Sql_Escape_non_decode($$Record[$cnt++]),		# 変更区分
						);
				# 6番目から削除
					if($i > 5 ) {
						$SQL_query4 = $NsoSyncRelayCall->Point_delete_relayQuery(\%RecordHash);

						my %db4;
						%db4 = $DbConnect->DbDelete($SQL_query4);

					# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
						$rows = %db->{rows};
						my $queryError = %db4->{status_err};
						if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
							push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
							push(@ErrorMessage, "ポイント履歴削除中にエラーが発生しました。");
							$ErrorCode = $point_change_error;
						}
					}
				$i++;
				}
			}
		}
	}

#-------------

	# 処理結果の出力
	if ( $ErrorCode ne "" ){
		html_out( "NG" , $ErrorCode );
	} else {
		html_out( "OK" , $ErrorCode );
	}
}


;# 
;# ポイント有効期限切れ更新
;# 引数：なし
;# 戻り値：なし
sub point_expire_csv_reflection{
	
	my $self = shift;
	my $SQL_query;
	my $SQL_query2;
	my $SQL_query3;
	my $SQL_query4;
	my $rows;
	my $RecordList;
	my $RecordCount;
	
	# 排他チェック (排他開始)
	$LockFlag = lock_cgi();

#-------------CSV解析
	# 解析前の準備
	my %NsoCsvCapcher;
	my $ResultCode;
	
	# "ConfirmPointExpireDate.csv"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($csv_pass, $filename1);
	my $NsoCsvCapcher_ExpirePoint = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename1);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
#-------------

	# DB接続(エラーの時はメッセージを累積格納、return/SQL実施せずエラー画面に遷移)
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		push(@ErrorData, "");
		push(@ErrorMessage, "データベース接続中にエラーが発生しました。");
		$ErrorCode = $db_connect_error;
		html_out( "NG" , $ErrorCode );
	}

#-------------ポイント有効期限切れ更新、ポイント履歴追加
	# クエリ作成
	my %sqlesc = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_ExpirePoint ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}
	#-------------ポイント有効期限切れ更新
		# クエリ発行
		$SQL_query = $NsoSyncRelayCall->Change_Expire_Point_relayQuery(\%sqlesc);

		my %db;
		%db = $DbConnect->DbUpdate($SQL_query);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
			push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
			push(@ErrorMessage, "ポイント有効期限切れ確認中にエラーが発生しました。");
			$ErrorCode = $point_expire_error;
		} else {

		#-------------ポイント履歴追加([ポイント有効期限切れ更新]クエリが正常に実行された場合のみ)

			my %RecordHash2 = (
				SamePeriodID			=>	$sqlesc{'SamePeriodID'},					# 同期ID
				ChangeTime				=>	$sqlesc{'PointExpireDate'},					# ポイント有効期限
				ChangeType				=>	$sqlesc{'ChangeType'},						# 変更区分
				ChangePoint				=>	$DbConnect->Sql_Escape_sjis2euc_decode(0),	# 変更ポイント数(SJIS→EUCエンコード＆エスケープ)
			);

			$SQL_query2 = $NsoSyncRelayCall->Point_add_relayQuery(\%RecordHash2);

			my %db2;
			%db2 = $DbConnect->DbInsert($SQL_query2);
			
			# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
			$rows = %db2->{rows};
			my $queryError = %db2->{status_err};
			if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
				push(@ErrorData, "$$CsvCap_Line{SamePeriodID}" );
				push(@ErrorMessage, "ポイント履歴追加中にエラーが発生しました。");
				$ErrorCode = $point_expire_error;
			}

		#-------------ポイント履歴取得
			
			my %RecordHash3 = (
				SamePeriodID			=>	$sqlesc{'SamePeriodID'},	# 同期ID
			);
			
			# クエリ発行
			$SQL_query3 = $NsoSyncRelayCall->Point_select_relayQuery(\%RecordHash3);

			my %db3;
			%db3 = $DbConnect->DbSelect($SQL_query3);

			# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
			my $queryError = %db3->{status_err};
			if ( $queryError ne ""){
				push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
				push(@ErrorMessage, "ポイント履歴取得中にエラーが発生しました。");
				$ErrorCode = $point_expire_error;
			}
			
		#-------------ポイント履歴削除(ポイント履歴が6件以上の場合)
			$RecordList = %db3->{RecordList};
			$RecordCount = scalar @$RecordList;

			if ( $RecordCount > 5){

				my $i = 1;
				foreach my $Record (@{$RecordList}){
					my $cnt = 0;
					# DBから取得したデータはEUCなので、デコードなしエスケープ
					my %RecordHash = (
						ChangeTime					=>	$DbConnect->Sql_Escape_non_decode($$Record[$cnt++]),	# 変更日時
						SamePeriodID				=>	$DbConnect->Sql_Escape_non_decode($$Record[$cnt++]),	# 同期ID
						ChangePoint					=>	$DbConnect->Sql_Escape_non_decode($$Record[$cnt++]),	# 変更ポイント数
						ChangeType					=>	$DbConnect->Sql_Escape_non_decode($$Record[$cnt++]),	# 変更区分
						);
				# 6番目から削除
					if($i > 5 ) {
						$SQL_query4 = $NsoSyncRelayCall->Point_delete_relayQuery(\%RecordHash);

						my %db4;
						%db4 = $DbConnect->DbDelete($SQL_query4);

					# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
						$rows = %db->{rows};
						my $queryError = %db4->{status_err};
						if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
							push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
							push(@ErrorMessage, "ポイント履歴削除中にエラーが発生しました。");
							$ErrorCode = $point_expire_error;
						}
					}
				$i++;
				}
			}
		}
	}

#-------------

	# 処理結果の出力
	if ( $ErrorCode ne "" ){
		html_out( "NG" , $ErrorCode );
	} else {
		html_out( "OK" , $ErrorCode );
	}
}


;# 
;# ポイント確定
;# 引数：なし
;# 戻り値：なし
sub point_decision_csv_reflection{
	
	my $self = shift;
	my $SQL_query;
	my $SQL_query2;
	my $SQL_query3;
	my $SQL_query4;
	my $rows;
	my $RecordList;
	my $RecordCount;
	
	# 排他チェック (排他開始)
	$LockFlag = lock_cgi();

#-------------CSV解析
	# 解析前の準備
	my %NsoCsvCapcher;
	my $ResultCode;
	
	# "DecisionPoint.csv"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($csv_pass, $filename1);
	my $NsoCsvCapcher_DecisionPoint = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename1);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
#-------------

	# DB接続(エラーの時はメッセージを累積格納、return/SQL実施せずエラー画面に遷移)
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		push(@ErrorData, "");
		push(@ErrorMessage, "データベース接続中にエラーが発生しました。");
		$ErrorCode = $db_connect_error;
		html_out( "NG" , $ErrorCode );
	}

#-------------ポイント確定、ポイント履歴追加
	# クエリ作成
	my %sqlesc = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_DecisionPoint ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}
	#-------------ポイント確定
		# クエリ発行
		$SQL_query = $NsoSyncRelayCall->Change_Decision_Point_relayQuery(\%sqlesc);

		my %db;
		%db = $DbConnect->DbUpdate($SQL_query);
		
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
			push(@ErrorData, "$$CsvCap_Line{OrderNo}");
			push(@ErrorMessage, "ポイント確定中にエラーが発生しました。");
			$ErrorCode = $point_decision_error;
		} else {

		#-------------ポイント履歴追加([ポイント確定]クエリが正常に実行された場合のみ)

			my %RecordHash2 = (
				SamePeriodID			=>	$sqlesc{'SamePeriodID'},	# 同期ID
				ChangeTime				=>	$sqlesc{'ChangeTime'},		# 実行日時(変更日時)
				ChangeType				=>	$sqlesc{'ChangeType'},		# 変更区分
				ChangePoint				=>	$sqlesc{'ChangePoint'},		# 変更ポイント数
			);

			$SQL_query2 = $NsoSyncRelayCall->Point_add_relayQuery(\%RecordHash2);

			my %db2;
			%db2 = $DbConnect->DbInsert($SQL_query2);
			
			# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
			$rows = %db2->{rows};
			my $queryError = %db2->{status_err};
			if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
				push(@ErrorData, "$$CsvCap_Line{OrderNo}" );
				push(@ErrorMessage, "ポイント履歴追加中にエラーが発生しました。");
				$ErrorCode = $point_decision_error;
			}

		#-------------ポイント履歴取得
			
			my %RecordHash3 = (
				SamePeriodID			=>	$sqlesc{'SamePeriodID'},	# 同期ID
			);
			
			# クエリ発行
			$SQL_query3 = $NsoSyncRelayCall->Point_select_relayQuery(\%RecordHash3);

			my %db3;
			%db3 = $DbConnect->DbSelect($SQL_query3);

			# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
			my $queryError = %db3->{status_err};
			if ( $queryError ne ""){
				push(@ErrorData, "$$CsvCap_Line{OrderNo}");
				push(@ErrorMessage, "ポイント履歴取得中にエラーが発生しました。");
				$ErrorCode = $point_decision_error;
			}
			
		#-------------ポイント履歴削除(ポイント履歴が6件以上の場合)
			$RecordList = %db3->{RecordList};
			$RecordCount = scalar @$RecordList;

			if ( $RecordCount > 5){

				my $i = 1;
				foreach my $Record (@{$RecordList}){
					my $cnt = 0;
					# DBから取得したデータはEUCなので、デコードなしエスケープ
					my %RecordHash = (
						ChangeTime					=>	$DbConnect->Sql_Escape_non_decode($$Record[$cnt++]),	# 変更日時
						SamePeriodID				=>	$DbConnect->Sql_Escape_non_decode($$Record[$cnt++]),	# 同期ID
						ChangePoint					=>	$DbConnect->Sql_Escape_non_decode($$Record[$cnt++]),	# 変更ポイント数
						ChangeType					=>	$DbConnect->Sql_Escape_non_decode($$Record[$cnt++]),	# 変更区分
						);
				# 6番目から削除
					if($i > 5 ) {
						$SQL_query4 = $NsoSyncRelayCall->Point_delete_relayQuery(\%RecordHash);

						my %db4;
						%db4 = $DbConnect->DbDelete($SQL_query4);

					# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
						$rows = %db->{rows};
						my $queryError = %db4->{status_err};
						if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
							push(@ErrorData, "$$CsvCap_Line{OrderNo}");
							push(@ErrorMessage, "ポイント履歴削除中にエラーが発生しました。");
							$ErrorCode = $point_decision_error;
						}
					}
				$i++;
				}
			}
		}
	}
#-------------

	# 処理結果の出力
	if ( $ErrorCode ne "" ){
		html_out( "NG" , $ErrorCode );
	} else {
		html_out( "OK" , $ErrorCode );
	}
}


;# 
;# クーポン情報反映
;# 引数：なし
;# 戻り値：なし
sub update_Coupon_csv_reflection{
	
	my $self = shift;
	my $SQL_query;
	my $SQL_MakedQuery;
	my $SQL_names;
	my $rows;
	
	# 排他チェック (排他開始)
	$LockFlag = lock_cgi();

#-------------CSV解析
	# 解析前の準備
	my %NsoCsvCapcher;
	my $ResultCode;
	
	# "UploadFtpCoupon.csv"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($csv_pass, $filename1);
	my $NsoCsvCapcher_UploadCoupon = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename1);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
#-------------

	# DB接続(エラーの時はメッセージを累積格納、return/SQL実施せずエラー画面に遷移)
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		push(@ErrorData, "");
		push(@ErrorMessage, "データベース接続中にエラーが発生しました。");
		$ErrorCode = $db_connect_error;
		html_out( "NG" , $ErrorCode );
	}

#-------------クーポン情報反映
	# クエリ作成
	my %sqlesc = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_UploadCoupon ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

		$SQL_MakedQuery = $NsoSyncRelayCall->Update_Coupon_relayQuery(\%sqlesc);

		#ハッシュで格納してあるSQL群を取り出して、1本づつ実行
		foreach $SQL_names (sort keys %$SQL_MakedQuery ) {
			$SQL_query = $$SQL_MakedQuery{$SQL_names};

			#$SQL_names(ハッシュ上のSQL呼出名)に"Delete_"が入っていれば削除なければ追加
			my %db;
			if (index($SQL_names, 'Delete_',0) == 0) {

				# クエリ発行
				%db = $DbConnect->DbDelete($SQL_query);
				
				# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
				$rows = %db->{rows};
				my $queryError = %db->{status_err};
				if ( $queryError ne "" ){
					push(@ErrorData, "No.$$CsvCap_Line{CouponNo}");
					push(@ErrorMessage, "クーポン情報削除中にエラーが発生しました。");
					$ErrorCode = $coupon_update_db_error;
				}
			} else {

				# クエリ発行
				%db = $DbConnect->DbInsert($SQL_query);

				# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
				$rows = %db->{rows};
				my $queryError = %db->{status_err};
				if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
					push(@ErrorData, "No.$$CsvCap_Line{CouponNo}");
					push(@ErrorMessage, "クーポン情報追加中にエラーが発生しました。");
					$ErrorCode = $coupon_update_db_error;
				}
			}
		}
	}
#-------------

	# 処理結果の出力
	if ( $ErrorCode ne "" ){
		html_out( "NG" , $ErrorCode );
	} else {
		html_out( "OK" , $ErrorCode );
	}
}


;# 
;# 顧客情報保存
;# 引数：なし
;# 戻り値：なし
sub member_save_csv_reflection{
	
	my $self = shift;
	my $SQL_query;
	my $rows;
	
	# 排他チェック (排他開始)
	$LockFlag = lock_cgi();

#-------------CSV解析
	# 解析前の準備
	my %NsoCsvCapcher;
	my $ResultCode;

	# "SaveCustomerInfo.csv"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcherDecode($csv_pass, $filename1);
	my $NsoCsvCapcher_SaveCustomerInfo = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename1);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	} 
	
#-------------

	# DB接続(エラーの時はメッセージを累積格納、return/SQL実施せずエラー画面に遷移)
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		push(@ErrorData, "");
		push(@ErrorMessage, "データベース接続中にエラーが発生しました。");
		$ErrorCode = $db_connect_error;
		html_out( "NG" , $ErrorCode );
	}

#-------------顧客情報保存
	# クエリ作成
	my %sqlesc = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_SaveCustomerInfo ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

		$SQL_query = $NsoSyncRelayCall->Change_member_info_relayQuery(\%sqlesc);

		# クエリ発行
		my %db;
		%db = $DbConnect->DbUpdate($SQL_query);
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
			push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
			push(@ErrorMessage, "顧客情報更新中にエラーが発生しました。");
			$ErrorCode = $member_save_error;
		}
	}
#-------------

	# 処理結果の出力
	if ( $ErrorCode ne "" ){
		html_out( "NG" , $ErrorCode );
	} else {
		html_out( "OK" , $ErrorCode );
	}
}


;# 
;# 顧客CSVインポート
;# 引数：なし
;# 戻り値：なし
sub member_import_csv_reflection{
	
	my $self = shift;
	my $SQL_query;
	my $rows;
	
	# 排他チェック (排他開始)
	$LockFlag = lock_cgi();

#-------------CSV解析
	# 解析前の準備
	my %NsoCsvCapcher;
	my $ResultCode;

	# "ImportCustomer.csv"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcherDecode($csv_pass, $filename1);
	my $NsoCsvCapcher_ImportCustomer = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename1);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
#-------------

	# DB接続(エラーの時はメッセージを累積格納、return/SQL実施せずエラー画面に遷移)
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		push(@ErrorData, "");
		push(@ErrorMessage, "データベース接続中にエラーが発生しました。");
		$ErrorCode = $db_connect_error;
		html_out( "NG" , $ErrorCode );
	}

#-------------顧客CSVインポート
	# クエリ作成
	my %sqlesc = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_ImportCustomer ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

		$SQL_query = $NsoSyncRelayCall->Member_csv_import_relayQuery(\%sqlesc);

		# クエリ発行
		my %db;
		%db = $DbConnect->DbUpdate($SQL_query);
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
			push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
			push(@ErrorMessage, "顧客情報更新中にエラーが発生しました。");
			$ErrorCode = $member_csv_import_error;
		}
	}
#-------------

	# 処理結果の出力
	if ( $ErrorCode ne "" ){
		html_out( "NG" , $ErrorCode );
	} else {
		html_out( "OK" , $ErrorCode );
	}
}


;# 
;# 会員データ個別更新
;# 引数：なし
;# 戻り値：なし
sub member_separately_up_csv_reflection{
	
	my $self = shift;
	my $SQL_query;
	my $SQL_query2;
	my $SQL_query3;
	my $SQL_query4;
	my $rows;
	
	# 排他チェック (排他開始)
	$LockFlag = lock_cgi();

#-------------CSV解析
	# 解析前の準備
	my %NsoCsvCapcher;
	my $ResultCode;

	# "UpdateSeparatelyMemberData.csv"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcherDecode($csv_pass, $filename1);
	my $NsoCsvCapcher_UpSeparateMember = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename1);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
	# "UpdateSeparatelyPointHistory.csv"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($csv_pass, $filename2);
	my $NsoCsvCapcher_UpSeparatePoint = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename2);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}

#-------------

	# DB接続(エラーの時はメッセージを累積格納、return/SQL実施せずエラー画面に遷移)
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		push(@ErrorData, "");
		push(@ErrorMessage, "データベース接続中にエラーが発生しました。");
		$ErrorCode = $db_connect_error;
		html_out( "NG" , $ErrorCode );
	}

#-------------会員データ個別更新, ポイント履歴削除
	# クエリ作成
	my %sqlesc = ();
	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_UpSeparateMember ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}
		
		   # 20100223 Y.Motai start
        
    #-------------会員データ個別削除
		my %RecordHash4 = (
			SamePeriodID	=>	$sqlesc{'SamePeriodID'},		# 同期ID
		);

		# クエリ発行
		$SQL_query4 = $NsoSyncRelayCall->Del_Customer_relayQuery(\%RecordHash4);

		my %db4;
		%db4 = $DbConnect->DbDelete($SQL_query4);
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db4->{rows};
		my $queryError = %db4->{status_err};
		if ( $queryError ne ""){
			push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
			push(@ErrorMessage, "会員データ削除中にエラーが発生しました。");
			$ErrorCode = $member_one_modify_error;
		}
    #-------------会員データ個別追加
        
        # この関数は本来会員データ全更新用のInsertであるが、ここで使用したいが
        # ために同じ関数をコピーして増やすのは意味がないので全更新用のを使用している。
		$SQL_query = $NsoSyncRelayCall->Insert_All_Member_relayQuery(\%sqlesc);
		# $SQL_query = $NsoSyncRelayCall->Member_update_seperate_relayQuery(\%sqlesc);
		
		# クエリ発行
		my %db;
		%db = $DbConnect->DbInsert($SQL_query);
		# %db = $DbConnect->DbUpdate($SQL_query);
		
		# 20100223 Y.Motai end				

		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db->{rows};
		my $queryError = %db->{status_err};
		if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
			push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
			push(@ErrorData2, "$$CsvCap_Line{SamePeriodID}");	 # 追加する時使う
			push(@ErrorMessage, "会員データ個別更新中にエラーが発生しました。");
			$ErrorCode = $member_one_modify_error;
		}
		
	#-------------ポイント履歴削除
		my %RecordHash = (
			SamePeriodID	=>	$sqlesc{'SamePeriodID'},		# 同期ID
		);

		# クエリ発行
		$SQL_query2 = $NsoSyncRelayCall->Del_point_relayQuery(\%RecordHash);

		my %db2;
		%db2 = $DbConnect->DbDelete($SQL_query2);
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db2->{rows};
		my $queryError = %db2->{status_err};
		if ( $queryError ne ""){
			push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
			push(@ErrorMessage, "ポイント履歴削除中にエラーが発生しました。");
			$ErrorCode = $member_one_modify_error;
		}
	}
#-------------

#-------------ポイント履歴追加([ポイント履歴削除]クエリが正常に実行された場合のみ)
	# クエリ作成
	my %sqlesc = ();

	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_UpSeparatePoint ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

		my %RecordHash2 = (
			SamePeriodID			=>	$sqlesc{'SamePeriodID'},	# 同期ID
			ChangeTime				=>	$sqlesc{'ChangeTime'},		# 実行日時(変更日時)
			ChangeType				=>	$sqlesc{'ChangeType'},		# 変更区分
			ChangePoint				=>	$sqlesc{'ChangePoint'},		# 変更ポイント数
		);

		my $error = 0;
		foreach my $Error_list ( @ErrorData2 ) {			# $Error_list => エラーが発生した同期ID
			if ( $Error_list eq $$CsvCap_Line{SamePeriodID} ) {
				$error = 1;
				last;
			}
		}
		unless ( $error ) {			# $error => 0の場合
			# クエリ発行
			$SQL_query3 = $NsoSyncRelayCall->Point_add_relayQuery(\%RecordHash2);

			my %db3;
			%db3 = $DbConnect->DbInsert($SQL_query3);
			# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
			$rows = %db3->{rows};
			my $queryError = %db3->{status_err};
			if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
				push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
				push(@ErrorMessage, "ポイント履歴追加中にエラーが発生しました。");
				$ErrorCode = $member_one_modify_error;
			}
		}
	}
#-------------

	# 処理結果の出力
	if ( $ErrorCode ne "" ){
		html_out( "NG" , $ErrorCode );
	} else {
		html_out( "OK" , $ErrorCode );
	}
}


;# 
;# 会員データ全更新
;# 引数：なし
;# 戻り値：なし
sub member_all_up_csv_reflection{
	
	my $self = shift;
	my $SQL_query;
	my $SQL_query2;
	my $SQL_query3;
	my $SQL_query4;
	my $rows;
	
	# 排他チェック (排他開始)
	$LockFlag = lock_cgi();

#-------------CSV解析
	# 解析前の準備
	my %NsoCsvCapcher;
	my $ResultCode;

	# "UpdateAllMemberData.csv"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcherDecode($csv_pass, $filename1);
	my $NsoCsvCapcher_UpAllMember = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename1);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}
	
	# "UpdateAllPointHistory.csv"の解析
	%NsoCsvCapcher = NsoCsvCapcher->NsoCsvCapcher($csv_pass, $filename2);
	my $NsoCsvCapcher_UpAllPoint = %NsoCsvCapcher->{datalist};
	$ResultCode = %NsoCsvCapcher->{err_code};
	# 解析エラー時の処理
	if ($ResultCode == 1) {
		push(@ErrorData, $filename2);
		push(@ErrorMessage, "ファイルが正しくありません。");
		$ErrorCode = $csv_analyzeing_error;
		html_out( "NG" , $ErrorCode );
	}

#-------------

	# DB接続(エラーの時はメッセージを累積格納、return/SQL実施せずエラー画面に遷移)
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		push(@ErrorData, "");
		push(@ErrorMessage, "データベース接続中にエラーが発生しました。");
		$ErrorCode = $db_connect_error;
		html_out( "NG" , $ErrorCode );
	}

#-------------会員データ全削除の作成
	# クエリ作成
	$SQL_query = $NsoSyncRelayCall->Del_All_Member_relayQuery();

	# クエリ発行
	my %db;
	%db = $DbConnect->DbDelete($SQL_query);
	# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
	my $queryError = %db->{status_err};
	if ( $queryError ne ""){
		push(@ErrorData, "");
		push(@ErrorMessage, "会員データ全削除中にエラーが発生しました。");
		$ErrorCode = $member_all_modify_error;
		html_out( "NG" , $ErrorCode );
	}
#-------------

#-------------ポイント履歴全削除の作成
	# クエリ作成
	$SQL_query2 = $NsoSyncRelayCall->Del_All_Point_relayQuery();

	# クエリ発行
	my %db2;
	%db2 = $DbConnect->DbDelete($SQL_query2);
	# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
	my $queryError = %db2->{status_err};
	if ( $queryError ne ""){
		push(@ErrorData, "");
		push(@ErrorMessage, "ポイント履歴全削除中にエラーが発生しました。");
		$ErrorCode = $member_all_modify_error;
	}
#-------------

#-------------会員データ追加
	my %sqlesc = ();

	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_UpAllMember ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

	#-------------会員データ追加の作成
		# クエリ作成
		$SQL_query3 = $NsoSyncRelayCall->Insert_All_Member_relayQuery(\%sqlesc);

		# クエリ発行
		my %db3;
		%db3 = $DbConnect->DbInsert($SQL_query3);
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db3->{rows};
		my $queryError = %db3->{status_err};
		if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
			push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
			push(@ErrorMessage, "会員データ追加中にエラーが発生しました。");
			$ErrorCode = $member_all_modify_error;
		}
	}
#-------------

#-------------ポイント履歴追加
	my %sqlesc = ();

	## 1行単位でのデータを展開・DB追加(フィールドデータ・ハッシュ展開)
	foreach my $CsvCap_Line ( @$NsoCsvCapcher_UpAllPoint ) {
		foreach my $key ( sort keys %$CsvCap_Line ) {
			# SJIS→EUCエンコード＆エスケープ
			$sqlesc{$key} = $DbConnect->Sql_Escape_sjis2euc_decode($$CsvCap_Line{$key});
		}

	#-------------ポイント履歴追加の作成
		my %RecordHash = (
			SamePeriodID			=>	$sqlesc{'SamePeriodID'},	# 同期ID
			ChangeTime				=>	$sqlesc{'ChangeTime'},		# 実行日時(変更日時)
			ChangeType				=>	$sqlesc{'ChangeType'},		# 変更区分
			ChangePoint				=>	$sqlesc{'ChangePoint'},		# 変更ポイント数
		);
		# クエリ作成
		$SQL_query4 = $NsoSyncRelayCall->Point_add_relayQuery(\%RecordHash);

		# クエリ発行
		my %db4;
		%db4 = $DbConnect->DbInsert($SQL_query4);
		# SQL 結果取得(エラーの時はメッセージを累積格納、Html_outさせる)
		$rows = %db4->{rows};
		my $queryError = %db4->{status_err};
		if ( $queryError ne "" || $rows eq '0E0'){           # 件数が'0' => '0E0'
			push(@ErrorData, "$$CsvCap_Line{SamePeriodID}");
			push(@ErrorMessage, "ポイント履歴追加中にエラーが発生しました。");
			$ErrorCode = $member_all_modify_error;
		}
	}
#-------------

	# 処理結果の出力
	if ( $ErrorCode ne "" ){
		html_out( "NG" , $ErrorCode );
	} else {
		html_out( "OK" , $ErrorCode );
	}
}


;# 
;# HTTPレスポンス生成
;# 引数：結果（$Result）
;#     ：エラーコード（$ErrorCode）
;# 戻り値：なし
sub html_out{
	my ( $Result , $ErrorCode ) = @_;
	my $Message_Split;

	print "Content-Type:text/html; charset=Shift_JIS\n\n";
	print "<TABLE>\n";
	print "  <TR>\n";
	print "    <TD>$Result</TD>\n";
	print "    <TD>error_code：$ErrorCode</TD>\n";
	print "  </TR>\n";
	print "  <TR>\n";
	foreach $Message_Split ( @ErrorData ) {
		print "<TD>$Message_Split</TD>\n";
	}
	print "  </TR>\n";
	print "  <TR>\n";
	foreach $Message_Split ( @ErrorMessage ) {
		print "<TD>$Message_Split</TD>\n";
	}
	print "  </TR>\n";
	print "</TABLE>\n";

	# 排他解除
	$LockFlag = unlock_cgi();
	exit;
}

;# 
;# 排他開始 (dbgw_relay.cgi二重起動抑止のため)
;# 戻り値： 0:排他失敗 1:排他成功
;# 
sub lock_cgi {

	# ロック用ディレクトリ
	my $dir = $LockDir =~ /\/$/ ? "$LockDir$Lock" : "$LockDir/$Lock";
	
	# ロック用ディレクトリが最終更新から最大ロック時間(秒)経過している場合は削除
	if ( -d $dir && ( -M $dir ) * 86400 > $LockLimit ) {
		rmdir( $dir );
	}
	
	# ロック用ディレクトリを作成 (0:失敗 1:成功)
	if ( !mkdir( $dir , 0755 ) ) {
		$ErrorCode = $duplicate_startup_error;	# 二重起動エラー
		push(@ErrorData, "");
		push(@ErrorMessage, "二重起動エラー");
		&html_out( "NG" , $ErrorCode );
	}
	return 1;	# ロック開始
}

;# 
;# 排他解除 (dbgw_relay.cgi二重起動抑止のため)
;# 戻り値： 0
;# 
sub unlock_cgi {

	# ロック用ディレクトリ
	my $dir = $LockDir =~ /\/$/ ? "$LockDir$Lock" : "$LockDir/$Lock";

	# ロック中の場合はロック用ディレクトリ削除
	if ( $LockFlag == 1 && -d $dir ) {
		rmdir( $dir );
	}
	return 0;	# ロック解除
}













