diff --git a/lib/WebGUI/Asset/Wobject/TimeTracking.pm b/lib/WebGUI/Asset/Wobject/TimeTracking.pm index 5b0d0fd9d..2dd9a3312 100644 --- a/lib/WebGUI/Asset/Wobject/TimeTracking.pm +++ b/lib/WebGUI/Asset/Wobject/TimeTracking.pm @@ -19,6 +19,7 @@ use WebGUI::International; use WebGUI::Utility; use POSIX qw(ceil floor); use base 'WebGUI::Asset::Wobject'; +use WebGUI::Asset::Wobject::ProjectManager; #------------------------------------------------------------------- sub definition { @@ -59,7 +60,14 @@ sub definition { tab=>"security", hoverHelp=>$i18n->get('groupToManage hoverhelp'), label=>$i18n->get('groupToManage label') - } + }, + pmIntegration => { + fieldType=>"yesNo", + defaultValue=>0, + tab=>"properties", + hoverHelp=>$i18n->echo("Choose yes to pull projects and task information from the various project management assets on your site"), + label=>$i18n->echo("Project Management Integration") + }, ); push(@{$definition}, { assetName=>$i18n->get('assetName'), @@ -170,11 +178,30 @@ sub view { $var->{'extras'} = $config->get("extrasURL")."/wobject/TimeTracking"; if($user->isInGroup($self->get("groupToManage"))) { - #Return manager screen - #$self->_buildManagerView($var); + $var->{'project.manage.url'} = $self->getUrl("func=manageProjects"); + $var->{'project.manage.label'} = $i18n->get("project manage label"); } - $self->_buildUserView($var); + $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); return $self->processTemplate($var, undef, $self->{_viewTemplate}); } @@ -206,6 +233,7 @@ sub www_editTimeEntrySave { $reportId = $self->setCollateral("TT_report","reportId",$props,0,1); my @tasks = (); + my $tasksToUpdate = {}; my $rowTotal = $form->get("rowTotal"); for(my $i = 1; $i <= $rowTotal; $i++) { @@ -221,13 +249,29 @@ sub www_editTimeEntrySave { $props->{comments} = $form->process("comments_$i","text"); if ($props->{taskDate} && $props->{projectId} && $props->{taskId} && $props->{hours}) { $taskEntryId = $self->setCollateral("TT_timeEntry","entryId",$props,0,0); - push(@tasks,$taskEntryId); + push(@tasks,$taskEntryId); + $tasksToUpdate->{$taskEntryId} = { taskId=>$props->{taskId}, projectId=>$props->{projectId} }; } } #Delete anything not in the task list $db->write("delete from TT_timeEntry where reportId=? and entryId not in (".$db->quoteAndJoin(\@tasks).")",[$reportId]); + + #Update Project Management App if integrated + if($self->getValue("pmIntegration")) { + foreach my $eid (@tasks) { + my $task = $tasksToUpdate->{$eid}; + my $taskId = $task->{taskId}; + my $projectId = $task->{projectId}; + my $pmAsset = WebGUI::Asset::Wobject::ProjectManager->getProjectInstance($session,$projectId); + if($pmAsset) { + my ($totalHours) = $db->quickArray("select sum(hours) from TT_timeEntry where taskId=?",[$taskId]); + $pmAsset->updateProjectTask($taskId,$projectId,$totalHours); + } + } + } + return ""; } @@ -528,49 +572,6 @@ sub www_manageProjects { 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; @@ -581,14 +582,22 @@ sub www_buildTimeTable { return $privilege->insufficient unless ($self->canView); - my $pmAssetId = $self->getValue("pmAssetId"); + my $pmIntegration = $self->getValue("pmIntegration"); my $week = $form->get("week") || $dt->time; + + my $nextWeek = $dt->addToDate($week,0,0,7); + my $lastWeek = $dt->addToDate($week,0,0,-7); + my $daysInWeek = $self->getDaysInWeek($week); my $weekStart = $daysInWeek->{"0"}; my $weekEnd = $daysInWeek->{"6"}; + #It's this week, don't allow next week url to be seen + $var->{'report.nextWeek.url'} = $self->getUrl("func=view;week=$nextWeek"); + $var->{'report.lastWeek.url'} = $self->getUrl("func=view;week=$lastWeek"); + $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"); @@ -612,11 +621,18 @@ sub www_buildTimeTable { #Build Project List tie my %projectList, "Tie::IxHash"; - if($pmAssetId) { + %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 $pmAsset; + if($pmIntegration) { #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 ($pmAssetId) = $db->quickArray("select a.assetId from PM_wobject a, asset b where a.assetId=b.assetId and b.state not like 'trash%'"); + if($pmAssetId) { + $pmAsset = WebGUI::Asset->newByDynamicClass($session,$pmAssetId); + my %pmProjectList = %{$pmAsset->getProjectList($user->userId)}; + %projectList = WebGUI::Utility::sortHash((%projectList,%pmProjectList)); + } + } my $chooseLabel = $i18n->echo("Choose One"); #Build Task Lists based on Project Ids @@ -625,25 +641,25 @@ sub www_buildTimeTable { 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| }|; - } + tie my %taskHash, "Tie::IxHash"; + %taskHash = $db->buildHash("select taskId, taskName from TT_projectTasks where projectId=?",[$projectId]); + if($pmAsset && scalar(keys %taskHash) == 0) { + my $pmTaskRef = $pmAsset->getTaskList($projectId,$user->userId) || {}; + %taskHash = %{$pmTaskRef}; + } + %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"; @@ -657,7 +673,7 @@ sub www_buildTimeTable { #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); + #$eh->warn($reportId); #Add Report Stuff to form header $viewVar->{'form.header'} .= WebGUI::Form::hidden($session, { -name=>"reportId", @@ -674,15 +690,21 @@ sub www_buildTimeTable { -value=>$weekEnd }); + $viewVar->{'form.header'} .= WebGUI::Form::hidden($session, { + -name=>"week", + -value=>$week + }); + $viewVar->{'form.header'} .= WebGUI::Form::hidden($session, { -name=>"resourceId", -value=>$resourceId }); - + + my $reportComplete = $report->{reportComplete}; $viewVar->{'form.isComplete'} = WebGUI::Form::checkbox($session, { -name=>"isComplete", -value=>1, - -checked=>$report->{reportComplete} + -checked=>$reportComplete }); #Build Entries Loop @@ -690,16 +712,24 @@ sub www_buildTimeTable { my $rowCount = 1; my @timeEntries = (); + my $totalHours = 0; foreach my $entry (@{$entries}) { - push (@timeEntries,$self->_buildRow($entry,$rowCount++,\%setDaysHash, \%projectList, \%taskList)); + my $hash = {}; + push (@timeEntries,$self->_buildRow($entry,$rowCount++,\%setDaysHash, \%projectList, \%taskList,$hash,$reportComplete)); + $totalHours += $hash->{'entry.hours'}; } - #Seed time tracker with 10 empty rows - for( my $i = $rowCount; $i < ($rowCount + 10); $i++) { - push(@timeEntries,$self->_buildRow(undef,$i,\%setDaysHash, \%projectList, \%taskList)); - } + $var->{'report.isComplete'} = $reportComplete; + $var->{'time.totalHours'} = $totalHours; - $self->_buildRow(undef,"x",\%setDaysHash, \%projectList, \%taskList,$var); + #Seed time tracker with 10 empty rows and build the dummy row + unless($reportComplete) { + 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); @@ -718,6 +748,7 @@ sub _buildRow { my $projectList = $_[3]; my $taskList = $_[4]; my $var = $_[5] || {}; + my $reportComplete = $_[6] || 0; my $entryId = $entry->{entryId} || "new"; $var->{'row.id'} = "row_$rowCount"; @@ -733,54 +764,65 @@ sub _buildRow { #Entry Date my $chooseLabel = $i18n->echo("Choose One"); - - tie my %days, "Tie::IxHash"; - %days = (""=>$chooseLabel, %{$daysInWeek}); - $var->{'form.date'} = WebGUI::Form::selectBox($session,{ + $var->{'entry.hours'} = $entry->{hours}; + if($reportComplete) { + $var->{'form.date'} = $entry->{taskDate}; + $var->{'form.project'} = $projectList->{$projectId}; + + my $taskHash = $taskList->{$projectId}; + $var->{'form.task'} = $taskHash->{$entry->{taskId}}; + $var->{'form.hours'} = $var->{'entry.hours'}; + $var->{'form.comments'} = $entry->{comments}; + + } else { + 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,{ + 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}}; - } + #Entry Task + tie my %taskHash, "Tie::IxHash"; + %taskHash = (""=>$chooseLabel,%taskHash); + if($projectId) { + #$eh->warn($projectId); + %taskHash = %{$taskList->{$projectId}}; + } - $var->{'form.task'} = WebGUI::Form::selectBox($session,{ + $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, { + #Entry Hours + $var->{'form.hours'} = WebGUI::Form::float($session, { -name=>"hours_$rowCount", - -value=>$entry->{hours}, + -value=>$var->{'entry.hours'}, -size=>5, -extras=>qq|onchange="recalcHours();"| }); - #Entry Comments - $var->{'form.comments'} = WebGUI::Form::text($session, { + #Entry Comments + $var->{'form.comments'} = WebGUI::Form::text($session, { -name=>"comments_$rowCount", -value=>$entry->{comments}, -size=>40 }); - + } $var->{'delete.url'} = ""; return $var;