#┌──────────────────────────
#│ Web Mart v1.31 (2004/04/25) : 新消費税仮対応版
#│ Copyright (c) KentWeb
#│ webmaster@kent-web.com
#│ http://www.kent-web.com/
#└──────────────────────────
$ver = 'Web Mart v1.31';
#┌──────────────────────────
#│ [注意事項]
#│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#│ いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 設置に関する質問はサポート掲示板にお願いいたします。
#│ 直接メールによる質問は一切お受けいたしておりません。
#└─────────────────────────

#-------------------------------------------------
# ▼基本設定
#-------------------------------------------------

# タイトル名
$title = "輸入インテリア家具の買い物籠";

# 本文文字サイズ
$b_size = '13px';

# 本文文字スタイル
$b_face = '"MS UI Gothic", "MS Pゴシック", Osaka';

# カゴCGIスクリプトURL ( http://から記述 )
$script = 'http://www.****.co.jp/kagu/cgi-bin/mart.cgi';

# 注文CGIスクリプトURL ( http://から記述 )
$order = 'http://www.****.co.jp/kagu/cgi-bin-s/mart_order.cgi';

# 管理CGIスクリプトURL ( http://から記述 )
$admin = 'http://www.****.co.jp/kagu/cgi-bin/mart_admin.cgi';

# データファイル( / から始まるフルパス )
$datfile = '
/virtual/kr01234567/public_html/kagu/cgi-bin/mart.dat';

# 「特定商取引に関する法律」の表示内容
# → 引用: http://www.jadma.org/guid_mai/guidelin.html
$rawfile = '/
virtual/kr01234567/public_html/kagu/cgi-bin/mart_raw.txt';

# 在庫管理を行う (0=no 1=yes)
$stock = 0;

# 在庫ファイル( / から始まるフルパス )
$stkfile = '/
virtual/kr01234567/public_html/kagu/cgi-bin/stock.dat';

# ファイルロック形式
# → 0=no 1=symlink関数 2=mkdir関数
$lockkey = 1;

# ロックファイル名
$lockfile = '
/virtual/kr01234567/public_html/kagu/cgi-bin/lock/mart.lock';

# 管理用パスワード
# → できるだけ複雑な英数字で指定してください
$pass = '0123';

# クッキー(顧客情報)をSSL対応 (0=no 1=yes)
# → SSL配下でクッキー(顧客情報)を使う場合secure属性を付加
$ssl_cookie = 0;

# 戻り先URL
$home = "http://www.****.co.jp/kagu/index.htm";

# bodyタグ
$body = '<body bgcolor="#F0F0F0" text="#000000"
link="#0000FF" vlink="#800080" alink="#FF0000">';

# 消費税率
$per_tax = 0.05;

# 都道府県
# → 県別に送料を指定する時はコンマの後に送料を指定
# → 送料が不要な場合は送料部分を 0 とする
@pref = (
'北海道,1260',
'青森県,1050',
'岩手県,1050',
'宮城県,1050',
'秋田県,1050',
'山形県,1050',
'福島県,1050',
'茨城県,525',
'栃木県,525',
'群馬県,525',
'埼玉県,525',
'千葉県,525',
'東京都,525',
'神奈川県,525',
'山梨県,525',
'長野県,840',
'新潟県,840',
'富山県,840',
'石川県,840',
'福井県,840',
'岐阜県,840',
'静岡県,840',
'愛知県,840',
'三重県,840',
'滋賀県,840',
'京都府,840',
'大阪府,840',
'兵庫県,840',
'奈良県,840',
'和歌山県,840',
'鳥取県,1050',
'島根県,1050',
'岡山県,1050',
'広島県,1050',
'山口県,1050',
'徳島県,1050',
'香川県,1050',
'愛媛県,1050',
'高知県,1050',
'福岡県,1050',
'佐賀県,1050',
'長崎県,1050',
'熊本県,1050',
'大分県,1050',
'宮崎県,1050',
'鹿児島県,1050',
'沖縄県,1260',
);

# 送料は税込み (0=no 1=yes)
$cari_tax = 1;

# 送料の無料サービスの合計金額 (税抜き)
# → 一定金額以上の場合に送料を無料
# → この機能を使用しない場合は 0 にする
$cari_serv = 10000;

# 支払方法の選択
# → 支払い別に手数料を指定する時はコンマの後に送料を指定
# → 手数料が不要な場合は手数料部分を 0 とする
@payment = (
'銀行振込,0',
'郵便振替,0',
'代金引換,525',
);

# 支払手数料は税込み (0=no 1=yes)
$paym_tax = 1;

# 配達時間の選択
@deli = ('午前中', '12-14時', '14-16時', '16-18時', '18-20時', '20-21時');

# 管理者アドレス
$master = '****@****.co.jp';

# sendmailパス
$sendmail = '/usr/lib/sendmail';

# テーブル色指定(順に、濃色、薄色、中間色)
$col1 = "#8080C0";
$col2 = "#FFFFFF";
$col3 = "#DCDCED";

# 買物進行パネル色指定(順に、下地色、文字明色、ボタン明色、薄色)
$col4 = "#444444";
$col5 = "#FFFFFF";
$col6 = "#FAC947";
$col7 = "#A2A2A2";

# 属性情報
# → name値は順に、color, size
$opt01 = '色';
$opt02 = 'サイズ';

# クッキーID
# → 順に、買物データ、住所氏名情報
$cookieID = 'WebMart1';
$cookieID2 = 'WebMart2';

# ホスト取得方法
# 0 : gethostbyaddr関数を使わない
# 1 : gethostbyaddr関数を使う
$gethostbyaddr = 1;

# 管理画面のページ当り商品表示件数
$pageLog = 20;

# 買物カゴの中身画面での数量調節の範囲(プルダウン式)
$max_select = 10;

#-------------------------------------------------
# ▲設定完了
#-------------------------------------------------

# 再定義
$zip_coop = 0;

#-------------------------------------------------
# フォームデコード
#-------------------------------------------------
sub decode {
local($j_flag) = @_;
local($buf, $key, $val);
undef(%in);

# データを受理
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
} else {
$buf = $ENV{'QUERY_STRING'};
}

# URLデコード
foreach ( split(/&/, $buf) ) {
($key, $val) = split(/=/);
$key =~ tr/+/ /;
$key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;

# コード変換
&jcode'convert(*val, 'sjis') if ($j_flag);

# タグ & 改行等処理
$val =~ s/&/&amp;/g;
$val =~ s/"/&quot;/g;
$val =~ s/</&lt;/g;
$val =~ s/>/&gt;/g;
$val =~ s/,/,/g;
$val =~ s/\0//g;
$val =~ s/\r\n/<br>/g;
$val =~ s/\r/<br>/g;
$val =~ s/\n/<br>/g;

# 重複データは null で挟む
$in{$key} .= "\0" if (defined($in{$key}));
$in{$key} .= $val;
}
$page = $in{'page'};
$mode = $in{'mode'};

# タイムゾーン設定
$ENV{'TZ'} = "JST-9";

$lockflag=0;
$headflag=0;
}

#-------------------------------------------------
# 登録データ認識
#-------------------------------------------------
sub get_data {
local($code,$name,$price,$intax,$deli,$dai,@op);

%cart=();
open(IN,"$datfile") || &error("Open Error: $datfile");
while (<IN>) {
($code,$name,$price,$intax,$deli,$dai) = split(/<>/);

$cart{$code} = $_;
}
close(IN);
}

#-------------------------------------------------
# 買物カゴ中身
#-------------------------------------------------
sub cart_tbl {
local($job,$postage,$cost) = @_;
local($colspan,$all,$no_tax,$kei,$postage2);

print <<EOM;
<Table border=0 cellspacing=0 cellpadding=0>
<Tr><Td bgcolor="$col1">
<table border=0 cellpadding=5 cellspacing=1 width="100%">
<tr bgcolor="$col1">
<th bgcolor="$col3">商品コード</th>
<th bgcolor="$col3">商品名</th>
<th bgcolor="$col3">数 量</th>
<th bgcolor="$col3">単 価</th>
<th bgcolor="$col3">金 額</th>
<th bgcolor="$col3">消費税</th>
<th bgcolor="$col3">備 考</th>
EOM

$colspan = 7;
if ($job eq "basket") {
$colspan++;
print "<th bgcolor=\"$col3\">変更</th>";
}
print "</tr>\n";

# 中身無しの場合
if (@cook == 0) {
print "<tr bgcolor=\"$col1\">";
print "<td bgcolor=\"$col2\" align=center colspan=\"$colspan\" height=\"50\">";
print "現在買物カゴには何も入っていません</td></td>\n";
}

@op = ('別','込み');
$all=0;
$no_tax=0;
foreach (@cook) {
($id,$code,$num,$size,$col) = split(/,/);
next if (!defined($cart{$code}));

($code,$name,$price,$intax,$deli,$dai) = split(/<>/, $cart{$code});

# 小計
$kei = $price * $num;
$all += $kei;

# 外税商品 & 消費税を合計
if (!$intax) { $no_tax += $kei; }

$kei = &comma($kei);
$price = &comma($price);

print "<tr bgcolor=\"$col1\"><td bgcolor=\"$col2\">&nbsp;$code</td>";
print "<td bgcolor=\"$col2\">$name</td><td align=right bgcolor=\"$col2\">\n";

if ($job eq "basket") {
local($flag)=0;
print "<select name=\"num:$code:$size:$col\">\n";
foreach $i (1 .. $max_select) {
if ($num == $i) {
$flag++;
print "<option value=\"$i\" selected>$i\n";
} else {
print "<option value=\"$i\">$i\n";
}
}
print "<option value=\"$num\" selected>$num\n" if (!$flag);
print "</select>\n";
} else {
print $num;
}

print "</td><td align=right bgcolor=\"$col2\">$price</td>";
print "<td align=right bgcolor=\"$col2\">$kei</td>";
print "<td align=center bgcolor=\"$col2\">$op[$intax]</td>";
print "<td bgcolor=\"$col2\">";

print "[$opt01] $col " if ($col ne "");
print "[$opt02] $size " if ($size ne "");
print "</td>";

# 削除ボタン
if ($job eq "basket") {
print "<td align=center width=60 bgcolor=\"$col2\">";
print "<a href=\"$script?mode=dele&id=$id&back=$in{'back'}\">削除</a></td>";
}
print "</tr>\n";
}

if ($job ne "basket") {
$all_c = &comma($all);

print "<tr bgcolor=\"$col1\">";
print "<td colspan=4 align=right bgcolor=\"$col2\">小計</td>";
print "<td align=right bgcolor=\"$col2\">\\$all_c</td>";
print "<td colspan=3 bgcolor=\"$col2\">\n";

if ($job eq "addr" && $postage == 1) {
print "(送料等は次画面で計算されます)\n";
}

print "</td></tr>\n";
}

# 最終確認画面
if ($job eq "view") {

# 送料サービスフラグ
local($serv_flag)=0;

# 県別送料
if ($postage > 0) {
local($memo);

# 送料サービス有り
if ($cari_serv && $cari_serv <= $all) {
$postage2 = $postage = 0;
$memo = '送料サービス';

$serv_flag++;

# 送料サービス無し
} else {
$postage2 = &comma($postage);
$memo = '&nbsp;';
}

print "<tr bgcolor=\"$col1\">";
print "<td colspan=4 align=right bgcolor=\"$col2\">送料</td>";
print "<td align=right bgcolor=\"$col2\">\\$postage2</td>";
print "<td colspan=3 bgcolor=\"$col2\">$memo</td></tr>\n";
}

# 送料が設定されている場合
if (!$serv_flag) {
$all += $postage;

if ($cari_tax == 0) {
$no_tax += $postage;
}
}

# 支払手数料が設定されている場合
if ($cost > 0) {
$all += $cost;

if ($paym_tax == 0) {
$no_tax += $cost;
}
}

# 合計
if ($no_tax > 0) { $tax = int($no_tax * $per_tax); }
$all2 = $all + $tax;

# コンマ付加
$tax = &comma($tax) if ($tax > 0);
$all = &comma($all);
$all2 = &comma($all2);

# 支払手数料
if ($cost > 0) {
$cost = &comma($cost);
local($pay) = split(/,/, $payment[$in{'payment'}]);

print "<tr bgcolor=\"$col1\">";
print "<td colspan=4 align=right bgcolor=\"$col2\">$pay手数料</td>";
print "<td align=right bgcolor=\"$col2\">\\$cost</td>";
print "<td colspan=3 bgcolor=\"$col2\">&nbsp;</td></tr>\n";
}

if ($tax > 0) {
print "<tr bgcolor=\"$col1\">";
print "<td colspan=4 align=right bgcolor=\"$col2\">消費税</td>";
print "<td align=right bgcolor=\"$col2\">\\$tax</td>";
print "<td colspan=3 align=right bgcolor=\"$col2\">&nbsp;</td></tr>\n";
}

print "<tr><td colspan=4 align=right bgcolor=\"$col2\">合計</td>";
print "<td align=right bgcolor=\"$col2\">\\$all2</td>";
print "<td colspan=3 align=right bgcolor=\"$col2\">&nbsp;</td></tr>\n";
}

print "</table></Td></Tr></Table>\n";
}

#-------------------------------------------------
# 特定商取引法
#-------------------------------------------------
sub note {
&header;
print <<EOM;
<div align="center">
<h3>特定商取引に関する法律の表\示</h3>
<table border=2 cellpadding=10>
<tr><td class=r>
<pre>
EOM
open(IN,"$rawfile") || &error("Open Error: $rawfile");
print <IN>;
close(IN);

print <<EOM;
</pre>
</td></tr>
</table>
<form>
EOM
if ($in{'job'} eq "blank") {
print "<input type=button value='画面を閉じる' onClick='top.close();' class=f>";
} else {
print "<input type=button value='前の画面にもどる' onClick='history.back()' class=f>";
}

print <<EOM;
</form>
</div>
</body>
</html>
EOM
exit;
}

#-------------------------------------------------
# HTMLヘッダ
#-------------------------------------------------
sub header {
local($jvs,$jv2,$meta) = @_;

if ($headflag) { return; }

print "Content-type: text/html\n\n";
print <<"EOM";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<META HTTP-EQUIV="Content-Style-Type" content="text/css">
<STYLE TYPE="text/css">
<!--
body,td,th { font-size: $b_size; font-family: $b_face; }
a:hover { background-color: $col1; color: $col2; }
.l { background-color: #666666; color: #ffffff; }
.r { background-color: #ffffff; color: #000000; }
.menu { background-color: #ffffff; color: #000000; }
-->
</STYLE>
EOM

# 住所フォーム(親ウインドウ)
if ($jvs eq "addr" && $zip_coop) {

print "<SCRIPT LANGUAGE=\"JavaScript\">\n<!--\n";
print "function zipcode(i) {\n";
print "var script = '$order?mode=zipcode&type='+i+'&zip=';\n";
print "if (i > 1) {\n";
print "script += eval(\"document.adrForm.zip\"+i+\".value\");\n";
print "} else {\n";
print "script += document.adrForm.zip.value;\n}\n";
print "window.open(script,\"window1\",\"width=520,height=350,scrollbars=1\");\n";
print "}\n//-->\n</SCRIPT>\n";

# 郵便番号検索画面(小ウインドウ)
} elsif ($jvs eq "zipcode" && $zip_coop) {

local($ken) = $jv2 + 1;

print "<SCRIPT LANGUAGE=\"JavaScript\">\n<!--\n";
print "var i = $in{'type'};\n";
print "function setForm() {\n";
print "if (i > 1) {\n";
print "eval(\"window.opener.document.adrForm.pref\"+i+\".selectedIndex=$ken\");\n";
print "eval(\"window.opener.document.adrForm.addr\"+i+\".value='$adr1$adr2'\");\n";
print "eval(\"window.opener.document.adrForm.zip\"+i+\".value='$in{'zip'}'\");\n";
print "} else {\n";
print "window.opener.document.adrForm.pref.selectedIndex=$ken;\n";
print "window.opener.document.adrForm.addr.value=\"$adr1$adr2\";\n";
print "window.opener.document.adrForm.zip.value=\"$in{'zip'}\";\n";
print "}\nwindow.close();\n";
print "}\n//-->\n</SCRIPT>\n";

}

# meta : no-cashe
if ($meta eq "no-cashe") {
print "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">\n";
}

print "<title>$title</title></head>\n";
print "$body\n";

$headflag=1;
}

#-------------------------------------------------
# エラー処理
#-------------------------------------------------
sub error {
if ($lockflag) { &unlock; }

&header;
print <<EOM;
<div align="center">
<table border=1 cellpadding=18 cellspacing=0 width="450">
<tr><td class="r" align="center">
<h3>ERROR !</h3>
<font color="#dd0000">$_[0]</font>
<p>
<form>
<input type=button value="前画面に戻る" onClick="history.back()">
</form>
</td></tr></table>
</div>
</body>
</html>
EOM
exit;
}

#-------------------------------------------------
# コンマ区切
#-------------------------------------------------
sub comma {
local($_) = @_;

1 while s/(.*\d)(\d\d\d)/$1,$2/;
$_;
}

#-------------------------------------------------
# クッキー処理 : 買物情報
#-------------------------------------------------
sub set_cookie {
local(@cook) = @_;
local($cook, $path);

foreach (@cook) {
s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
$cook .= "$_<>";
}
print "Set-Cookie: $cookieID=$cook; path=/;\n";
}
sub get_cookie {
local($cookID) = shift;
local($key, $val, *cook);

# クッキーを取得
$cook = $ENV{'HTTP_COOKIE'};

# クッキーID単位に分割
foreach ( split(/;/, $cook) ) {
($key, $val) = split(/=/);
$key =~ s/\s//g;
$cook{$key} = $val;
}

# データをURLデコードして復元
foreach ( split(/<>/, $cook{$cookID}) ) {
s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;

push(@cook,$_);
}
return (@cook);
}

#-------------------------------------------------
# ロック処理
#-------------------------------------------------
sub lock {
# リトライ回数
local($retry) = 5;

# 古いロックは削除
if (-e $lockfile) {
local($mtime) = (stat($lockfile))[9];
if ($mtime < time - 30) { &unlock; }
}
# symlink関数式ロック
if ($lockkey == 1) {
while (!symlink(".", $lockfile)) {
if (--$retry <= 0) { &error('LOCK is BUSY'); }
sleep(1);
}
# mkdir関数式ロック
} elsif ($lockkey == 2) {
while (!mkdir($lockfile, 0755)) {
if (--$retry <= 0) { &error('LOCK is BUSY'); }
sleep(1);
}
}

$lockflag=1;
}
sub unlock {
if ($lockkey == 1) {
unlink($lockfile);
} elsif ($lockkey == 2) {
rmdir($lockfile);
}

$lockflag=0;
}


1;

__END__

















←サイトのタイトルを記入








←URL及びホルダ名を入力と言うことです。








←サーバー会社に確認して買い物籠に使用するフルパスを教えて下さいと言えば教えてくれます。




←在庫管理をおこなうかどうかの確認です。選択して下さい。



←サーバー会社に確認して買い物籠に使用するフルパスを教えて下さいと言えば教えてくれます。
(ホルダ名も書き込むことを忘れずに)

←サーバー会社にこれらが使えるかどうかを確認して下さい。(アット・ワイエムシー社は使えます)


←サーバー会社に確認して買い物籠に使用するフルパスを教えて下さいと言えば教えてくれます。

←入力用のパスワードです。


←ドメインがSSL対応かどうかの確認をおこなうこと。
(アット・ワイエムシー社では不可)のため、0)



←戻るべきホームページのアドレスを記入


←買い物籠の配色を決定


←現在は消費税込みの記入の為、0.05と記入のこと。



←送料記入欄です。



















































←現在は消費税込みで表示の為、1です。


←当てはまる金額を記入




←支払い方法の選択です。








←現在は消費税込みの表示の為、1です。





←此処で書いたメールアドレスに受注メールが送信されます。


←自動返信メールをおこなうと言うことです。


買い物籠の配色です。
















←一度受注した方の情報を記憶しておくか否かの選択です。















設定変更は此処までです。


次へ