#! /usr/bin/perl # Copyright 2001-2021 Leslie Richardson # This file is part of Open Admin for Schools. # Absent strings for matching set in admin.conf; Comparison at line # 305 in this file. my $self = 'rptAttMonthBand.pl'; my %lex = ('Monthly Attendance Report' => 'Monthly Attendance Report', 'Missing' => 'Missing', 'Date' => 'Date', 'Main' => 'Main', 'Attendance' => 'Attendance', 'Schooldays' => 'Schooldays', 'Weekdays' => 'Weekdays', 'Hols/Inserv' => 'Hols/Inserv', 'Red = Withdrawn' => 'Red = Withdrawn', 'Grand Totals' => 'Grand Totals', 'Periods Per Day' => 'Periods Per Day', 'Not Defined' => 'Not Defined', 'Name' => 'Name', 'Enrolled' => 'Enrolled', 'Attended' => 'Attended', 'Days' => 'Days', 'Absent' => 'Absent', 'Unexec' => 'Unexec', 'Excuse' => 'Excuse', 'Other' => 'Other', 'Total' => 'Total', 'Late' => 'Late', 'Times' => 'Times', 'Grade' => 'Grade', 'Homeroom' => 'Homeroom', 'Band' => 'Band', 'Total School Days not calculated' => 'Total School Days not calculated', 'Student-Days' => 'Student-Days', 'Pg' => 'Pg', 'Top' => 'Top', 'View Log File' => 'View Log File', 'Error' => 'Error', 'View/Download' => 'View/Download', 'Report Type' => 'Report Type', 'Group by' => 'Group by', 'Continue' => 'Continue', 'End' => 'End', 'Font Size' => 'Font Size', 'Paper Size' => 'Paper Size', 'Letter' => 'Letter', 'Legal' => 'Legal', 'A4' => 'A4', 'Records per Page' => 'Records per Page', 'Month' => 'Month', 'Group' => 'Group', 'Separate with Spaces' => 'Separate with Spaces', 'Enrol' => 'Enrol', 'Active' => 'Active', 'Type' => 'Type', 'Open' => 'Open', 'or' => 'or', 'Blank=All' => 'Blank=All', 'Select' => 'Select', 'Show Withdrawn' => 'Show Withdrawn', ); use DBI; use CGI; use Number::Format qw(:all); use Cwd; my $defmaxrecords = 24; # Default maximum records per PDF page. # Get current dir so know what path for config files. my $configpath; my $teachermode; #} else { $configpath = '..'; # go back two to get to etc. #} # only load passwords and users eval require "$configpath/etc/admin.conf.root"; if ( $@ ) { print $lex{Error}. " $@
\n"; die $lex{Error}. " $@\n"; } eval require "$configpath/lib/libattend.pl"; if ( $@ ) { print $lex{Error}. " $@
\n"; die $lex{Error}. " $@\n"; } my $dbtype = 'mysql'; my $dsn = "DBI:$dbtype:dbname=$dbase"; my $dbh = DBI->connect($dsn,$user,$password); $dbh->{mysql_enable_utf8} = 1; # Load Configuration Variables; my $sth = $dbh->prepare("select id, datavalue from conf_system where filename = 'admin'"); $sth->execute; if ( $DBI::errstr ) { print $DBI::errstr; die $DBI::errstr; } while ( my ($id, $datavalue) = $sth->fetchrow ) { eval $datavalue; if ( $@ ) { print "$lex{Error}: $@
\n"; die "$lex{Error}: $@\n"; } } my @tim = localtime(time); my $year = @tim[5] + 1900; my $month = @tim[4] + 1; my $day = @tim[3]; if (length($month) == 1){ $month = "0".$month;} if (length($day) == 1){ $day = "0".$day;} my $currdate = "$year-$month-$day"; # Teachermode if ( $teachermode ) { # running on teacher site $css = $tchcss; $homepage = $tchpage; $downloaddir = $tchdownloaddir; $webdownloaddir = $tchwebdownloaddir; } my $q = new CGI; print $q->header( -charset, $charset ); my %arr = $q->Vars; # Page Header my $title = "$lex{'Monthly Attendance Report'} - Band"; print qq{$doctype\n$title\n}; print qq{\n}; print qq{$chartype\n\n}; print qq{[ $lex{Main} ]\n}; print qq{

$title

\n}; # Show Start Page, if necessary. if ( not $arr{page} ) { showStartPage(); } else { delete $arr{page}; } # foreach my $key ( sort keys %arr ) { print qq{K:$key V:$arr{$key}
\n}; } my $userid = $arr{userid}; delete $arr{userid}; my $password = $arr{password}; delete $arr{password}; # Check for a user and get a band value my $sth = $dbh->prepare("select * from staff_secondary where userid = ? and password = ?"); $sth->execute($userid, $password); if ($DBI::errstr) { print $DBI::errstr; die $DBI::errstr; } my $ref = $sth->fetchrow_hashref; my %r = %$ref; if ( not $r{band} ) { print qq{

User Band not found

\n}; print qq{\n}; exit; } my $band = $r{band}; # Setup the TYPE of report, HTML or PDF. my ( $html, $pdf ); #if ( $arr{reporttype} eq 'HTML' ) { $html = 1; #} else { # $pdf = 1; #} if ( not $arr{month} ) { print qq{

$lex{Missing} $lex{Month}

\n}; print qq{\n}; exit; } my ( $year, $month ) = split('-', $arr{month} ); my $yearmonth = $arr{month}; # Check to make sure start date can really be the first of month. my ($startyear, $startmonth, $startday) = split '-', $schoolstart; if ( $month == $startmonth and $year == $startyear ) { $startdate = $schoolstart; } else { $startdate = "$year-$month-01"; } # End Date my ($nextmonth, $nextyear); if ( $month == 12 ) { $nextmonth = 1; $nextyear = $year + 1; } else { $nextmonth = $month + 1; $nextyear = $year; } my $nextstartjd = julian_day($nextyear,$nextmonth,'1'); my $monthendjd = $nextstartjd - 1; my @tmp = inverse_julian_day($monthendjd); my $endday = $tmp[2]; my $enddate = qq{$year-$month-$endday}; #print "Start:$startdate End:$enddate
\n"; my $schooldaysopen = calcDaysOpen($startdate, $enddate, $dbh); # Find number of days school not in session this period. my $sth = $dbh->prepare("select id, date, dayfraction from dates where to_days(date) >= to_days('$startdate') and to_days(date) <= to_days('$enddate')"); $sth->execute; if ($DBI::errstr) { print $DBI::errstr; die $DBI::errstr; } my $holidays; while ( my ($id, $date, $dayfraction) = $sth->fetchrow ) { if ( not $dayfraction ) { print "

$lex{Error}: $date $lex{Missing} $lex{Value}

\n"; $dayfraction = 1; } $holidays += $dayfraction; } # holidays now defined. # Note: may be a decimal, may need rounding. my $schooldaysopen = format_number($schooldaysopen, 2, 2); my $holidays = format_number($holidays, 2, 2); if ( $pdf ) { # Open TEX file, and print header. $shortname = "monthatt$$"; $fileName = "$shortname.tex"; open(TEX,">$fileName") || die "Can't open tex file"; print_tex_doc_start(); # Setup the start of the file. } if ( $html ) { # print top of page print qq{

$lex{Month} - $month[$month] $year
\n}; print qq{$lex{Days} $lex{Open}: $schooldaysopen $lex{'Hols/Inserv'}: $holidays

\n}; print qq{

[ $lex{'Grand Totals'} ] \n}; print qq{$lex{'Red = Withdrawn'}

\n}; } my $sth = $dbh->prepare("select lastname, firstname, initial, studnum, homeroom, grade, band from studentall where band = ? order by lastname, firstname"); # Current or Withdrawn? my $sth5 = $dbh->prepare("select count(*) from studentwd where studnum = ?"); my $curroom = -1; # Watch! Not a value entered for a reason...hopefully. my $firstflag = 1; # Flag to watch for first "real" person (not withdrawn) my ($studentname, $gr, $hr); # global grade, homeroom # *********** Start of Main Student Loop *********** #foreach my $grp ( sort {$a <=> $b} keys %groups ) { # foreach my $subgrp ( sort keys %{ $groups{$grp}} ) { # print "
GRP:$grp SUB:$subgrp
\n"; # $sth->execute( $grp, $subgrp ); # if ($DBI::errstr) { print $DBI::errstr; die $DBI::errstr;} $sth->execute($band); my $group = 'band'; while ( my ( $lastname, $firstname, $middlename, $studnum, $homeroom, $grade, $band ) = $sth->fetchrow ) { $studentname = "$lastname, $firstname $middlename"; $gr = $grade; # for printing in other function $hr = $homeroom; # print "Name:$studentname G:$grade:HR:$homeroom
\n"; # Withdrawn? $sth5->execute( $studnum ); if ($DBI::errstr) { print $DBI::errstr; die $DBI::errstr; } my $wd = $sth5->fetchrow; # returns 1 if withdrawn, 0 if not. if ( $wd and $html ){ $studentname = qq{$studentname}; } # print "GRP:$grp Subgroup:$subgrp $studnum WD:$wd "; # Calculate the days enrolled for this student my $ref = calcMonthlyEnrollment( $studnum, $startdate, $enddate, $dbh); if ( not $ref ) { next; } #student my $schooldays = $ref->{$yearmonth}->{'days'}; if ( not $schooldays ) { print qq{
No School Days for $firstname $lastname
\n}; next; } #student # print "Ref:$ref
\n"; # foreach my $key ( sort keys %$ref ) { # print "K:$key: V:$ref->{$key}{'days'}
\n"; # } # Put Header printing here since we have to skip some students ==== $oldroom = $curroom; if ( $group eq 'homeroom' ){ $curroom = $homeroom; # homeroom field. # Get Teacher Name for the room. $sth1 = $dbh->prepare("select s.lastname, s.firstname from staff as s, staff_multi as sm where sm.userid = s.userid and field_name = 'homeroom' and field_value = ? "); $sth1->execute( $curroom ); if ($DBI::errstr) {print $DBI::errstr; die $DBI::errstr; } my ($fn, $ln) = $sth1->fetchrow; $teachername = '$fn $ln'; } elsif ( $group eq 'band' ) { $curroom = $band; # band } else { $curroom = $grade; # grade field. } if ( $curroom ne $oldroom ) { if (not $firstflag) { if ($html){ print_html_class_totals(); } else { print_tex_class_totals(); $linecount=0; } $totschooldays = 0; $totattended = 0; $totlatedayun = 0; $totlatedayex = 0; $totabsentdayun = 0; $totabsentdayex = 0; $totother = 0; $totabsenttot = 0; } if ($html){ print qq{

}; print_html_header(); } else { print_tex_header(); } # Reset the number of periods per day when class changes. $periods = $g_ppd{ $grade }; # grade. if ( not $periods ){ if ( not $grade ){ $grade = 'Undefined!';} print "

$lex{'Periods Per Day'} $lex{'Not Defined'}- $lex{Grade}:$grade\n"; print "$firstname $lastname

\n"; print "\n"; exit "No grade for: $firstname $lastname ($studnum)\n"; } } # End of Header printing section =========== # Note: this can use startdate and $enddate since we only track absences # Get attendance records for this student and loop through adding up. $sth1 = $dbh->prepare("select * from attend where studentid = ? and to_days(absdate) >= to_days('$startdate') and to_days(absdate) <= to_days('$enddate') order by absdate,period"); $sth1->execute( $studnum ); if ($DBI::errstr) { print $DBI::errstr; die $DBI::errstr; } $absentex = 0;$absentun = 0; $lateex = 0;$lateun = 0; $other = 0; # Track 5 groups of attendance: Absent Unexcused, Absent (any # other; presumed excused), Late Unexcused, Late (any other; # presumed excused), Other (which should be 0). while ( my @absence = $sth1->fetchrow ) { my $reason = $absence[3]; # These string values set in the admin.conf file and match reasons if ($reason =~ /$absentUnexcused/) { $absentun++; } elsif ($reason =~ /$absentString/){ $absentex++;} elsif ($reason =~ /$lateUnexcused/) { $lateun++; } elsif ($reason =~ /$lateString/) { $lateex++; } else { $other++;} } if ( not $periods ) { if ( not $grade ){ $grade = 'Undefined';} print "

$lex{'Periods Per Day'} $lex{'Not Defined'}- $lex{Grade}:$grade\n"; print "$firstname $lastname.

\n"; print "\n"; exit; } if ( not $schooldays or $schooldays == 0 ) { print "

$lex{Schooldays} $lex{Missing} - "; print "$firstname $lastname ($studnum)

\n"; print "\n"; exit; } $absentdayun = $absentun/$periods; # convert from periods into days $absentdayex = $absentex/$periods; $otherday = $other/$periods; $absentperun = ($absentdayun/$schooldays) * 100; $absentperex = ($absentdayex/$schooldays) * 100; $otherper = ($otherday/$schooldays) * 100; $absentdaytot = $absentdayun + $absentdayex + $otherday; $absentpertot = ($absentdaytot/$schooldays) * 100; $latedayun = $lateun/$periods; $latedayex = $lateex/$periods; $lateperun = ($latedayun/$schooldays) * 100; $lateperex = ($latedayex/$schooldays) * 100; $attended = $schooldays - $absentdaytot; # For Class/Grade Summary $totschooldays = $schooldays + $totschooldays; $totattended = $attended + $totattended; $totabsentdayun = $absentdayun + $totabsentdayun; $totabsentdayex = $absentdayex + $totabsentdayex; $totother = $otherday + $totother; $totabsenttot = $absentdaytot + $totabsenttot; $totlatedayun = $latedayun + $totlatedayun; $totlatedayex = $latedayex + $totlatedayex; # For School Summary at Bottom $grtotschooldays += $schooldays; $grtotattended += $attended; $grtotabsentdayun += $absentdayun; $grtotabsentdayex += $absentdayex; $grtotother += $otherday; $grtotabsenttot += $absentdaytot; $grtotlatedayun += $latedayun; $grtotlatedayex += $latedayex; $firstflag = 0; # Not first person to run through. # Print this student's record if ( $html ){ print_html_record( $studnum, $schooldays ); } else { print_tex_record( $lastname, $firstname, $middlename, $studnum, $schooldays ); } $linecount++; if ( $pdf and $linecount >= $arr{maxrecords} ) { # New page. print TEX "\\end{tabular}\\newpage\n\n"; print_tex_header(); $linecount = 0; } } # End of main studentloop # print out stats for the last class if ($html){ print_html_class_totals(); } else { print_tex_class_totals(); } # Grand totals if ($html){ # print_html_grandtotals(); } else { print_tex_grandtotals(); print_tex_end(); } #---------------- sub showStartPage { #---------------- # Setup Year-Months. my @months; my %months; my ($sy, $sm, $sd) = split('-', $schoolstart); # schoolstart is global var from config. my $yrmo = "$sy-$sm"; push @months, $yrmo; $months{$yrmo} = "$s_month[$sm]-$sy"; for my $i (1..10) { my $mo = $sm + $i; my $yr = $sy; if ( $mo > 12 ) { $mo = $mo - 12; $yr++; } if ( $yr == $cyear and $mo == $cmonth ) { # done last; } if ( length $mo == 1 ) { $mo = '0'. $mo; } my $yrmo = "$yr-$mo"; push @months, $yrmo; $months{$yrmo} = "$s_month[$mo]-$yr"; } # Form Start print qq{
\n}; print qq{\n}; print qq{\n}; # Report Type - Always HTML now. #print qq{\n}; # Userid print qq{\n\n}; # Password print qq{\n\n}; # Month print qq{}; print qq{\n}; print qq{\n}; # Group # print qq{\n}; # Show Withdrawn # print qq{\n}; # print qq{\n}; =head # Spacer print qq{\n}; print qq{\n}; # Paper Size $defaultpapersize =~ s/paper//; # strip out word paper so lex works; from admin.conf my $defpaper = ucfirst( $defaultpapersize ); print qq{\n\n}; # Font Size print qq{\n\n}; # Records per page print qq{\n\n}; # Spacer print qq{\n}; =cut print qq{}; print qq{\n}; print qq{
$lex{'Report Type'}}; #print qq{
Liason Userid}; print qq{
Password}; print qq{
$lex{Select} $lex{Month}

$lex{'Group by'}
$lex{'Show Withdrawn'}

PDF Options
$lex{'Paper Size'}}; print qq{
$lex{'Font Size'}}; print qq{
$lex{'Records per Page'}}; print qq{

\n}; print qq{
\n}; print qq{\n}; exit; } # Print Table header at top of each table. #-------------------- sub print_html_header { #-------------------- my $heading = "\L\u$group"; print qq{\n}; print qq{}; print qq{\n}; print qq{\n}; print qq{}; print qq{\n}; print qq{}; print qq{\n}; print qq{}; print qq{\n}; } #------------------- sub print_tex_header { #------------------- my $heading = "\L\u$group"; print TEX "\\begin{tabular}{|p{5cm}"; for (1..8){ print TEX "|p{1.4cm}";} print TEX "|}\n\\hline\\rowcolor[gray]{0.85}{\\it $heading:} "; print TEX "{\\bf\\large $curroom} \n"; print TEX "& {\\bf ". $lex{Enrolled}. ' ('. $lex{Days}. ")} & {\\bf "; print TEX $lex{Attended}. ' ('. $lex{Days}. ")} & "; print TEX "{\\bf ". $lex{Absent}. ' '. $lex{Unexec}. ' ('. $lex{Days}; print TEX ")} &{\\bf ". $lex{Absent}. ' '. $lex{Excuse}. ' ('. $lex{Days}. ")} & "; print TEX "{\\bf ". $lex{Absent}. ' '. $lex{Other}. ' ('. $lex{Days}. ")} &{\\bf "; print TEX $lex{Absent}. ' '. $lex{Total}. ' ('. $lex{Days}. ")} & \n"; print TEX "{\\bf ". $lex{Late}. ' '. $lex{Unexec}. ' ('. $lex{Times}. ")} &{\\bf "; print TEX $lex{Late}. ' '. $lex{Excuse}. ' ('. $lex{Times}. ")}\\\\ \\hline\n"; } #-------------------------- sub print_html_class_totals { #-------------------------- if ( not $totschooldays ) { print qq{$lex{Error}: $lex{'Total School Days not calculated'}!\n}; return; } $totpercent = ($totattended/$totschooldays) * 100; $totabsentperun = ($totabsentdayun/$totschooldays) * 100; $totabsentperex = ($totabsentdayex/$totschooldays) * 100; $tototherper = ($totother/$totschooldays) * 100; $totabsentpertot = ($totabsenttot/$totschooldays) * 100; $totlateperun = ($totlatedayun/$totschooldays) * 100; $totlateperex = ($totlatedayex/$totschooldays) * 100; # print out stats for this class print qq{}; print qq{\n}; print qq{"; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{
$heading: $curroom
$lex{Name}$lex{Grade}
$lex{Homeroom}
$lex{Enrolled}$lex{Attended}
($lex{Days})
$lex{Absent}
$lex{Unexec}
($lex{Days})
$lex{Absent}
$lex{Excuse}
($lex{Days})
$lex{Absent}
$lex{Other}
($lex{Days})
$lex{Absent}
$lex{Total}
($lex{Days})
$lex{Late}
$lex{Unexec}
($lex{Times})
$lex{Late}
$lex{Excuse}
($lex{Times})
$lex{Total} ($lex{'Student-Days'})}. format_number($totschooldays,2,2). "}. format_number($totattended,2,2). "
("; print format_number( $totpercent, 2,2 ); print qq{%)
}. format_number($totabsentdayun,2,2). "
("; print format_number( $totabsentperun, 2, 2); print qq{%)
}. format_number($totabsentdayex,2,2). "
("; print format_number( $totabsentperex, 2,2); print qq{%)
}. format_number($totother,2,2). "
("; print format_number( $tototherper, 2, 2 ); print qq{%)
}. format_number($totabsenttot,2,2). "
("; print format_number( $totabsentpertot, 2,2); print qq{%)
}. format_number($totlatedayun,2,2). ' '. $lex{Days}. "
("; print format_number( $totlateperun, 2,2); print qq{%)
}. format_number($totlatedayex,2,2). ' '. $lex{Days}. "
("; print format_number( $totlateperex, 2); print qq{%)
\n}; } #------------------------- sub print_tex_class_totals { #------------------------- if (not $totschooldays){ print $lex{Error}. "! ". $lex{'Total School Days not calculated'}; return; } $totpercent = ($totattended/$totschooldays) * 100; $totabsentperun = ($totabsentdayun/$totschooldays) * 100; $totabsentperex = ($totabsentdayex/$totschooldays) * 100; $tototherper = ($totother/$totschooldays) * 100; $totabsentpertot = ($totabsenttot/$totschooldays) * 100; $totlateperun = ($totlatedayun/$totschooldays) * 100; $totlateperex = ($totlatedayex/$totschooldays) * 100; # print out stats for this class print TEX "\\rowcolor[gray]{0.90}"; print TEX "{\\bf Totals (Student-Days)} & ". format_number($totschooldays,2,2). " &\n"; print TEX format_number($totattended,2,2). " (", format_number( $totpercent, 2,2),"\\%)& \n"; print TEX format_number($totabsentdayun,2,2). " (", format_number( $totabsentperun, 2,2),"\\%)&\n"; print TEX format_number($totabsentdayex,2,2). " (", format_number( $totabsentperex, 2,2),"\\%)&\n"; print TEX format_number($totother,2,2). " (", format_number( $tototherper, 2,2),"\\%)&\n"; print TEX format_number($totabsenttot,2,2). " (", format_number( $totabsentpertot, 2,2),"\\%)&\n"; print TEX format_number($totlatedayun,2,2). ' '. $lex{Days}. " ("; print TEX format_number( $totlateperun, 2,2),"\\%)&\n"; print TEX format_number($totlatedayex,2,2). ' '. $lex{Days}. " ("; print TEX format_number( $totlateperex, 2,2),"\\%)\\\\"; print TEX "\\hline\\end{tabular}\n\n\\bigskip\n\\bigskip\n"; print TEX "\\underline{\\hspace{2.5in}} \n\n"; print TEX "{\\small Teacher}\n"; print TEX "\\newpage\n\n"; } #---------------------- sub print_tex_doc_start { #---------------------- # Set Paper Size, text width and height my ( $papersize, $textwidth, $textheight ); if ( $arr{papersize} eq $lex{Letter} ) { $papersize = 'letterpaper'; $textwidth = $g_letterpaper_textwidth; $textheight = $g_letterpaper_textheight; } elsif ( $arr{papersize} eq $lex{Legal} ) { $papersize = 'legalpaper'; $textwidth = $g_legalpaper_textwidth; $textheight = $g_legalpaper_textheight; } elsif ( $arr{papersize} eq $lex{A4} ) { $papersize = 'a4paper'; $textwidth = $g_a4paper_textwidth; $textheight = $g_a4paper_textheight; } print TEX "\\documentclass[$arr{fontsize}, $papersize, oneside]{article} \\usepackage{array,colortbl,inputenc} $a_latex_header %\\renewcommand{\\familydefault}{\\sfdefault} \\pagestyle{empty} \\setlength{\\textwidth}{$textwidth} \\setlength{\\textheight}{$textheight} \\setlength{\\hoffset}{-38mm} \\setlength{\\voffset}{-20mm} \\setlength{\\headsep}{10pt} \\setlength{\\headheight}{14pt} \\setlength{\\topmargin}{0pt} \\setlength{\\parindent}{0pt} \\setlength{\\tabcolsep}{5pt} \\setlength{\\extrarowheight}{3pt} \\pagestyle{headings} \\markright{$schoolname \\hfill ". $lex{'Monthly Attendance Report'}. " -- $month[$month] $year -- ". $lex{Pg}. " } \n\n \\begin{document}\n"; } # End of Print Tex Doc Start #---------------- sub print_tex_end { #---------------- print TEX "\\hline\\end{tabular}\n\n\\end{document}\n"; close TEX; system("$pdflatex $fileName > pdflog$$.txt"); system("mv $shortname.pdf $downloaddir"); system("mv pdflog$$.txt $downloaddir"); system("rm $shortname.*"); print qq{

\n}; print qq{$lex{'View/Download'} $lex{'Monthly Attendance Report'}

\n}; print qq{

[ \n}; if ( not $teachermode ) { print qq{ $lex{Attendance} | \n}; } print qq{ }; print qq{$lex{'View Log File'} ]

\n}; print qq{\n}; } # Print Tex End #-------------------- sub print_html_record { #-------------------- my ( $studnum, $schooldays ) = @_; print qq{$studentname ($studnum) $withdrawdate$gr/$hr\n}; print qq{}. format_number($schooldays, 2,2). qq{\n}; my $att = format_number($attended, 2,2); if ( $attended < 0 ) { $att = qq{$att}; } else { $att = "$att"; } print "$att\n"; print "". format_number($absentdayun, 2,2). " ("; print format_number( $absentperun,2,2); print "%)"; print "". format_number($absentdayex,2,2). " ("; print format_number( $absentperex, 2,2); print "%)\n"; print "". format_number($otherday,2,2). " ("; print format_number( $otherper, 2,2); print "%)"; print "". format_number($absentdaytot,2,2). " ("; print format_number( $absentpertot, 2,2 ); print "%)"; print "". format_number($lateun,2,2). " ("; print format_number( $lateperun, 2,2 ); print "%)"; print "". format_number($lateex, 2,2). " ("; print format_number( $lateperex, 2,2); print "%)"; print "\n"; } # End of Print HTML Record #------------------- sub print_tex_record { #------------------- my ( $lastname, $firstname, $middlename, $studnum, $schooldays ) = @_; print TEX "{\\bf $lastname}, $firstname $middlename ($studnum) $withdrawdate & "; print TEX format_number($schooldays,2,2). " & ". format_number($attended,2,2). " & "; print TEX format_number($absentdayun,2,2). " (", format_number( $absentperun, 2,2), "\\%)& "; print TEX format_number($absentdayex,2,2). " (", format_number( $absentperex, 2,2), "\\%) & "; print TEX format_number($otherday,2,2). " (", format_number( $otherper, 2,2), "\\%) & "; print TEX format_number($absentdaytot,2,2). " (", format_number( $absentpertot, 2,2),"\\%) & "; print TEX format_number($lateun,2,2). " (", format_number( $lateperun, 2,2), "\\%) & "; print TEX format_number($lateex,2,2). " (", format_number( $lateperex, 2,2), "\\%) \\\\ \\hline\n\n"; } #------------------------- sub print_html_grandtotals { #------------------------- # Print Grand Totals print qq{\n}; print qq{\n}; print qq{\n}; print "\n"; print "\n"; print '\n"; print '\n"; $grtotpercent = ($grtotattended/$grtotschooldays) * 100; $grtotabsentperun = ($grtotabsentdayun/$grtotschooldays) * 100; $grtotabsentperex = ($grtotabsentdayex/$grtotschooldays) * 100; $grtototherper = ($grtotother/$grtotschooldays) * 100; $grtotabsentpertot = ($grtotabsenttot/$grtotschooldays) * 100; $grtotlateperun = ($grtotlatedayun/$grtotschooldays) * 100; $grtotlateperex = ($grtotlatedayex/$grtotschooldays) * 100; # print out grand totals print qq{\n}; print ""; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print qq{
}; print qq{$lex{'Grand Totals'}
". $lex{Enrolled}. ''. $lex{Attended}; print '
('. $lex{Days}. ")
". $lex{Absent}. '
'. $lex{Unexec}. '
('. $lex{Days}. ")
\n"; print $lex{Absent}. '
'. $lex{Excuse}. '
('. $lex{Days}. ")
'. $lex{Absent}. '
'. $lex{Other}. '
('. $lex{Days}. ')
'; print $lex{Absent}. '
'. $lex{Total}. '
('. $lex{Days}. ")
'. $lex{Late}. '
'. $lex{Unexec}. '
('. $lex{Times}. ')
'; print $lex{Late}. '
'. $lex{Excuse}. '
('. $lex{Times}. ")
$lex{'Grand Totals'} (Student-Days)". format_number($grtotschooldays,2,2). "". format_number($grtotattended,2,2). ' '. $lex{Days}. "
("; print format_number( $grtotpercent, 2,2 ); print "%)
". format_number($grtotabsentdayun,2,2). ' '. $lex{Days}. "
("; print format_number( $grtotabsentperun, 2,2 ); print "%)
". format_number($grtotabsentdayex,2,2). ' '. $lex{Days}. "
("; print format_number( $grtotabsentperex, 2,2 ); print "%)
". format_number($grtotother,2,2). ' '. $lex{Days}. "
("; print format_number( $grtototherper, 2,2 ); print "%)
". format_number($grtotabsenttot,2,2). ' '. $lex{Days}. "
("; print format_number( $grtotabsentpertot, 2,2 ); print "%)
". format_number($grtotlatedayun,2,2). "
("; print format_number( $grtotlateperun, 2,2 ); print "%)
". format_number($grtotlatedayex,2,2). "
("; print format_number( $grtotlateperex, 2,2 ); print "%)
\n}; print qq{

[ $lex{Main} |\n}; print qq{$lex{Attendance} |\n}; print qq{$lex{Top} ]

\n}; } #------------------------ sub print_tex_grandtotals { #------------------------ print TEX "\\begin{tabular}{|p{4cm}"; for (1..8){ print TEX "|p{1.5cm}";} print TEX "|}\n\\hline\\rowcolor[gray]{0.85}". $lex{'Grand Totals'}. " &"; print TEX $lex{Enrolled}. " & ". $lex{Attended}. " (". $lex{Days}. ") &"; print TEX $lex{Absent}. ' '. $lex{Unexec}. " (". $lex{Days}. ") & ". $lex{Absent}; print TEX ' '. $lex{Excuse}. " (". $lex{Days}. ") &"; print TEX $lex{Absent}. ' '. $lex{Other}. " (". $lex{Days}. ") & ". $lex{Absent}; print TEX ' '. $lex{Total}. " (". $lex{Days}. ") &"; print TEX $lex{Late}. ' '. $lex{Unexec}. " (". $lex{Times}. ") & ". $lex{Late}; print TEX ' '. $lex{Excuse}. " (". $lex{Times}. ")\\\\ \\hline\n"; $grtotpercent = ($grtotattended/$grtotschooldays) * 100; $grtotabsentperun = ($grtotabsentdayun/$grtotschooldays) * 100; $grtotabsentperex = ($grtotabsentdayex/$grtotschooldays) * 100; $grtototherper = ($grtotother/$grtotschooldays) * 100; $grtotabsentpertot = ($grtotabsenttot/$grtotschooldays) * 100; $grtotlateperun = ($grtotlatedayun/$grtotschooldays) * 100; $grtotlateperex = ($grtotlatedayex/$grtotschooldays) * 100; # print out grand totals print TEX $lex{'Grand Totals'}. " (". $lex{'Student-Days'}. ") & "; print TEX format_number($grtotschooldays,2,2). " &"; print TEX format_number( $grtotattended,2,2). q{ }. $lex{Days}. " ("; print TEX format_number( $grtotpercent, 2,2 ). "\\%)&\n"; print TEX format_number( $grtotabsentdayun,2,2). q{ }. $lex{Days}. " ("; print TEX format_number( $grtotabsentperun, 2,2 ). "\\%)&\n"; print TEX format_number($grtotabsentdayex,2,2). q{ }. $lex{Days}. " ("; print TEX format_number( $grtotabsentperex, 2,2 ),"\\%)&\n"; print TEX format_number($grtotother,2,2). q{ }. $lex{Days}. " ("; print TEX format_number( $grtototherper, 2),"\\%)&\n"; print TEX format_number($grtotabsenttot,2,2). q{ }. $lex{Days}. " ("; print TEX format_number( $grtotabsentpertot, 2,2),"\\%)&\n"; print TEX format_number($grtotlatedayun,2,2). q{ }. " ("; print TEX format_number( $grtotlateperun, 2,2),"\\%)&\n"; print TEX format_number($grtotlatedayex,2,2). q{ }. " ("; print TEX format_number( $grtotlateperex, 2,2),"\\%)\\\\ \n"; } # End of Print_tex_grandtotals