#!/usr/bin/perl

# 届け先管理

use DBI;

require './jcode.pl';
require './subfunc.cgi';
require './settings.cgi';

#==================================================================
#	設定
#==================================================================
$html_file = "RegistrationReceiver.html";			# 通常表示用テンプレートＨＴＭＬ
$list_file = "ReceiverList.html";							# 検索一覧表示用テンプレートＨＴＭＬ
$inputerr_file = "RegistReceiverError.html";	# 入力エラー表示用テンプレートＨＴＭＬ

#==================================================================
#	cookieの取得
#==================================================================
$cookies = $ENV{'HTTP_COOKIE'};
@pairs = split(/ /, $cookies);
foreach $pair (@pairs) {
	($name, $value) = split(/=/, $pair);
	$value =~ s/\;//g;
	$cc{$name} = $value;
}

#==================================================================
#	引数を解析する
#==================================================================
if ($ENV{'REQUEST_METHOD'} eq "POST") {
	read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
	$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/,$buffer);
foreach $pair (@pairs)
{
	($name, $value) = split(/=/, $pair);
	$value =~ tr/+/ /;
	$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	$value =~ s/\n//g;
	&jcode'convert(*value,'sjis');
	$PARA{$name} = $value;
}

#==================================================================
#	引数により処理を分岐する
#==================================================================
print "Content-type: text/html\n\n";
if( $PARA{mode} eq "write" ) {
	&err_check;					# 入力漏れ、確認入力の不一致のチェック
	&write_data;				# データベースへの書き込み
	# 一覧表示へ
	$PARA{mode} = "edit";
	$PARA{LoginName} = "";
	$PARA{SeqNo} = "";
}
if( $PARA{mode} eq "del" ) {
	&delete_data;				# データベースからの削除
	# 一覧表示へ
	$PARA{mode} = "edit";
	$PARA{LoginName} = "";
	$PARA{SeqNo} = "";
}
if( $PARA{mode} eq "edit" || $PARA{mode} eq "" ) {
	# cookieよりログイン名を取得
	if( $cc{LoginID} eq "" ) {
		&disp_html( "RegistrationReceiver" );
		exit;
	}
	# 修正時は一覧表示しない
	if( $PARA{LoginName} eq "" ) {
		# 既に登録されている届け先一覧を表示
		# 存在しない場合はすぐに新規登録画面に移動
		$dbh = DBI->connect($data_source,$user_name,$user_pass) || die "CONNECT ERROR $DBI::ERRSTR";
		$sql = "SELECT * FROM receiver WHERE CustomerId=?;";
		$sth = $dbh->prepare($sql);
		$sth->execute( "$cc{LoginID}" ) || die $sth->errstr;
		$sth->finish;
		$dbh->disconnect;
		if( $sth->rows > 0 ) {
			# まずは届け先一覧を表示
			&srch_html;			# 指定会員の届け先一覧の表示
			exit;
		}
	}
	&view_html;					# 新規入力または既存データの表示
	exit;
}
# 戻り時の再表示
&reload_html;
exit;

#==================================================================
#	検索内容一覧ＨＴＭＬ作成
#==================================================================
sub srch_html {

	open(HTML,"$list_file") || die "error!\n";
	flock (HTML, 2);
	@HTML = <HTML>;
	flock (HTML, 8);
	close(HTML);
	
	open(HTML2,"../head.html") || die "error!\n";
	flock (HTML2, 2);
	@HEAD_HTML = <HTML2>;
	flock (HTML2, 8);
	close(HTML2);

	$dbh = DBI->connect($data_source,$user_name,$user_pass) || die "CONNECT ERROR $DBI::ERRSTR";

	$sql = "SELECT * FROM receiver WHERE CustomerId=?;";
	$sth = $dbh->prepare($sql);
	$sth->execute( "$cc{LoginID}" ) || die $sth->errstr;

	# ＢＯＤＹまでのＨＴＭＬ表示

	@PUTPAGE = ();
	foreach $line (@HTML) {
		if( index( $line, '#INCLUDE_HEAD#' ) >= 0 ) {
			foreach $line2 (@HEAD_HTML) {
				push( @PUTPAGE, $line2 );
			}
			$line = "<!-- INCLUDE OK -->\n";
		}
		if( index( $line, "BODY_START" ) >= 0 ) { last; }
		$line =~ s/(#)(00)(#)/$cc{LoginID}/g;
		push( @PUTPAGE, $line );
	}

	# ＢＯＤＹ部のテンプレート保存
	$body_save = "";
	$flg = 0;
	foreach $line (@HTML) {
		if( index( $line, "BODY_START" ) >= 0 ) { $flg = 1; next; }
		if ( $flg == 0 ) { next; }
		if( index( $line, "BODY_END" ) >= 0 ) { last; }
		$body_save = $body_save . $line;
	}

	# ＢＯＤＹ部の表示
	while( @value = $sth->fetchrow_array ){
		$body = $body_save;
		# 名前
		$body =~ s/(#)(NAME)(#)/$value[6]/;
		# 郵便番号
		$zip = sprintf( "%03d-%04d", $value[2] / 10000, $value[2] % 10000 );
		$body =~ s/(#)(ZIP)(#)/$zip/;
		# 都道府県
		$body =~ s/(#)(PREFECTURE)(#)/$value[3]/;
		# 住所
		$body =~ s/(#)(ADDRESS)(#)/$value[4]$value[5]/;
		# 電話番号
		$body =~ s/(#)(TEL)(#)/$value[7]/;
		# ログイン名
		$body =~ s/(#)(00)(#)/$value[0]/g;
		# 通し番号
		$body =~ s/(#)(01)(#)/$value[1]/g;
		push( @PUTPAGE, $body );
	}

	# フッターの表示
	$flg = 0;
	foreach $line (@HTML) {
		if( index( $line, "BODY_END" ) >= 0 ) { $flg = 1; next; }
		if ( $flg == 0 ) { next; }
		$line =~ s/(#)(00)(#)/$cc{LoginID}/g;
		push( @PUTPAGE, $line );
	}

	foreach $line (@PUTPAGE) {
		print $line;
	}

	$sth->finish;
	$dbh->disconnect;
}

#==================================================================
#	データ入力用ＨＴＭＬ作成
#==================================================================
sub view_html {

	open(HTML,"$html_file") || die "error!\n";
	flock (HTML, 2);
	@HTML = <HTML>;
	flock (HTML, 8);
	close(HTML);

	open(HTML2,"../head.html") || die "error!\n";
	flock (HTML2, 2);
	@HEAD_HTML = <HTML2>;
	flock (HTML2, 8);
	close(HTML2);

	if( $PARA{SeqNo} ne "" ) {
		# 登録データの読み出し
		$dbh = DBI->connect($data_source,$user_name,$user_pass) || die "CONNECT ERROR $DBI::ERRSTR";
		$sql = "SELECT * FROM receiver WHERE CustomerId=? AND SeqNo=?;";
		$sth = $dbh->prepare($sql);
		$sth->execute( "$PARA{LoginName}", "$PARA{SeqNo}" ) || die $sth->errstr;
		@value = $sth->fetchrow_array;
		$sth->finish;
		$dbh->disconnect;
	}

	$flg = 0;
	$title = "";
	foreach $line (@HTML) {
		if( index( $line, '#INCLUDE_HEAD#' ) >= 0 ) {
			foreach $line2 (@HEAD_HTML) {
				print $line2;
			}
			$line = "<!-- INCLUDE OK -->\n";
		}
		if( $PARA{SeqNo} ne "" ) {
			# 登録データの表示
			$line =~ s/(#)(\d\d)(#)/$value[$2]/;	# 単純なデータの表示

			# タイトル
			$title = "お届け先変更";
			$line =~ s/(#)(TITLE)(#)/$title/;

			# オプション選択の初期値表示
			if( index( $line, "Prefecture" ) >= 0 ) { $flg = 3; }
			if( index( $line, "/select" ) >= 0 ) { $flg = 0; }
			if( $flg != 0 ) {
				$name = "value=\"$value[$flg]\"";
				if( index( $line, "$name" ) >= 0 ) {
					$line =~ s/>/ selected>/;
				}
			}

			# 特殊表示
			if( index( $line, "Zip" ) >= 0 ) {
				# 郵便番号
				$zip1 = $value[2] / 10000;
				$zip2 = $value[2] % 10000;
				$buf = sprintf( "%03d", $zip1 );
				$line =~ s/(#)(ab)/$buf/;
				$buf = sprintf( "%04d", $zip2 );
				$line =~ s/(#)(cd)/$buf/;
			}
		} else {
			# 登録データの表示
			$line =~ s/#06#/$PARA{Name}/;
			$line =~ s/#ab/$PARA{Zip1}/;
			$line =~ s/#cd/$PARA{Zip2}/;
			$line =~ s/#04#/$PARA{Address1}/;
			$line =~ s/#05#/$PARA{Address2}/;
			$line =~ s/#07#/$PARA{Tel}/;
			if( $PARA{Prefecture} ne "" ) {
				$line =~ s/value=\"$PARA{Prefecture}\"/value=\"$PARA{Prefecture}\" selected/;
			}
			# タイトル
			$title = "お届け先登録";
			$line =~ s/(#)(TITLE)(#)/$title/;
			# 未入力状態の表示
			# LoginNameの反映
			if( index( $line, "LoginName" ) >= 0 ) {
				if( $PARA{LoginName} eq "" ) {
					$line =~ s/(#)(\d\d)(#)/$cc{LoginID}/;
				}
				else {
					$line =~ s/(#)(\d\d)(#)/$PARA{LoginName}/;
				}
			}
			# SeqNoの反映
			if( index( $line, "SeqNo" ) >= 0 ) {
				$line =~ s/(#)(\d\d)(#)/$PARA{SeqNo}/;
			}
			$line =~ s/(#)(\d\d)(#)//g;
			$line =~ s/(#)(ab)//g;
			$line =~ s/(#)(cd)//g;
		}
		print $line;
	}
}

#==================================================================
#	戻り時の再表示
#==================================================================
sub reload_html {

	open(HTML,"$html_file") || die "error!\n";
	flock (HTML, 2);
	@HTML = <HTML>;
	flock (HTML, 8);
	close(HTML);

	open(HTML2,"../head.html") || die "error!\n";
	flock (HTML2, 2);
	@HEAD_HTML = <HTML2>;
	flock (HTML2, 8);
	close(HTML2);

	$flg = 0;
	foreach $line (@HTML) {
		if( index( $line, '#INCLUDE_HEAD#' ) >= 0 ) {
			foreach $line2 (@HEAD_HTML) {
				print $line2;
			}
			$line = "<!-- INCLUDE OK -->\n";
		}
		$name = "";
		# ログイン名
		if( index( $line, "LoginName" ) >= 0 ) { $name = 'LoginName'; }
		# 通し番号
		if( index( $line, "SeqNo" ) >= 0 ) { $name = 'SeqNo'; }
		# 氏名
		if( index( $line, "\"Name" ) >= 0 ) { $name = 'Name'; }
		# 住所
		if( index( $line, "Address1" ) >= 0 ) { $name = 'Address1'; }
		if( index( $line, "Address2" ) >= 0 ) { $name = 'Address2'; }
		# 電話番号
		if( index( $line, "Tel" ) >= 0 ) { $name = 'Tel'; }
		# 最終注文日
		if( index( $line, "LastOrderDate" ) >= 0 ) { $name = 'LastOrderDate'; }
		# 最終注文商品コード
		if( index( $line, "LastOrderGoodsCode" ) >= 0 ) { $name = 'LastOrderGoodsCode'; }
		# 最終注文商品名
		if( index( $line, "LastOrderGoodsName" ) >= 0 ) { $name = 'LastOrderGoodsName'; }
		# 最終注文数
		if( index( $line, "LastOrderQuantity" ) >= 0 ) { $name = 'LastOrderQuantity'; }
		# 最終注文金額
		if( index( $line, "LastOrderAmountOfMoney" ) >= 0 ) { $name = 'LastOrderAmountOfMoney'; }
		if( $name ne "" ) {
			$line =~ s/(#)(\d\d)(#)/$PARA{$name}/;	# 単純なデータの表示
		}

		# タイトル
		$line =~ s/(#)(TITLE)(#)/$PARA{Title}/;

		# オプション選択の初期値表示
		if( index( $line, "Prefecture" ) >= 0 ) { $flg = 3; }	# 都道府県
		if( index( $line, "/select" ) >= 0 ) { $flg = 0; }
		if( $flg != 0 ) {
			$name = "value=\"$PARA{Prefecture}\"";
			if( index( $line, "$name" ) >= 0 ) {
				$line =~ s/>/ selected>/;
			}
		}

		# 特殊表示
		if( index( $line, "Zip" ) >= 0 ) {
			# 郵便番号（111-1111のように分解）
			$line =~ s/(#)(ab)/$PARA{Zip1}/;
			$line =~ s/(#)(cd)/$PARA{Zip2}/;
		}
		# 年齢
		$line =~ s/(#)(\d\d)(#)//g;
		print $line;
	}
}

#==================================================================
#	データを登録する
#==================================================================
sub write_data {

	$dbh = DBI->connect($data_source,$user_name,$user_pass) || die "CONNECT ERROR $DBI::ERRSTR";

	$sql = "SELECT * FROM receiver WHERE CustomerId=? AND SeqNo=?;";
	$sth = $dbh->prepare($sql);
	$sth->execute( "$PARA{LoginName}", "$PARA{SeqNo}" ) || die $sth->errstr;

  # 郵便番号を３桁−４桁に桁揃えする
  $zip1 = 0 + $PARA{Zip1};
  $zip2 = 0 + $PARA{Zip2};
  $zip = sprintf( "%03d%04d", $zip1, $zip2 );

	if( $sth->rows == 0 ) {
		# 新規登録
		$sql = "INSERT INTO receiver VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?);";
		$sth = $dbh->prepare($sql);
		$sth->bind_param( 1, $PARA{LoginName} );					# ＩＤ
		$sth->bind_param( 2, 0 );													# 届け先コード（自動採番）
		$sth->bind_param( 3, $zip );											# 郵便番号
		$sth->bind_param( 4, $PARA{Prefecture} );					# 都道府県
		$sth->bind_param( 5, $PARA{Address1} );						# 住所（市区町村番地）
		$sth->bind_param( 6, $PARA{Address2} );						# 住所（建物／アパート名）
		$sth->bind_param( 7, $PARA{Name} );								# 名前
		$sth->bind_param( 8, $PARA{Tel} );								# 電話番号
		$sth->bind_param( 9, 0 );													# 最終注文日
		$sth->bind_param( 10, "" );												# 最終注文商品コード
		$sth->bind_param( 11, "" );												# 最終注文商品名
		$sth->bind_param( 12, 0 );												# 最終注文数量
		$sth->bind_param( 13, 0 );												# 最終注文金額
		$sth->execute || die print $sth->errstr;
	} else {
		# 更新
		$sql = "UPDATE receiver SET CustomerId=?,SeqNo=?,ZipCode=?,Address1=?,Address2=?,Address3=?,Name=?,Telephone=?";
		$sql = $sql . ",LastOrderDate=?,LastOrderGoodsCode=?,LastOrderGoodsName=?,LastOrderQuantity=?,LastOrderAmountOfMoney=?";
		$sql = $sql . " WHERE CustomerID=? AND SeqNo=?;";
		$sth = $dbh->prepare($sql);
		$sth->bind_param( 1, $PARA{LoginName} );								# ＩＤ
		$sth->bind_param( 2, $PARA{SeqNo} );										# 届け先コード
		$sth->bind_param( 3, $zip );														# 郵便番号
		$sth->bind_param( 4, $PARA{Prefecture} );								# 都道府県
		$sth->bind_param( 5, $PARA{Address1} );									# 住所（市区町村番地）
		$sth->bind_param( 6, $PARA{Address2} );									# 住所（建物／アパート名）
		$sth->bind_param( 7, $PARA{Name} );											# 名前
		$sth->bind_param( 8, $PARA{Tel} );											# 電話番号
		$sth->bind_param( 9, $PARA{LastOrderDate} );						# 最終注文日
		$sth->bind_param( 10, $PARA{LastOrderGoodsCode} );			# 最終注文商品コード
		$sth->bind_param( 11, $PARA{LastOrderGoodsName} );			# 最終注文商品名
		$sth->bind_param( 12, $PARA{LastOrderQuantity} );				# 最終注文数量
		$sth->bind_param( 13, $PARA{LastOrderAmountOfMoney} );	# 最終注文金額
		$sth->bind_param( 14, $PARA{LoginName} );								# ＩＤ
		$sth->bind_param( 15, $PARA{SeqNo} );										# 届け先コード
		$sth->execute || die print $sth->errstr;
	}

	$sth->finish;
	$dbh->disconnect;
}

#==================================================================
#	データを削除する
#==================================================================
sub delete_data {
	
	$dbh = DBI->connect($data_source,$user_name,$user_pass) || die "CONNECT ERROR $DBI::ERRSTR";

	$sql = "DELETE from receiver WHERE CustomerId=? AND SeqNo=?;";
	$sth = $dbh->prepare($sql);
	$sth->execute( "$PARA{LoginName}", "$PARA{SeqNo}" ) || die print $sth->errstr;

	$sth->finish;
	$dbh->disconnect;
}

#==================================================================
#	必須入力のチェック
#==================================================================
sub err_check {

	$err_message = "";

	# 各必須項目の未入力チェック
	if( $PARA{Name} eq "" ) {
		$err_message = $err_message . "\n■氏名が入力されていません。<BR>\n";
	}
#	if( $PARA{Nenrei} eq "" ) {
#		$err_message = $err_message . "■年齢が入力されていません。<BR>\n";
#	}
#	if( $PARA{Nenrei} < 20 ) {
#		$err_message = $err_message . "■未成年の方は登録できません。<BR>\n";
#	}
	if( $PARA{Zip1} eq "" or $PARA{Zip2} eq "" ) {
		$err_message = $err_message . "■郵便番号が入力されていません。<BR>\n";
	}
	if( $PARA{Prefecture} eq "--- 選択して下さい ---" ) {
		$err_message = $err_message . "■都道府県が入力されていません。<BR>\n";
	}
	if( $PARA{Address1} eq "" ) {
		$err_message = $err_message . "■住所（市区町村番地）が入力されていません。<BR>\n";
	}
	if( $PARA{Tel} eq "" ) {
		$err_message = $err_message . "■電話番号が入力されていません。<BR>\n";
	}

	if( $err_message ne "" ) {
		# エラー
		### 隠し入力に既存入力値を保存しておく ###
		# タイトル
		$err_message = $err_message . '<INPUT size="20" type="hidden" maxlength="20" name="Title" value="' . $PARA{Title} . "\">\n";
		# ログイン名
		$err_message = $err_message . '<INPUT size="16" type="hidden" maxlength="16" name="LoginName" value="' . $PARA{LoginName} . "\">\n";
		# 通し番号
		$err_message = $err_message . '<INPUT size="10" type="hidden" maxlength="10" name="SeqNo" value="' . $PARA{SeqNo} . "\">\n";
		# 氏名
		$err_message = $err_message . '<INPUT size="20" type="hidden" maxlength="20" name="Name" value="' . $PARA{Name} . "\">\n";
		# 年齢
		$err_message = $err_message . '<INPUT size="20" type="hidden" maxlength="3" name="Nenrei" value="' . $PARA{Nenrei} . "\">\n";
		# 郵便番号
		$err_message = $err_message . '<INPUT size="3" type="hidden" maxlength="3" name="Zip1" value="' . $PARA{Zip1} . "\">\n";
		$err_message = $err_message . '<INPUT size="4" type="hidden" maxlength="4" name="Zip2" value="' . $PARA{Zip2} . "\">\n";
		# 都道府県
		$err_message = $err_message . '<INPUT size="22" type="hidden" maxlength="22" name="Prefecture" value="' . $PARA{Prefecture} . "\">\n";
		# 住所
		$err_message = $err_message . '<INPUT size="50" type="hidden" maxlength="50" name="Address1" value="' . $PARA{Address1} . "\">\n";
		$err_message = $err_message . '<INPUT size="50" type="hidden" maxlength="50" name="Address2" value="' . $PARA{Address2} . "\">\n";
		# 電話番号
		$err_message = $err_message . '<INPUT size="15" type="hidden" maxlength="15" name="Tel" value="' . $PARA{Tel} . "\">\n";
		# 最終注文日
		$err_message = $err_message . '<INPUT size="8" type="hidden" maxlength="8" name="LastOrderDate" value="' . $PARA{LastOrderDate} . "\">\n";
		# 最終注文商品コード
		$err_message = $err_message . '<INPUT size="20" type="hidden" maxlength="20" name="LastOrderGoodsCode" value="' . $PARA{LastOrderGoodsCode} . "\">\n";
		# 最終注文商品名
		$err_message = $err_message . '<INPUT size="50" type="hidden" maxlength="50" name="LastOrderGoodsName" value="' . $PARA{LastOrderGoodsName} . "\">\n";
		# 最終注文数量
		$err_message = $err_message . '<INPUT size="4" type="hidden" maxlength="4" name="LastOrderQuantity" value="' . $PARA{LastOrderQuantity} . "\">\n";
		# 最終注文金額
		$err_message = $err_message . '<INPUT size="9" type="hidden" maxlength="9" name="LastOrderAmountOfMoney" value="' . $PARA{LastOrderAmountOfMoney} . "\">\n";

		open(HTML,"$inputerr_file") || die "error!\n";
		flock (HTML, 2);
		@HTML = <HTML>;
		flock (HTML, 8);
		close(HTML);

		open(HTML2,"../head.html") || die "error!\n";
		flock (HTML2, 2);
		@HEAD_HTML = <HTML2>;
		flock (HTML2, 8);
		close(HTML2);
	
		foreach $line (@HTML) {
			if( index( $line, '#INCLUDE_HEAD#' ) >= 0 ) {
				foreach $line2 (@HEAD_HTML) {
					print $line2;	
				}
				$line = "<!-- INCLUDE OK -->\n";
			}
			$line =~ s/(#)(TITLE)(#)/$PARA{Title}/;	# タイトル
			$line =~ s/(#)(aa)(#)/$err_message/;		#エラーメッセージの表示
			print $line;
		}
		exit;
	}
}

