Fixed Project Management Integration

This commit is contained in:
Frank Dillon 2006-06-02 15:41:25 +00:00
parent 51bab8ba45
commit 6948055caf

View file

@ -19,6 +19,7 @@ use WebGUI::International;
use WebGUI::Utility; use WebGUI::Utility;
use POSIX qw(ceil floor); use POSIX qw(ceil floor);
use base 'WebGUI::Asset::Wobject'; use base 'WebGUI::Asset::Wobject';
use WebGUI::Asset::Wobject::ProjectManager;
#------------------------------------------------------------------- #-------------------------------------------------------------------
sub definition { sub definition {
@ -59,7 +60,14 @@ sub definition {
tab=>"security", tab=>"security",
hoverHelp=>$i18n->get('groupToManage hoverhelp'), hoverHelp=>$i18n->get('groupToManage hoverhelp'),
label=>$i18n->get('groupToManage label') 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}, { push(@{$definition}, {
assetName=>$i18n->get('assetName'), assetName=>$i18n->get('assetName'),
@ -170,11 +178,30 @@ sub view {
$var->{'extras'} = $config->get("extrasURL")."/wobject/TimeTracking"; $var->{'extras'} = $config->get("extrasURL")."/wobject/TimeTracking";
if($user->isInGroup($self->get("groupToManage"))) { if($user->isInGroup($self->get("groupToManage"))) {
#Return manager screen $var->{'project.manage.url'} = $self->getUrl("func=manageProjects");
#$self->_buildManagerView($var); $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}); return $self->processTemplate($var, undef, $self->{_viewTemplate});
} }
@ -206,6 +233,7 @@ sub www_editTimeEntrySave {
$reportId = $self->setCollateral("TT_report","reportId",$props,0,1); $reportId = $self->setCollateral("TT_report","reportId",$props,0,1);
my @tasks = (); my @tasks = ();
my $tasksToUpdate = {};
my $rowTotal = $form->get("rowTotal"); my $rowTotal = $form->get("rowTotal");
for(my $i = 1; $i <= $rowTotal; $i++) { for(my $i = 1; $i <= $rowTotal; $i++) {
@ -221,13 +249,29 @@ sub www_editTimeEntrySave {
$props->{comments} = $form->process("comments_$i","text"); $props->{comments} = $form->process("comments_$i","text");
if ($props->{taskDate} && $props->{projectId} && $props->{taskId} && $props->{hours}) { if ($props->{taskDate} && $props->{projectId} && $props->{taskId} && $props->{hours}) {
$taskEntryId = $self->setCollateral("TT_timeEntry","entryId",$props,0,0); $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 #Delete anything not in the task list
$db->write("delete from TT_timeEntry where reportId=? and entryId not in (".$db->quoteAndJoin(\@tasks).")",[$reportId]); $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 ""; return "";
} }
@ -528,49 +572,6 @@ sub www_manageProjects {
return $ac->render($output,$i18n->get("manage projects screen 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 { sub www_buildTimeTable {
my $self = shift; my $self = shift;
@ -581,14 +582,22 @@ sub www_buildTimeTable {
return $privilege->insufficient unless ($self->canView); return $privilege->insufficient unless ($self->canView);
my $pmAssetId = $self->getValue("pmAssetId"); my $pmIntegration = $self->getValue("pmIntegration");
my $week = $form->get("week") || $dt->time; 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 $daysInWeek = $self->getDaysInWeek($week);
my $weekStart = $daysInWeek->{"0"}; my $weekStart = $daysInWeek->{"0"};
my $weekEnd = $daysInWeek->{"6"}; 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.header'} = sprintf($i18n->get("time report header"),$weekEnd);
$var->{'time.report.hours.label'} = $i18n->get("total hours label"); $var->{'time.report.hours.label'} = $i18n->get("total hours label");
$var->{'time.report.date.label'} = $i18n->get("time report date label"); $var->{'time.report.date.label'} = $i18n->get("time report date label");
@ -612,11 +621,18 @@ sub www_buildTimeTable {
#Build Project List #Build Project List
tie my %projectList, "Tie::IxHash"; 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 #Build project list and task lists from project management app
} else { my ($pmAssetId) = $db->quickArray("select a.assetId from PM_wobject a, asset b where a.assetId=b.assetId and b.state not like 'trash%'");
%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]); 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"); my $chooseLabel = $i18n->echo("Choose One");
#Build Task Lists based on Project Ids #Build Task Lists based on Project Ids
@ -625,25 +641,25 @@ sub www_buildTimeTable {
my $counter = 0; my $counter = 0;
my $js = "{\n"; my $js = "{\n";
foreach my $projectId (keys %projectList) { foreach my $projectId (keys %projectList) {
if($pmAssetId) { tie my %taskHash, "Tie::IxHash";
#Build task hash for project management app %taskHash = $db->buildHash("select taskId, taskName from TT_projectTasks where projectId=?",[$projectId]);
} else { if($pmAsset && scalar(keys %taskHash) == 0) {
tie my %taskHash, "Tie::IxHash"; my $pmTaskRef = $pmAsset->getTaskList($projectId,$user->userId) || {};
%taskHash = $db->buildHash("select taskId, taskName from TT_projectTasks where projectId=?",[$projectId]); %taskHash = %{$pmTaskRef};
%taskHash = (""=>$chooseLabel,%taskHash); }
$taskList{$projectId} = \%taskHash; %taskHash = (""=>$chooseLabel,%taskHash);
#Build JavaScript Hash $taskList{$projectId} = \%taskHash;
$js .= ",\n" if($counter++ > 0); #Build JavaScript Hash
$js .= qq|"$projectId": {|; $js .= ",\n" if($counter++ > 0);
my $ind = 0; $js .= qq|"$projectId": {|;
foreach my $taskId (keys %taskHash) { my $ind = 0;
next if ($taskId eq ""); foreach my $taskId (keys %taskHash) {
my $taskName = $taskHash{$taskId}; next if ($taskId eq "");
$js .= ",\n" if($ind++ > 0); my $taskName = $taskHash{$taskId};
$js .= qq| "$taskId":"$taskName"|; $js .= ",\n" if($ind++ > 0);
} $js .= qq| "$taskId":"$taskName"|;
$js .= q| }|; }
} $js .= q| }|;
} }
$js .= "\n};\n"; $js .= "\n};\n";
@ -657,7 +673,7 @@ sub www_buildTimeTable {
#Build Report Info #Build Report Info
my $report = $db->quickHashRef("select * from TT_report where resourceId=? and startDate=? and endDate=?",[$resourceId,$weekStart,$weekEnd]); my $report = $db->quickHashRef("select * from TT_report where resourceId=? and startDate=? and endDate=?",[$resourceId,$weekStart,$weekEnd]);
my $reportId = $report->{reportId}; my $reportId = $report->{reportId};
$eh->warn($reportId); #$eh->warn($reportId);
#Add Report Stuff to form header #Add Report Stuff to form header
$viewVar->{'form.header'} .= WebGUI::Form::hidden($session, { $viewVar->{'form.header'} .= WebGUI::Form::hidden($session, {
-name=>"reportId", -name=>"reportId",
@ -674,15 +690,21 @@ sub www_buildTimeTable {
-value=>$weekEnd -value=>$weekEnd
}); });
$viewVar->{'form.header'} .= WebGUI::Form::hidden($session, {
-name=>"week",
-value=>$week
});
$viewVar->{'form.header'} .= WebGUI::Form::hidden($session, { $viewVar->{'form.header'} .= WebGUI::Form::hidden($session, {
-name=>"resourceId", -name=>"resourceId",
-value=>$resourceId -value=>$resourceId
}); });
my $reportComplete = $report->{reportComplete};
$viewVar->{'form.isComplete'} = WebGUI::Form::checkbox($session, { $viewVar->{'form.isComplete'} = WebGUI::Form::checkbox($session, {
-name=>"isComplete", -name=>"isComplete",
-value=>1, -value=>1,
-checked=>$report->{reportComplete} -checked=>$reportComplete
}); });
#Build Entries Loop #Build Entries Loop
@ -690,16 +712,24 @@ sub www_buildTimeTable {
my $rowCount = 1; my $rowCount = 1;
my @timeEntries = (); my @timeEntries = ();
my $totalHours = 0;
foreach my $entry (@{$entries}) { 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 $var->{'report.isComplete'} = $reportComplete;
for( my $i = $rowCount; $i < ($rowCount + 10); $i++) { $var->{'time.totalHours'} = $totalHours;
push(@timeEntries,$self->_buildRow(undef,$i,\%setDaysHash, \%projectList, \%taskList));
}
$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; $var->{'time.entry.loop'} = \@timeEntries;
$viewVar->{'time.report.rows.total'} = (scalar(@timeEntries)+1); $viewVar->{'time.report.rows.total'} = (scalar(@timeEntries)+1);
@ -718,6 +748,7 @@ sub _buildRow {
my $projectList = $_[3]; my $projectList = $_[3];
my $taskList = $_[4]; my $taskList = $_[4];
my $var = $_[5] || {}; my $var = $_[5] || {};
my $reportComplete = $_[6] || 0;
my $entryId = $entry->{entryId} || "new"; my $entryId = $entry->{entryId} || "new";
$var->{'row.id'} = "row_$rowCount"; $var->{'row.id'} = "row_$rowCount";
@ -733,54 +764,65 @@ sub _buildRow {
#Entry Date #Entry Date
my $chooseLabel = $i18n->echo("Choose One"); my $chooseLabel = $i18n->echo("Choose One");
$var->{'entry.hours'} = $entry->{hours};
tie my %days, "Tie::IxHash"; if($reportComplete) {
%days = (""=>$chooseLabel, %{$daysInWeek}); $var->{'form.date'} = $entry->{taskDate};
$var->{'form.date'} = WebGUI::Form::selectBox($session,{ $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", -name=>"taskDate_$rowCount",
-value=>$entry->{taskDate}, -value=>$entry->{taskDate},
-options=>\%days, -options=>\%days,
-extras=>qq|class="date-select"| -extras=>qq|class="date-select"|
}); });
my $taskName = "taskId_$rowCount"; my $taskName = "taskId_$rowCount";
$taskId = "taskId_".$rowCount."_formId"; $taskId = "taskId_".$rowCount."_formId";
$var->{'form.project'} = WebGUI::Form::selectBox($session,{ $var->{'form.project'} = WebGUI::Form::selectBox($session,{
-name=>"projectId_$rowCount", -name=>"projectId_$rowCount",
-options=>$projectList, -options=>$projectList,
-value=>$projectId, -value=>$projectId,
-extras=>qq|onchange="changeOptions(this,document.getElementById('$taskId'));" class="pt-select"| -extras=>qq|onchange="changeOptions(this,document.getElementById('$taskId'));" class="pt-select"|
}); });
#Entry Task #Entry Task
tie my %taskHash, "Tie::IxHash"; tie my %taskHash, "Tie::IxHash";
%taskHash = (""=>$chooseLabel,%taskHash); %taskHash = (""=>$chooseLabel,%taskHash);
if($projectId) { if($projectId) {
%taskHash = %{$taskList->{$projectId}}; #$eh->warn($projectId);
} %taskHash = %{$taskList->{$projectId}};
}
$var->{'form.task'} = WebGUI::Form::selectBox($session,{ $var->{'form.task'} = WebGUI::Form::selectBox($session,{
-name=>$taskName, -name=>$taskName,
-options=>\%taskHash, -options=>\%taskHash,
-value=>$entry->{taskId}, -value=>$entry->{taskId},
-extras=>qq|class="pt-select"| -extras=>qq|class="pt-select"|
}); });
#Entry Hours #Entry Hours
$var->{'form.hours'} = WebGUI::Form::float($session, { $var->{'form.hours'} = WebGUI::Form::float($session, {
-name=>"hours_$rowCount", -name=>"hours_$rowCount",
-value=>$entry->{hours}, -value=>$var->{'entry.hours'},
-size=>5, -size=>5,
-extras=>qq|onchange="recalcHours();"| -extras=>qq|onchange="recalcHours();"|
}); });
#Entry Comments #Entry Comments
$var->{'form.comments'} = WebGUI::Form::text($session, { $var->{'form.comments'} = WebGUI::Form::text($session, {
-name=>"comments_$rowCount", -name=>"comments_$rowCount",
-value=>$entry->{comments}, -value=>$entry->{comments},
-size=>40 -size=>40
}); });
}
$var->{'delete.url'} = ""; $var->{'delete.url'} = "";
return $var; return $var;