#! /usr/bin/perl # Copyright 2001-2022 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 = 'rptattmonth.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; if ( getcwd() =~ /tcgi/ ){ # we are in tcgi $teachermode = 1; $configpath = '..'; # go back one to get to etc. } 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"; } # for parseGradesPeriod function eval require "$configpath/lib/libDate.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'} 1"; print qq{$doctype\n$title\n}; print qq{\n}; print qq{$chartype\n\n}; print qq{[ $lex{Main} \n}; if ( not $teachermode ) { print qq{| $lex{Attendance} }; } print qq{]\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}; } # 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}; # if ( not $arr{grade} and not $arr{homeroom} ) { # everyone.... # print qq{

$lex{Missing} $lex{Grade} $lex{or} $lex{Homeroom}

\n}; # print qq{\n}; # exit; # } my %groups; # will be: groups{group}{subgroup} for report ordering of students. # This is the 'container' for the other subgroupings. my $group = $arr{group}; # grade, homeroom, band? if ( $arr{grade} ) { # if we have a grade value, we group by grade. $group = 'grade'; } elsif ( $arr{homeroom} ) { $group = 'homeroom'; } my $subgroup; if ( $group eq 'grade' ) { $subgroup = 'grade'; # WAS $subgroup = 'homeroom'; } else { # group is homeroom $subgroup = 'grade'; } my $sth = $dbh->prepare("select distinct $group, $subgroup from studentall order by $group"); $sth->execute; if ($DBI::errstr) { print $DBI::errstr; die $DBI::errstr; } while ( my ($grp,$subgrp) = $sth->fetchrow ) { $groups{$grp}{$subgrp} = 1; push @groups, $grp } if ( $arr{grade} ) { # @groups = ($arr{grade}); foreach my $g ( keys %groups ) { if ( $g ne $arr{grade} ) { delete $groups{$g}; } } } elsif ( $arr{homeroom} ) { foreach my $g ( keys %groups ) { if ( $g ne $arr{homeroom} ) { delete $groups{$g}; } } } # 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 ; Can't just use sql month() function due to August starts. 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 qq{Start:$startdate End:$enddate
\n}; =head #-------------------------------- my $schooldaysopen = calcDaysOpen($startdate, $enddate, $dbh); # NOTE: one could pass a homeroom (4th arg) and get those counted # also. It uses dates_homeroom. This function already reads dates table # and uses non-zero day fractions. # Find number of days additional school closed this month (partial closures via dates_period table) # from dates_periods (ie. grades closed). my $sth = $dbh->prepare("select date from dates_periods where month(date) = ? and year(date) = ?"); $sth->execute($month,$year); if ($DBI::errstr) { print $DBI::errstr; die $DBI::errstr; } my %pclosed; # pclosed{date}{grade} = periodcount; one or more periods. while ( my $date = $sth->fetchrow ) { # there may be more than one record per date. my $ref = parseGradesPeriod($date,$dbh); my %per = %$ref; foreach my $grade ( sort keys %per ) { $pclosed{$date}{$grade}++; } } my %openfrac; # openfrac{$date} = fraction of day open (ie. less than 1). foreach my $date ( keys %pclosed ) { my $closedfrac; # there may be more than one grade grouping both with periods # closed. We have to find which one is larger in terms of periods # closed / ppd for that grade grouping. foreach my $grade ( sort keys %{ $pclosed{$date}} ) { if ( $pclosed{$date}{$grade} / $ppd{$grade} > $closedfrac ) { $closedfrac = $pclosed{$date}{$grade} / $ppd{$grade}; } $openfrac{$date} = 1 - $closedfrac; } } # we have the fractions of the day open for any day in the month. We # ignore the values for PK, K since they are just here partially # anyway.... #------------------------------- =cut #========================================= my $schooldaysopen = calcDaysOpen($startdate, $enddate, $dbh); # NOTE: one could pass a homeroom (4th arg) and get those counted # also. It uses dates_homeroom. This function already reads dates table # and uses non-zero day fractions. # Find number of days additional school closed this month (partial closures via dates_period table) # from dates_periods (ie. grades closed). my $sth = $dbh->prepare("select date from dates_periods where month(date) = ? and year(date) = ?"); $sth->execute($month,$year); if ($DBI::errstr) { print $DBI::errstr; die $DBI::errstr; } my %pclosed; # pclosed{date}{grade} = periodcount; one or more periods. while ( my $date = $sth->fetchrow ) { # there may be more than one record per date. my $ref = parseGradesPeriod($date,$dbh); my %per = %$ref; foreach my $grade ( sort keys %per ) { $pclosed{$date}{$grade}++; } } my %closedfrac; # stores partial day closed $closedfrac{date} = fraction closed (value between 0 and1) my $totalpartclosed; # total days equivalent this month partly closed. foreach my $date ( keys %pclosed ) { my $cfrac; foreach my $grade ( keys %{ $pclosed{$date}} ) { # go over grades to find largest closed value if ( not $g_ppd{$grade} ) { print qq{Missing Att Periods per day for Grade $grade
\n}; exit; } my $gradefrac = $pclosed{$date}{$grade} / $g_ppd{$grade}; # fraction closed for this grade. if ( $gradefrac > $cfrac ) { $cfrac = $gradefrac; # get largest closed value for this date } } $closedfrac{$date} = round($cfrac, 1); $totalpartclosed += round($cfrac, 1); } # Adjust value of schools day open based on partial days closure. $schooldaysopen = $schooldaysopen - $totalpartclosed; #================================================== 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{

$month[$month] $year / \n}; print qq{$lex{Days} $lex{Open}: $schooldaysopen

\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 $group = ? and $subgroup = ? 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 qq{
GRP:$grp SUB:$subgrp
\n}; $sth->execute( $grp, $subgrp ); if ($DBI::errstr) { print $DBI::errstr; die $DBI::errstr;} while ( my ( $lastname, $firstname, $middlename, $studnum, $homeroom, $grade, $band ) = $sth->fetchrow ) { $studentname = qq{$lastname, $firstname $middlename}; $gr = $grade; # for printing in other function $hr = $homeroom; # Now let's find which table student from: student or studentwd $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}; } # 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 ) { next; } #student # Header printing Section 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 qq{

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

\n}; print qq{\n}; exit qq{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 qq{

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

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

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

\n}; print qq{\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; $schooldays -= $totalpartclosed; # partial days closed $attended = $schooldays - $absentdaytot; if ( $attended < 0 ) { $schooldays += $totalpartclosed; # put this value back since WD was before this day. $attended = 0; } # 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 } # end of subgroup loop } # end of group loop # 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"; } # Get the grades my @grades; my $sth = $dbh->prepare("select distinct grade from student where grade is not NULL and grade != ''"); $sth->execute; if ( DBI::errstr ) { print $DBI::errstr; die $DBI::errstr; } while ( my $gr = $sth->fetchrow ) { push @grades, $gr; } # Get the homerooms. my @homerooms; my $sth1 = $dbh->prepare("select distinct grade from student where homeroom = ? and grade != '' and grade is not NULL"); my $sth = $dbh->prepare("select distinct homeroom from student where homeroom is not NULL and homeroom != ''"); $sth->execute; if ( DBI::errstr ) { print $DBI::errstr; die $DBI::errstr; } while ( my $hr = $sth->fetchrow ) { push @homerooms, $hr; # removed checking below # Now check for the grade level in this homeroom # $sth1->execute($hr); # if ( DBI::errstr ) { print $DBI::errstr; die $DBI::errstr; } # while ( my $gr = $sth1->fetchrow ) { # if ( $g_AttendanceEntryMethod{$gr} eq 'homeroom' ) { # push @homerooms, $hr; # last; # } # } } =head my ($cyear,$cmonth, $cday) = split('-', $currdate); # Get Previous month end. my $startdayjd = julian_day($cyear, $cmonth, '1'); my $prevendjd = $startdayjd - 1; # end of previous month. my @prev = inverse_julian_day( $prevendjd ); my $prevdate = join('-', @prev); =cut print qq{
\n}; print qq{\n}; print qq{\n}; # Report Type print qq{\n}; # Month print qq{}; print qq{\n}; print qq{\n}; # Homerooms print qq{}; print qq{\n}; # Grades print qq{}; print qq{\n}; # Spacer print qq{\n}; # Group print qq{\n}; # Show Withdrawn # print qq{\n}; # print qq{\n}; # 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}; print qq{}; print qq{\n}; print qq{
$lex{'Report Type'}}; print qq{
$lex{Select} $lex{Month}

$lex{Homeroom} $lex{'Blank=All'}
$lex{or} }; print qq{$lex{Grade} $lex{'Blank=All'}

$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{\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{
}; 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). qq{}. format_number($totattended,2,2). qq{
(}; print format_number( $totpercent, 2,2 ); print qq{%)
}. format_number($totabsentdayun,2,2). qq{
(}; print format_number( $totabsentperun, 2, 2); print qq{%)
}. format_number($totabsentdayex,2,2). qq{
(}; print format_number( $totabsentperex, 2,2); print qq{%)
}. format_number($totother,2,2). qq{
(}; print format_number( $tototherper, 2, 2 ); print qq{%)
}. format_number($totabsenttot,2,2). qq{
(}; print format_number( $totabsentpertot, 2,2); print qq{%)
}. format_number($totlatedayun,2,2). qq{ $lex{Days}
(}; print format_number( $totlateperun, 2,2); print qq{%)
}. format_number($totlatedayex,2,2). qq{ $lex{Days}
(}; print format_number( $totlateperex, 2); print qq{%)
\n}; } #------------------------- sub print_tex_class_totals { #------------------------- if ( not $totschooldays ){ print qq{$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 = qq{$att}; } print qq{$att\n}; print qq{}. format_number($absentdayun, 2,2). qq{ (}; print format_number( $absentperun,2,2); print qq{%)}; print qq{}. format_number($absentdayex,2,2). qq{ (}; print format_number( $absentperex, 2,2); print qq{%)\n}; print qq{}. format_number($otherday,2,2). qq{ (}; print format_number( $otherper, 2,2); print qq{%)}; print qq{}. format_number($absentdaytot,2,2). qq{ (}; print format_number( $absentpertot, 2,2 ); print qq{%)}; print qq{}. format_number($lateun,2,2). qq{ (}; print format_number( $lateperun, 2,2 ); print qq{%)}; print qq{}. format_number($lateex, 2,2). qq{ (}; print format_number( $lateperex, 2,2); print qq{%)}; print qq{\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 qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\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 qq{}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{
}; print qq{$lex{'Grand Totals'}
$lex{Enrolled}$lex{Attended} }; print qq{
($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{'Grand Totals'} (Student-Days)}. format_number($grtotschooldays,2,2). qq{}. format_number($grtotattended,2,2). qq{$lex{Days}
(}; print format_number( $grtotpercent, 2,2 ); print qq{%)
}. format_number($grtotabsentdayun,2,2). qq{$lex{Days}
(}; print format_number( $grtotabsentperun, 2,2 ); print qq{%)
}. format_number($grtotabsentdayex,2,2). qq{$lex{Days}
(}; print format_number( $grtotabsentperex, 2,2 ); print qq{%)
}. format_number($grtotother,2,2). qq{$lex{Days}
(}; print format_number( $grtototherper, 2,2 ); print qq{%)
}. format_number($grtotabsenttot,2,2). qq{$lex{Days}
(}; print format_number( $grtotabsentpertot, 2,2 ); print qq{%)
}. format_number($grtotlatedayun,2,2). qq{
(}; print format_number( $grtotlateperun, 2,2 ); print qq{%)
}. format_number($grtotlatedayex,2,2). qq{
(}; print format_number( $grtotlateperex, 2,2 ); print qq{%)
\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