#counter **内容 [#x2307cb2] #setlinebreak(on) #contents **1.目的 [#l604e78e] 部署のメンバーが今どこで何しているのか把握するために使用します。 その人宛に電話がかかってきた時にすぐに状況を把握できるため対応がスムーズになるかと思われます。 (入力するのだけは面倒。社内の勤務システムと連動できればさらに便利になりますね。。) **2.ツールのURL [#w5c16ff2] http://hinata.la.coocan.jp/tool/zaseki_koushin.cgi (適当に更新していただいてまったく問題ありません。むしろたくさんいじってみて下さい。) **3.機能の概要 [#re0dd3a1] 3-1.出勤状況を座席表に反映させ表示する。 「向きを逆にする」をクリックすると逆向きの座席表になる。 3-2.出勤状況は更新ページから更新できる。 「出勤状況を更新する」をクリックすると更新用ページが表示され、情報を更新できる。 (個別更新、チーム一括更新ができる。) 3-3.ロケーション(休務)ごとに並べえる。 「ロケーション(休務)ごとに表示する」をクリックすると 3-4.取次ぎ方法を表示する。 座席表の各座席にマウスをポイントすると、取り次ぎ方法が表示される。 別ロケーションの場合はその電話番号が出力される。 **4.使用イメージ [#peedc9d7] 4-1.出勤状況の更新 朝のミーティングの前などに各チームにて「出勤状況更新ページ」 から情報を更新する。 4-2.出勤状況の確認 電話がかかってきた時など、その人がどこにいるのか確認するためには 座席表(もしくは逆向きの座席表)を表示する。 ※ 日中情報が更新されることもあるためすでに表示している場合は 「最新の情報を表示する」をクリックした方が無難です。 ※ その情報がいつの情報であるか、最終更新日時も座席表に表示されている。 4-3.ロケーションごとに表示 「ロケーション(休務)ごとに表示する」のページは、 まとめて報告したい時(朝のミーティングなど)にはこのページを確認すると便利かと。 ※ こツールの例では、大手町を本拠地としていてよく新宿ロケーションに出かけることがある、という設定です。 **5.ディレクトリ構成 [#e3f31060] zaseki_asami.cgi zaseki_gyaku.cgi zaseki_hyouji.cgi zaseki_koushin.cgi zaseki_data/poptxt.js ←ポップアップを出力するためのJavascript /zaseki1.txt ←出勤状況のデータたち zaseki2.txt zaseki3.txt zaseki4.txt zaseki5.txt /tmp/ ←情報の更新時に一時的に使用するディレクトリ ※poptxt.jsのソースは[[HIMAJIN>http://himajin.moo.jp/]]様のページから頂きました。 誠にありがとうございます。 **6.ソースイメージ [#v8d7c0fa] ***6-1.zaseki_koushin.cgi [#xa7aa111] #!/usr/bin/perl sub printradio{ my $checked =""; if ($_[0] eq $_[1]){$checked="checked";} print <<EOL; <input type="radio" name="locate$_[2]_$_[3]" value="$_[0]" $checked>$_[0] EOL } sub printform{ my $color ="white"; if($_[5]%2==1){$color="#CCFFFF";} print <<EOL; <tr bgcolor="$color"><td width="120"> $_[1]</td> <td> EOL &printradio("大手町",$_[2],$_[4],$_[0]); &printradio("新宿",$_[2],$_[4],$_[0]); &printradio("年休",$_[2],$_[4],$_[0]); &printradio("週休",$_[2],$_[4],$_[0]); &printradio("長期出張",$_[2],$_[4],$_[0]); &printradio("深夜勤務",$_[2],$_[4],$_[0]); &printradio("研修",$_[2],$_[4],$_[0]); &printradio("その他",$_[2],$_[4],$_[0]); print "</td>"; print <<EOL; <td> <input type=\"text\" name="bikou$_[4]_$_[0]" size="30" maxlength="40" value="$_[3]"></td> <td> <input type="submit" value="個別更新" name="submit$_[4]_$_[0]"> </td> </tr> EOL } sub team{ my $color=""; my $bikou=""; my $koushin=""; my $count=0; my $teamname=""; open(F,$_[0]); while(<F>){ if($_=~/teamname=([\S\s]+),[0-9\-\/\s]+/){ $teamname=$1; print <<EOL; ■$teamname <table><tr><td></td><td><center>出勤状況</td><td><center>備考</td><td></td></tr> EOL } if($_=~/([0-9]*),([0-9\-]*),(\S*),(\S*),([\S\s]*),[0-9\s\/:]*/){ if($4 eq ""){next;} &printform("$1","$3","$4","$5",$_[1],$count); $count++; next; } if($_=~/([0-9]*),(\S*),(\S*),([\S\s]*),[0-9\s\/:]*/){ if($3 eq ""){next;} &printform("$1","$2","$3","$4",$_[1],$count); $count++; } } print <<EOL; <tr><td></td><td></td><td></td><td> <input type="submit" value="このチームをすべて更新" name="submit$_[1]_all"></td></tr> </table> <hr> EOL close(F); } print <<"EOL"; Content-type: text/html <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <TITLE>出勤状況更新ページ</TITLE> </HEAD> <BODY> <form method="POST" action="zaseki_hyouji.cgi"> [<a href="./zaseki_hyouji.cgi">情報を更新せずに座席表を表示する</a>] <hr> EOL $shimacnt=0; @files = glob ("zaseki_data/*.txt"); foreach $i (@files){ $shimacnt++; &team("$i","$shimacnt"); } print <<"EOL"; [<a href="./zaseki_hyouji.cgi">情報を更新せずに座席表を表示する</a>] </BODY> </HTML> EOL ***6-2.zaseki_hyouji.cgi [#gd9e2ba1] #!/usr/bin/perl sub decode { local($args, $n_read, *terms, $tag, $value); $ENV{'REQUEST_METHOD'} eq "POST" ? ($n_read = sysread(STDIN, $args, $ENV{'CONTENT_LENGTH'})): ($args = $ENV{'QUERY_STRING'}); @terms = split('&', $args); foreach (@terms) { ($tag, $value) = split(/=/, $_, 2); $value =~ s/\+/ /g; $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/ge; $tags{$tag} = $value; # tags is global } } sub kobetsu_koushin{ my $updated_line=""; my $locate="locate${_[0]}_${_[1]}"; my $bikou="bikou${_[0]}_${_[1]}"; $tags{$bikou}=~s/,/、/g; my $team=${_[0]}; my $naisen=${_[1]}; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); my $yyyymmddHHMM = sprintf("%04d/%02d/%02d %02d:%02d", $year + 1900, $mon +1, $mday, $hour, $min); open(OLD,"zaseki_data/zaseki$team.txt"); while(<OLD>){ if($_=~/$naisen,([0-9\-]*),(\S*),\S*,[\S\s]*,[0-9\s\/:]*/){ $updated_line="$naisen,$1,$2,$tags{$locate},$tags{$bikou},$yyyymmddHHMM\n"; last; } if($_=~/$naisen,(\S*),\S*,[\S\s]*,[0-9\s\/:]*/){ $updated_line="$naisen,$1,$tags{$locate},$tags{$bikou},$yyyymmddHHMM\n"; last; } } close(OLD); open(TMP,">zaseki_data/tmp/zaseki${team}_tmp.txt"); open(OLD,"zaseki_data/zaseki$team.txt"); while(<OLD>){ if($_=~/$naisen/){print TMP $updated_line;}else{print TMP $_;} } close(OLD); close(TMP); open(TMP,"zaseki_data/tmp/zaseki${team}_tmp.txt"); open(NEW,">zaseki_data/zaseki$team.txt"); while(<TMP>){ print NEW $_; } close(NEW); close(TMP); } sub button_check{ my $button=""; $button="submit$_[1]_all"; if($tags{$button} ne ""){return $button;} open(F,$_[0]); while(<F>){ if($_=~/^([0-9]{4})/){ $button="submit$_[1]_$1"; if($tags{$button} ne ""){return $button;} } } } sub which_button{ my $button=""; my $shimacnt=0; @files = glob ("zaseki_data/*.txt"); foreach $i (@files){ $shimacnt++; $button=&button_check("$i","$shimacnt"); if($button ne ""){return $button;} } return $button; } sub data_koushin{ my $submitted_button= &which_button(); $submitted_button =~s/submit//g; @list = split( /_/ , $submitted_button ); my $team=$list[0]; my $naisen=$list[1]; if($naisen eq "all"){ open(TEAM,"zaseki_data/zaseki$team.txt"); while(<TEAM>){ if($_=~/^([0-9]{4})/){ &kobetsu_koushin("$team","$1"); } } close(TEAM); }else{ &kobetsu_koushin("$team","$naisen"); } } sub desidecolor{ if($_[0] eq "年休") {return "gray";} if($_[0] eq "週休") {return "gray";} if($_[0] eq "研修") {return "gray";} if($_[0] eq "長期出張"){return "gray";} if($_[0] eq "その他") {return "gray";} if($_[0] eq "深夜勤務"){return "#9999CC";} if($_[0] eq "大手町") {return "#99CCCC";} if($_[0] eq "新宿") {return "#99CC99";} } sub setmsg{ my $naisen=$_[0]; my $name=$_[1]; my $locate=$_[2]; if($locate eq "大手町" || $locate eq "深夜勤務"){ if($naisen eq "0000"){return "";} else{ return "'■取次ぎ方法1 パーク保留<br> 1-1.「パーク保留」ボタンを押す。<br>" . " 1-2.表示されたパーク番号を$nameさんに伝える。<br>" . " 1-3.$nameさんはその番号を入力して発信する。<br>" . "■取次ぎ方法2 転送<br> 2-1.「転送/音声メール」ボタンを押す。<br>" . " 2-2.<font size=4><b>$naisen</b></font>を入力し「決定/発信」ボタンを押す。<br>" . " 2-3.$nameさんが出たら切る。<br>" . " (転送をやめたい場合は「取消」ボタンを押す。)'"; } }elsif($locate eq "新宿"){ return "'■新宿電話番号<br>" . " 03-xxxx-xxxx'"; }else{ return ""; } } sub shima{ my $count=0; my $color=""; my $koushin=""; my $msg=""; open(F,$_[0]); while(<F>){ if($_=~/teamname=([\S\s]+),([0-9\-\/\s]+)/){ print "■$1 ( $2)"; } if($_=~/([0-9]*),([0-9\-]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){ $color = &desidecolor("$4"); if($3 ne ""){ $koushin="最終更新 $6"; }else{ $koushin=" "; $msg=""; } $msg=&setmsg("$1","$3","$4"); print <<"EOL"; <table border=1 align="left"> <tr> <td bgcolor ="$color" width="140" onMouseover="opentext($msg)" onMouseout="opentext('')"> <font size = "1">$1 $2</font><br> <b>$3 </b><br> $4 <br> <font size = 2>$5 </font> <div align="right"><font size = 1>$koushin</font></div></td> </tr> </table> EOL $koushin=""; next; } if($_=~/([0-9]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){ $color = &desidecolor("$3"); if($2 ne ""){ $koushin="最終更新 $5"; }else{ $koushin=" "; } $msg=&setmsg("$1","$2","$3"); if($count==0){print "<table border=1><tr>\n";} print <<"EOL"; <td bgcolor ="$color" width="140" onMouseover="opentext($msg)" onMouseout="opentext('')"><font size = "1">$1 </font><br> <b>$2 </b><br> $3 <br> <font size = 2>$4 </font><br> <div align="right"><font size = 1>$koushin</font></div></td> EOL if($count==4){print "</tr><tr>";} if($count==9){print "</tr></table> <br>";} $count++; $koushin=""; } } close(F); } print <<"EOL"; Content-type: text/html <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <TITLE>座席表 (山向き)</TITLE> <script type="text/javascript" src="zaseki_data/poptxt.js"> </script> </HEAD> <BODY> [<a href="./zaseki_hyouji.cgi">最新の情報を表示する</a>] [<a href="./zaseki_koushin.cgi">出勤状況を更新する</a>] [<a href="./zaseki_gyaku.cgi">向きを逆にする</a>] [<a href="./zaseki_asami.cgi">ロケーション(休務)ごとに表示する</a>] <hr> <table> <tr> <td><table><tr><td bgcolor="#99CCCC" height="20" width="30"></td></tr></table></td> <td>・・・大手町</td> <td width="20"></td> <td><table><tr><td bgcolor="#99CC99" height="20" width="30"></td></tr></table></td> <td>・・・新宿</td> <td width="20"></td> <td><table><tr><td bgcolor="#9999CC" height="20" width="30"></td></tr></table></td> <td>・・・深夜勤務</td> <td width="20"></td> <td><table><tr><td bgcolor="gray" height="20" width="30"></td></tr></table></td> <td>・・・年休,週休,長期出張,研修,その他</td> </tr> </table> <br> EOL if ($ENV{'REQUEST_METHOD'} eq "POST") { &decode(); &data_koushin(); } @files = glob ("zaseki_data/*.txt"); foreach $i (@files){ &shima("$i"); } print <<"EOL"; <hr> [<a href="./zaseki_hyouji.cgi">最新の情報を表示する</a>] [<a href="./zaseki_koushin.cgi">出勤状況を更新する</a>] [<a href="./zaseki_gyaku.cgi">向きを逆にする</a>] [<a href="./zaseki_asami.cgi">ロケーション(休務)ごとに表示する</a>] </BODY> </HTML> EOL ***6-3.zaseki_gyaku.cgi [#a5321133] #!/usr/bin/perl sub desidecolor{ if($_[0] eq "年休") {return "gray";} if($_[0] eq "週休") {return "gray";} if($_[0] eq "研修") {return "gray";} if($_[0] eq "長期出張"){return "gray";} if($_[0] eq "その他") {return "gray";} if($_[0] eq "深夜勤務"){return "#9999CC";} if($_[0] eq "大手町") {return "#99CCCC";} if($_[0] eq "新宿") {return "#99CC99";} } sub setmsg{ my $naisen=$_[0]; my $name=$_[1]; my $locate=$_[2]; if($locate eq "大手町" || $locate eq "深夜勤務"){ if($naisen eq "0000"){return "";} else{ return "'■取次ぎ方法1 パーク保留<br> 1-1.「パーク保留」ボタンを押す。<br>" . " 1-2.表示されたパーク番号を$nameさんに伝える。<br>" . " 1-3.$nameさんはその番号を入力して発信する。<br>" . "■取次ぎ方法2 転送<br> 2-1.「転送/音声メール」ボタンを押す。<br>" . " 2-2.<font size=4><b>$naisen</b></font>を入力し「決定/発信」ボタンを押す。<br>" . " 2-3.$nameさんが出たら切る。<br>" . " (転送をやめたい場合は「取消」ボタンを押す。)'"; } }elsif($locate eq "新宿"){ return "'■新宿電話番号<br>" . " 03-xxxx-xxxx'"; }else{ return ""; } } sub shima{ my $linecnt=0; my $color=""; my $koushin=""; my $index=0; my @line; open(F,$_[0]); while(<F>){ if($_=~/teamname=([\S\s]+),([0-9\-\/\s]+)/){ print "■$1 ( $2)"; } if($_=~/([0-9]*),([0-9\-]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){ $line[$linecnt]=$_; $linecnt++; next; } if($_=~/([0-9]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){ $line[$linecnt]=$_; $linecnt++; } } close(F); for ($index=$linecnt;$index>=0;$index--){ if($line[$index]=~/([0-9]*),([0-9\-]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){ $color = &desidecolor("$4"); if($3 ne ""){ $koushin="最終更新 $6"; }else{ $koushin=" "; } $msg=&setmsg("$1","$3","$4"); print <<"EOL"; <table border=1> <tr> <td bgcolor ="$color" width="140" onMouseover="opentext($msg)" onMouseout="opentext('')"><font size = "1">$1 $2</font><br> <b>$3 </b><br> $4 <br> <font size = 2>$5 </font> <div align="right"><font size = 1>$koushin</font></div></td> </tr> </table> <table> <tr> <td width="140"><font size = "1"> </font><br> <b> </b><br> <br> <font size = 2> </font> <div align="right"><font size = 1> </font></div></td> </tr> </table> EOL $koushin=""; next; } if($line[$index]=~/([0-9]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){ $color = &desidecolor("$3"); if($2 ne ""){ $koushin="最終更新 $5"; }else{ $koushin=" "; } $msg=&setmsg("$1","$2","$3"); if($index==10){print "<table border=1 align=\"left\"><tr>\n";} print <<"EOL"; <td bgcolor ="$color" width="140" onMouseover="opentext($msg)" onMouseout="opentext('')"><font size = "1">$1 </font><br> <b>$2 </b><br> $3 <br> <font size = 2>$4 </font><br> <div align="right"><font size = 1>$koushin</font></div></td> EOL if($index==6){print "</tr><tr>";} if($index==1){print "</tr></table>";} $koushin=""; } } print "<br>"; } print <<"EOL"; Content-type: text/html <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <TITLE>座席表 (海向き)</TITLE> <script type="text/javascript" src="zaseki_data/poptxt.js"> </script> </HEAD> <BODY> EOL print <<EOL; [<a href="./zaseki_gyaku.cgi">最新の情報を表示する</a>] [<a href="./zaseki_koushin.cgi">出勤状況を更新する</a>] [<a href="./zaseki_hyouji.cgi">向きを逆にする</a>] [<a href="./zaseki_asami.cgi">ロケーション(休務)ごとに表示する</a>] <hr> <table> <tr> <td><table><tr><td bgcolor="#99CCCC" height="20" width="30"></td></tr></table></td> <td>・・・大手町</td> <td width="20"></td> <td><table><tr><td bgcolor="#99CC99" height="20" width="30"></td></tr></table></td> <td>・・・新宿</td> <td width="20"></td> <td><table><tr><td bgcolor="#9999CC" height="20" width="30"></td></tr></table></td> <td>・・・深夜勤務</td> <td width="20"></td> <td><table><tr><td bgcolor="gray" height="20" width="30"></td></tr></table></td> <td>・・・年休,週休,長期出張,研修,その他</td> </tr> </table> EOL @files = glob ("zaseki_data/*.txt"); $count=@files; $ind; for ($ind=$count;$ind>=0;$ind--){ &shima("$files[$ind]"); } print <<"EOL"; <hr> [<a href="./zaseki_gyaku.cgi">最新の情報を表示する</a>] [<a href="./zaseki_koushin.cgi">出勤状況を更新する</a>] [<a href="./zaseki_hyouji.cgi">向きを逆にする</a>] [<a href="./zaseki_asami.cgi">ロケーション(休務)ごとに表示する</a>] </BODY> </HTML> EOL ***6-4.zaseki_asami.cgi [#s3208208] #!/usr/bin/perl $globalcnt=0; @locations=("新宿","深夜勤務","年休","週休","研修","長期出張","その他","大手町"); sub desidecolor{ if($_[0] eq "年休") {return "gray";} if($_[0] eq "週休") {return "gray";} if($_[0] eq "研修") {return "gray";} if($_[0] eq "長期出張"){return "gray";} if($_[0] eq "その他") {return "gray";} if($_[0] eq "深夜勤務"){return "#9999CC";} if($_[0] eq "大手町") {return "#99CCCC";} if($_[0] eq "新宿") {return "#99CC99";} } sub shima{ my $count=0; my $color=""; my $koushin=""; my $msg=""; my $teamname=""; my $color=&desidecolor("$_[1]"); open(F,$_[0]); while(<F>){ if($_=~/teamname=([\S\s]+),[0-9\-\/\s]+/){ $teamname=$1; } if($_=~/([0-9]*),([0-9\-]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){ if($4 eq $_[1]){ $count++; } next; } if($_=~/([0-9]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){ if($3 eq $_[1]){ $count++; } } } $globalcnt=$globalcnt+$count; $teamname="<td width=150 rowspan=$count>$teamname</td>"; open(F,$_[0]); while(<F>){ if($_=~/([0-9]*),([0-9\-]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){ if($4 eq $_[1]){ print <<EOL; <tr bgcolor="$color"> $teamname <td width=120>$3</td> <td width=200>$5 </td> <td><font size=2>最終更新 $6</font></td> </tr> EOL $teamname=""; } next; } if($_=~/([0-9]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){ if($3 eq $_[1]){ print <<EOL; <tr bgcolor="$color"> $teamname <td width=120>$2</td> <td width=200>$4 </td> <td><font size=2>最終更新 $5</font></td> </tr> EOL $teamname=""; } } } close(F); } print <<"EOL"; Content-type: text/html <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <TITLE>朝ミ確認用</TITLE> <script type="text/javascript" src="zaseki_data/poptxt.js"> </script> </HEAD> <BODY> [<a href="./zaseki_asami.cgi">最新の情報を表示する</a>] [<a href="./zaseki_hyouji.cgi">座席表を表示する</a>] [<a href="./zaseki_koushin.cgi">出勤状況を更新する</a>] <hr> <br> EOL foreach $locate(@locations){ $globalcnt=0; print "■$locate<br><table border=1>"; @files = glob ("zaseki_data/*.txt"); foreach $team (@files){ &shima("$team","$locate"); } print "</table>"; if($globalcnt==0){ print "なし<br> <br>"; }else{print " <br>";} } print <<"EOL"; <hr> [<a href="./zaseki_asami.cgi">最新の情報を表示する</a>] [<a href="./zaseki_hyouji.cgi">座席表を表示する</a>] [<a href="./zaseki_koushin.cgi">出勤状況を更新する</a>] </BODY> </HTML> EOL **7.改版履歴 [#d6a87859] ***090414(初版) [#a1cac902] #ref(zaseki_koushin.cgi_090414.txt) #ref(zaseki_hyouji.cgi_090414.txt) #ref(zaseki_gyaku.cgi_090414.txt) #ref(zaseki_asami.cgi_090414.txt) #ref(zaseki1.txt) #ref(zaseki2.txt) #ref(zaseki3.txt) #ref(zaseki4.txt) #ref(zaseki5.txt) ※poptxt.jsは[[HIMAJIN>http://himajin.moo.jp/]]様のページから拝借いたしました。 再配布になってしまうため、ここにはアップしません。 ↑のリンクの「すぐに使えるJavaScript」→「ポップアップテキスト」です。 作った頃のメモ→[[メモメモ/2009-04-09]]、[[メモメモ/2009-04-12]]、[[メモメモ/2009-04-13]] **バグ管理簿 [#od1d05c2] //#ls2 ---- #comment ---- -[[Perlメモ]] -[[プログラミング]] #amazon_live(books-jp,search,Perl,48) #amazon_search(small)