Index: openacs-4/packages/project-manager-portlet/lib/projects-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/project-manager-portlet/lib/projects-postgresql.xql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/project-manager-portlet/lib/projects-postgresql.xql 12 Aug 2005 22:31:21 -0000 1.1 @@ -0,0 +1,63 @@ + + + postgresql7.3 + + + + SELECT + p.item_id as project_item_id, + p.project_id, + p.status_id, + p.parent_id as folder_id, + p.object_type as content_type, + p.title as project_name, + p.project_code, + to_char(p.planned_start_date, 'YYYY-MM-DD HH24:MI:SS') as planned_start_date, + to_char(p.planned_end_date, 'YYYY-MM-DD HH24:MI:SS') as planned_end_date, + p.ongoing_p, + c.category_id, + c.category_name, + p.earliest_finish_date - current_date as days_to_earliest_finish, + p.latest_finish_date - current_date as days_to_latest_finish, + p.actual_hours_completed, + p.estimated_hours_total, + to_char(p.estimated_finish_date, 'YYYY-MM-DD HH24:MI:SS') as estimated_finish_date, + to_char(p.earliest_finish_date, 'YYYY-MM-DD HH24:MI:SS') as earliest_finish_date, + to_char(p.latest_finish_date, 'YYYY-MM-DD HH24:MI:SS') as latest_finish_date, + case when o.name is null then '--no customer--' else o.name + end as customer_name, + o.organization_id as customer_id + FROM pm_projectsx p + LEFT JOIN pm_project_assignment pa + ON p.item_id = pa.project_id + LEFT JOIN organizations o ON p.customer_id = + o.organization_id + LEFT JOIN ( + select + om.category_id, + om.object_id, + t.name as category_name + from + category_object_map om, + category_translations t, + categories ctg + where + om.category_id = t.category_id and + ctg.category_id = t.category_id and + ctg.deprecated_p = 'f') + c ON p.item_id = c.object_id, + cr_items i, + cr_folders f + WHERE + p.project_id = i.live_revision + and i.parent_id = f.folder_id + and f.package_id = :package_id + and exists (select 1 from acs_object_party_privilege_map ppm + where ppm.object_id = p.project_id + and ppm.privilege = 'read' + and ppm.party_id = :user_id) + [template::list::filter_where_clauses -and -name "projects_${package_id}"] + + + + Index: openacs-4/packages/project-manager-portlet/lib/projects.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/project-manager-portlet/lib/projects.adp,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/project-manager-portlet/lib/projects.adp 12 Aug 2005 22:31:21 -0000 1.1 @@ -0,0 +1,22 @@ + + +
+ #project-manager.Search#
+ + @hidden_vars;noquote@ +

+ #project-manager.planned_end_date_between#
+ #project-manager.Start_date#: + + + & #project-manager.End_date#: + + [YYYY-MM-DD] + +
+ @category_select;noquote@ +
+ +
+ + Index: openacs-4/packages/project-manager-portlet/lib/projects.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/project-manager-portlet/lib/projects.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/project-manager-portlet/lib/projects.tcl 12 Aug 2005 22:31:21 -0000 1.1 @@ -0,0 +1,297 @@ +# packages/project-manager/lib/project-list.tcl +# List of all projects +# @author Malte Sussdorff (sussdorff@sussdorff.de) +# @creation-date 2005-05-23 +# @arch-tag: 2f586eec-4768-42ef-a09a-4950ac00ddaf +# @cvs-id $Id: projects.tcl,v 1.1 2005/08/12 22:31:21 miguelm Exp $ + +set required_param_list [list package_id] +set optional_param_list [list status_id searchterm bulk_p action_p filter_p base_url end_date_f] +set optional_unset_list [list assignee_id date_range] + +foreach required_param $required_param_list { + if {![info exists $required_param]} { + return -code error "$required_param is a required parameter." + } +} + +foreach optional_param $optional_param_list { + if {![info exists $optional_param]} { + set $optional_param {} + } +} + +foreach optional_unset $optional_unset_list { + if {[info exists $optional_unset]} { + if {[empty_string_p [set $optional_unset]]} { + unset $optional_unset + } + } +} + +if {![info exists format]} { + set format "normal" +} + + + +# --------------------------------------------------------------- # + +set _package_id $package_id +template::multirow create pm_packages "list_id" "contact_column" "community_name" +set c_row 0 + + + +foreach package_id $_package_id { + + +set _base_url [site_node::get_url_from_object_id -object_id $package_id] + +if {![empty_string_p $_base_url]} { + + set base_url $_base_url +} + +set community_id [dotlrn_community::get_community_id_from_url \ + -url $base_url \ + ] + +if {![empty_string_p $community_id]} { + + set community_name [dotlrn_community::get_community_name $community_id] + + set portal_info_name "Project: $community_name" + set portal_info_url [lindex $base_url 0] + +} + + + + +set exporting_vars { status_id category_id assignee_id format } +set hidden_vars [export_vars -form $exporting_vars] + +# set up context bar +set context [list] + +# the unique identifier for this package +set user_id [ad_maybe_redirect_for_registration] + + +# root CR folder +set root_folder [pm::util::get_root_folder -package_id $package_id] + +# Projects, using list-builder --------------------------------- + +# Set status +if {![exists_and_not_null status_id]} { + set status_where_clause "" + set status_id "" +} else { + set status_where_clause {p.status_id = :status_id} +} + +# We want to set up a filter for each category tree. + +set export_vars [export_vars -form {status_id }] + +if {[exists_and_not_null category_id]} { + set temp_category_id $category_id + set pass_cat $category_id +} else { + set temp_category_id "" + if {[info exists category_id]} { + unset category_id + } +} + +set category_select [pm::util::category_selects \ + -export_vars $export_vars \ + -category_id $temp_category_id \ + -package_id $package_id \ + ] + +set assignees_filter [pm::project::assignee_filter_select -status_id $status_id] + +if {![empty_string_p $searchterm]} { + + if {[regexp {([0-9]+)} $searchterm match query_digits]} { + set search_term_where " (upper(p.title) like upper('%$searchterm%') + or p.item_id = :query_digits) " + } else { + set search_term_where " upper(p.title) like upper('%$searchterm%')" + } +} else { + set search_term_where "" +} + +############################################## +# Filter for planned_end_date +if {[exists_and_not_null date_range] } { + set start_range_f [lindex [split $date_range "/"] 0] + set end_range_f [lindex [split $date_range "/"] 1] + if {![empty_string_p $start_range_f] && ![empty_string_p $end_range_f]} { + set p_range_where "to_char(p.planned_end_date,'YYYY-MM-DD') >= :start_range_f and + to_char(p.planned_end_date,'YYYY-MM-DD') <= :end_range_f" + } else { + if {![empty_string_p $start_range_f] } { + set p_range_where "to_char(p.planned_end_date,'YYYY-MM-DD') >= :start_range_f" + } elseif { ![empty_string_p $end_range_f] } { + set p_range_where "to_char(p.planned_end_date,'YYYY-MM-DD') <= :end_range_f" + } else { + set p_range_where "" + } + } +} else { + set p_range_where "" +} + +############################################## + +# Get url of the contacts package if it has been mounted for the links on the index page. +set contacts_url [util_memoize [list site_node::get_package_url -package_key contacts]] +if {[empty_string_p $contacts_url]} { + set contact_column "@projects_${package_id}.customer_name@" +} else { + set contact_column "@projects_${package_id}.customer_name@" +} + +# Store project names and all other project individuel data +set contact_coloum "fff" + +template::multirow append pm_packages "projects_${package_id}" "$contact_column" + +ns_log notice "projects = projects_${package_id} c_row=$c_row\n [template::multirow get pm_packages 1 list_id] , [template::multirow columns pm_packages] , [template::multirow size pm_packages]" +incr c_row + +# Get the rows to display + +set row_list "checkbox {}\nproject_name {}\n" +foreach element $elements { + append row_list "$element {}\n" +} + +if {$bulk_p == 1} { + set bulk_actions [list "[_ project-manager.Close]" "@{base_url}/bulk-close" "[_ project-manager.Close_project]" ] +} else { + set bulk_actions [list] +} + +if {$actions_p == 1} { + + if {[info exists portal_info_name]} { + + set actions [list "$portal_info_name" "$portal_info_url" "$portal_info_name" "[_ project-manager.Add_project]" "[export_vars -base "[lindex $base_url 0]add-edit" -url {customer_id}]" "[_ project-manager.Add_project]" "[_ project-manager.Customers]" "[site_node::get_package_url -package_key contacts]" "[_ project-manager.View_customers]" ] + + } else { + + set actions [list "[_ project-manager.Add_project]" "[export_vars -base "[lindex $base_url 0]add-edit" -url {customer_id}]" "[_ project-manager.Add_project]" "[_ project-manager.Customers]" "[site_node::get_package_url -package_key contacts]" "[_ project-manager.View_customers]" ] + + } + +} else { + set actions [list "Project: $community_name" "$base_url"] +} + +template::list::create \ + -name "projects_${package_id}" \ + -multirow projects_${package_id} \ + -selected_format $format \ + -key project_item_id \ + -elements { + project_name { + label "[_ project-manager.Project_name]" + link_url_col item_url + link_html { title "[_ project-manager.lt_View_this_project_ver]" } + } + customer_name { + label "[_ project-manager.Customer]" + display_template " +$contact_column@projects_${package_id}.customer_name@ +" + } + earliest_finish_date { + label "[_ project-manager.Earliest_finish]" + display_template "@projects_${package_id}.earliest_finish_date@@projects_${package_id}.earliest_finish_date@" + } + latest_finish_date { + label "[_ project-manager.Latest_Finish]" + display_template "@projects_${package_id}.latest_finish_date@@projects_${package_id}.latest_finish_date@" + } + actual_hours_completed { + label "[_ project-manager.Hours_completed]" + display_template "@projects_${package_id}.actual_hours_completed@/@projects_${package_id}.estimated_hours_total@" + } + category_id { + display_template "" + } + status_id { + label "[_ project-manager.Status_1]" + display_template "#project-manager.Closed##project-manager.Open#" + } + planned_end_date { + label "[_ project-manager.Planned_end_date]" + } + } \ + -actions $actions \ + -bulk_actions $bulk_actions \ + -sub_class { + narrow + } \ + -filters { + searchterm { + label "[_ project-manager.Search_1]" + where_clause {$search_term_where} + } + date_range { + label "[_ project-manager.Planned_end_date]" + where_clause {$p_range_where} + } + status_id { + label "[_ project-manager.Status_1]" + values {[pm::status::project_status_select]} + where_clause {$status_where_clause} + } + assignee_id { + label "[_ project-manager.Assignee]" + values {$assignees_filter} + where_clause {pa.party_id = :assignee_id} + } + category_id { + label Categories + where_clause {c.category_id = [join [value_if_exists category_id] ","]} + } + } \ + -formats { + normal { + label "[_ project-manager.Table]" + layout table + row $row_list + } + csv { + label "[_ project-manager.CSV]" + output csv + page_size 0 + row $row_list + } + } \ + -html { + width 100% + } + +db_multirow -extend { item_url } "projects_${package_id}" project_folders { +} { + set earliest_finish_date [lc_time_fmt $earliest_finish_date $fmt] + set latest_finish_date [lc_time_fmt $latest_finish_date $fmt] + set item_url [export_vars -base "${base_url}one" {project_item_id}] +} + + + +} + + + +ad_return_template +# ------------------------- END OF FILE ------------------------- # Index: openacs-4/packages/project-manager-portlet/lib/tasks-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/project-manager-portlet/lib/tasks-postgresql.xql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/project-manager-portlet/lib/tasks-postgresql.xql 12 Aug 2005 22:31:21 -0000 1.1 @@ -0,0 +1,154 @@ + + +postgresql7.2 + + + + SELECT distinct + t.item_id as task_item_id, + t.parent_id as project_item_id, + t.title, + to_char(t.end_date,'YYYY-MM-DD HH24:MI:SS') as end_date, + to_char(t.earliest_start,'YYYY-MM-DD HH24:MI:SS') as earliest_start, + t.earliest_start - current_date as days_to_earliest_start, + to_char(t.earliest_start,'J') as earliest_start_j, + to_char(t.earliest_finish,'YYYY-MM-DD HH24:MI:SS') as earliest_finish, + t.earliest_finish - current_date as days_to_earliest_finish, + to_char(t.latest_start,'YYYY-MM-DD HH24:MI:SS') as latest_start, + t.latest_start - current_date as days_to_latest_start, + to_char(t.latest_start,'J') as latest_start_j, + to_char(current_date,'J') as today_j, + to_char(t.latest_finish,'YYYY-MM-DD HH24:MI:SS') as latest_finish, + t.latest_finish - current_date as days_to_latest_finish, + to_char(t.end_date,'YYYY-MM-DD HH24:MI:SS') as end_date, + t.end_date - current_date as days_to_end_date, + u.person_id, + u.first_names, + u.last_name, + t.percent_complete, + d.parent_task_id, + d.dependency_type, + t.estimated_hours_work, + t.estimated_hours_work_min, + t.estimated_hours_work_max, + t.actual_hours_worked, + s.status_type, + s.description as status_description, + r.is_lead_p, + t.priority, + p.customer_id, + p.title as project_name, + ar.object_id_two as logger_project + FROM + (select tr.item_id, + ta.party_id, + ta.role_id, + tr.title, + tr.end_date, + tr.earliest_start, + tr.earliest_finish, + tr.latest_start, + tr.latest_finish, + tr.percent_complete, + tr.estimated_hours_work, + tr.estimated_hours_work_min, + tr.estimated_hours_work_max, + tr.actual_hours_worked, + tr.parent_id, + tr.revision_id, + tr.priority + from pm_tasks_revisionsx tr + LEFT JOIN + pm_task_assignment ta ON tr.item_id = ta.task_id) t + LEFT JOIN + persons u + ON + t.party_id = u.person_id + LEFT JOIN + pm_roles r + ON t.role_id = r.role_id, + cr_items i + LEFT JOIN + pm_task_dependency d + ON + i.item_id = d.task_id, + pm_tasks_active ti, + pm_task_status s, + pm_projectsx p, + acs_rels ar, + acs_objects o + WHERE + t.parent_id = p.item_id and + t.revision_id = i.live_revision and + t.item_id = ti.task_id and + ti.status = s.status_id + $party_where_clause + and ar.object_id_one = t.parent_id + and ar.rel_type = 'application_data_link' + and o.object_id = ar.object_id_two + and o.object_type = 'logger_project' + and exists (select 1 from acs_object_party_privilege_map ppm + where ppm.object_id = ti.task_id + and ppm.privilege = 'read' + and ppm.party_id = :user_id) + $done_clause + [template::list::filter_where_clauses -and -name tasks] + + + + + + select distinct task_item_id from (SELECT + t.item_id as task_item_id + FROM + (select tr.item_id, + ta.party_id, + ta.role_id, + tr.title, + tr.end_date, + tr.earliest_start, + tr.earliest_finish, + tr.latest_start, + tr.latest_finish, + tr.percent_complete, + tr.estimated_hours_work, + tr.estimated_hours_work_min, + tr.estimated_hours_work_max, + tr.actual_hours_worked, + tr.parent_id, + tr.revision_id, + tr.priority + from pm_tasks_revisionsx tr + LEFT JOIN + pm_task_assignment ta ON tr.item_id = ta.task_id) t + LEFT JOIN + persons u + ON + t.party_id = u.person_id + LEFT JOIN + pm_roles r + ON t.role_id = r.role_id, + cr_items i + LEFT JOIN + pm_task_dependency d + ON + i.item_id = d.task_id, + pm_tasks_active ti, + pm_task_status s, + pm_projectsx p + WHERE + t.parent_id = p.item_id and + t.revision_id = i.live_revision and + t.item_id = ti.task_id and + ti.status = s.status_id + $party_where_clause + and exists (select 1 from acs_object_party_privilege_map ppm + where ppm.object_id = ti.task_id + and ppm.privilege = 'read' + and ppm.party_id = :user_id) + $done_clause + [template::list::filter_where_clauses -and -name tasks] + + + + Index: openacs-4/packages/project-manager-portlet/lib/tasks.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/project-manager-portlet/lib/tasks.adp,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/project-manager-portlet/lib/tasks.adp 12 Aug 2005 22:31:21 -0000 1.1 @@ -0,0 +1,32 @@ + + + + + +
+ #project-manager.Search#
+ + @hidden_vars;noquote@ +
+ + +
+ + + + + + +
+
+ #project-manager.Search#
+ + @hidden_vars;noquote@ +
+ + +
+ + +
+
Index: openacs-4/packages/project-manager-portlet/lib/tasks.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/project-manager-portlet/lib/tasks.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/project-manager-portlet/lib/tasks.tcl 12 Aug 2005 22:31:21 -0000 1.1 @@ -0,0 +1,425 @@ +# Possible +# party_id +# role_id + +set required_param_list [list] +set optional_param_list [list searchterm status_id page bulk_p actions_p base_url] +set optional_unset_list [list party_id role_id project_item_id instance_id] + +foreach required_param $required_param_list { + if {![info exists $required_param]} { + return -code error "$required_param is a required parameter." + } +} + +foreach optional_param $optional_param_list { + if {![info exists $optional_param]} { + set $optional_param {} + } +} + +foreach optional_unset $optional_unset_list { + if {[info exists $optional_unset]} { + if {[empty_string_p [set $optional_unset]]} { + unset $optional_unset + } + } +} + +if ![info exists page_size] { + set page_size 25 +} + +if ![info exists display_mode] { + set display_mode "all" +} + +if ![info exists format] { + set format "normal" +} + +if ![info exists package_id] { + set package_id [ad_conn package_id] +} + + +# --------------------------------------------------------------- + +# Hide finished tasks. This should be added as a filter, but I did not +# have time to look it up in the howto. + +set hide_done_tasks_p [parameter::get \ + -parameter "HideDoneTaskP" -default "1"] + +if {$hide_done_tasks_p} { + set done_clause "and t.percent_complete < 100" +} else { + set done_clause "" +} + +# Deal with the fact that we might work with days instead of hours + +if {[parameter::get \ + -parameter "UseDayInsteadOfHour" -default "t"] == "t"} { + set days_string "days" +} else { + set days_string "hours" +} + +set exporting_vars {status_id party_id } +set hidden_vars [export_vars \ + -form $exporting_vars] + +# how to get back here + +set return_url [ad_return_url \ + -qualified] +set logger_url [pm::util::logger_url] + +set contacts_url [util_memoize [list site_node::get_package_url \ + -package_key contacts]] + + +# set up context bar + +set context [list "[_ project-manager.Tasks]"] + +# Get the currently available Status + +set status_list [db_list_of_lists get_status_values "select description, status_id from pm_task_status order by status_type desc, description"] + +# the unique identifier for this package + +set package_id [ad_conn package_id] +set user_id [ad_maybe_redirect_for_registration] + +# status defaults to open + +if {![exists_and_not_null status_id]} { + set status_where_clause "" +} else { + set status_where_clause {ts.status = :status_id} +} + +# permissions + +permission::require_permission -party_id $user_id -object_id $package_id -privilege read + +# Tasks, using list-builder --------------------------------- + +if {![empty_string_p $searchterm]} { + + # if we're searching, we disregard who we were searching for. + + if {[info exists party_id]} { + unset party_id + } + + if {[regexp {([0-9]+)} $searchterm match query_digits]} { + set search_term_where " (upper(t.title) like upper('%$searchterm%') + or t.item_id = :query_digits) " + } else { + set search_term_where " upper(t.title) like upper('%$searchterm%')" + } +} else { + set search_term_where "" +} + +# Get the rows to display + +if {![exists_and_not_null elements]} { + set elements [list task_item_id title slack_time role latest_start latest_finish status_type remaining worked project_item_id percent_complete log_url edit_url] +} + +set filters [list \ + searchterm [list \ + label "[_ project-manager.Search_1]" \ + where_clause {$search_term_where} + ] \ + status_id [list \ + label "[_ project-manager.Status_1]" \ + values {$status_list} \ + where_clause "$status_where_clause" + ] \ + project_item_id [list \ + label "[_ project-manager.Project_1]" \ + values {[pm::project::get_list_of_open]} \ + where_clause "t.parent_id = :project_item_id" + ] \ + instance_id [list \ + where_clause "p.object_package_id = :instance_id" + ] \ + ] + +foreach element $elements { + + # Special treatement for days / hours + + if {$element == "remaining"} { + set element "${days_string}_remaining" + } + if {$element == "worked"} { + set element "actual_${days_string}_worked" + } + + + # We need to filter by the user if a party_id is given + if {[exists_and_not_null party_id]} { + set party_where_clause "and t.party_id = :party_id" + + # Do we want to show observer tasks as well? + if {[parameter::get -parameter "ShowObserverTasksP"] == 0} { + append party_where_clause "\n and r.is_observer_p = 'f' " + } + } else { + set party_where_clause "" + } + + + # If we display the items of a single user, show the role. Otherwise + # show all players. + + if {$element == "role"} { + if {[exists_and_not_null party_id] + && $user_id == $party_id} { + set element "role" + lappend filters [list role_id [list \ + label "[_ project-manager.Roles]" \ + values {[pm::role::select_list_filter]} \ + where_clause "ta.role_id = :role_id" + ] + ] + } else { + set element "party_id" + lappend filters [list party_id [list \ + label "[_ project-manager.People]" \ + values "[pm::task::assignee_filter_select \ +-status_id $status_id]" \ + where_clause "" + ] + ] + } + } + append row_list "$element {}\n" +} + +if {$bulk_p == 1} { + set bulk_actions [list "[_ project-manager.Log_hours]" "${base_url}log-bulk" "[_ project-manager.lt_Log_hours_for_several]" "[_ project-manager.Edit_tasks]" "${base_url}task-add-edit" "[_ project-manager.Edit_multiple_tasks]"] + set bulk_action_export_vars [list [list return_url]] +} else { + set bulk_actions [list] + set bulk_action_export_vars [list] +} + +if {$actions_p == 1} { + set actions [list "[_ project-manager.Add_task]" [export_vars \ + -base "${base_url}task-select-project" {return_url}] "[_ project-manager.Add_a_task]"] +} else { + set actions [list] +} + +template::list::create \ + -name tasks \ + -multirow tasks \ + -key task_item_id \ + -selected_format $format \ + -elements { + task_item_id { + label "[_ project-manager.number]" + link_url_col item_url + link_html {title "[_ project-manager.lt_View_this_project_ver]" } + display_template {@tasks.task_item_id@} + } + status_type { + label "[_ project-manager.Done_1]" + display_template { + } + } + title { + label "[_ project-manager.Subject_1]" + } + parent_task_id { + label "[_ project-manager.Dep]" + display_template {@tasks.parent_task_id@ + } + } + priority { + label "[_ project-manager.Priority_1]" + display_template { + @tasks.priority@ + } + } + slack_time { + label "[_ project-manager.Slack_1]" + display_template "@tasks.slack_time@@tasks.slack_time@" + } + party_id { + label "[_ project-manager.Who]" + display_template { @tasks.first_names@ @tasks.last_name@
+ } + } + role { + label "[_ project-manager.Role]" + } + earliest_start { + label "[_ project-manager.Earliest_Start]" + display_template "@tasks.earliest_start_pretty@@tasks.earliest_start_pretty@" + } + earliest_finish { + label "[_ project-manager.Earliest_Finish]" + display_template "@tasks.earliest_finish_pretty@@tasks.earliest_finish_pretty@" + } + latest_start { + label "[_ project-manager.Latest_Start]" + display_template "@tasks.latest_start_pretty@@tasks.latest_start_pretty@" + } + latest_finish { + label "[_ project-manager.Latest_Finish]" + display_template "@tasks.latest_finish_pretty@@tasks.latest_finish_pretty@" + } + end_date { + label "[_ project-manager.Deadline]" + display_template "@tasks.end_date_pretty@@tasks.end_date_pretty@" + } + status { + label "[_ project-manager.Status_1]" + } + days_remaining { + label "[_ project-manager.Days_work]" + html { + align right + } + } + hours_remaining { + label "[_ project-manager.Hours_remaining]" + html { + align right + } + } + actual_days_worked { + label "[_ project-manager.Days_worked]" + html { + align right + } + } + actual_hours_worked { + label "[_ project-manager.Hours_worked]" + html { + align right + } + } + project_item_id { + label "[_ project-manager.Project_1]" + display_template {@tasks.project_name@} + hide_p {[ad_decode [exists_and_not_null project_item_id] 1 1 0]} + } + log_url { + display_template {L} + } + edit_url { + display_template {E} + } + percent_complete { + label "[_ project-manager.Percent_complete]" + } + last_name { + label "[_ project-manager.Who]" + display_template { + @tasks.first_names@ @tasks.last_name@
+ } + } + } \ + -sub_class { + narrow + } \ + -filters $filters \ + -actions $actions \ + -bulk_actions $bulk_actions \ + -bulk_action_export_vars $bulk_action_export_vars \ + -page_size_variable_p 1 \ + -page_size $page_size \ + -page_flush_p 0 \ + -page_query_name tasks_pagination \ + -html { + width 100% + } \ + -formats { + normal { + label "[_ project-manager.Table]" + layout table + row $row_list + } + csv { + label "[_ project-manager.CSV]" + output csv + page_size 0 + row $row_list + } + } + +db_multirow -extend {item_url earliest_start_pretty earliest_finish_pretty end_date_pretty latest_start_pretty latest_finish_pretty slack_time edit_url log_url hours_remaining days_remaining actual_days_worked my_user_id user_url base_url task_close_url project_url} tasks tasks {} { + + set item_url [export_vars \ + -base "task-one" {{task_id $task_item_id}}] + + set log_url [export_vars \ + -base "${logger_url}log" {{project_id $logger_project} {pm_task_id $task_item_id} {pm_project_id $project_item_id} {return_url $return_url}}] + + set edit_url [export_vars \ + -base "task-add-edit" {{task_id $task_item_id} project_item_id return_url}] + + if {[parameter::get -parameter "UseDayInsteadOfHour"] == "f"} { + set fmt "%x %X" + } else { + set fmt "%x" + } + + set earliest_start_pretty [lc_time_fmt $earliest_start $fmt] + set earliest_finish_pretty [lc_time_fmt $earliest_finish $fmt] + set latest_start_pretty [lc_time_fmt $latest_start $fmt] + set latest_finish_pretty [lc_time_fmt $latest_finish $fmt] + set end_date_pretty [lc_time_fmt $end_date $fmt] + + if {[exists_and_not_null earliest_start_j]} { + set slack_time [pm::task::slack_time \ + -earliest_start_j $earliest_start_j \ + -today_j $today_j \ + -latest_start_j $latest_start_j] + } else { + set slack_time "[_ project-manager.na]" + } + + if {![exists_and_not_null percent_complete]} { + set percent_complete 0 + } + + set hours_remaining \ + [pm::task::hours_remaining \ + -estimated_hours_work $estimated_hours_work \ + -estimated_hours_work_min $estimated_hours_work_min \ + -estimated_hours_work_max $estimated_hours_work_max \ + -percent_complete $percent_complete] + + set days_remaining \ + [pm::task::days_remaining \ + -estimated_hours_work $estimated_hours_work \ + -estimated_hours_work_min $estimated_hours_work_min \ + -estimated_hours_work_max $estimated_hours_work_max \ + -percent_complete $percent_complete] + + if {[exists_and_not_null actual_hours_worked]} { + set actual_days_worked [expr $actual_hours_worked / 24] + } else { + set actual_days_worked "" + } + set my_user_id $user_id + set user_url [export_vars \ + -base "${contacts_url}contact" {{party_id $person_id}}] + + acs_object::get -object_id $task_item_id -array task_array + set base_url [lindex [site_node::get_url_from_object_id -object_id $task_array(package_id)] 0] + set task_close_url [export_vars -base "${base_url}task-close" -url {task_item_id return_url}] + set project_url [export_vars -base "${base_url}one" {project_item_id $tasks(project_item_id)}] +} + +# ------------------------- END OF FILE -------------------------