Commit 121728e8 authored by Frank Bergmann's avatar Frank Bergmann

- Ganttproject:

  Fixes from Malte (thanks!): Added "ActualWork" into the MS-Project
  output in order to fix milestone display and percent_completed
  calculation in MS-Project
parent 1cc362aa
<?xml version="1.0" encoding="ISO-8859-1"?>
<message_catalog package_key="intranet-ganttproject" package_version="3.4.0.7.0" locale="de_DE" charset="ISO-8859-1">
<message_catalog package_key="intranet-ganttproject" package_version="3.4.0.7.5" locale="de_DE" charset="ISO-8859-1">
<msg key="Dim_day_of_month">Tag</msg>
<msg key="Dim_month_of_year">Monat</msg>
......
......@@ -948,7 +948,7 @@ ad_proc -public im_gp_save_tasks2 {
set nodeName [$taskchild nodeName]
set nodeText [$taskchild text]
# ns_log Notice "im_gp_save_tasks2: nodeName=$nodeName, nodeText=$nodeText"
switch $nodeName {
"PredecessorLink" {
if {$save_dependencies} {
......
......@@ -10,13 +10,9 @@ ad_library {
with GanttProject and its data structure
@author frank.bergmann@project-open.com
@author malte.sussdorff@cognovis.de
}
# ----------------------------------------------------------------------
#
# ----------------------------------------------------------------------
ad_proc -public im_ms_project_write_subtasks {
{ -default_start_date "" }
{ -default_duration "" }
......@@ -178,71 +174,83 @@ ad_proc -public im_ms_project_write_task {
PercentComplete
FixedCostAccrual
ConstraintType
ActualStart
}
}
# Add the following elements to the xml_elements always
foreach xml_element [list "PredecessorLink" "ManualStart" "ManualFinish" "ManualDuration"] {
foreach xml_element [list "PredecessorLink" "ActualStart" "ManualStart" "ManualFinish" "ManualDuration"] {
if {[lsearch $xml_elements $xml_element] < 0} {
lappend xml_elements $xml_element
}
}
set predecessors_done 0
foreach element $xml_elements {
set attribute_name [plsql_utility::generate_oracle_name "xml_$element"]
switch $element {
Name { set value $project_name }
Type {
set value [util_memoize [list db_string type "select aux_int1 from im_categories where category_id = $effort_driven_type_id" -default ""]]
if {"" == $value} {
ad_return_complaint 1 "im_ms_project_write_task: Unknown fixed task type '$effort_driven_type_id'"
}
Name { set value $project_name }
Type {
if {![exists_and_not_null effort_driven_type_id]} {set effort_driven_type_id 9720}
set value [util_memoize [list db_string type "select aux_int1 from im_categories where category_id = $effort_driven_type_id" -default ""]]
if {"" == $value} {
ad_return_complaint 1 "im_ms_project_write_task: Unknown fixed task type '$effort_driven_type_id'"
}
IsNull { set value 0 }
OutlineNumber { set value $outline_number }
OutlineLevel { set value $outline_level }
Priority { set value 500 }
Start - ManualStart { set value $start_date }
Finish - ManualFinish { set value $end_date }
Duration - ManualDuration {
# Check if we've got a duration defined in the xml_elements.
# Otherwise (export without import...) generate a duration.
set seconds [expr $duration_hours * 3600.0]
set value [im_gp_seconds_to_ms_project_time $seconds]
}
IsNull { set value 0 }
OutlineNumber { set value $outline_number }
OutlineLevel { set value $outline_level }
Priority { set value 500 }
ActualStart {
# We need to add the ActualStart to a milestone otherwise
# The Percent Complete will not be transferred.
if {[info exists xml_actualstart]} {
set value $xml_actualstart
}
DurationFormat { set value 7 }
EffortDriven { if {"t" == $effort_driven_p} { set value 1 } else { set value 0 } }
RemainingDuration {
set remaining_duration_hours [expr round($duration_hours * (100.0 - $percent_completed) / 100.0)]
set seconds [expr $remaining_duration_hours * 3600.0]
set value [im_gp_seconds_to_ms_project_time $seconds]
if {$value ne "" && "t" == $milestone_p} {
$task_node appendXML "
<ActualStart>$value</ActualStart>
"
}
Milestone { if {"t" == $milestone_p} { set value 1 } else { set value 0 } }
Notes { set value $note }
PercentComplete { set value $percent_completed }
PredecessorLink {
if {$predecessors_done} { continue }
set predecessors_done 1
# Add dependencies to predecessors
set dependency_sql "
SELECT DISTINCT
gp.xml_uid as xml_uid_ms_project,
gp.project_id as xml_uid
FROM im_timesheet_task_dependencies ttd
LEFT OUTER JOIN im_gantt_projects gp ON (ttd.task_id_two = gp.project_id)
WHERE ttd.task_id_one = :task_id and
ttd.dependency_type_id = [im_timesheet_task_dependency_type_depends] and
ttd.task_id_two <> :task_id
"
set dependency_sql "
continue
}
Start - ManualStart { set value $start_date }
Finish - ManualFinish { set value $end_date }
Duration - ManualDuration {
# Check if we've got a duration defined in the xml_elements.
# Otherwise (export without import...) generate a duration.
set seconds [expr $duration_hours * 3600.0]
set value [im_gp_seconds_to_ms_project_time $seconds]
}
ManualDuration {
# Check if we've got a duration defined in the xml_elements.
# Otherwise (export without import...) generate a duration.
set seconds [expr $duration_hours * 3600.0]
set value [im_gp_seconds_to_ms_project_time $seconds]
}
DurationFormat { set value 7 }
EffortDriven { if {"t" == $effort_driven_p} { set value 1 } else { set value 0 } }
RemainingDuration {
set remaining_duration_hours [expr round($duration_hours * (100.0 - $percent_completed) / 100.0)]
set seconds [expr $remaining_duration_hours * 3600.0]
set value [im_gp_seconds_to_ms_project_time $seconds]
}
Milestone { if {"t" == $milestone_p} { set value 1 } else { set value 0 } }
Notes { set value $note }
PercentComplete { set value $percent_completed }
PredecessorLink {
if {$predecessors_done} { continue }
set predecessors_done 1
# Add dependencies to predecessors
set dependency_sql "
SELECT DISTINCT
gp.xml_uid as xml_uid_ms_project,
gp.project_id as xml_uid,
coalesce(c.aux_int1,1) as type_id,
coalesce(c.aux_int1,1) as type_id,
coalesce(ttd.difference,0) as difference
FROM im_categories c,
im_timesheet_task_dependencies ttd
......@@ -251,9 +259,9 @@ ad_proc -public im_ms_project_write_task {
ttd.dependency_type_id = c.category_id and
ttd.task_id_two <> :task_id
"
db_foreach dependency $dependency_sql {
$task_node appendXML "
db_foreach dependency $dependency_sql {
$task_node appendXML "
<PredecessorLink>
<PredecessorUID>$xml_uid</PredecessorUID>
<Type>$type_id</Type>
......@@ -262,20 +270,20 @@ ad_proc -public im_ms_project_write_task {
<LagFormat>7</LagFormat>
</PredecessorLink>
"
}
continue
}
UID { set value $org_project_id }
Work {
if { ![info exists planned_units] || "" == $planned_units || "" == [string trim $planned_units] } {
set planned_units 0
set value ""
} else {
set seconds [expr $planned_units * 3600.0]
set value [im_gp_seconds_to_ms_project_time $seconds]
}
continue
}
UID { set value $org_project_id }
Work {
if { ![info exists planned_units] || "" == $planned_units || "" == [string trim $planned_units] } {
set planned_units 0
set value ""
} else {
set seconds [expr $planned_units * 3600.0]
set value [im_gp_seconds_to_ms_project_time $seconds]
}
ACWP - \
}
ACWP - \
ActualCost - \
ActualDuration - \
ActualOvertimeCost - \
......
......@@ -157,6 +157,12 @@ ns_log Notice "gantt-upload-2: format=$format"
# The task_hash contains a mapping table from gantt_project_ids to task_ids.
# -------------------------------------------------------------------
# First delete the dependencies.
# This is brute force and might be handled better....
set del_dep_task_ids [im_project_subproject_ids -project_id $project_id -type task]
if {$del_dep_task_ids ne ""} {
db_dml delete_dependencies "delete from im_timesheet_task_dependencies where task_id_one in ([template::util::tcl_to_sql_list $del_dep_task_ids])"
}
if {$debug_p} { ns_write "<h2>Pass 1: Saving Tasks</h2>\n" }
set task_hash_array [list]
......
......@@ -111,6 +111,7 @@ if {![info exists xml_elements] || [llength $xml_elements] == 0} {
foreach element $xml_elements {
set append_p 1
set value ""
switch $element {
"Name" - "Title" { set value "${project_name}.xml" }
"Manager" { set value $project_lead_name }
......@@ -148,7 +149,9 @@ foreach element $xml_elements {
}
default {
set attribute_name [plsql_utility::generate_oracle_name "xml_$element"]
set value [expr $$attribute_name]
if {[info exists $attribute_name]} {
set value [expr $$attribute_name]
}
}
}
......@@ -378,7 +381,7 @@ set project_allocations_sql "
object_id_one AS task_id,
object_id_two AS user_id,
bom.percentage as percentage_assigned,
p.percent_completed,
coalesce(p.percent_completed,0) as percent_completed,
to_char(p.start_date, 'YYYY-MM-DD') as start_date_date,
to_char(p.end_date, 'YYYY-MM-DD') as end_date_date,
tt.planned_units,
......@@ -417,6 +420,7 @@ set project_allocations_sql "
)
)
"
set assignment_ctr 0
db_foreach project_allocations $project_allocations_sql {
......@@ -433,9 +437,20 @@ db_foreach project_allocations $project_allocations_sql {
# so we divide the task work evenly across the assigned resources.
if { ![info exists planned_units] || "" == $planned_units || "" == [string trim $planned_units] } { set planned_units 0 }
set planned_seconds [expr $planned_units * 3600]
set work_seconds [expr $planned_seconds * $percentage_assigned / $total_percentage_assigned]
set work_ms [im_gp_seconds_to_ms_project_time $work_seconds]
set actual_work_seconds [expr $planned_seconds * $percent_completed / 100]
set remaining_work_seconds [expr $planned_seconds - $actual_work_seconds]
if {$total_percentage_assigned == 0} {
set work_seconds $planned_seconds
} else {
set work_seconds [expr $planned_seconds * $percentage_assigned / $total_percentage_assigned]
set actual_work_seconds [expr $actual_work_seconds * $percentage_assigned / $total_percentage_assigned]
set remaining_work_seconds [expr $remaining_work_seconds * $percentage_assigned / $total_percentage_assigned]
}
set work_ms [im_gp_seconds_to_ms_project_time $work_seconds]
set actual_work_ms [im_gp_seconds_to_ms_project_time $actual_work_seconds]
set remaining_work_ms [im_gp_seconds_to_ms_project_time $remaining_work_seconds]
ns_log Notice "microsoft-project: allocactions: uid=$assignment_ctr, task_id=$task_id, tot=$total_percentage_assigned, assig=$percentage_assigned"
......@@ -450,7 +465,8 @@ db_foreach project_allocations $project_allocations_sql {
<Finish>${end_date_date}T23:00:00</Finish>
<OvertimeWork>PT0H0M0S</OvertimeWork>
<RegularWork>$work_ms</RegularWork>
<RemainingWork>$work_ms</RemainingWork>
<ActualWork>$actual_work_ms</ActualWork>
<RemainingWork>$remaining_work_ms</RemainingWork>
<Work>$work_ms</Work>
</Assignment>
"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment