You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
597 lines
27 KiB
597 lines
27 KiB
# $Id: amtda2.pl,v 1.2 2005/04/12 19:50:26 ddoughty Exp $
|
|
#
|
|
# Source File: amtda.pl
|
|
# custom reports for amtda.org
|
|
#
|
|
|
|
use FileHandle;
|
|
use Time::Local;
|
|
use Data::Dumper;
|
|
require 'sitecfg.pl';
|
|
require 'testlib.pl';
|
|
require "maillib.pl";
|
|
|
|
use strict;
|
|
use vars qw(%FORM %SESSION %CLIENT %TEST_SESSION %SUBTEST_QUESTIONS %TEST
|
|
%SUBTEST_SUMMARY %CANDIDATE %SUBTEST_ANSWERS %SYSTEM %REPORT
|
|
%SUBTEST_RESPONSES);
|
|
use vars qw($testcomplete $cgiroot $pathsep $dataroot );
|
|
|
|
&app_initialize;
|
|
&LanguageSupportInit();
|
|
&get_client_profile($SESSION{'clid'});
|
|
&get_test_profile($CLIENT{'clid'}, $FORM{'tstid'});
|
|
$FORM{'tstid'} = ($CLIENT{'clid'} eq 'sandbox'? 'tutor': 'CMTSE2');
|
|
|
|
if (&get_session($FORM{'tid'})) {
|
|
if (not $FORM{'reportname'}) {
|
|
&ReportChooser($CLIENT{'clid'},$FORM{'tstid'});
|
|
} else {
|
|
if ($FORM{'mofm'} < 10) { $FORM{'mofm'}="0$FORM{'mofm'}";}
|
|
if ($FORM{'moto'} < 10) { $FORM{'moto'}="0$FORM{'moto'}";}
|
|
if ($FORM{'dyfm'} < 10) { $FORM{'dyfm'}="0$FORM{'dyfm'}";}
|
|
if ($FORM{'dyto'} < 10) { $FORM{'dyto'}="0$FORM{'dyto'}";}
|
|
my $datefm="$FORM{'yrfm'}\-$FORM{'mofm'}\-$FORM{'dyfm'}";
|
|
my $dateto="$FORM{'yrto'}\-$FORM{'moto'}\-$FORM{'dyto'}";
|
|
my $questions = &get_test_questions($CLIENT{'clid'},$FORM{'tstid'});
|
|
my $results = &get_all_test_results($CLIENT{'clid'},$FORM{'tstid'}, $datefm, $dateto);
|
|
my ($subjects, $categories) = &add_results_by_cnd($questions,$results);
|
|
#print "<pre>".Dumper($results)."</pre>\n";
|
|
if (toGMSeconds($datefm." 00:00:00") > toGMSeconds($dateto." 00:00:00")) {
|
|
print "<h2>Error: Invalid date range</H2><br>\n";
|
|
print "<input type=button name=close value=Close onClick='Javascript: window.close()'>";
|
|
} elsif ($FORM{'reportname'} eq 'rawscorebycnd') {
|
|
&RawScoreByCnd($questions, $results, $subjects, $categories);
|
|
} elsif ($FORM{'reportname'} eq 'percentscorebycnd') {
|
|
&PercentScoreByCnd($questions, $results, $subjects, $categories);
|
|
} elsif ($FORM{'reportname'} eq 'rawscorebysubject') {
|
|
my $bysubj = &results_by_subject($questions, $results, $subjects);
|
|
&RawScoreBySubject($questions, $results, $subjects, $bysubj);
|
|
} elsif ($FORM{'reportname'} eq 'passfailbycnd') {
|
|
&PassFailByCnd($results);
|
|
} elsif ($FORM{'reportname'} eq 'candidateletter') {
|
|
my $letter = &CandidateLetter($questions, $results, $subjects, $categories,$FORM{"uid"});
|
|
my $note = '';
|
|
if ($FORM{'sendemail'}) {
|
|
# email copies of the letter out
|
|
#print STDERR "($FORM{'email'}|$FORM{'CC'})\n";
|
|
if ($FORM{'email'} or $FORM{'CC'}) {
|
|
my $testdef = get_test_definition($CLIENT{'clid'},$FORM{'tstid'});
|
|
my $addresses = join(',',$FORM{'email'},$FORM{'CC'});
|
|
$note = "<font color=\"green\"><h1>NOTE: The following letter has been";
|
|
if ($FORM{'email'}) {$note .= " mailed to the candidate ($FORM{'email'})";}
|
|
if ($FORM{'email'} and $FORM{'CC'}) {$note .= " and";}
|
|
if ($FORM{'CC'}) {$note .= " CCed to these addresses - $FORM{'CC'}";}
|
|
$note .= ".</h1></font>\n";
|
|
send_mail($testdef->{'ntfy'}->[0],$addresses,'CMTSE Test Results',"Content-Type: text/html\n\n".$letter);
|
|
} else {
|
|
$note = "<font color=\"red\"><h1>WARNING: An emailed report was requested but no".
|
|
" email addresses were given.</h1></font>\n";
|
|
}
|
|
}
|
|
$letter =~ s/(<BODY.*?>)/$1$note/i;
|
|
print $letter;
|
|
} else {
|
|
&ReportChooser($CLIENT{'clid'},$FORM{'tstid'});
|
|
}
|
|
}
|
|
}
|
|
|
|
# There should only be function definitions beyond this point.
|
|
exit(0);
|
|
|
|
sub get_test_definition {
|
|
my ($client,$testid) = @_;
|
|
my @tests = get_test_list($client);
|
|
my @keys = split(/&/,shift(@tests));
|
|
chomp(@keys);
|
|
my $test;
|
|
foreach (@tests) {
|
|
if (/^$testid/) {
|
|
chomp;
|
|
@{$test}{@keys} = split(/&/,$_);
|
|
last;
|
|
}
|
|
}
|
|
if ($test) {
|
|
$test->{'ntfy'} = [split(/,/,$test->{'ntfy'})];
|
|
}
|
|
return $test;
|
|
}
|
|
|
|
sub get_test_questions {
|
|
# populate an anonymous Assoc. array of arrays.
|
|
my ($client,$test) = @_;
|
|
my @questions = &get_question_list($test,$client);
|
|
my @keys = split(/&/,shift(@questions));
|
|
chomp(@keys);
|
|
my $questions;
|
|
foreach (@questions) {
|
|
chomp;
|
|
my @values = split(/&/,$_);
|
|
#if ($values[3] eq 'Y') {next;}
|
|
@{$questions->{$values[0]}}{@keys} = @values;
|
|
}
|
|
return $questions;
|
|
}
|
|
|
|
sub get_all_test_results {
|
|
my ($client,$test,$datefm,$dateto) = @_;
|
|
my @filelist = &get_test_result_files($testcomplete, $client, $test);
|
|
my $results = {};
|
|
my $historyfile = join($pathsep,$testcomplete,"$client.$test.history");
|
|
open (HISTFILE,"<$historyfile") or return 0;
|
|
my %histentries;
|
|
while ($_ = <HISTFILE>) {
|
|
my ($date) = split(/<<>>/,$_);
|
|
my $completedat = &format_date_time("yyyy-mm-dd", "1", "-10000", toGMSeconds($date));
|
|
#print STDERR "Date: $date Completedate: $completedat\n";
|
|
if (!&date_out_of_range($completedat,$datefm,$dateto)) {
|
|
my (undef,$user) = split(/&/,$_);
|
|
$histentries{$user} = 1;
|
|
}
|
|
}
|
|
close HISTFILE;
|
|
foreach my $file (@filelist) {
|
|
my $user = $file;
|
|
$user =~ s/.$test$//;
|
|
$user =~ s/^$client.//;
|
|
if (not exists $histentries{$user}) {
|
|
# no test after jan 1 2004 exist for this user
|
|
next;
|
|
}
|
|
&get_candidate_profile($client,$user);
|
|
$results->{$user}->{'fullname'} = "$CANDIDATE{'nml'}, $CANDIDATE{'nmf'} $CANDIDATE{'nmm'}";
|
|
&get_test_sequence_for_reports($client,$user,$test);
|
|
my @questions = split(/\&/, $SUBTEST_QUESTIONS{2});
|
|
my @answers = split(/\&/,$SUBTEST_ANSWERS{2});
|
|
my @responses = split(/&/,$SUBTEST_RESPONSES{2});
|
|
my @summary = split(/\&/, $SUBTEST_SUMMARY{2});
|
|
my @results = split(/\//, $summary[$#summary]);
|
|
@{$results->{$user}->{'overall'}}{'right','wrong','percent'} = @summary[0,1,2];
|
|
#print STDERR "$user @summary[0,1,2]\n";
|
|
for (my $i=1; $i < @questions; $i++) {
|
|
@{$results->{$user}->{'questions'}->{$questions[$i]}}{'question','answer','response','result'} =
|
|
($questions[$i], $answers[$i], $responses[$i], [split(/\./,$results[$i])]);
|
|
}
|
|
}
|
|
return $results;
|
|
}
|
|
|
|
sub add_results_by_cnd {
|
|
my ($questions,$results) = @_;
|
|
my (%subjects,%categories);
|
|
foreach my $user (keys %$results) {
|
|
my $subject = {};
|
|
my $category = {};
|
|
foreach my $quest (values %{$results->{$user}->{'questions'}}) {
|
|
my $subj = $questions->{$quest->{'question'}}->{'subj'};
|
|
$subj =~ s/\..*$//;
|
|
$subjects{$subj} = 1;
|
|
if (not exists $subject->{$subj}) {$subject->{$subj} = [0,0];}
|
|
$subject->{$subj}->[$quest->{'result'}->[0]]++;
|
|
my $cat = $questions->{$quest->{'question'}}->{'ques2'};
|
|
if (not $cat) {print STDERR "$questions->{$quest->{'question'}}->{'id'} $questions->{$quest->{'question'}}->{'qil'}\n";}
|
|
$categories{$cat} = 1;
|
|
if (not exists $category->{$cat}) {$category->{$cat} = [0,0];}
|
|
$category->{$cat}->[$quest->{'result'}->[0]]++;
|
|
}
|
|
$results->{$user}->{'subject'} = $subject;
|
|
$results->{$user}->{'category'} = $category;
|
|
}
|
|
return ([sort(keys(%subjects))],[sort(keys(%categories))]);
|
|
}
|
|
|
|
sub sum {
|
|
my $sum = 0;
|
|
foreach (@_) {
|
|
$sum += $_;
|
|
}
|
|
return $sum;
|
|
}
|
|
|
|
sub results_by_subject {
|
|
my ($questions,$results,$subjects) = @_;
|
|
my %init = ('count' => 0, 'mean' => 0, 'stddev' => 0, 'min' => 1000000, 'max' => 0, 'pass' => 0);
|
|
my $res = {'overall' => {%init}};
|
|
foreach (@$subjects) {
|
|
$res->{'subjects'}->{$_} = {%init};
|
|
}
|
|
my $overall = $res->{'overall'};
|
|
foreach my $result (values(%$results)) {
|
|
my $right = $result->{'overall'}->{'right'};
|
|
if (not exists $overall->{'total'}) {$overall->{'total'} = $right + $result->{'overall'}->{'wrong'};}
|
|
$overall->{'count'}++;
|
|
$overall->{'mean'} += $right;
|
|
$overall->{'min'} = ($overall->{'min'} < $right ? $overall->{'min'}: $right);
|
|
$overall->{'max'} = ($overall->{'max'} > $right ? $overall->{'max'}: $right);
|
|
$overall->{'percent'} += $result->{'overall'}->{'percent'};
|
|
if ($result->{'overall'}->{'percent'} >= 70) {$overall->{'pass'}++;}
|
|
push @{$overall->{'values'}} , $right;
|
|
foreach my $subj (@$subjects) {
|
|
my $current = $res->{'subjects'}->{$subj};
|
|
$right = $result->{'subject'}->{$subj}->[1];
|
|
if (not exists $current->{'total'}) {$current->{'total'} = ($right+$result->{'subject'}->{$subj}->[0]);}
|
|
#$current->{'count'}++;
|
|
$current->{'mean'} += $right;
|
|
$current->{'min'} = ($current->{'min'} < $right ? $current->{'min'}: $right);
|
|
$current->{'max'} = ($current->{'max'} > $right ? $current->{'max'}: $right);
|
|
$current->{'percent'} += 100*$right/($current->{'total'});
|
|
push @{$current->{'values'}} , $right;
|
|
}
|
|
}
|
|
# calculate standard deviations
|
|
foreach my $s ($overall, values(%{$res->{'subjects'}})) {
|
|
$s->{'mean'} /= $overall->{'count'};
|
|
$s->{'percent'} /= $overall->{'count'};
|
|
$s->{'stddev'} = sqrt(sum(map(($s->{'mean'}-$_)**2,@{$s->{'values'}}))/($overall->{'count'}-1));
|
|
}
|
|
return $res;
|
|
}
|
|
|
|
sub HTMLHeader {
|
|
return "<html>\n<head>\n<title>$_[0]</title>\n".
|
|
"<script language=\"JavaScript\">\n<!-- \n$_[1]\n -->\n</script>\n</head>\n".
|
|
"<BODY BACKGROUND=\"$SYSTEM{'BACKGROUND'}\" BGCOLOR=\"$SYSTEM{'BGCOLOR'}\"".
|
|
" TEXT=\"$SYSTEM{'TEXT'}\" LINK=\"$SYSTEM{'LINK'}\"".
|
|
" VLINK=\"$SYSTEM{'VLINK'}\" ALINK=\"$SYSTEM{'ALINK'}\">\n";
|
|
}
|
|
|
|
sub HTMLHeaderPlain {
|
|
return "<html>\n<head>\n<title>$_[0]</title>\n".
|
|
"<script language=\"JavaScript\">\n<!-- \n$_[1]\n -->\n</script>\n</head>\n".
|
|
"<BODY>\n";
|
|
}
|
|
|
|
sub HTMLFooter {
|
|
return "<br><center><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\">Copyright (c) 2004, AMTDA<center></font></body>\n</html>\n";
|
|
}
|
|
|
|
sub HTMLReportHeader {
|
|
my ($reporttype) = @_;
|
|
my $html = "<html><head><title>$reporttype</title></head><body>\n";
|
|
$html .= "American Machine Tool Distributors' Association<br>\n";
|
|
$html .= "Certified Machine Tool Sales Engineer (CMTSE) Examination<br>\n";
|
|
$html .= "Form 575070<br>\n";
|
|
$html .= "Report Generated ".scalar(localtime(time))."<br>\n";
|
|
$html .= "$reporttype<br>\n";
|
|
$html .= "Passing Score = Total Raw Score of 105 (70 % Correct)<p>\n";
|
|
return $html;
|
|
}
|
|
|
|
sub HTMLTable {
|
|
my ($data,$caption,%options) = @_;
|
|
my %options = ('aligndef' => 'center',
|
|
'alignrow' => [],
|
|
'bold' => {0 => 1},
|
|
@_);
|
|
my $html = "<table border>\n";
|
|
if ($caption or $caption eq '0') {
|
|
$html .= "<caption>$caption</caption>";
|
|
}
|
|
#$html .= "<tr>".join("",map("<th align=\"center\">$_</th>",@{$data->[0]}))."</tr>\n";
|
|
for (my $row = 0; $row < @{$data}; $row++) {
|
|
my $celltype = 'td';
|
|
my $align = $options{'aligndef'};
|
|
if ($options{'alignrow'}->[$row]) {$align = $options{'alignrow'}->[$row];}
|
|
if ($options{'bold'}->{$row}) {$celltype = 'th';}
|
|
$html .= "<tr>".join("",map("<$celltype align=\"$align\">$_</td>",@{$data->[$row]}))."</$celltype>\n";
|
|
}
|
|
$html .= "</table>\n";
|
|
return $html;
|
|
}
|
|
|
|
sub ReportChooser {
|
|
my ($client,$test) = @_;
|
|
my $js = "function parmsAMTDA(oform,rpt) {\n\t".
|
|
"oform.reportname.value=rpt;\n\t".
|
|
"oform.action='/cgi-bin/creports.pl';\n\t".
|
|
"oform.submit();\n};\n";
|
|
$js .= "function cndSelect(form) {
|
|
select = form.userview;
|
|
params = String(select.options[select.selectedIndex].value).split('&');
|
|
form.uid.value=params[0];
|
|
form.firstname.value=params[3];
|
|
form.middlename.value=params[4];
|
|
form.lastname.value=params[5];
|
|
form.address.value=params[6];
|
|
form.city.value=params[7];
|
|
form.state.value=params[8];
|
|
form.zip.value=params[9];
|
|
form.country.value=params[10];
|
|
form.email.value=params[11];
|
|
}";
|
|
$js .="\nfunction onWdwLoad() {\n\t".
|
|
"var oform=document.amtdarpt;\n\t".
|
|
"oform.mofm.selectedIndex=0;\n\t".
|
|
"oform.dyfm.selectedIndex=0;\n\t".
|
|
"oform.yrfm.selectedIndex=0;\n\t".
|
|
"oform.moto.selectedIndex=oform.moto.options.length-1;\n\t".
|
|
"oform.dyto.selectedIndex=oform.dyto.options.length-1;\n\t".
|
|
"oform.yrto.selectedIndex=oform.yrto.options.length-1;\n\t".
|
|
"oform.testsummary[0].checked=true;\n\t".
|
|
"oform.showcmts[0].checked=true;\n\t".
|
|
"}\n".
|
|
"window.onload=onWdwLoad;\n";
|
|
print HTMLHeader("AMTDA CMTSE Test Reports",$js);
|
|
print "<form name=\"amtdarpt\" action=\"/cgi-bin/creports.pl\" method=\"Post\" target=\"rptwindow\" enctype=\"multipart/form-data\" >\n";
|
|
print "<input type=\"hidden\" name=\"tid\" value=\"$SESSION{'tid'}\">\n";
|
|
# For development purposes we hardcode the survey id.
|
|
# Fix this before production
|
|
print "<input type=hidden name=\"tstid\" value=\"$FORM{'tstid'}\">\n";
|
|
print "<input type=hidden name=\"rptno\" value=\"$FORM{'rptno'}\">\n";
|
|
print "<input type=hidden name=\"rptdesc\" value=\"$REPORT{'rptdesc'}\">\n";
|
|
print "<input type=hidden name=\"rptid\" value=\"$REPORT{'rptid'}\">\n";
|
|
print "<input type=\"hidden\" name=\"reportname\" value=\"\">\n";
|
|
print "<H1>AMTDA CMTSE Test Reports</h1>\n";
|
|
print "<ul style=\"list-style: none\">\n";
|
|
print "<li><a href=\"javascript:parmsAMTDA(document.amtdarpt,'rawscorebycnd');\">".
|
|
"Raw Scores by Candidate</a></li>\n";
|
|
print "<li><a href=\"javascript:parmsAMTDA(document.amtdarpt,'percentscorebycnd');\">".
|
|
"Percent Scores by Candidate</a></li>\n";
|
|
print "<li><a href=\"javascript:parmsAMTDA(document.amtdarpt,'rawscorebysubject');\">".
|
|
"Raw Scores by Subject</a></li>\n";
|
|
print "<li><a href=\"javascript:parmsAMTDA(document.amtdarpt,'passfailbycnd');\">".
|
|
"Pass/Fail by Candidate</a></li>\n";
|
|
print "<li><a href=\"javascript:parmsAMTDA(document.amtdarpt,'candidateletter');\">".
|
|
"Candidate Letter</a><p>\n";
|
|
my $users = get_users($client,$test);
|
|
print "<ul style=\"list-style: none\">\n";
|
|
print "<li><table width=100%><tr>\n";
|
|
print "<td valign=top><select name=\"userview\" onChange='cndSelect(document.amtdarpt)'>\n";
|
|
my $defuser;
|
|
foreach my $user (sort keys %$users) {
|
|
my (undef,undef,undef,$first,$middle,$last) = split(/&/,$users->{$user});
|
|
if (not defined $defuser) {
|
|
$defuser = $user;
|
|
print "<option value=\"$users->{$user}\" selected>$last, $first $middle</option>\n";
|
|
} else {
|
|
print "<option value=\"$users->{$user}\">$last, $first $middle</option>\n";
|
|
}
|
|
}
|
|
print "</select><input type=\"hidden\" name=\"uid\" value=\"$defuser\"></td>\n";
|
|
my $finputs="\t\t<td align=center><font size=2>\n";
|
|
my $j;
|
|
$finputs=join('',$finputs,"From: <select name=\"mofm\">\n");
|
|
for my $i (526 .. 537) {
|
|
$j=$i-525;
|
|
$finputs=join('',$finputs,"<option value=\"$j\">$main::xlatphrase[$i]\n");
|
|
}
|
|
$finputs=join('',$finputs,"</select><select name=\"dyfm\">\n");
|
|
for my $i (1 .. 31) {
|
|
$finputs=join('',$finputs,"<option value=\"$i\">$i\n");
|
|
}
|
|
$finputs=join('',$finputs,"</select><select name=\"yrfm\">\n");
|
|
for my $i (2000 .. 2037) {
|
|
$finputs=join('',$finputs,"<option value=\"$i\">$i\n");
|
|
}
|
|
$finputs=join('',$finputs,"</select><br>\n");
|
|
$finputs .= "\t\t</td><td align=center><font size=2>\n";
|
|
$finputs=join('',$finputs,"To: <select name=\"moto\">\n");
|
|
for my $i (526 .. 537) {
|
|
$j=$i-525;
|
|
$finputs=join('',$finputs,"<option value=\"$j\">$main::xlatphrase[$i]\n");
|
|
}
|
|
$finputs=join('',$finputs,"</select><select name=\"dyto\">\n");
|
|
for my $i (1 .. 31) {
|
|
$finputs=join('',$finputs,"<option value=\"$i\">$i\n");
|
|
}
|
|
$finputs=join('',$finputs,"</select><select name=\"yrto\">\n");
|
|
for my $i (2000 .. 2037) {
|
|
$finputs=join('',$finputs,"<option value=\"$i\">$i\n");
|
|
}
|
|
$finputs=join('',$finputs,"</select><br>\n");
|
|
$finputs=join('',$finputs,"\t\t</font></td>\n");
|
|
print "$finputs </tr></table></li>\n";
|
|
my (undef,undef,undef,$first,$middle,$last,$address,$city,$state,$zip,$country,$email)
|
|
= split(/&/,$users->{$defuser});
|
|
print "<li><table><tr><td>Last Name:</td><td><input type=\"text\" name=\"lastname\" value=\"$last\"></td>\n";
|
|
print "<td>First:</td><td><input type=\"text\" name=\"firstname\" value=\"$first\"></td>\n";
|
|
print "<td>Middle:</td><td><input type=\"text\" name=\"middlename\" value=\"$middle\"></td></tr>\n";
|
|
print "<tr><td>Address:</td><td colspan=5><input type=\"text\" name=\"address\" value=\"$address\" size=80></td></tr>\n";
|
|
print "<tr><td>City:</td><td><input type=\"text\" name=\"city\" value=\"$city\"></td>\n";
|
|
print "<td>State:</td><td><input type=\"text\" name=\"state\" value=\"$state\"></td>\n";
|
|
print "<td>Zip:</td><td><input text=\"text\" name=\"zip\" value=\"$zip\"></td></tr>\n";
|
|
print "<tr><td>Country:</td><td colspan=5><input type=\"text\" name=\"country\" value=\"$country\" size=80></td></tr>\n";
|
|
print "<tr><td>E-mail:</td><td colspan=5><input type=\"text\" name=\"email\" value=\"$email\" size=80></td></tr>\n";
|
|
print "</table></li>";
|
|
print "<li><input type=\"checkbox\" name=\"sendemail\"> Send Email to Candidate\n</li>";
|
|
print "<li>CC: <input type=\"text\" name=\"CC\" size=80></li>\n";
|
|
# print "<li>BCC: <input type=\"text\" name=\"BCC\" size=80></li>\n";
|
|
print "<li>(Separate multiple email addresses with a comma, e.g. name\@place.com,name2\@place2.com)</li>\n";
|
|
print "</ul>\n";
|
|
print "</li>\n";
|
|
print HTMLFooter();
|
|
}
|
|
|
|
sub RawScoreByCnd {
|
|
my ($questions,$results,$subjects,$categories) = @_;
|
|
my $data = [];
|
|
my @subjects = sort {$a <=> $b} @$subjects;
|
|
$data->[0] = ['ID#','Name','Total Score',@subjects];
|
|
foreach my $user (sort {$results->{$a}->{'fullname'} cmp $results->{$b}->{'fullname'}} keys %$results) {
|
|
my $bysubject = $results->{$user}->{'subject'};
|
|
push @$data, [$user,
|
|
$results->{$user}->{'fullname'},
|
|
$results->{$user}->{'overall'}->{'right'},
|
|
map($bysubject->{$_}->[1],@subjects)];
|
|
}
|
|
print &HTMLReportHeader("Raw Score Report for PES File");
|
|
#print "<pre>".Dumper($data)."</pre>\n";
|
|
print &HTMLTable($data);
|
|
print &HTMLFooter();
|
|
}
|
|
|
|
sub PercentScoreByCnd {
|
|
my ($questions,$results,$subjects,$categories) = @_;
|
|
my $data = [];
|
|
my @subjects = sort {$a <=> $b} @$subjects;
|
|
$data->[0] = ['ID#','Name','Total Score',@subjects];
|
|
foreach my $user (sort {$results->{$a}->{'fullname'} cmp $results->{$b}->{'fullname'}} keys %$results) {
|
|
my $bysubject = $results->{$user}->{'subject'};
|
|
push @$data, [$user,
|
|
$results->{$user}->{'fullname'},
|
|
$results->{$user}->{'overall'}->{'percent'}." %",
|
|
map(int(100*$bysubject->{$_}->[1]/($bysubject->{$_}->[1]+$bysubject->{$_}->[0])+0.5)." %",@subjects)];
|
|
}
|
|
print &HTMLReportHeader("Percent Score Report for PES File");
|
|
#print "<pre>".Dumper($data)."</pre>\n";
|
|
print &HTMLTable($data);
|
|
print &HTMLFooter();
|
|
}
|
|
|
|
sub RawScoreBySubject {
|
|
my ($questions,$results,$subjects,$bysubj) = @_;
|
|
#print "<pre>".Dumper($bysubj)."</pre>";
|
|
my $data = [];
|
|
my @subjects = sort {$a <=> $b} @$subjects;
|
|
$data->[0] = ['Subject','Max Raw Scores','Range of Raw Scores','Average Raw Scores',
|
|
'Standard Deviation','Average Percent Correct','Number Passing','Percent Passing'];
|
|
my $current = $bysubj->{'overall'};
|
|
$data->[1] = ['Total Score',$current->{'total'},"$current->{'min'} - $current->{'max'}",
|
|
sprintf("%.2f",$current->{'mean'}),sprintf("%.2f",$current->{'stddev'}),
|
|
sprintf("%.2f",$current->{'percent'}),$current->{'pass'},
|
|
sprintf("%.2f %%",100*$current->{'pass'}/$current->{'count'})];
|
|
foreach my $subj (@subjects) {
|
|
$current = $bysubj->{'subjects'}->{$subj};
|
|
push @$data, [$subj, $current->{'total'},"$current->{'min'} - $current->{'max'}",
|
|
sprintf("%.2f",$current->{'mean'}),sprintf("%.2f",$current->{'stddev'}),
|
|
sprintf("%.2f",$current->{'percent'})];
|
|
}
|
|
print &HTMLReportHeader("Subject Breakdown");
|
|
#print "<pre>".Dumper($data)."</pre>\n";
|
|
print &HTMLTable($data,"Data Based on $bysubj->{'overall'}->{'count'} Candidates");
|
|
print &HTMLFooter();
|
|
}
|
|
|
|
sub PassFailByCnd {
|
|
my ($results) = @_;
|
|
my $data = [];
|
|
$data->[0] = ['ID#','Name','Status'];
|
|
foreach my $user (sort {$results->{$a}->{'fullname'} cmp $results->{$b}->{'fullname'}} keys %$results) {
|
|
push @$data, [$user,
|
|
$results->{$user}->{'fullname'},
|
|
($results->{$user}->{'overall'}->{'percent'} < 70 ? 'Fail': 'Pass')];
|
|
}
|
|
print &HTMLReportHeader("Alphabetical List of Candidates with Pass/Fail Status");
|
|
print &HTMLTable($data);
|
|
print &HTMLFooter();
|
|
}
|
|
|
|
sub CandidateLetter {
|
|
my ($questions, $results, $subjects, $categories, $user) = @_;
|
|
my $history = &get_cnd_test_from_history($testcomplete,$CLIENT{'clid'},$user,$FORM{'tstid'});
|
|
my %chapter = ('1' => 'Market Management',
|
|
'2' => 'Customer Engagement',
|
|
'3' => 'Needs Analysis',
|
|
'4' => 'Contract Proposal',
|
|
'5' => 'Customer Acceptance',
|
|
'6' => 'Order Management',
|
|
'7' => 'Post-Installation Management');
|
|
my %content = ('2' =>'Ch. 02: Territory and Customer Development',
|
|
'3' =>'Ch. 03: Planning and Organizing',
|
|
'4' =>'Ch. 04: The Selling Process',
|
|
'5' =>'Ch. 05: Business Practices & Ethics',
|
|
'6' =>'Ch. 06: Manufacturing Processes',
|
|
'7' =>'Ch. 07: CNC Technology and Machine Control',
|
|
'8' =>'Ch. 08: Blueprint Reading and Geometric Tolerancing',
|
|
'9' =>'Ch. 09: Cutting Tool Technology',
|
|
'10' =>'Ch. 10: Machine Tool Design',
|
|
'11' =>'Ch. 11: Metal Forming Technology',
|
|
'12' =>'Ch. 12: Machine Tool Accuracy',
|
|
'13' =>'Ch. 13: General Mathematics and Geometry');
|
|
my $data1 = [[1,2,3,4],
|
|
['Study Guide Chapter', "Maximum Possible","Raw Score","Percent Score"]];
|
|
my $data2 = [[1,2,3,4],['Content Domain', "Maximum Possible","Raw Score","Percent Score"]];
|
|
push @$data1, (['Total Score',
|
|
$results->{$user}->{'overall'}->{'right'}+$results->{$user}->{'overall'}->{'wrong'},
|
|
$results->{$user}->{'overall'}->{'right'},
|
|
$results->{$user}->{'overall'}->{'percent'}.' %'],
|
|
[' ',' ',' ',' ']);
|
|
#print STDERR Dumper($subjects, $data1, $results->{$user});
|
|
my @subjects = sort {$a <=> $b} @$subjects;
|
|
foreach my $subj (@subjects) {
|
|
my $current = $results->{$user}->{'subject'}->{$subj};
|
|
push @$data1, [$content{$subj},
|
|
$current->[0]+$current->[1],
|
|
$current->[1],
|
|
sprintf("%.2f %%",100*$current->[1]/($current->[0]+$current->[1] or 1))];
|
|
}
|
|
foreach my $cat (@$categories) {
|
|
my $current = $results->{$user}->{'category'}->{$cat};
|
|
push @$data2, [$chapter{$cat},
|
|
$current->[0]+$current->[1],
|
|
$current->[1],
|
|
sprintf("%.2f %%",100*$current->[1]/($current->[0]+$current->[1] or 1))];
|
|
}
|
|
my $html = "";
|
|
|
|
$html .= &HTMLHeaderPlain("Notice of Test Results");
|
|
$html .= "<center>Notice of Test Results<br>";
|
|
$html .= "for the<br>\n";
|
|
$html .= "American Machine Tool Distributors' Association<br>\n";
|
|
$html .= "Certified Machine Tool Sales Engineer (CMTSE) Examination<br>\n";
|
|
my $date = scalar(localtime($history->{'end'}));
|
|
$date =~ s/ \d\d:\d\d:\d\d/,/;
|
|
$html .= "Tested $date<br></center>\n";
|
|
$html .= "<p>ID \# $user<p>\n";
|
|
$html .= "<ul style=\"list-style: none\">\n";
|
|
$html .= "<li>$FORM{'firstname'}".($FORM{'middlename'}?" $FORM{'middlename'}":'').
|
|
($FORM{'lastname'}?" $FORM{'lastname'}":'')."</li>\n";
|
|
$html .= "<li>$FORM{'address'}</li>\n" if ($FORM{'address'});
|
|
$html .= "<li>$FORM{'city'}, $FORM{'state'} $FORM{'zip'}</li>" if ($FORM{'city'} or $FORM{'state'} or $FORM{'zip'});
|
|
$html .= "<li>$FORM{'country'}</li>\n" if ($FORM{'country'});
|
|
$html .= "<li>E-mail: $FORM{'email'}</li>\n" if ($FORM{'email'});
|
|
$html .= "</ul>\n";
|
|
$html .= "You must achieve a percent score of 70 % or higher to pass this examination.\n";
|
|
$html .= &HTMLTable($data1,undef,'bold' => {1=>1},'aligndef' => 'left','alignrow' => ['center','center']);
|
|
$html .= "<p>\n";
|
|
$html .= &HTMLTable($data2,"Scores Based on Content Domains",'bold' => {1=>1},'aligndef' => 'left','alignrow' => ['center','center']);
|
|
$html .= "<P>\n";
|
|
if ($results->{$user}->{'overall'}->{'percent'} >= 70) {
|
|
$html .= "Congratulations on successfully completing the Certified ".
|
|
"Machine Tool Sales Engineer (CMTSE) Examination. The information ".
|
|
"contained in this report includes your Total Score, your scores on ".
|
|
"the seven content domains that comprise the examination, and your ".
|
|
"score by Candidate Study Guide chapter. Column 2 lists the total ".
|
|
"number of exam questions for each area; Column 3 lists the actual ".
|
|
"number of questions you answered correctly; and, Column 4 ".
|
|
"indicates the percentage of questions you answered correctly.<p>\n";
|
|
$html .= "Thank you for ".
|
|
"participating in the Certified Machine Tool Sales Engineer ".
|
|
"(CMTSE) Examination.<p>";
|
|
} else {
|
|
$html .= "Regretfully, we must inform you that you failed to ".
|
|
"pass the Certified Machine Tool Sales Engineer (CMTSE) ".
|
|
"Examination. The information contained in this report ".
|
|
"includes your Total Score, your scores on the seven content ".
|
|
"domains that comprise the examination, and your score by ".
|
|
"Candidate Study Guide chapter. Column 2 lists the total ".
|
|
"number of exam questions for each area; Column 3 lists the ".
|
|
"actual number of questions you answered correctly; and, Column ".
|
|
"4 indicates the percentage of questions you answered ".
|
|
"correctly.<p>\n".
|
|
|
|
"CMTSE candidates who do not pass the exam are welcome and ".
|
|
"encouraged to retake it at their earliest opportunity. ".
|
|
"Your application is valid for two years from the exam date ".
|
|
"for which you originally registered. To participate in an ".
|
|
"upcoming exam, please contact AMTDA at 1-800-878-2683.<p>\n";
|
|
}
|
|
$html .= HTMLFooter();
|
|
return $html;
|
|
}
|
|
|
|
sub date_out_of_range {
|
|
my ($completedat,$datefm,$dateto) = @_;
|
|
my @unsorted=();
|
|
push @unsorted, $completedat;
|
|
push @unsorted, $datefm;
|
|
push @unsorted, $dateto;
|
|
my @sorted = sort @unsorted;
|
|
my $bretyes = ($sorted[1] eq $unsorted[0]) ? 0 : 1;
|
|
@unsorted=();
|
|
@sorted=();
|
|
return $bretyes;
|
|
}
|
|
|
|
|