package WebGUI::Asset::Wobject::TimeTracking;
$VERSION = "1.0.0";
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2006 Plain Black Corporation.
#-------------------------------------------------------------------
# Please read the legal notices (docs/legal.txt) and the license
# (docs/license.txt) that came with this distribution before using
# this software.
#-------------------------------------------------------------------
# http://www.plainblack.com info@plainblack.com
#-------------------------------------------------------------------
use strict;
use DateTime;
use Tie::IxHash;
use WebGUI::International;
use WebGUI::Utility;
use POSIX qw(ceil floor);
use base 'WebGUI::Asset::Wobject';
#-------------------------------------------------------------------
sub definition {
my $class = shift;
my $session = shift;
my $definition = shift;
my $i18n = WebGUI::International->new($session,'Asset_TimeTracking');
my %properties;
tie %properties, 'Tie::IxHash';
%properties = (
userViewTemplateId =>{
fieldType=>"template",
defaultValue=>'TimeTrackingTMPL000001',
tab=>"display",
namespace=>"TimeTracking_user",
hoverHelp=>$i18n->get('userViewTemplate hoverhelp'),
label=>$i18n->get('userViewTemplate label')
},
managerViewTemplateId => {
fieldType=>"template",
defaultValue=>'TimeTrackingTMPL000002',
tab=>"display",
namespace=>"TimeTracking_manager",
hoverHelp=>$i18n->get('managerViewTemplate hoverhelp'),
label=>$i18n->get('managerViewTemplate label')
},
timeRowTemplateId=> {
fieldType=>"template",
defaultValue=>'TimeTrackingTMPL000003',
tab=>"display",
namespace=>"TimeTracking_row",
hoverHelp=>$i18n->get('timeRowTemplateId hoverhelp'),
label=>$i18n->get('timeRowTemplateId label')
},
groupToManage => {
fieldType=>"group",
defaultValue=>3,
tab=>"security",
hoverHelp=>$i18n->get('groupToManage hoverhelp'),
label=>$i18n->get('groupToManage label')
}
);
push(@{$definition}, {
assetName=>$i18n->get('assetName'),
icon=>'timetrack.gif',
autoGenerateForms=>1,
tableName=>'TT_wobject',
className=>'WebGUI::Asset::Wobject::TimeTracking',
properties=>\%properties
});
return $class->SUPER::definition($session, $definition);
}
#-------------------------------------------------------------------
sub duplicate {
my $self = shift;
my $newAsset = $self->SUPER::duplicate(shift);
return $newAsset;
}
#-------------------------------------------------------------------
sub prepareView {
my $self = shift;
$self->SUPER::prepareView();
my $template;
#if($user->isInGroup($self->get("groupToManage")) {
# $template = WebGUI::Asset::Template->new($self->session, $self->get("managerViewTemplateId"));
#} else {
$template = WebGUI::Asset::Template->new($self->session, $self->get("userViewTemplateId"));
#}
$template->prepare;
$self->{_viewTemplate} = $template;
}
#-------------------------------------------------------------------
sub processErrors {
my $self = shift;
my $errors = "";
if($_[0]) {
$errors = "
| |
|;
my $projects = $db->buildHashRef("select projectId, projectName from TT_projectList where assetId=".$db->quote($self->getId));
my $count = 0;
foreach my $projectId (keys %{$projects}) {
my $projectName = $projects->{$projectId};
my $projectId = $projectId;
my @tasks = $db->buildArray("select taskName from TT_projectTasks where projectId=".$db->quote($projectId));
my $taskList = join("
",@tasks);
my @resources = $db->buildArray("select resourceId from TT_projectResourceList where projectId=".$db->quote($projectId));
for(my $i = 0; $i < scalar(@resources); $i++) {
my $u = WebGUI::User->new($session,$resources[$i]);
my $fname = $u->profileField("firstName");
my $lname = $u->profileField("lastName");
my $r = $u->username;
if($fname && $lname) {
$r = $fname." ".$lname;
}
$resources[$i] = $r;
}
my $resourceList = join("
",@resources);
my $editUrl = $self->getUrl("func=editProject;projectId=".$projectId);
my $editLink = qq|
|;
my $deletePrompt = $i18n->echo("Deleting this project will also delete all associated resources and tasks. Are you sure you'd like to continue?");
$deletePrompt =~ s/'/\\'/g;
my $deleteUrl = $self->getUrl("func=deleteProject;projectId=".$projectId);
my $deleteLink = qq|
|;
my $cl = "";
$cl = q|class="alt"| if($count++ % 2 eq 0);
$output .= qq|
| $projectName |
$taskList |
$resourceList |
$editLink $deleteLink |
|;
}
my $newProjectUrl = $self->getUrl('func=editProject;projectId=new');
if(scalar(keys %{$projects}) == 0) {
my $noProjects = sprintf($i18n->get("no project message"),$newProjectUrl);
$output .= qq|| $noProjects |
|
}
$output .= "
";
my $css = q|
|;
$output = $css.$output;
my $ac = $self->getAdminConsole;
$ac->addSubmenuItem($newProjectUrl,$i18n->get("add project label"));
return $ac->render($output,$i18n->get("manage projects screen label"));
}
#-------------------------------------------------------------------
sub _buildUserView {
my $self = shift;
my $var = $_[0];
my ($session,$privilege,$form,$db,$dt,$i18n,$user,$eh) = $self->getSessionVars("privilege","form","db","datetime","i18n","user","errorHandler");
my $pmAssetId = $self->getValue("pmAssetId");
if($user->isInGroup($self->get("groupToManage"))) {
if($pmAssetId) {
#Add link to project dashboard
$var->{'project.manage.url'} = "";
} else {
$var->{'project.manage.url'} = $self->getUrl("func=manageProjects");
}
$var->{'project.manage.label'} = $i18n->get("project manage label");
}
$var->{'form.header'} = WebGUI::Form::formHeader($session,{
action=>$self->getUrl,
extras=>q|name="editTimeForm" onsubmit="return validateForm(this);"|
});
$var->{'form.header'} .= WebGUI::Form::hidden($session, {
-name=>"func",
-value=>"editTimeEntrySave"
});
$var->{'form.header'} .= WebGUI::Form::hidden($session, {
-name=>"rowTotal",
-value=>""
});
$var->{'form.footer'} = WebGUI::Form::formFooter($session);
$var->{'js.alert.removeRow.error'} = $i18n->echo("There must be at least one row. Please add more rows if you wish to delete this one");
$var->{'js.alert.validate.hours.error'} = $i18n->echo("You may not submit more hours than are available during any given week.");
$var->{'js.alert.validate.incomplete.error'} = $i18n->echo("The highlighted fields are required if you wish to submit this form.");
$var->{'form.timetracker'} = $self->www_buildTimeTable($var);
}
#-------------------------------------------------------------------
sub www_buildTimeTable {
my $self = shift;
my $viewVar = $_[0];
my $var = {};
$var->{'extras'} = $viewVar->{'extras'};
my ($session,$dt,$i18n,$eh,$form,$db,$user,$privilege) = $self->getSessionVars("datetime","i18n","errorHandler","form","db","user","privilege");
return $privilege->insufficient unless ($self->canView);
my $pmAssetId = $self->getValue("pmAssetId");
my $week = $form->get("week") || $dt->time;
my $daysInWeek = $self->getDaysInWeek($week);
my $weekStart = $daysInWeek->{"0"};
my $weekEnd = $daysInWeek->{"6"};
$var->{'time.report.header'} = sprintf($i18n->get("time report header"),$weekEnd);
$var->{'time.report.hours.label'} = $i18n->get("total hours label");
$var->{'time.report.date.label'} = $i18n->get("time report date label");
$var->{'time.report.project.label'} = $i18n->get("time report project label");
$var->{'time.report.task.label'} = $i18n->get("time report task label");
$var->{'time.report.hours.label'} = $i18n->get("time report hours label");
$var->{'time.report.comments.label'} = $i18n->get("time report comments label");
$var->{'time.add.row.label'} = $i18n->echo("Add Row");
$var->{'time.save.label'} = $i18n->echo("Save");
$var->{'time.report.complete.label'} = $i18n->echo("Report Complete");
#my ($junk,$weekEnd) = $dt->dayStartEnd($daysInWeek->{"6"});
#Rebuild days in week hash to contain set values
tie my %setDaysHash,"Tie::IxHash";
foreach my $day (keys %{$daysInWeek}) {
my $set = $daysInWeek->{$day};
$setDaysHash{$set} = $set;
}
#Build Project List
tie my %projectList, "Tie::IxHash";
if($pmAssetId) {
#Build project list and task lists from project management app
} else {
%projectList = $db->buildHash("select a.projectId, a.projectName from TT_projectList a, TT_projectResourceList b where a.assetId=? and a.projectId=b.projectId and b.resourceId=? order by a.projectName",[$self->getId,$user->userId]);
}
my $chooseLabel = $i18n->echo("Choose One");
#Build Task Lists based on Project Ids
tie my %taskList, "Tie::IxHash";
#Build task list javascript:
my $counter = 0;
my $js = "{\n";
foreach my $projectId (keys %projectList) {
if($pmAssetId) {
#Build task hash for project management app
} else {
tie my %taskHash, "Tie::IxHash";
%taskHash = $db->buildHash("select taskId, taskName from TT_projectTasks where projectId=?",[$projectId]);
%taskHash = (""=>$chooseLabel,%taskHash);
$taskList{$projectId} = \%taskHash;
#Build JavaScript Hash
$js .= ",\n" if($counter++ > 0);
$js .= qq|"$projectId": {|;
my $ind = 0;
foreach my $taskId (keys %taskHash) {
next if ($taskId eq "");
my $taskName = $taskHash{$taskId};
$js .= ",\n" if($ind++ > 0);
$js .= qq| "$taskId":"$taskName"|;
}
$js .= q| }|;
}
}
$js .= "\n};\n";
$viewVar->{'project.task.array'} = $js;
#Set default project for project list
%projectList = (""=>$chooseLabel,%projectList);
my $resourceIdFromForm = $form->get("resourceId");
my $resourceId = ($user->isInGroup($self->get("groupToManage")) && $resourceIdFromForm)?$resourceIdFromForm:$user->userId;
#Build Report Info
my $report = $db->quickHashRef("select * from TT_report where resourceId=? and startDate=? and endDate=?",[$resourceId,$weekStart,$weekEnd]);
my $reportId = $report->{reportId};
$eh->warn($reportId);
#Add Report Stuff to form header
$viewVar->{'form.header'} .= WebGUI::Form::hidden($session, {
-name=>"reportId",
-value=>$reportId || "new"
});
$viewVar->{'form.header'} .= WebGUI::Form::hidden($session, {
-name=>"startDate",
-value=>$weekStart
});
$viewVar->{'form.header'} .= WebGUI::Form::hidden($session, {
-name=>"endDate",
-value=>$weekEnd
});
$viewVar->{'form.header'} .= WebGUI::Form::hidden($session, {
-name=>"resourceId",
-value=>$resourceId
});
$viewVar->{'form.isComplete'} = WebGUI::Form::checkbox($session, {
-name=>"isComplete",
-value=>1,
-checked=>$report->{reportComplete}
});
#Build Entries Loop
my $entries = $db->buildArrayRefOfHashRefs("select * from TT_timeEntry where reportId=? order by taskDate",[$reportId]);
my $rowCount = 1;
my @timeEntries = ();
foreach my $entry (@{$entries}) {
push (@timeEntries,$self->_buildRow($entry,$rowCount++,\%setDaysHash, \%projectList, \%taskList));
}
#Seed time tracker with 10 empty rows
for( my $i = $rowCount; $i < ($rowCount + 10); $i++) {
push(@timeEntries,$self->_buildRow(undef,$i,\%setDaysHash, \%projectList, \%taskList));
}
$self->_buildRow(undef,"x",\%setDaysHash, \%projectList, \%taskList,$var);
$var->{'time.entry.loop'} = \@timeEntries;
$viewVar->{'time.report.rows.total'} = (scalar(@timeEntries)+1);
return $self->processTemplate($var,$self->getValue("timeRowTemplateId"));
}
#-------------------------------------------------------------------
sub _buildRow {
my $self = shift;
my ($session,$dt,$i18n,$eh,$form,$db,$user) = $self->getSessionVars("datetime","i18n","errorHandler","form","db","user");
my $entry = $_[0] || {};
my $rowCount = $_[1];
my $daysInWeek = $_[2];
my $projectList = $_[3];
my $taskList = $_[4];
my $var = $_[5] || {};
my $entryId = $entry->{entryId} || "new";
$var->{'row.id'} = "row_$rowCount";
#$var->{'row.id'} .= "_$entryId" if($entryId);
my $projectId = $entry->{projectId};
my $taskId = $entry->{taskId};
#Task Entry Id
$var->{'form.taskEntryId'} = WebGUI::Form::hidden($session,{
-name=>"taskEntryId_$rowCount",
-value=>$entryId
});
#Entry Date
my $chooseLabel = $i18n->echo("Choose One");
tie my %days, "Tie::IxHash";
%days = (""=>$chooseLabel, %{$daysInWeek});
$var->{'form.date'} = WebGUI::Form::selectBox($session,{
-name=>"taskDate_$rowCount",
-value=>$entry->{taskDate},
-options=>\%days,
-extras=>qq|class="date-select"|
});
my $taskName = "taskId_$rowCount";
$taskId = "taskId_".$rowCount."_formId";
$var->{'form.project'} = WebGUI::Form::selectBox($session,{
-name=>"projectId_$rowCount",
-options=>$projectList,
-value=>$projectId,
-extras=>qq|onchange="changeOptions(this,document.getElementById('$taskId'));" class="pt-select"|
});
#Entry Task
tie my %taskHash, "Tie::IxHash";
%taskHash = (""=>$chooseLabel,%taskHash);
if($projectId) {
%taskHash = %{$taskList->{$projectId}};
}
$var->{'form.task'} = WebGUI::Form::selectBox($session,{
-name=>$taskName,
-options=>\%taskHash,
-value=>$entry->{taskId},
-extras=>qq|class="pt-select"|
});
#Entry Hours
$var->{'form.hours'} = WebGUI::Form::float($session, {
-name=>"hours_$rowCount",
-value=>$entry->{hours},
-size=>5,
-extras=>qq|onchange="recalcHours();"|
});
#Entry Comments
$var->{'form.comments'} = WebGUI::Form::text($session, {
-name=>"comments_$rowCount",
-value=>$entry->{comments},
-size=>40
});
$var->{'delete.url'} = "";
return $var;
}
1;