#!/bin/perl
########################################################################
#                           Timeclock  ver.  1.2                       #   
#                           Sep 4 1996                                 #
########################################################################
# 1.1 added file locking.
# 1.2 bug fixes
#     1. "User's Time" for someone not logged in.
#     2. Timesheet for someone only clocked "IN" once. (though unneccessary)
#     3. Adduser now works again, rather than flushing the passwd database.
#     4. 
#
# 1.2 additions
#     1. Current Logins
#     2. Comments for modification. (Though no punctuation yet)
#     3. 
#
# 1.3 bug fixes
#     1. a strange handling problem with arch statements in the data file.
#        it ended up with -263k hours as the total.
#     2. other stuff introduced while coding 1.3
#
# 1.3 additions
#     1. mostly bs comment things. Updated the help file a bit.
#
#
##########################################################
# Requires.  ctime to fix the timme in and out,          #
#            cgi-lib.pl for other stuff.                 #
##########################################################

require 'ctime.pl';
require 'cgi-lib.pl';
require 'timeclock.settings';

#### Parse the submitted form data and pprint the return header.

&ReadParse (*FORM);
print &PrintHeader;
&assign;


#######################################################
#               MAIN ROUTINE                          #
#######################################################


if ($FORM{whattodo} eq "hours") { &CHECKHOURS(*FORM);}
elsif ($FORM{whattodo} eq "HELP") { &HELP(*FORM);}
elsif ($FORM{whattodo} eq "IN") { &TIMECLOCK(*FORM);}
elsif ($FORM{whattodo} eq "OUT") { &TIMECLOCK(*FORM);}
elsif ($FORM{whattodo} eq "FLUSHSURE") { &FLUSHSURE(*FORM);}
elsif ($FORM{whattodo} eq "FLUSHUSER") { &FLUSHUSER(*FORM);}
elsif ($FORM{whattodo} eq "FLUSHALL") { &FLUSHALL(*FORM);}
elsif ($FORM{whattodo} eq "FUDGEPAGE") { &FUDGEPAGE(*FORM);}
elsif ($FORM{whattodo} eq "FUDGE") { &FUDGE(*FORM);}
elsif ($FORM{whattodo} eq "ADDPAGE") { &ADDPAGE(*FORM);}
elsif ($FORM{whattodo} eq "ADDUSER") { &ADDUSER(*FORM);}
elsif ($FORM{whattodo} eq "REMPAGE") { &REMPAGE(*FORM);}
elsif ($FORM{whattodo} eq "REMUSER") { &REMUSER(*FORM);}
elsif ($FORM{whattodo} eq "PRINT") { &PRINT(*FORM);}
elsif ($FORM{whattodo} eq "ADMIN") { &ADMIN(*FORM);}
elsif ($FORM{whattodo} eq "CURRENT") { &CURRENT(*FORM);}
elsif ($FORM{whattodo} eq "ViewDatabase") { &ViewDatabase;}
elsif ($FORM{whattodo} eq "ViewComment") {&ViewComment;}
elsif ($FORM{whattodo} eq "AddCommentP") {&AddCommentP;}
elsif ($FORM{whattodo} eq "AddComment") {&AddComment;}
else { &DEF(*FORM);}

############################################################
#
#                Add Comment Page
#
###########################################################
sub AddCommentP
{
    
    $subroutine = ("yes");
    $username = ("Garbage");
    &VERIFY ($username, $FORM{passwd});
    &IDITitle;
    print ('<form action="',$timeclock,'" method=post> <CENTER>');

    print <<EOF;
<table BORDER=3 CELLSPACING=0 CELLPADDING=0>
<TR><TD align=left><B>Administrator's Name: </B></TD>
<TD><SELECT name=commentor>
EOF

    &USERLIST;

    print <<EOF;
</SELECT>
</TD></TR>

<TR><TD align=left><B>Comment: </B></TD><TD></TD></TR>
<TR><TD colspan=2 ALIGN=center><input type=text size=40 name=comment></TD></TR>

</TABLE>
<BR><BR>
<input type=submit value=Submit name=clock><BR><BR>
<input type=hidden name=passwd value=$FORM{passwd} >
<input type=hidden name=whattodo value=AddComment >
<input type=hidden name=whoami value=$FORM{whoami} >
EOF

    print ("</CENTER>\n</FORM>");
    &IDIFooter;
}


########################################################
#
#          Add Comment
#
############################################################
sub AddComment
{
    $username = ("Garbage");
    &VERIFY ($username, $FORM{passwd});
    &IDITitle;
    ($FORM{comment}) =~ s/\://eg;
    ($FORM{comment}) =~ s/\;//eg;
    ($FORM{comment}) =~ s/\%//eg;
    ($FORM{comment}) =~ s/\$//eg;
    ($FORM{comment}) =~ s/\*//eg;
    ($FORM{comment}) =~ s/\#//eg;
    ($FORM{comment}) =~ s/\@//eg;
    ($FORM{comment}) =~ s/\(//eg;
    ($FORM{comment}) =~ s/\)//eg;
    
    open (DATA, "+>>" . $DATABASE) || die("Cannot open database") && print("Cannot open database");
    seek DATA, 0, 0;
    flock DATA, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    print DATA "COM:" . $FORM{whoami} . ":" . time . ":Modified:" . $FORM{comment} . ":" . $FORM{commentor} . "\n";
    print ("COM:" . $FORM{whoami} . ":" . time . ":Modified:" . $FORM{comment} . ":" . $FORM{commentor} . "\n");
    &IDIFooter;
}



##########################################################
#
#                 View Comments
#
##########################################################

sub ViewComment
{
    
    $subroutine = ("yes");
    $username = ("Garbage");
    &VERIFY ($username, $FORM{passwd});

    &IDITitle;
    open (DATA, "+<" . $DATABASE) || print("Cannot open database $DATABSE") && die;
    seek DATA, 0, 0;
    flock DATA, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    ($name) = (&getrealname($FORM{whoami}),"\n");
    print <<EOF;
<H2>Comments For : $name </H2>
<TABLE CELLPADDING=4 BORDER=1>
EOF
    print ("<TR><TD>Name</TD><TD>Date\/Time</TD><TD>Commentor</TD><TD>Comment</TD></TR>");
    while (<DATA>)
    {
        ($inout,$user,$timeinout,$ifModified,$Comment,$commentor) = split(/:/);
	if ($user eq $FORM{whoami})
	{
	    if (($inout eq "IN") || ($inout eq "COM"))
	    {
		if ($ifModified eq "Modified")
		{
		    ($date) = (ctime($timeinout));
		    ($date) =~ s/US\/Central 1996//;
		    print ("<TR><TD>$name</TD><TD>$date</TD><TD>$commentor</TD><TD>$Comment</TD></TR>");
		    $numberOfComments++;
		}
	    }
	}
    }
    print ("</TABLE>");

    if ($numberOfComments == 0)
    {
	print ("<BR><FONT SIZE=+1>No Comments On Record For $name\.<BR></FONT>");
    }

    &IDIFooter;


}

###########################################################
#
#            View Database
#
###########################################################
sub ViewDatabase {

    $subroutine = ("yes");
    $username = ("Garbage");
    &VERIFY ($username, $FORM{passwd});
    
    &IDITitle;
    open (DATA, "+<" . $DATABASE) || print("Cannot open database $DATABSE") && die;
    seek DATA, 0, 0;
    flock DATA, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    print <<EOF;
<H2>View Database </H2>
<TABLE CELLPADDING=4 BORDER=1>
EOF
    while (<DATA>)
    {
	($one,$two,$three,$four,$five,$six) = split(/:/);
	print ("<TR><TD>$one</TD><TD>$two</TD><TD>$three $four $five $six $seven $eight</TD></TR>");
    }
    print("</TABLE>");
    &IDIFooter;


}

###########################################################
#
#      Current Logins
#
##########################################################
sub CURRENT {

    $subroutine = ("yes");
    &IDITitle;

# CREATE THE ARRAY OF USERS
    open (DATA, "+<" . $DATABASE) || print("Cannot open database $DATABSE") && die;
    seek DATA, 0, 0;
    flock DATA, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    @users = ();
    $numberofusers = 0;
    while (<DATA>) {
        chop;
        ($inout,$employee,$timeseconds,$modified,$comment,$commentor) = split(/:/);
	if ($inout ne "ARCH") {
	    if ("@users" !~ /$employee/) { 
		push (@users, $employee); 
		$numberofusers++;
	    }
	}
	
    }
    while (<@users>) {
	$currentuser = $_;
	seek DATA, 0, 0;
	while (<DATA>){
	     chop;
	     ($inout,$employee,$timeseconds,$modified,$comment,$commentor) = split(/:/);
	     if ($inout ne "ARCH") {
		 if ($currentuser eq $employee){
		     $lastinout = $inout;
		 }
	     }
	 }
	if ($lastinout eq "IN") {
	    push (@current, $currentuser);
	}
    }
    close (DATA);
    print ("<H2>Current logins</H2>\n");
    @currentsorted = sort(@current);
    while (<@currentsorted>){
	print (&getrealname($_)," <BR>\n");
    }
    print "</center>";
    &IDIFooter;
}

#########################################################
#
#               PRINT USERLIST
#
#########################################################

sub USERLIST {

    local (@unsorted);
    local (@userlist);
    open (PASS, "+<" . $PWDATABASE) || die("Cannot open Password database : $PWDATABSE");
    seek PASS, 0, 0;
    flock PASS, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    while (<PASS>) {
        chop;
	push (@unsorted, $_);
    }
    close PASS;
    @userlist = sort(@unsorted);
    while (@userlist) {
	($pwdusername,$pwdpassword, $real) = split ( /:/, shift(@userlist));
	print('<option value="', $pwdusername, '">', $real, " \n");
	
    }
}

########################################################
#
#         REMOVE USER
#
########################################################

sub REMUSER {

    $subroutine = ("yes");
    $username = ("Garbage");
    &VERIFY ($username, $FORM{passwd});
    &IDITitle;
    system ('rm', $TEMPFILE);
    system ('touch',$TEMPFILE);
    open (PASS, "+<" . $PWDATABASE) || die("Cannot open Password database for read : $PWDATABSE");
    seek PASS, 0, 0;
    flock PASS, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    open (TEMP, "+>" . $TEMPFILE) || print("Cannot open database $TEMPFILE") && die;
    seek TEMP, 0, 0;
    flock TEMP, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    if ($FORM{luser} eq 'admin') {
	print ("<FONT size=+2><B><I>Admin</I> Cannot Be Removed.</B></FONT>");
	&IDIFooter;
	die;
    }

    while (<PASS>) {
        chop;
	($luser, $notneeded, $notneededyet) = split(/:/);
	if ($luser ne $FORM{luser}) {
	    print TEMP ($_, "\n");
	} else { ($employee, $notneeded, $realname) = split ( /:/, $_ ); }
    }
    close (PASS);
    close (TEMP);
    system ('mv', $PWDATABASE, $PWDATABASE . '.back');
    system ('touch', $PWDATABASE);
    open (PASS, "+>" . $PWDATABASE) || die("Cannot open Password database : $PWDATABSE");
    seek PASS, 0, 0;
    flock PASS, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try  again.</H2>");
    open (TEMP, "+<" . $TEMPFILE) || print("Cannot open database $TEMPFILE") && die;
    seek TEMP, 0, 0;
    flock TEMP, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    print ("<font size=+1>The user : <B> $realname <I>( $employee )</I></B> has been removed.</font>");
    while (<TEMP>) {
        chop;
	print PASS ($_, "\n");
    }
    &IDIFooter;
    close (PASS);
    close (TEMP);   
}

#######################################################
#
#       REMOVE USER PAGE
#
#######################################################

sub REMPAGE {

    $subroutine = ("yes");

    $username = ("Garbage");
    &VERIFY ($username, $FORM{passwd});

    &IDITitle;
    print ('<form action="',$timeclock,'" method=post><input type=hidden name=whattodo value=REMUSER>');
    print ('<input type=hidden name=whoami value="',$FORM{whoami},'"><input type=hidden name=passwd value="',$FORM{passwd},'">');

    print <<EOF;

<CENTER>
<TABLE BORDER=3 CELLPADDING=4>
<TR><TD ALIGN=CENTER COLSPAN=2><font size=+1>Remove User From Timeclock</font></TD></TR>
<TR>
<TD ALIGN=LEFT >User's Name <SELECT name=luser>

EOF

&USERLIST;
print ("</SELECT>");


# <input type=text size=20 name=realname value="New User"></TD>


print <<EOF;
<TD ALIGN=CENTER >Admin Password <input type=password size=8 name=passwd></TD>
</TR>

<TR><TD ALIGN=CENTER COLSPAN=2>
        <TABLE BORDER=3><TR>
            <TD><input type=submit value="Remove User" name=clock></TD></TR>
        </TABLE>
    </TD></TR>
</TABLE>
</CENTER>

EOF

    &IDIFooter;


}

########################################################
#
#               ADD USER PAGE
#
#######################################################
sub ADDPAGE {

    $subroutine = ("yes");

    $username = ("Garbage");
    &VERIFY ($username, $FORM{passwd});

    &IDITitle;
    print ('<form action="',$timeclock,'" method=post><input type=hidden name=whattodo value=ADDUSER>');
    print ('<input type=hidden name=whoami value="',$FORM{whoami},'"><input type=hidden name=passwd value="', $FORM{passwd},'">');

    print <<EOF;

<CENTER>
<TABLE BORDER=3 CELLPADDING=4>
<TR><TD ALIGN=CENTER COLSPAN=2><font size=+1>Add User To Timeclock</font></TD></TR>
<TR>
<TD ALIGN=LEFT >User's Name <input type=text size=20 name=realname value="New User"></TD>
<TD ALIGN=CENTER >User's Password <input type=password size=8 name=newpass></TD>
</TR><TR>
<TD ALIGN=LEFT >User's Login <input type=text size=8 name=luser></TD>
<TD ALIGN=CENTER >User's Password <input type=password size=8 name=passcheck></TD>
</TR>
<TR><TD ALIGN=CENTER COLSPAN=2>
        <TABLE BORDER=3><TR>
	    <TD><input type=submit value="Add User" name=clock></TD></TR>
	</TABLE>
    </TD></TR>
</TABLE>
</CENTER>

EOF

    &IDIFooter;

}


########################################################
#
#               ADD USER
#
########################################################

sub ADDUSER {

    $subroutine = ("yes");
    $username = ("Garbage");
    &VERIFY ($username, $FORM{passwd});     
    &IDITitle;

    if ($FORM{newpass} ne $FORM{passcheck}) {
	print ("<H2>New Passwords Do Not Match</H2>");
	&IDIFooter;
    } else {
	open (PASS, "+<" . $PWDATABASE) || print("Cannot open Password database for reading : $PWDATABSE") && die("Cannot open Password database : $PWDATABSE");
	seek PASS, 0, 0;
	flock PASS, 2 || print ("<H2>Cannot create lock, try again.</H2>") && die ("cannot creat lockfile");
	while (<PASS>) {
	    chop;
	    ($pwdusername,$pwdpassword,$realname) = split (/:/);
	    if ($pwdusername eq $FORM{luser}) {
		print ("<CENTER><FONT SIZE=+1>$FORM{luser} is already in the database.<BR><BR><B> $realname , $pwdusername</B></FONT></CENTER>");
		&IDIFooter;
		die;

	    }
	    if ($realname eq $FORM{realname}) {
		print ("<CENTER><FONT SIZE=+1>$FORM{realname} is already in the database.<BR><BR><B> $realname , $pwdusername</B></FONT></CENTER>");
		&IDIFooter;
		die;
	    }
	    
	}
	close (PASS);
	print ("<font size=+1>Added User<B><I> $FORM{realname}</I></B> as <B><I>$FORM{luser}</I></B></font>");
	$now = time;
	($pert1, $pert2) = unpack("C2", $FORM{luser});
	$week = $now / (60*60*24*7) + $pert1 + pert2;
	@saltset = ('a' .. 'z', 'A' .. 'Z', '0' .. '9', '.', '/');
	$nsalt = $saltset[$week % 64] . $saltset[$now % 64];
	$cryptpass = crypt($FORM{newpass},$nsalt);
	open (PASS, "+>>" . $PWDATABASE) || die && print("Cannot open Password database : $PWDATABSE");
	seek PASS, 0, 0;
	flock PASS, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
	print PASS ($FORM{luser},":",$cryptpass,":",$FORM{realname},"\n");
	close (PASS);
	&IDIFooter;

    }


}

##########################################################
#
#        FLUSH SURE.  "Are You Sure You Want To Archive?
#
##########################################################

sub FLUSHSURE {

    &IDITitle;

    print ('<form action="',$timeclock,'" method=post>');

    print ("<H2>Are you sure you want to archive hours for ", &getrealname($FORM{whoami}), "? </H1>");

    print <<EOF;

<TABLE><TR><TD>
<SELECT name="whattodo">
<option value="DEFAULT">No
<option value="FLUSHALL">Yes
</SELECT></TD><TD>
<input type=submit name="clockman" value="Go"></TD></TR></TABLE>

EOF

    print ("<input type=hidden name=whoami value=",$FORM{whoami},"><input type=hidden name=passwd value=",$FORM{passwd},">");

print ("</FORM>");

    &IDIFooter;
} 

###########################################################
#                PRINT
###########################################################
sub PRINT {

# Nifty Subroutine calling stuff

    $subroutine = ("yes");
    local (*FORMDATA) = @_;
    $username = ("GarbageManFromMars");
    &VERIFY ($username, $FORMDATA{passwd});
    
# CREATE THE ARRAY OF USERS
    open (DATA, "+<" . $DATABASE) || print("Cannot open database $DATABSE") && die;
    seek DATA, 0, 0;
    flock DATA, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    @users = ();
    $count = 0;
    while (<DATA>) {
        chop;
        ($inout,$employee,$timeseconds) = split(/:/);
	if ($inout ne "ARCH") {
	    if ("@users" !~ /$employee/) { 
		push (@users, $employee); 
		$name = &getrealname($employee);
		push (@realname, $name);
		$counter++;
	    }
	}
	
    }
    print "<p>";
    close (DATA);
# Run CHECKHOURS FOR EACH USER
    print ("<HTML><TITLE>IDI Timeclock</TITLE><body bgcolor=#ffffff text=#000000 link=#220077 vlink=#860091>");
    foreach $i (@users) {
	&CHECKHOURS ($i);
	&SigFoot;
	$lusersexist = 1;
	$count++;
    }
    if ($counter eq 0) {
	&IDITitle;
	print("<H2>There Are No Records In The Database $DATABASE </H2>");
	&IDIFooter;
    }
    if ($lusersexist = 1) {
	open (DATA, "+>>" . $DATABASE) || print("Cannot open database $DATABSE") && die;
	seek DATA, 0, 0;
	flock DATA, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
	$currenttime = ctime(time);
	$currenttime =~ s/US\/Central 1996//;
        chop($currenttime);
	print DATA ("ARCH:0:Hours To Date Recorded on $currenttime \nARCH:0:Username:TotalHoursToDate\n");
	foreach $k (@timeappend) {
	    print DATA ("ARCH:0:$k \n");
	}
    }
    return $count;
    close DATA;
}

#############################################################
#                 GET REAL NAME
#############################################################

sub getrealname {
    ($username) = @_;
    open (PASS, "<" . $PWDATABASE) || die("Cannot open Password database : $PWDATABSE");
    seek PASS, 0, 0;
    flock PASS, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    while (<PASS>) {
	chop;
	($pwdusername,$pwdpassword,$real) = split (/:/);
	if ($pwdusername eq $username) {
	    $realname = $real;

	}
    }
    close PASS;
    return $realname;
}

#####################################################################
#
#                    FUDGE
#
#####################################################################

sub FUDGE {

    $lastinout = "NONE";
    &VERIFY($FORM{whoami}, $FORM{passwd});

    open (DATA, "+<" . $DATABASE) || die("Cannot open database") && print("Cannot open database");
    seek DATA, 0, 0;
    flock DATA, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    while (<DATA>){
        ($loggedinout,$employee,$timeinout,$modified,$comment,$commentor) = split(/:/);
        if ($employee eq $FORM{whoami}) {
            $lastinout = $loggedinout; }
    }
    close (DATA);
    ($inout) = ("IN");
    if ($inout eq $lastinout) {
        &IDITitle;
        print ("<CENTER><FONT size=+1><B>",&getrealname($FORM{whoami})," is still clocked in.</B><BR>Please clock him out and try again.<BR><BR></font>");
        print ("Last time $inout : ",ctime($timeinout),"<P><a href=",$timeclock,">Return To Timeclock</A></CENTER>");
	&IDIFooter;
    } else {

	
	&IDITitle;
	($FORM{comment}) =~ s/\://eg;
        ($FORM{comment}) =~ s/\;//eg;
        ($FORM{comment}) =~ s/\%//eg;
        ($FORM{comment}) =~ s/\$//eg;
        ($FORM{comment}) =~ s/\*//eg;
        ($FORM{comment}) =~ s/\#//eg;
        ($FORM{comment}) =~ s/\@//eg;
        ($FORM{comment}) =~ s/\(//eg;
        ($FORM{comment}) =~ s/\)//eg;

	$seconds_to_add = time + ($FORM{add_subtract} *  (($FORM{minutes} * 60) + $FORM{seconds} + ($FORM{hours} * 3600)));
	
	open (DATA, "+>>" . $DATABASE) || die("Cannot open database") && print("Cannot open database");
	seek DATA, 0, 0;
	flock DATA, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
	print ("<FONT SIZE=+1><CENTER>Time Added:<BR><BR>IN  : ",ctime(time),"<BR>OUT : ",ctime($seconds_to_add),"<BR> Comment: " . $FORM{comment} . "\n<BR>Comment By:" . $commentor . "</FONT></CENTER>");
	
        print DATA "IN" . ":" . $FORM{whoami} . ":" . time . ":" . "Modified" . ":" . $FORM{comment} . ":" . $FORM{commentor} . "\n";
	print DATA "OUT" . ":" . $FORM{whoami} . ":" . $seconds_to_add . ":" . "Modified" . ":" . $FORM{comment} . ":" . $FORM{commentor} . "\n";

	&IDIFooter;
	close (DATA);
    }
}

#####################################################################
#
#                    FUDGE PAGE
#
######################################################################
sub FUDGEPAGE {
    $subroutine = ("yes");
    local (*FORMDATA) = @_;
    $username = ("GarbageManFromMars");
    &VERIFY ($username, $FORMDATA{passwd});
#print out a full hours count for the user to be fudged.


    &IDITitle;
    print ('<form action="',$timeclock,'" method=post> <CENTER>\n');
    print ("<FONT size=+1>Enter the amount of time to add / subtract from ",&getrealname($FORM{whoami}),"'s records.</FONT><BR><BR>");

print <<EOF;

<table BORDER=3 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD ROWSPAN=2 ALIGN=CENTER>
<SELECT name=add_subtract>
    <option value=1>Add Time
    <option value=-1>Subtract Time
</SELECT>

<TD ALIGN=CENTER> Hours </TD><TD ALIGN=CENTER> Minutes </TD><TD ALIGN=CENTER> Seconds </TD></TR>

<TR>
<TD ALIGN=CENTER><input value=0 type=text name=hours size=4></TD>
<TD ALIGN=CENTER><input value=0 type=text name=minutes size=4></TD>
<TD ALIGN=CENTER><input value=0 type=text name=seconds size=4></TD>
</TR>
<TR><TD colspan=5 align=left><B>Comment:</B></TD></TR>
<TR> <TD ALIGN=center COLSPAN=5><input type=text name=comment size=40></TD></TR>
<TR><TD colspan=5 align=left><B>Commentor:</B></TD></TR>
<TR><TD ALIGN=center COLSPAN=5><input type=text name=commentor size=40></TD></TR>
</TABLE>
<BR><BR>
<input type=submit value=Submit name=clock><BR><BR>

EOF

    print ("<input type=hidden name=passwd value=",$FORM{passwd},"><input type=hidden name=whoami value=",$FORM{whoami},"><input type=hidden name=whattodo value=FUDGE>");

    print ("(<I>Note:</I>",&getrealname($FORM{whoami})," <B>Must</B> clock out before using this function.)<BR>");

    print <<EOF;

</CENTER>
</FORM>

EOF
    
    &IDIFooter;
}


#####################################################################
#
#			FLUSH ALL		
#
#####################################################################


sub FLUSHALL {
    local (*FORMDATA) = @_;
    $username = ("GarbageManFromMars");
    &VERIFY ($username, $FORMDATA{passwd});
    
### open files for read + write.

    system 'rm', $TEMPFILE;

    open (DATA, "+<" . $DATABASE) || print("Cannot open", $DATABSE) && die;
    open (ARCH, "+>>" . $ARCHIVE) || print("Cannot open", $ARCHIVE) && die;
    seek ARCH, 0, 0;
    flock ARCH, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    print ARCH ("XXXXXXXXXXX---  DATABASE ARCHIVED ON ", ctime(time)," ---XXXXXXXXXXX");
    $count = 0;
    while (<DATA>) {
	chop($_);
	print ARCH ($_, "\n");
	$count++;
    }   

    close (ARCH);
    close (DATA);
    system 'cp', $DATABASE, $DATABASEBACK;
    system 'rm', $DATABASE;
    system 'touch', $DATABASE;
    &IDITitle;
    print ("<CENTER><H3> $count Records Archived in $ARCHIVE<BR> $count Records Flushed from $DATABASE<BR><BR>A Backup copy has been placed in $DATABASEBACK </H3></CENTER>");
    &IDIFooter;
}



######################################################################
#                            FLUSH USER                              #
# Copys timeclock's entries to timeclock.archive with a header that  #
#   says  FLUSHED ON 'ctime(date)'                                   #
######################################################################

sub FLUSHUSER {
    local (*FORMDATA) = @_;
    $username = ("GarbageManFromMars");
    &VERIFY ($username, $FORMDATA{passwd});
    
#open files for read + write.
    system 'rm', $TEMPFILE;
    open (DATA, "+<" . $DATABASE) || print("Cannot open database $DATABSE") && die;
    seek DATA, 0, 0;
    flock DATA, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    open (ARCH, "+>>" . $ARCHIVE) || print("Cannot open database $ARCHIVE") && die;
    seek ARCH, 0, 0;
    flock ARCH, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    open (TEMP, "+>>" . $TEMPFILE) || print("Cannot open database $TEMPFILE") && die;
    seek TEMP, 0, 0;
    flock TEMP, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
#annote the archive date + time + user in $ARCHIVE
    
    print ARCH ("XXXXXXXXXXX---   ARCHIVE OF USER",$FORMDATA{whoami}," FLUSHED ON ", ctime(time));
    
# Sort the records to be archived from the records to be put back.
    $count = 0;
    while (<DATA>) {
        chop;
	($inout,$employee,$timeseconds,$modified,$comment,$commentor) = split(/:/);
	if ($employee eq $FORMDATA{whoami}) {
	    print ARCH ($_, "\n");
	    $count++
	} else { print TEMP ($_, "\n");}
	
    }
    close (TEMP);
    close (ARCH);
    close (DATA);
    system 'rm', $DATABASE;
    open (TEMP, "+<" . $TEMPFILE) || print("Cannot open database $TEMPFILE") && die;
    seek TEMP, 0, 0;
    flock TEMP, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    open (DATA, "+>>" . $DATABASE) || print("Cannot open database $DATABSE") && die;
    seek DATA, 0, 0;
    flock DATA, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    while (<TEMP>) {
	chop;
	print DATA ($_,"\n");
    }
    close (TEMP);
    close (DATA);
    system 'rm', $TEMPFILE;
    &IDITitle;
    print ("<H2> $count Records Archived for ",&getrealname($FORMDATA{whoami}),"<BR>Archived In: <B>$ARCHIVE</B><BR> Flushed from: <B>$DATABASE</B></H2>");
    &IDIFooter;
}


######################################################################
#                             VERIFY                                 #
#                                                                    #
#Veryify the login ID or Admin with the passwd given                  #
#                                                                    #
######################################################################
sub VERIFY {
    
    local ($username, $password) = @_;
    open (PASS, "+<" . $PWDATABASE) || die("Cannot open Password database : $PWDATABSE");
    seek PASS, 0, 0;
    flock PASS, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    $verification = "0";
    while (<PASS>) {
        chop;
        ($pwdusername,$pwdpassword) = split (/:/);
        if ($pwdusername eq $username) {
            if (crypt ($password, $pwdpassword) eq $pwdpassword) {
                $verification = "1"; }
        }
	if ($pwdusername eq "$admin") {
	    if (crypt ($password, $pwdpassword) eq $pwdpassword) {
		$verification = "1"; }
	}
    }
    if ($verification eq "0") {
	&IDITitle;
        print <<EOF;

	<FONT SIZE=+3>Invalid Username or Password.</FONT></CENTER>
EOF

        close (PASS);
	&IDIFooter;
	die ("Invalid User Name");
    }
    return ($verification);
}

#################################################################
#                       Min Per Page
#################################################################

sub minperpage {
    local ($checkcount) = @_;
    if ($checkcount == 0) {$checkcount++;}
    while ($checkcount++ % $Lines) {
        print ("<TR><TD align=center>-</TD><TD align=center>-</TD><TD>0.00</TD></TR>\n");
    $continue = "YES";
	}

    $continue;
}

#########################################################################
#                    CHECK HOURS                                        #
#                                                                       #
#                                                                       #
#########################################################################

sub CHECKHOURS {
    # Init some variablles 
    $totaltime = 0;
    $lastinout = 0;
    $timeseconds = 0;
    $continue  = "NO";
    $lastinout = "0";
    
    if ($subroutine ne "yes") {
	local (*FORMDATA) = @_;
	&VERIFY($FORMDATA{whoami}, $FORMDATA{passwd});
	&IDITitle;
	&printhead;
	$user = $FORMDATA{whoami};
	$pass = $FORMDATA{passwd};
	print <<EOF;
    <P>
    <!--<TABLE CELLPADDING=4 CELLSPACING=4 WIDTH=80% BORDER=3>-->
    <TR><TD ALIGN=CENTER>Time In</TD>
    <TD ALIGN=CENTER>Time Out</TD>
    <TD>Hours Worked</TD></TR>
EOF
	    
	} else {
	    ($user) = @_;
	}
    
    
    local ($check = 0);
    open (DATA, "+<" . $DATABASE) || die("Cannot open database");
    seek DATA, 0, 0;
    flock DATA, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    while (<DATA>) {
	chop;
	($inout,$employee,$timeseconds,$fudged,$comment,$commentor) = split(/:/);
	if ($inout ne 'COM'){
	    if ($employee eq $user){
		$lastinout = $inout;
		if ($inout eq 'IN') { 
		    ($newday) = ($timeseconds);
		} elsif ($inout eq 'OUT') {
		    
		    if (( $check % $Lines == 0) && ($subroutine eq "yes")) {&printhead;}
		    $check += 1;
		    ($currentdayhours) = (($timeseconds - $newday)/3600);
		    ($timein) = (ctime($newday));
		    ($timein) =~ s/US\/Central 1996//;
		    ($timeout) = (ctime($timeseconds));
		    ($timeout) =~ s/US\/Central 1996//;
		    print ("<TR><TD>",$timein," - ",$fudged,"</TD><TD>",$timeout," - ",$fudged,"</TD><TD>");
		    printf "%0.2f",$currentdayhours;
		    print ("</TD></TR>\n");
		    if ($check % $Lines == 0) {&P_NoSig;}
		}
		
		#Totalling up total hours.
		if ($inout eq 'OUT') { $totaltime += $timeseconds;} else { $totaltime += -$timeseconds;}
	    }
	}   
    }
    close DATA;
    if (! $check % $Lines == 0) {
	$continue = "YES";
	&minperpage($check);
    }   
    
####  Make sure they are clocked out.
####  If not, make note that they are still clocked in.
    
    if ($check == 0 && $lastinout ne "0") {
	if ($subroutine eq "yes") {&printhead;}
	$timeseconds = time;
	($currentdayhours) = (($timeseconds - $newday)/3600);
	($timein) = (ctime($newday));
	($timein) =~ s/US\/Central 1996//;
	print ("<TR><TD>$timein</TD><TD>Currently IN</TD><TD>");
	printf "%0.2f",$currentdayhours;
	print ("</TD></TR>\n");
	&minperpage($check);
	$totaltime += $timeseconds;
	$done = 1;
    }
    
    
    if ($lastinout eq 'IN' && $done ne '1') {
	$timeseconds = time;
	($currentdayhours) = (($timeseconds - $newday)/3600);
	($timein) = (ctime($newday));
	($timein) =~ s/US\/Central 1996//;
	print ("<TR><TD>$timein</TD><TD>Currently IN</TD><TD>");
	printf "%0.2f",$currentdayhours;
	print ("</TD></TR>\n");
	$totaltime += $timeseconds;
    }

####  Print out the total hours worked.
    $timehours = ($totaltime / 3600.00);
    print ("<TR><TD COLSPAN=2 ALIGN=CENTER>Total Hours Worked:</TD><TD>");
    printf "%0.2f", $timehours;
    print ("</TD></TR>\n");
    $totaltimearch = (($totaltime)/60)/60;
    $notetemp = ("$user:$totaltimearch");
    push(@timeappend, $notetemp);
    if ($subroutine ne "yes") {
	if ($lastinout eq "0") {
	 print ("<TR><TD align=center colspan=3><B>This user has not logged in.</B></TD></TR>");   
	}
	&P_NoSig;
	close DATA;
	$inout;
    }
    
}
#########################################################################
#                                                                       #
#                             TIMECLOCK                                 #
#########################################################################


sub TIMECLOCK {
    
    local (*FORMDATA) = @_;
    $lastinout = "NONE";
    &VERIFY($FORMDATA{whoami}, $FORMDATA{passwd});
    
    open (DATA, "+<" . $DATABASE) || die("Cannot open database") && print("Cannot open database");
    seek DATA, 0, 0;
    flock DATA, 2 || die ("cannot creat lockfile") && print ("<H2>Cannot create lock, try again.</H2>");
    while (<DATA>){
	($loggedinout,$employee,$timeinout,$modified,$comment,$commentor) = split(/:/);
	if ($employee eq $FORMDATA{whoami}) {
	    $lastinout = $loggedinout; }
    }
    close (DATA);
    
    if ($FORMDATA{whattodo} eq "IN") {
	($inout) = ("IN");
    } elsif ($FORMDATA{whattodo} eq "OUT") {
	($inout) = ("OUT");}
    if ($inout eq $lastinout) {
	&IDITitle;
	print ("<CENTER><h2>You are already $inout</H2><BR><BR>");
	print ("<h3>Last time $inout : ",ctime($timeinout),"</H3><P><a href=" . $timeclock . ">Return To Timeclock</A></CENTER></BODY></HTML>");
    } else {
	open (DATA, "+>>" . $DATABASE) || print("Cannot open database") && die("Cannot open database");
	seek DATA, 0, 0;
	flock DATA, 2 || print ("lock failed") && die;
	print DATA $inout . ":" . $FORMDATA{whoami} . ":" . time . ":" . ":" . ":" ."\n";
	close DATA;
	if ($inout eq "IN") {
	    &IDITitle;
	    print ("<h2>Welcome back, ", &getrealname($FORMDATA{whoami})," .</h2><BR><BR><BR><a href=" . $timeclock . ">Return To Timeclock</A></CENTER></BODY></HTML>");
	} else {
	    &IDITitle;
	   print ("<h2>Good bye, ",&getrealname($FORMDATA{whoami}),".</h2><BR><BR><BR><a href=" . $timeclock . ">Return To Timeclock</A></CENTER></BODY></HTML>");}
    }
    $inout;
 }



