Counter: 72795, today: 6, yesterday: 0

内容

1.目的

部署のメンバーが今どこで何しているのか把握するために使用します。
電話対応、取次ぎがスムーズになるかと思われます。
(入力するのだけは面倒。社内の勤務システムと連動できればさらに便利になりますね。。)

2.ツールのURL

http://hinata.la.coocan.jp/tool/zaseki_koushin.cgi
(適当に更新していただいてまったく問題ありません。むしろたくさんいじってみて下さい。)

3.機能の概要

3-1.出勤状況を座席表に反映させ表示する。
  「向きを逆にする」をクリックすると逆向きの座席表になる。
3-2.出勤状況は更新ページから更新できる。
  「出勤状況を更新する」をクリックすると更新用ページが表示され、情報を更新できる。
  (個別更新、チーム一括更新ができる。)
3-3.ロケーション(休務)ごとに並べえる。
  「ロケーション(休務)ごとに表示する」をクリックすると
3-4.取次ぎ方法を表示する。
  座席表の各座席にマウスをポイントすると、取り次ぎ方法が表示される。
  別ロケーションの場合はその電話番号が出力される。

4.使用イメージ

4-1.出勤状況の更新
  朝のミーティングの前などに各チームにて「出勤状況更新ページ」
  から情報を更新する。
4-2.出勤状況の確認
  電話がかかってきた時など、その人がどこにいるのか確認するためには
  座席表(もしくは逆向きの座席表)を表示する。
  
 ※ 日中情報が更新されることもあるためすでに表示している場合は
   「最新の情報を表示する」をクリックした方が無難です。
 ※ その情報がいつの情報であるか、最終更新日時も座席表に表示されている。

4-3.ロケーションごとに表示
  「ロケーション(休務)ごとに表示する」のページは、
  まとめて報告したい時(朝のミーティングなど)にはこのページを確認すると便利かと。

 ※ こツールの例では、大手町を本拠地としていてよく新宿ロケーションに出かけることがある、という設定です。

5.ディレクトリ構成

zaseki_asami.cgi
zaseki_hyouji.cgi
zaseki_koushin.cgi
zaseki_data/poptxt.js   ←ポップアップを出力するためのJavascript
           /url.txt     ←内線番号と各人のURLを対応付けたtxt
            zaseki1.txt ←出勤状況のデータたち
            zaseki2.txt
            zaseki3.txt
            zaseki4.txt
            zaseki5.txt
           /tmp/        ←情報の更新時に一時的に使用するディレクトリ
           /jpg/        ←顔写真用の画像置き場。内線番号.JPG(内線番号.gif)で保存。

※poptxt.jsのソースはHIMAJIN様のページから頂きました。
 誠にありがとうございます。
※顔写真用の画像はFirst Moon様のページから拝借しました。
 誠にありがとうございます。

座席データ等はこんな感じ。
http://hinata.la.coocan.jp/tool/zaseki_data/zaseki1.txt
http://hinata.la.coocan.jp/tool/zaseki_data/zaseki2.txt
http://hinata.la.coocan.jp/tool/zaseki_data/zaseki3.txt
http://hinata.la.coocan.jp/tool/zaseki_data/zaseki4.txt
http://hinata.la.coocan.jp/tool/zaseki_data/zaseki5.txt
http://hinata.la.coocan.jp/tool/zaseki_data/memberinfo.txt

6.ソースイメージ

6-1.zaseki_koushin.cgi

#!/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 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="";
    my $filename=$_[0];
    my $teamnum="";

    if($_[0]=~/zaseki([0-9])\.txt/){
        $teamnum=$1;
    }else{
        return;
    }

    open(F,$filename);
    while(<F>){
        if($_=~/teamname=([\S\s]+),[0-9\-\/\s]+/){
            $teamname=$1;
            print <<EOL;
            <input type="checkbox" name="check$teamnum" value="on"> $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",$teamnum,$count);
            $count++;
        next;
        }
        if($_=~/([0-9]*),(\S*),(\S*),([\S\s]*),[0-9\s\/:]*/){
            if($3 eq ""){next;}
            &printform("$1","$2","$3","$4",$teamnum,$count);
            $count++;
        }
    }
    print <<EOL;
    <tr><td></td><td></td><td></td><td> <input type="submit" value="このチームをすべて更新" name="submit${teamnum}_all"></td></tr>
    </table>
    <hr>
EOL
    close(F);
}

sub print_menu(){
    print <<"EOL";
    <table>
    <tr>
    <td>
    <form method="POST" action="zaseki_koushin.cgi">
        <input type="hidden" name="gyaku" value="$tags{gyaku}">
        <input type="hidden" name="photo" value="$tags{photo}">
        <input type="submit" value="最新の情報を表示する" name="sonomama">
    </form>
    </td>
    <td width=20></td>
    <td>
    <form method="POST" action="zaseki_hyouji.cgi">
        <input type="hidden" name="gyaku" value="$tags{gyaku}">
        <input type="hidden" name="photo" value="$tags{photo}">
        <input type="submit" value="情報を更新せずに座席表を表示する" name="sonomama">
    </form>
    </td>
    <tr>
    </table>
EOL
}
if ($ENV{'REQUEST_METHOD'} eq "POST") {
    &decode();
}

print <<"EOL";
Content-type: text/html

<HTML>
    <HEAD>
        <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
        <TITLE>出勤状況更新ページ</TITLE>
    </HEAD>
<BODY>
EOL
&print_menu();
print <<"EOL";
<hr>
<form method="POST" action="zaseki_hyouji.cgi">
EOL

@files = glob ("zaseki_data/zaseki*.txt");
foreach $i (@files){
    &team("$i");
}

print<<"EOL";
<table align="center">
<tr><td><input type="submit" value="チェックしたチームを一括更新" name="submitchecked_all"></td><td></td><td></td></tr>
<tr><td align="right"><input type="submit" value="全チームを一括更新" name="submitall_all"></td><td><font size="2">←</font></td><td><font size="2">「全チームを一括更新」使用時は更新日時がすべて現在になる<br>ことに注意してください。</font></td></tr>
</table>
<input type="hidden" name="gyaku" value="$tags{gyaku}">
<input type="hidden" name="photo" value="$tags{photo}">
</form>
<hr>
EOL
&print_menu();
print <<"EOL";
    </BODY>
</HTML>
EOL

6-2.zaseki_hyouji.cgi

#!/usr/bin/perl

$title="";
$gyaku=0;
$photo=0;
$photo_msg="";
@files = glob ("zaseki_data/zaseki*.txt");

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 $teamnum=0;
    foreach $filename (@files){
        if($filename=~/zaseki([0-9])\.txt/){
            $teamnum=$1;
        }else{
            next;
        }
        $button=&button_check("$filename","$teamnum");
        if($button ne ""){return $button;}
    }
    return $button;
}

sub data_koushin{

    if($tags{sonomama} ne ""){return;}
    if($tags{submitall_all} ne ""){

        foreach $filename (@files){
            if($filename=~/zaseki([0-9])\.txt/){
                my $team=$1;
                open(TEAM,"$filename");
                while(<TEAM>){
                    if($_=~/^([0-9]{4})/){
                        &kobetsu_koushin("$team","$1");
                    }
                }
                close(TEAM);
            }
        }
        return;
    }
    if($tags{submitchecked_all} ne ""){
        foreach $filename (@files){
            if($filename=~/zaseki([0-9])\.txt/){
                my $team=$1;
                my $checknum="check$team";
                if($tags{$checknum} ne ""){
                    open(TEAM,"$filename");
                    while(<TEAM>){
                        if($_=~/^([0-9]{4})/){
                            &kobetsu_koushin("$team","$1");
                        }
                    }
                    close(TEAM);
                }
            }
        }
        return;
        
    }
    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 gyakuflg_koushin{
    if($tags{hanten} ne ""){
        if($tags{gyaku}==1){$gyaku=0;}elsif($tags{gyaku}==0){$gyaku=1;}
    }else{
        $gyaku=$tags{gyaku};
    }
}
sub photoflg_koushin{
    if($tags{photohanten} ne ""){
        if($tags{photo}==1){$photo=0;}elsif($tags{photo}==0){$photo=1;}
    }else{
        $photo=$tags{photo};
    }
}
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 setbordercolor{
    if($_[0]==1)    {return "#b8860b";}
    if($_[0]==2)    {return "#006400";}
    if($_[0]==3)    {return "#006400";}
    if($_[0]==4)    {return "#000099";}
    if($_[0]==5)    {return "#800080";}
}
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 zaseki_print{
    my $naisen = $_[0];
    my $name   = $_[1];
    my $locate = $_[2];
    my $bikou  = $_[3];
    my $koushin= $_[4];
    my $gaisen = $_[5];
    my $count  = $_[6];
    my $msg="";
    my $head="";
    my $tail="";
    my $color="";
    my $local_bordercolor="bgcolor=$bordercolor";
    my $img="";
    my $url="";
    my $naisennamelocate="";
    my $width=0;
    my $k_width=0;

    if($photo==1 && $name ne ""){
#       $img="<img src=\"./zaseki_data/jpg/$naisen.JPG\" width=\"50\" height=\"55\">";
        $img="<img src=\"./zaseki_data/jpg/$naisen.gif\" width=\"50\" height=\"55\">";
    }
    if($naisen ne ""){
        open(URL,"./zaseki_data/url.txt");
        while(<URL>){
            if($_=~/$naisen,(\S+)\s+\/\//){
                $url="onClick=\"window.open('$1','_blank')\"";
            }
        }
        close(URL);
    }
    if($gaisen ne ""){$gaisen="<br>$gaisen";}
    if($photo==0){
        $width=140;
        $k_width=160;
        $naisennamelocate=<<EOL;
            <font size = "1">$naisen $gaisen</font><br>
            <b>$name </b><br>
            $locate <br>

EOL
    }elsif($photo==1){
        $width=160;
        $k_width=180;
        $naisennamelocate=<<EOL;
            <table>
                <tr><td width="100"><font size = "1">$naisen $gaisen</font></td><td rowspan="3">$img</td></tr>
                <tr><td><b>$name </b></td>
                <tr><td>$locate </td><tr>
            </table>
EOL
    }

    $color = &desidecolor("$locate");
    if($name eq "" || $name=~/BU/){
        $local_bordercolor="";
    }

    if($2 ne ""){
        $koushin="最終更新 $koushin";
    }else{
        $koushin=" ";
    }
    $msg=&setmsg("$naisen","$name","$locate");

    if($count==0){$head= "<td><table border=1><tr>\n";}
    elsif($count==4){$tail= "</tr><tr>";}
    elsif($count==9){$tail= "</tr></table></td>";}
    elsif($count==100){
        my $border="";
        if($name ne ""){$border="border=1";}
        $head="<td width =$k_width><table $border><tr>";
        $tail="</tr></table>";
    }elsif($count==101){
        my $border="";
        if($name ne ""){$border="border=1";}
        $head="<table $border $border><tr>";
        $tail="</tr></table></td>";
    }


    print <<"EOL";
    $head
    <td>
    <table border="0" $local_bordercolor  cellspacing="3"><tr>
    <td bgcolor ="$color" width="$width" $url onMouseover="opentext($msg)" onMouseout="opentext('')" >
    $naisennamelocate
    <font size = 2>$bikou </font><br>
    <div align="right"><font size = 1>$koushin</font></div></td>
    </tr></table>
    </td>
    $tail
EOL

}
sub shima{
    my $count=0;
    my $k_count=100;
    my @line;

    if($_[0]=~/zaseki([0-9])\.txt/){
            $bordercolor=&setbordercolor("$1");
    }else{
        next;
    }

    open(F,$_[0]);
    while(<F>){
        if($_=~/teamname=([\S\s]+),([0-9\-\/\s]+)/){
            if($gyaku==0){
                print "<table><tr><td></td><td>■$1 ( $2)</td><tr>";
            }elsif($gyaku==1){
                print "<table><tr>■$1 ( $2)<td></td><td></td><tr>";
            }
        }
        if($_=~/([0-9]*),([0-9\-]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){
            if($gyaku==0){
                &zaseki_print("$1","$3","$4","$5","$6","$2","$k_count");
                $k_count++;
            }elsif($gyaku==1){
                $line[$linecnt]=$_;
                $linecnt++;
            }
        next;
        }
        if($_=~/([0-9]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){
            if($gyaku==0){
                &zaseki_print("$1","$2","$3","$4","$5","","$count");
                $count++;
            }elsif($gyaku==1){
                $line[$linecnt]=$_;
                $linecnt++;
            }
        }
    }
    close(F);

    $count=0;
    if($gyaku==1){
        for ($index=$linecnt;$index>=0;$index--){
            if($line[$index]=~/([0-9]*),([0-9\-]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){
                &zaseki_print("$1","$3","$4","$5","$6","$2","$k_count");
                $k_count++;
                next;
            }
            if($line[$index]=~/([0-9]*),(\S*),(\S*),([\S\s]*),([0-9\s\/:]*)/){
                &zaseki_print("$1","$2","$3","$4","$5","","$count");
                $count++;
            }
        }
    }
    print "</tr></table><br>";
}
sub print_menu{
    print<<"EOL";
    <table>
    <tr>
    <td>
    <form method="POST" action="zaseki_hyouji.cgi">
        <input type="hidden" name="gyaku" value="$gyaku">
        <input type="hidden" name="photo" value="$photo">
        <input type="submit" value="最新の情報を表示する" name="sonomama">
    </form>
    </td>
    <td width=20></td>
    <td>
    <form method="POST" action="zaseki_koushin.cgi">
        <input type="hidden" name="gyaku" value="$gyaku">
        <input type="hidden" name="photo" value="$photo">
        <input type="submit" value="出勤情報の更新ページへ" name="sonomama"> 
    </form>
    </td>
    <td width=20></td>
    <td>
    <form method="POST" action="zaseki_hyouji.cgi">
        <input type="hidden" name="gyaku" value="$gyaku">
        <input type="hidden" name="photo" value="$photo">
        <input type="submit" value="向きを逆にする" name="hanten"> 
    </form>
    </td>
    <td width=20></td>
    <td>
    <form method="POST" action="zaseki_asami.cgi">
        <input type="hidden" name="gyaku" value="$gyaku">
        <input type="hidden" name="photo" value="$photo">
        <input type="submit" value="ロケーション(休務)ごとに表示する" name="sonomama">
    </form>
    </td>
    <tr>
    </table>
EOL
}

if ($ENV{'REQUEST_METHOD'} eq "POST") {
    &decode();
    &data_koushin();
    &gyakuflg_koushin();
    &photoflg_koushin();
}
if($gyaku==0){
    $tille="座席表 (山向き)";
}elsif($gyaku==1){
    $tille="座席表 (海向き)";
}

if($photo==0){
    $photo_msg="写真表示 ON";
}elsif($photo==1){
    $photo_msg="写真表示 OFF";
}


print <<"EOL";
Content-type: text/html

<HTML>
    <HEAD>
        <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
        <TITLE>$tille</TITLE>
        <script type="text/javascript" src="zaseki_data/poptxt.js">
        </script>
    </HEAD>
<BODY>
EOL

&print_menu();
print <<"EOL";
<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>
<table align="right">
    <tr>
    <td>
    <form method="POST" action="zaseki_hyouji.cgi">
        <input type="hidden" name="gyaku" value="$gyaku">
        <input type="hidden" name="photo" value="$photo">
        <input type="submit" value="$photo_msg" name="photohanten">
    </form>
    </td>
    </tr>
</table>
 <br>
EOL

if($gyaku==0){
    foreach $i (@files){
        &shima("$i");
    }
}elsif($gyaku==1){
    my $filecount=@files;
    my $ind;
    for ($ind=$filecount;$ind>=0;$ind--){
        &shima("$files[$ind]");
    }
}

$time = localtime(time);

if($photo==1){
    print "※ 画像素材は<a href=\"http://www.first-moon.com/\">First Moon</a>様のサイトからお借りいたしました。"
}
print "<hr>";
&print_menu();
print <<"EOL";
    </BODY>
</HTML>
EOL

6-3.zaseki_asami.cgi

#!/usr/bin/perl

$globalcnt=0;

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
    }
}

@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);
}

sub print_menu{
    print<<"EOL";
    <table>
    <tr>
    <td>
    <form method="POST" action="zaseki_asami.cgi">
        <input type="hidden" name="gyaku" value="$tags{gyaku}">
        <input type="hidden" name="photo" value="$tags{photo}">
        <input type="submit" value="最新の情報を表示する" name="sonomama">
    </form>
    </td>
    <td width=20></td>
    <td>
    <form method="POST" action="zaseki_hyouji.cgi">
        <input type="hidden" name="gyaku" value="$tags{gyaku}">
        <input type="hidden" name="photo" value="$tags{photo}">
        <input type="submit" value="座席表を表示する" name="sonomama"> 
    </form>
    </td>
    <td width=20></td>
    <td>
    <form method="POST" action="zaseki_koushin.cgi">
        <input type="hidden" name="gyaku" value="$tags{gyaku}">
        <input type="hidden" name="photo" value="$tags{photo}">
        <input type="submit" value="出勤情報の更新ページへ" name="sonomama"> 
    </form>
    </td>
    <tr>
    </table>
EOL
}
print FW "zaseki_hyouji.cgi\n";
if ($ENV{'REQUEST_METHOD'} eq "POST") {
    &decode();
}

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_menu();
print <<"EOL";
<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 "<hr>";
&print_menu();
print <<"EOL";
    </BODY>
</HTML>
EOL

7.改版履歴

090414(初版)

※poptxt.jsはHIMAJIN様のページから拝借いたしました。
 再配布になってしまうため、ここにはアップしません。
 ↑のリンクの「すぐに使えるJavaScript」→「ポップアップテキスト」です。

作った頃のメモ→メモメモ/2009-04-09メモメモ/2009-04-12メモメモ/2009-04-13

090419

■Bug#1 zaseki_data配下に不正な.txtがあるとデータが壊れる。
■Bug#2 座席表を反転させた状態で更新した場合、反転させた座席表に戻るようにして欲しい。
■Bug#3 全チーム一括更新したい。
の対処。

090421

■Bug#3 全チーム一括更新したい。
に関連し、チェックしたチームのみ一括更新する機能を追加。

090422

■Bug#9 備考欄が2行のとき逆向きの座席表の表示がずれる。
■Bug#11 課長席の空箱を表示しないようにして欲しい。
■Bug#18 zaseki_data配下に不正なファイルがあると個別更新が行えない。
■Bug#19 部長も表示したい。
の対処。

090423

■Bug#14 座席表に顔写真を載せて欲しい。
■Bug#15 各座席から電子社員録の個人URLにリンクして欲しい。
の対処及び
▲Bug#12 チームごとの識別も色で行いたい。
の暫定対処。
zaseki_hyouji.cgiの随所に散らばっていたglob(zaseki_data/zaseki*.txt)が実は1箇所でよいのではないかと気づき、ソースの頭1箇所に記述するよう修正。
合わせてglobal変数をわかりやすく頭に記述するようにした。いまさら。。。w

※ 画像はすべてFirst Moon様のページから拝借しました。
 再配布になってしまうのでzipからは外しておきます。
 jpgディレクトリ配下に内線番号.JPG(内線番号.gif)で画像が保存されています。

メモメモ/2009-04-23

バグ管理簿


  • みました。とりあえずHTML::Templateなどを使って、プログラムとHTMLコードを分けたほうがいいですね。保守しづらいと思います -- yusuketsuiki? 2009-04-17 (金) 17:23:30
  • あ、どうもです。なんか早速バグっていたようで、データがめちゃめちゃ壊れていました。。
    そんなライブラリがあるんですね!アドバイスありがとうございます! -- 日向充 2009-04-17 (金) 19:50:18
  • ちょっとググって見ました。めちゃめちゃ便利そうですね。いつもアドバイスありがとうございます。 -- 日向充 2009-04-17 (金) 19:56:51



添付ファイル: filezaseki_koushin.cgi_090423.txt 137件 [詳細] filezaseki_hyouji.cgi_090423.txt 137件 [詳細] filezaseki_asami.cgi_090423.txt 129件 [詳細] filezaseki_koushin.cgi_090422.txt 107件 [詳細] filezaseki_hyouji.cgi_090422.txt 109件 [詳細] filezaseki_asami.cgi_090422.txt 76件 [詳細] filezaseki_koushin.cgi_090421.txt 142件 [詳細] filezaseki_hyouji.cgi_090421.txt 105件 [詳細] filezaseki_asami.cgi_090421.txt 165件 [詳細] filezaseki_koushin.cgi_090419.txt 109件 [詳細] filezaseki_hyouji.cgi_090419.txt 124件 [詳細] filezaseki_asami.cgi_090419.txt 88件 [詳細] fileurl.txt 384件 [詳細] filezaseki_090423.zip 285件 [詳細] filezaseki_090422.zip 172件 [詳細] filezaseki_090421.zip 172件 [詳細] filezaseki_090419.zip 184件 [詳細] filezaseki_koushin.cgi_090414.txt 118件 [詳細] filezaseki_hyouji.cgi_090414.txt 107件 [詳細] filezaseki_gyaku.cgi_090414.txt 133件 [詳細] filezaseki_asami.cgi_090414.txt 112件 [詳細] filezaseki5.txt 129件 [詳細] filezaseki4.txt 108件 [詳細] filezaseki3.txt 108件 [詳細] filezaseki2.txt 110件 [詳細] filezaseki1.txt 136件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-11-20 (土) 21:20:46 (2347d)