diff options
| author | sbh (Open ERP) <sbh@tinyerp.com> | 2010-11-01 11:43:43 +0530 |
|---|---|---|
| committer | sbh (Open ERP) <sbh@tinyerp.com> | 2010-11-01 11:43:43 +0530 |
| commit | aaa0b610b1017ff4f9df9add2ee6cc5af5ade421 (patch) | |
| tree | b371309cd97bccb9d5195813189e3c42a244b789 /addons/project_long_term | |
| parent | 263091c0e454f4de86de49310a8b50d565969fc7 (diff) | |
| parent | 9d44b90544bc1636e493c9be7301dbda69e1921f (diff) | |
[MERGE] Merge with trunk-dev-addons1
bzr revid: sbh@tinyerp.com-20101101061343-oefsywzw2l441hub
Diffstat (limited to 'addons/project_long_term')
26 files changed, 3951 insertions, 1641 deletions
diff --git a/addons/project_long_term/__init__.py b/addons/project_long_term/__init__.py index 8efcc1a0007..6b9b2613f3f 100644 --- a/addons/project_long_term/__init__.py +++ b/addons/project_long_term/__init__.py @@ -22,4 +22,4 @@ import project_long_term import wizard -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project_long_term/__openerp__.py b/addons/project_long_term/__openerp__.py index 32945899b30..0d03b5f7315 100644 --- a/addons/project_long_term/__openerp__.py +++ b/addons/project_long_term/__openerp__.py @@ -18,38 +18,43 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## + { - "name" : "Long Term Project Management", + "name": "Long Term Project Management", "version": "1.1", - "author" : "Tiny", - "website" : "http://www.openerp.com", - "category" : "Generic Modules/Projects & Services", - "depends" : ["project", "resource"], + "author": "OpenERP SA", + "website": "http://www.openerp.com", + "category": "Generic Modules/Projects & Services", + "depends": ["resource", "project"], "description": """ - - Long Term Project management module that tracks planning, scheduling, resources allocation. - Mainly used with Big project management. - - Project Phases will be maintained by Manager of the project - - Compute Phase Scheduling: Compute start date and end date of the phases which are in draft,open and pending state of the project given. - If no project given then all the draft,open and pending state phases will be taken - - Compute Task Scheduling: This works same as the scheduler button on project.phase. It takes the project as argument and computes all the open,draft and pending tasks - - Schedule Tasks: All the tasks which are in draft,pending and open state are scheduled with taking the phase's start date +Long Term Project management module that tracks planning, scheduling, resources allocation. +Features. + - Manage Big project. + - Define various Phases of Project. + - Compute Phase Scheduling: Compute start date and end date of the phases which are in draft,open and pending state of the project given. + If no project given then all the draft,open and pending state phases will be taken + - Compute Task Scheduling: This works same as the scheduler button on project.phase. It takes the project as argument and computes all the open,draft and pending tasks + - Schedule Tasks: All the tasks which are in draft,pending and open state are scheduled with taking the phase's start date """, - "init_xml" : [], - "demo_xml" : ["project_long_term_demo.xml"], + "init_xml": [], + "demo_xml": ["project_long_term_demo.xml"], + "test": [ + 'test/schedule_project_phases.yml', + 'test/schedule_project_tasks.yml', + 'test/schedule_phase_tasks.yml' + ], "update_xml": [ "security/ir.model.access.csv", - "project_long_term_wizard.xml" , "wizard/project_schedule_tasks_view.xml", "project_long_term_view.xml", "project_long_term_workflow.xml", "wizard/project_compute_phases_view.xml", "wizard/project_compute_tasks_view.xml", - ], 'installable': True, 'active': False, 'certificate': None, } + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project_long_term/i18n/de.po b/addons/project_long_term/i18n/de.po new file mode 100644 index 00000000000..b78d2f7d390 --- /dev/null +++ b/addons/project_long_term/i18n/de.po @@ -0,0 +1,549 @@ +# German translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2010-08-20 10:11+0000\n" +"PO-Revision-Date: 2010-10-05 13:36+0000\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: German <de@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-08 04:40+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: project_long_term +#: model:ir.module.module,shortdesc:project_long_term.module_meta_information +msgid "Long Term Project Management" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +#: view:project.compute.tasks:0 +msgid "Compute Scheduling of Phases" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,next_phase_ids:0 +msgid "Next Phases" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Project's Tasks" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_project_phases +#: view:project.phase:0 +msgid "Phases" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +msgid "_Compute" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: view:project.resource.allocation:0 +msgid "Group By..." +msgstr "" + +#. module: project_long_term +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "" + +#. module: project_long_term +#: constraint:project.project:0 +msgid "Error! project start-date must be lower then project end-date." +msgstr "" + +#. module: project_long_term +#: field:project.compute.phases,target_project:0 +msgid "Schedule" +msgstr "" + +#. module: project_long_term +#: model:ir.module.module,description:project_long_term.module_meta_information +msgid "" +"\n" +"\n" +" Long Term Project management module that tracks planning, " +"scheduling, resources allocation.\n" +" Mainly used with Big project management.\n" +" - Project Phases will be maintained by Manager of the project\n" +" - Compute Phase Scheduling: Compute start date and end date of " +"the phases which are in draft,open and pending state of the project given.\n" +" If no project given then all the " +"draft,open and pending state phases will be taken\n" +" - Compute Task Scheduling: This works same as the scheduler " +"button on project.phase. It takes the project as argument and computes all " +"the open,draft and pending tasks\n" +" - Schedule Tasks: All the tasks which are in draft,pending and " +"open state are scheduled with taking the phase's start date\n" +"\n" +" " +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_resouce_allocation +#: model:ir.ui.menu,name:project_long_term.menu_resouce_allocation +#: view:project.resource.allocation:0 +msgid "Resource Allocations" +msgstr "" + +#. module: project_long_term +#: view:project.resource.allocation:0 +msgid "R.A." +msgstr "" + +#. module: project_long_term +#: constraint:project.project:0 +msgid "Error! You cannot assign escalation to the same project!" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:0 +#, python-format +msgid "Day" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_task +msgid "Task" +msgstr "" + +#. module: project_long_term +#: selection:project.compute.phases,target_project:0 +msgid "Compute a Single Project" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,previous_phase_ids:0 +msgid "Previous Phases" +msgstr "" + +#. module: project_long_term +#: help:project.phase,product_uom:0 +msgid "UoM (Unit of Measure) is the unit of measurement for Duration" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_project +#: field:project.compute.phases,project_id:0 +#: field:project.compute.tasks,project_id:0 +#: view:project.phase:0 +#: field:project.phase,project_id:0 +msgid "Project" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "Error!" +msgstr "" + +#. module: project_long_term +#: selection:project.phase,state:0 +msgid "Cancelled" +msgstr "" + +#. module: project_long_term +#: field:project.resource.allocation,useability:0 +msgid "Usability" +msgstr "" + +#. module: project_long_term +#: help:project.resource.allocation,useability:0 +msgid "" +"Usability of this resource for this project phase in percentage (=50%)" +msgstr "" + +#. module: project_long_term +#: help:project.phase,date_end:0 +#: field:project.resource.allocation,phase_id_date_end:0 +msgid "Ending Date of the phase" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +msgid "This wizard will schedule phases for all or specified project" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Planning" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +#: view:project.compute.tasks:0 +msgid "_Cancel" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_compute_phases +#: model:ir.ui.menu,name:project_long_term.menu_compute_phase +msgid "Compute Phase Scheduling" +msgstr "" + +#. module: project_long_term +#: constraint:res.users:0 +msgid "The chosen company is not in the allowed companies for this user" +msgstr "" + +#. module: project_long_term +#: constraint:account.analytic.account:0 +msgid "Error! You can not create recursive analytic accounts." +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Dates" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,state:0 +msgid "State" +msgstr "" + +#. module: project_long_term +#: field:project.phase,product_uom:0 +msgid "Duration UoM" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_compute_tasks +#: model:ir.ui.menu,name:project_long_term.menu_compute_tasks +msgid "Compute Task Scheduling" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_resource_allocation +#: view:project.phase:0 +#: view:project.resource.allocation:0 +msgid "Project Resource Allocation" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_pm_resources_project1 +#: model:ir.ui.menu,name:project_long_term.menu_view_resource +msgid "Resources" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.project_phase_task_list +msgid "Related Tasks" +msgstr "" + +#. module: project_long_term +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "" + +#. module: project_long_term +#: help:project.phase,constraint_date_start:0 +msgid "force the phase to start after this date" +msgstr "" + +#. module: project_long_term +#: field:project.phase,task_ids:0 +msgid "Project Tasks" +msgstr "" + +#. module: project_long_term +#: field:project.phase,resource_ids:0 +msgid "Project Resources" +msgstr "" + +#. module: project_long_term +#: view:project.schedule.tasks:0 +msgid "_Ok" +msgstr "" + +#. module: project_long_term +#: constraint:project.phase:0 +msgid "Phase start-date must be lower than phase end-date." +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_schedule_tasks +msgid "project.schedule.tasks" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,constraint_date_start:0 +#: field:project.phase,date_start:0 +msgid "Start Date" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Resource Allocation" +msgstr "" + +#. module: project_long_term +#: help:project.phase,constraint_date_end:0 +msgid "force the phase to finish before this date" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_tasks.py:0 +#, python-format +msgid "Project must have members assigned !" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Draft" +msgstr "" + +#. module: project_long_term +#: constraint:ir.ui.menu:0 +msgid "Error ! You can not create recursive Menu." +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Pending" +msgstr "" + +#. module: project_long_term +#: constraint:project.task:0 +msgid "Error! Task start-date must be lower then task end-date." +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Remaining Hours" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "User" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Task Detail" +msgstr "" + +#. module: project_long_term +#: view:project.compute.tasks:0 +msgid "Compute" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_compute_tasks +msgid "Project Compute Tasks" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "No responsible person assigned !" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_tasks.py:0 +#: code:addons/project_long_term/wizard/project_schedule_tasks.py:0 +#, python-format +msgid "Error" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "You must assign a responsible person for phase '%s' !" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Constraints" +msgstr "" + +#. module: project_long_term +#: help:project.phase,sequence:0 +msgid "Gives the sequence order when displaying a list of phases." +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_project_phase +#: model:ir.actions.act_window,name:project_long_term.act_project_phase_list +#: model:ir.ui.menu,name:project_long_term.menu_project_phase +#: view:project.phase:0 +#: field:project.project,phase_ids:0 +msgid "Project Phases" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Done" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Cancel" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "In Progress" +msgstr "" + +#. module: project_long_term +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_schedule_tasks.py:0 +#, python-format +msgid "Phase must have resources assigned !" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Other Info" +msgstr "" + +#. module: project_long_term +#: field:project.phase,responsible_id:0 +msgid "Responsible" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Start Phase" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "Please Specify Project to be schedule" +msgstr "" + +#. module: project_long_term +#: view:project.schedule.tasks:0 +msgid "Task Scheduling completed successfully." +msgstr "" + +#. module: project_long_term +#: view:project.resource.allocation:0 +msgid "Phase" +msgstr "" + +#. module: project_long_term +#: help:project.phase,date_start:0 +#: field:project.resource.allocation,phase_id_date_start:0 +msgid "Starting Date of the phase" +msgstr "" + +#. module: project_long_term +#: help:project.phase,state:0 +msgid "" +"If the phase is created the state 'Draft'.\n" +" If the phase is started, the state becomes 'In Progress'.\n" +" If review is needed the phase is in 'Pending' state. " +" \n" +" If the phase is over, the states is set to 'Done'." +msgstr "" + +#. module: project_long_term +#: field:project.phase,constraint_date_end:0 +#: field:project.phase,date_end:0 +msgid "End Date" +msgstr "" + +#. module: project_long_term +#: view:project.resource.allocation:0 +#: field:project.resource.allocation,resource_id:0 +msgid "Resource" +msgstr "" + +#. module: project_long_term +#: field:project.phase,name:0 +msgid "Name" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar +msgid "Working Period" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_phase_schedule +#: view:project.phase:0 +msgid "Scheduling" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_phase +#: view:project.phase:0 +#: field:project.resource.allocation,phase_id:0 +#: field:project.task,phase_id:0 +msgid "Project Phase" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_compute_phases +msgid "Project Compute Phases" +msgstr "" + +#. module: project_long_term +#: field:project.schedule.tasks,msg:0 +msgid "Message" +msgstr "" + +#. module: project_long_term +#: constraint:project.phase:0 +msgid "Loops in phases not allowed" +msgstr "" + +#. module: project_long_term +#: field:project.phase,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: project_long_term +#: selection:project.compute.phases,target_project:0 +msgid "Compute All Projects" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar_leaves +msgid "Resource Leaves" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_schedule_tasks +#: view:project.phase:0 +#: view:project.schedule.tasks:0 +msgid "Schedule Tasks" +msgstr "" + +#. module: project_long_term +#: help:project.phase,duration:0 +msgid "By default in days" +msgstr "" + +#. module: project_long_term +#: field:project.phase,duration:0 +msgid "Duration" +msgstr "" diff --git a/addons/project_long_term/i18n/en_US.po b/addons/project_long_term/i18n/en_US.po new file mode 100644 index 00000000000..00e0d982c1c --- /dev/null +++ b/addons/project_long_term/i18n/en_US.po @@ -0,0 +1,550 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * project_long_term +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 6.0dev\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2010-08-20 10:27:00+0000\n" +"PO-Revision-Date: 2010-08-20 10:27:00+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: project_long_term +#: model:ir.module.module,shortdesc:project_long_term.module_meta_information +msgid "Long Term Project Management" +msgstr "Long Term Project Management" + +#. module: project_long_term +#: view:project.compute.phases:0 +#: view:project.compute.tasks:0 +msgid "Compute Scheduling of Phases" +msgstr "Compute Scheduling of Phases" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,next_phase_ids:0 +msgid "Next Phases" +msgstr "Next Phases" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Project's Tasks" +msgstr "Project's Tasks" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_project_phases +#: view:project.phase:0 +msgid "Phases" +msgstr "Phases" + +#. module: project_long_term +#: view:project.compute.phases:0 +msgid "_Compute" +msgstr "_Compute" + +#. module: project_long_term +#: view:project.phase:0 +#: view:project.resource.allocation:0 +msgid "Group By..." +msgstr "Group By..." + +#. module: project_long_term +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Invalid model name in the action definition." + +#. module: project_long_term +#: constraint:project.project:0 +msgid "Error! project start-date must be lower then project end-date." +msgstr "Error! project start-date must be lower then project end-date." + +#. module: project_long_term +#: field:project.compute.phases,target_project:0 +msgid "Schedule" +msgstr "Schedule" + +#. module: project_long_term +#: model:ir.module.module,description:project_long_term.module_meta_information +msgid "\n" +"\n" +" Long Term Project management module that tracks planning, scheduling, resources allocation.\n" +" Mainly used with Big project management.\n" +" - Project Phases will be maintained by Manager of the project\n" +" - Compute Phase Scheduling: Compute start date and end date of the phases which are in draft,open and pending state of the project given.\n" +" If no project given then all the draft,open and pending state phases will be taken\n" +" - Compute Task Scheduling: This works same as the scheduler button on project.phase. It takes the project as argument and computes all the open,draft and pending tasks\n" +" - Schedule Tasks: All the tasks which are in draft,pending and open state are scheduled with taking the phase's start date\n" +"\n" +" " +msgstr "\n" +"\n" +" Long Term Project management module that tracks planning, scheduling, resources allocation.\n" +" Mainly used with Big project management.\n" +" - Project Phases will be maintained by Manager of the project\n" +" - Compute Phase Scheduling: Compute start date and end date of the phases which are in draft,open and pending state of the project given.\n" +" If no project given then all the draft,open and pending state phases will be taken\n" +" - Compute Task Scheduling: This works same as the scheduler button on project.phase. It takes the project as argument and computes all the open,draft and pending tasks\n" +" - Schedule Tasks: All the tasks which are in draft,pending and open state are scheduled with taking the phase's start date\n" +"\n" +" " + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_resouce_allocation +#: model:ir.ui.menu,name:project_long_term.menu_resouce_allocation +#: view:project.resource.allocation:0 +msgid "Resource Allocations" +msgstr "Resource Allocations" + +#. module: project_long_term +#: view:project.resource.allocation:0 +msgid "R.A." +msgstr "R.A." + +#. module: project_long_term +#: constraint:project.project:0 +msgid "Error! You cannot assign escalation to the same project!" +msgstr "Error! You cannot assign escalation to the same project!" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:0 +#, python-format +msgid "Day" +msgstr "Day" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_task +msgid "Task" +msgstr "Task" + +#. module: project_long_term +#: selection:project.compute.phases,target_project:0 +msgid "Compute a Single Project" +msgstr "Compute a Single Project" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,previous_phase_ids:0 +msgid "Previous Phases" +msgstr "Previous Phases" + +#. module: project_long_term +#: help:project.phase,product_uom:0 +msgid "UoM (Unit of Measure) is the unit of measurement for Duration" +msgstr "UoM (Unit of Measure) is the unit of measurement for Duration" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_project +#: field:project.compute.phases,project_id:0 +#: field:project.compute.tasks,project_id:0 +#: view:project.phase:0 +#: field:project.phase,project_id:0 +msgid "Project" +msgstr "Project" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "Error!" +msgstr "Error!" + +#. module: project_long_term +#: selection:project.phase,state:0 +msgid "Cancelled" +msgstr "Cancelled" + +#. module: project_long_term +#: field:project.resource.allocation,useability:0 +msgid "Usability" +msgstr "Usability" + +#. module: project_long_term +#: help:project.resource.allocation,useability:0 +msgid "Usability of this resource for this project phase in percentage (=50%)" +msgstr "Usability of this resource for this project phase in percentage (=50%)" + +#. module: project_long_term +#: help:project.phase,date_end:0 +#: field:project.resource.allocation,phase_id_date_end:0 +msgid "Ending Date of the phase" +msgstr "Ending Date of the phase" + +#. module: project_long_term +#: view:project.compute.phases:0 +msgid "This wizard will schedule phases for all or specified project" +msgstr "This wizard will schedule phases for all or specified project" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Planning" +msgstr "Planning" + +#. module: project_long_term +#: view:project.compute.phases:0 +#: view:project.compute.tasks:0 +msgid "_Cancel" +msgstr "_Cancel" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_compute_phases +#: model:ir.ui.menu,name:project_long_term.menu_compute_phase +msgid "Compute Phase Scheduling" +msgstr "Compute Phase Scheduling" + +#. module: project_long_term +#: constraint:res.users:0 +msgid "The chosen company is not in the allowed companies for this user" +msgstr "The chosen company is not in the allowed companies for this user" + +#. module: project_long_term +#: constraint:account.analytic.account:0 +msgid "Error! You can not create recursive analytic accounts." +msgstr "Error! You can not create recursive analytic accounts." + +#. module: project_long_term +#: view:project.phase:0 +msgid "Dates" +msgstr "Dates" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,state:0 +msgid "State" +msgstr "State" + +#. module: project_long_term +#: field:project.phase,product_uom:0 +msgid "Duration UoM" +msgstr "Duration UoM" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_compute_tasks +#: model:ir.ui.menu,name:project_long_term.menu_compute_tasks +msgid "Compute Task Scheduling" +msgstr "Compute Task Scheduling" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_resource_allocation +#: view:project.phase:0 +#: view:project.resource.allocation:0 +msgid "Project Resource Allocation" +msgstr "Project Resource Allocation" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_pm_resources_project1 +#: model:ir.ui.menu,name:project_long_term.menu_view_resource +msgid "Resources" +msgstr "Resources" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.project_phase_task_list +msgid "Related Tasks" +msgstr "Related Tasks" + +#. module: project_long_term +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Invalid XML for View Architecture!" + +#. module: project_long_term +#: help:project.phase,constraint_date_start:0 +msgid "force the phase to start after this date" +msgstr "force the phase to start after this date" + +#. module: project_long_term +#: field:project.phase,task_ids:0 +msgid "Project Tasks" +msgstr "Project Tasks" + +#. module: project_long_term +#: field:project.phase,resource_ids:0 +msgid "Project Resources" +msgstr "Project Resources" + +#. module: project_long_term +#: view:project.schedule.tasks:0 +msgid "_Ok" +msgstr "_Ok" + +#. module: project_long_term +#: constraint:project.phase:0 +msgid "Phase start-date must be lower than phase end-date." +msgstr "Phase start-date must be lower than phase end-date." + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_schedule_tasks +msgid "project.schedule.tasks" +msgstr "project.schedule.tasks" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,constraint_date_start:0 +#: field:project.phase,date_start:0 +msgid "Start Date" +msgstr "Start Date" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Resource Allocation" +msgstr "Resource Allocation" + +#. module: project_long_term +#: help:project.phase,constraint_date_end:0 +msgid "force the phase to finish before this date" +msgstr "force the phase to finish before this date" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_tasks.py:0 +#, python-format +msgid "Project must have members assigned !" +msgstr "Project must have members assigned !" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Draft" +msgstr "Draft" + +#. module: project_long_term +#: constraint:ir.ui.menu:0 +msgid "Error ! You can not create recursive Menu." +msgstr "Error ! You can not create recursive Menu." + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Pending" +msgstr "Pending" + +#. module: project_long_term +#: constraint:project.task:0 +msgid "Error! Task start-date must be lower then task end-date." +msgstr "Error! Task start-date must be lower then task end-date." + +#. module: project_long_term +#: view:project.phase:0 +msgid "Remaining Hours" +msgstr "Remaining Hours" + +#. module: project_long_term +#: view:project.phase:0 +msgid "User" +msgstr "User" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Task Detail" +msgstr "Task Detail" + +#. module: project_long_term +#: view:project.compute.tasks:0 +msgid "Compute" +msgstr "Compute" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_compute_tasks +msgid "Project Compute Tasks" +msgstr "Project Compute Tasks" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "No responsible person assigned !" +msgstr "No responsible person assigned !" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_tasks.py:0 +#: code:addons/project_long_term/wizard/project_schedule_tasks.py:0 +#, python-format +msgid "Error" +msgstr "Error" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "You must assign a responsible person for phase '%s' !" +msgstr "You must assign a responsible person for phase '%s' !" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Constraints" +msgstr "Constraints" + +#. module: project_long_term +#: help:project.phase,sequence:0 +msgid "Gives the sequence order when displaying a list of phases." +msgstr "Gives the sequence order when displaying a list of phases." + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_project_phase +#: model:ir.actions.act_window,name:project_long_term.act_project_phase_list +#: model:ir.ui.menu,name:project_long_term.menu_project_phase +#: view:project.phase:0 +#: field:project.project,phase_ids:0 +msgid "Project Phases" +msgstr "Project Phases" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Done" +msgstr "Done" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Cancel" +msgstr "Cancel" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "In Progress" +msgstr "In Progress" + +#. module: project_long_term +#: constraint:ir.model:0 +msgid "The Object name must start with x_ and not contain any special character !" +msgstr "The Object name must start with x_ and not contain any special character !" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_schedule_tasks.py:0 +#, python-format +msgid "Phase must have resources assigned !" +msgstr "Phase must have resources assigned !" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Other Info" +msgstr "Other Info" + +#. module: project_long_term +#: field:project.phase,responsible_id:0 +msgid "Responsible" +msgstr "Responsible" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Start Phase" +msgstr "Start Phase" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "Please Specify Project to be schedule" +msgstr "Please Specify Project to be schedule" + +#. module: project_long_term +#: view:project.schedule.tasks:0 +msgid "Task Scheduling completed successfully." +msgstr "Task Scheduling completed successfully." + +#. module: project_long_term +#: view:project.resource.allocation:0 +msgid "Phase" +msgstr "Phase" + +#. module: project_long_term +#: help:project.phase,date_start:0 +#: field:project.resource.allocation,phase_id_date_start:0 +msgid "Starting Date of the phase" +msgstr "Starting Date of the phase" + +#. module: project_long_term +#: help:project.phase,state:0 +msgid "If the phase is created the state 'Draft'.\n" +" If the phase is started, the state becomes 'In Progress'.\n" +" If review is needed the phase is in 'Pending' state. \n" +" If the phase is over, the states is set to 'Done'." +msgstr "If the phase is created the state 'Draft'.\n" +" If the phase is started, the state becomes 'In Progress'.\n" +" If review is needed the phase is in 'Pending' state. \n" +" If the phase is over, the states is set to 'Done'." + +#. module: project_long_term +#: field:project.phase,constraint_date_end:0 +#: field:project.phase,date_end:0 +msgid "End Date" +msgstr "End Date" + +#. module: project_long_term +#: view:project.resource.allocation:0 +#: field:project.resource.allocation,resource_id:0 +msgid "Resource" +msgstr "Resource" + +#. module: project_long_term +#: field:project.phase,name:0 +msgid "Name" +msgstr "Name" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar +msgid "Working Period" +msgstr "Working Period" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_phase_schedule +#: view:project.phase:0 +msgid "Scheduling" +msgstr "Scheduling" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_phase +#: view:project.phase:0 +#: field:project.resource.allocation,phase_id:0 +#: field:project.task,phase_id:0 +msgid "Project Phase" +msgstr "Project Phase" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_compute_phases +msgid "Project Compute Phases" +msgstr "Project Compute Phases" + +#. module: project_long_term +#: field:project.schedule.tasks,msg:0 +msgid "Message" +msgstr "Message" + +#. module: project_long_term +#: constraint:project.phase:0 +msgid "Loops in phases not allowed" +msgstr "Loops in phases not allowed" + +#. module: project_long_term +#: field:project.phase,sequence:0 +msgid "Sequence" +msgstr "Sequence" + +#. module: project_long_term +#: selection:project.compute.phases,target_project:0 +msgid "Compute All Projects" +msgstr "Compute All Projects" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar_leaves +msgid "Resource Leaves" +msgstr "Resource Leaves" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_schedule_tasks +#: view:project.phase:0 +#: view:project.schedule.tasks:0 +msgid "Schedule Tasks" +msgstr "Schedule Tasks" + +#. module: project_long_term +#: help:project.phase,duration:0 +msgid "By default in days" +msgstr "By default in days" + +#. module: project_long_term +#: field:project.phase,duration:0 +msgid "Duration" +msgstr "Duration" + diff --git a/addons/project_long_term/i18n/fr.po b/addons/project_long_term/i18n/fr.po new file mode 100644 index 00000000000..4428edc8638 --- /dev/null +++ b/addons/project_long_term/i18n/fr.po @@ -0,0 +1,548 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * project_long_term +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 6.0dev\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2010-08-20 10:11+0000\n" +"PO-Revision-Date: 2010-08-30 12:19+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-09-29 05:18+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: project_long_term +#: model:ir.module.module,shortdesc:project_long_term.module_meta_information +msgid "Long Term Project Management" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +#: view:project.compute.tasks:0 +msgid "Compute Scheduling of Phases" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,next_phase_ids:0 +msgid "Next Phases" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Project's Tasks" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_project_phases +#: view:project.phase:0 +msgid "Phases" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +msgid "_Compute" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: view:project.resource.allocation:0 +msgid "Group By..." +msgstr "" + +#. module: project_long_term +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "" + +#. module: project_long_term +#: constraint:project.project:0 +msgid "Error! project start-date must be lower then project end-date." +msgstr "" + +#. module: project_long_term +#: field:project.compute.phases,target_project:0 +msgid "Schedule" +msgstr "" + +#. module: project_long_term +#: model:ir.module.module,description:project_long_term.module_meta_information +msgid "" +"\n" +"\n" +" Long Term Project management module that tracks planning, " +"scheduling, resources allocation.\n" +" Mainly used with Big project management.\n" +" - Project Phases will be maintained by Manager of the project\n" +" - Compute Phase Scheduling: Compute start date and end date of " +"the phases which are in draft,open and pending state of the project given.\n" +" If no project given then all the " +"draft,open and pending state phases will be taken\n" +" - Compute Task Scheduling: This works same as the scheduler " +"button on project.phase. It takes the project as argument and computes all " +"the open,draft and pending tasks\n" +" - Schedule Tasks: All the tasks which are in draft,pending and " +"open state are scheduled with taking the phase's start date\n" +"\n" +" " +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_resouce_allocation +#: model:ir.ui.menu,name:project_long_term.menu_resouce_allocation +#: view:project.resource.allocation:0 +msgid "Resource Allocations" +msgstr "" + +#. module: project_long_term +#: view:project.resource.allocation:0 +msgid "R.A." +msgstr "" + +#. module: project_long_term +#: constraint:project.project:0 +msgid "Error! You cannot assign escalation to the same project!" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:0 +#, python-format +msgid "Day" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_task +msgid "Task" +msgstr "" + +#. module: project_long_term +#: selection:project.compute.phases,target_project:0 +msgid "Compute a Single Project" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,previous_phase_ids:0 +msgid "Previous Phases" +msgstr "" + +#. module: project_long_term +#: help:project.phase,product_uom:0 +msgid "UoM (Unit of Measure) is the unit of measurement for Duration" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_project +#: field:project.compute.phases,project_id:0 +#: field:project.compute.tasks,project_id:0 +#: view:project.phase:0 +#: field:project.phase,project_id:0 +msgid "Project" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "Error!" +msgstr "" + +#. module: project_long_term +#: selection:project.phase,state:0 +msgid "Cancelled" +msgstr "" + +#. module: project_long_term +#: field:project.resource.allocation,useability:0 +msgid "Usability" +msgstr "" + +#. module: project_long_term +#: help:project.resource.allocation,useability:0 +msgid "" +"Usability of this resource for this project phase in percentage (=50%)" +msgstr "" + +#. module: project_long_term +#: help:project.phase,date_end:0 +#: field:project.resource.allocation,phase_id_date_end:0 +msgid "Ending Date of the phase" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +msgid "This wizard will schedule phases for all or specified project" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Planning" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +#: view:project.compute.tasks:0 +msgid "_Cancel" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_compute_phases +#: model:ir.ui.menu,name:project_long_term.menu_compute_phase +msgid "Compute Phase Scheduling" +msgstr "" + +#. module: project_long_term +#: constraint:res.users:0 +msgid "The chosen company is not in the allowed companies for this user" +msgstr "" + +#. module: project_long_term +#: constraint:account.analytic.account:0 +msgid "Error! You can not create recursive analytic accounts." +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Dates" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,state:0 +msgid "State" +msgstr "" + +#. module: project_long_term +#: field:project.phase,product_uom:0 +msgid "Duration UoM" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_compute_tasks +#: model:ir.ui.menu,name:project_long_term.menu_compute_tasks +msgid "Compute Task Scheduling" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_resource_allocation +#: view:project.phase:0 +#: view:project.resource.allocation:0 +msgid "Project Resource Allocation" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_pm_resources_project1 +#: model:ir.ui.menu,name:project_long_term.menu_view_resource +msgid "Resources" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.project_phase_task_list +msgid "Related Tasks" +msgstr "" + +#. module: project_long_term +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "" + +#. module: project_long_term +#: help:project.phase,constraint_date_start:0 +msgid "force the phase to start after this date" +msgstr "" + +#. module: project_long_term +#: field:project.phase,task_ids:0 +msgid "Project Tasks" +msgstr "" + +#. module: project_long_term +#: field:project.phase,resource_ids:0 +msgid "Project Resources" +msgstr "" + +#. module: project_long_term +#: view:project.schedule.tasks:0 +msgid "_Ok" +msgstr "" + +#. module: project_long_term +#: constraint:project.phase:0 +msgid "Phase start-date must be lower than phase end-date." +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_schedule_tasks +msgid "project.schedule.tasks" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,constraint_date_start:0 +#: field:project.phase,date_start:0 +msgid "Start Date" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Resource Allocation" +msgstr "" + +#. module: project_long_term +#: help:project.phase,constraint_date_end:0 +msgid "force the phase to finish before this date" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_tasks.py:0 +#, python-format +msgid "Project must have members assigned !" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Draft" +msgstr "" + +#. module: project_long_term +#: constraint:ir.ui.menu:0 +msgid "Error ! You can not create recursive Menu." +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Pending" +msgstr "" + +#. module: project_long_term +#: constraint:project.task:0 +msgid "Error! Task start-date must be lower then task end-date." +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Remaining Hours" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "User" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Task Detail" +msgstr "" + +#. module: project_long_term +#: view:project.compute.tasks:0 +msgid "Compute" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_compute_tasks +msgid "Project Compute Tasks" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "No responsible person assigned !" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_tasks.py:0 +#: code:addons/project_long_term/wizard/project_schedule_tasks.py:0 +#, python-format +msgid "Error" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "You must assign a responsible person for phase '%s' !" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Constraints" +msgstr "" + +#. module: project_long_term +#: help:project.phase,sequence:0 +msgid "Gives the sequence order when displaying a list of phases." +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_project_phase +#: model:ir.actions.act_window,name:project_long_term.act_project_phase_list +#: model:ir.ui.menu,name:project_long_term.menu_project_phase +#: view:project.phase:0 +#: field:project.project,phase_ids:0 +msgid "Project Phases" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Done" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Cancel" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "In Progress" +msgstr "" + +#. module: project_long_term +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_schedule_tasks.py:0 +#, python-format +msgid "Phase must have resources assigned !" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Other Info" +msgstr "" + +#. module: project_long_term +#: field:project.phase,responsible_id:0 +msgid "Responsible" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Start Phase" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "Please Specify Project to be schedule" +msgstr "" + +#. module: project_long_term +#: view:project.schedule.tasks:0 +msgid "Task Scheduling completed successfully." +msgstr "" + +#. module: project_long_term +#: view:project.resource.allocation:0 +msgid "Phase" +msgstr "" + +#. module: project_long_term +#: help:project.phase,date_start:0 +#: field:project.resource.allocation,phase_id_date_start:0 +msgid "Starting Date of the phase" +msgstr "" + +#. module: project_long_term +#: help:project.phase,state:0 +msgid "" +"If the phase is created the state 'Draft'.\n" +" If the phase is started, the state becomes 'In Progress'.\n" +" If review is needed the phase is in 'Pending' state. " +" \n" +" If the phase is over, the states is set to 'Done'." +msgstr "" + +#. module: project_long_term +#: field:project.phase,constraint_date_end:0 +#: field:project.phase,date_end:0 +msgid "End Date" +msgstr "" + +#. module: project_long_term +#: view:project.resource.allocation:0 +#: field:project.resource.allocation,resource_id:0 +msgid "Resource" +msgstr "" + +#. module: project_long_term +#: field:project.phase,name:0 +msgid "Name" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar +msgid "Working Period" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_phase_schedule +#: view:project.phase:0 +msgid "Scheduling" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_phase +#: view:project.phase:0 +#: field:project.resource.allocation,phase_id:0 +#: field:project.task,phase_id:0 +msgid "Project Phase" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_compute_phases +msgid "Project Compute Phases" +msgstr "" + +#. module: project_long_term +#: field:project.schedule.tasks,msg:0 +msgid "Message" +msgstr "" + +#. module: project_long_term +#: constraint:project.phase:0 +msgid "Loops in phases not allowed" +msgstr "" + +#. module: project_long_term +#: field:project.phase,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: project_long_term +#: selection:project.compute.phases,target_project:0 +msgid "Compute All Projects" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar_leaves +msgid "Resource Leaves" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_schedule_tasks +#: view:project.phase:0 +#: view:project.schedule.tasks:0 +msgid "Schedule Tasks" +msgstr "" + +#. module: project_long_term +#: help:project.phase,duration:0 +msgid "By default in days" +msgstr "" + +#. module: project_long_term +#: field:project.phase,duration:0 +msgid "Duration" +msgstr "" diff --git a/addons/project_long_term/i18n/pl.po b/addons/project_long_term/i18n/pl.po new file mode 100644 index 00000000000..506f739e8fe --- /dev/null +++ b/addons/project_long_term/i18n/pl.po @@ -0,0 +1,551 @@ +# Polish translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2010-08-20 10:11+0000\n" +"PO-Revision-Date: 2010-09-29 10:37+0000\n" +"Last-Translator: OpenERP Administrators <Unknown>\n" +"Language-Team: Polish <pl@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-09-30 04:44+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: project_long_term +#: model:ir.module.module,shortdesc:project_long_term.module_meta_information +msgid "Long Term Project Management" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +#: view:project.compute.tasks:0 +msgid "Compute Scheduling of Phases" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,next_phase_ids:0 +msgid "Next Phases" +msgstr "Nastepna faza" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Project's Tasks" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_project_phases +#: view:project.phase:0 +msgid "Phases" +msgstr "Fazy" + +#. module: project_long_term +#: view:project.compute.phases:0 +msgid "_Compute" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: view:project.resource.allocation:0 +msgid "Group By..." +msgstr "Grupuj wg..." + +#. module: project_long_term +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Nieprawidłowa nazwa modelu w definicji akcji." + +#. module: project_long_term +#: constraint:project.project:0 +msgid "Error! project start-date must be lower then project end-date." +msgstr "" + +#. module: project_long_term +#: field:project.compute.phases,target_project:0 +msgid "Schedule" +msgstr "Harmonogram" + +#. module: project_long_term +#: model:ir.module.module,description:project_long_term.module_meta_information +msgid "" +"\n" +"\n" +" Long Term Project management module that tracks planning, " +"scheduling, resources allocation.\n" +" Mainly used with Big project management.\n" +" - Project Phases will be maintained by Manager of the project\n" +" - Compute Phase Scheduling: Compute start date and end date of " +"the phases which are in draft,open and pending state of the project given.\n" +" If no project given then all the " +"draft,open and pending state phases will be taken\n" +" - Compute Task Scheduling: This works same as the scheduler " +"button on project.phase. It takes the project as argument and computes all " +"the open,draft and pending tasks\n" +" - Schedule Tasks: All the tasks which are in draft,pending and " +"open state are scheduled with taking the phase's start date\n" +"\n" +" " +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_resouce_allocation +#: model:ir.ui.menu,name:project_long_term.menu_resouce_allocation +#: view:project.resource.allocation:0 +msgid "Resource Allocations" +msgstr "" + +#. module: project_long_term +#: view:project.resource.allocation:0 +msgid "R.A." +msgstr "" + +#. module: project_long_term +#: constraint:project.project:0 +msgid "Error! You cannot assign escalation to the same project!" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:0 +#, python-format +msgid "Day" +msgstr "Dzień" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_task +msgid "Task" +msgstr "Zadanie" + +#. module: project_long_term +#: selection:project.compute.phases,target_project:0 +msgid "Compute a Single Project" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,previous_phase_ids:0 +msgid "Previous Phases" +msgstr "" + +#. module: project_long_term +#: help:project.phase,product_uom:0 +msgid "UoM (Unit of Measure) is the unit of measurement for Duration" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_project +#: field:project.compute.phases,project_id:0 +#: field:project.compute.tasks,project_id:0 +#: view:project.phase:0 +#: field:project.phase,project_id:0 +msgid "Project" +msgstr "Projekt" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "Error!" +msgstr "Błąd!" + +#. module: project_long_term +#: selection:project.phase,state:0 +msgid "Cancelled" +msgstr "Anulowano" + +#. module: project_long_term +#: field:project.resource.allocation,useability:0 +msgid "Usability" +msgstr "Użyteczność" + +#. module: project_long_term +#: help:project.resource.allocation,useability:0 +msgid "" +"Usability of this resource for this project phase in percentage (=50%)" +msgstr "" + +#. module: project_long_term +#: help:project.phase,date_end:0 +#: field:project.resource.allocation,phase_id_date_end:0 +msgid "Ending Date of the phase" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +msgid "This wizard will schedule phases for all or specified project" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Planning" +msgstr "Planowanie" + +#. module: project_long_term +#: view:project.compute.phases:0 +#: view:project.compute.tasks:0 +msgid "_Cancel" +msgstr "_Anuluj" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_compute_phases +#: model:ir.ui.menu,name:project_long_term.menu_compute_phase +msgid "Compute Phase Scheduling" +msgstr "" + +#. module: project_long_term +#: constraint:res.users:0 +msgid "The chosen company is not in the allowed companies for this user" +msgstr "" + +#. module: project_long_term +#: constraint:account.analytic.account:0 +msgid "Error! You can not create recursive analytic accounts." +msgstr "Błąd! Nie możesz tworzyć rekurencyjnych kont analitycznych" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Dates" +msgstr "Daty" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,state:0 +msgid "State" +msgstr "Stan" + +#. module: project_long_term +#: field:project.phase,product_uom:0 +msgid "Duration UoM" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_compute_tasks +#: model:ir.ui.menu,name:project_long_term.menu_compute_tasks +msgid "Compute Task Scheduling" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_resource_allocation +#: view:project.phase:0 +#: view:project.resource.allocation:0 +msgid "Project Resource Allocation" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_pm_resources_project1 +#: model:ir.ui.menu,name:project_long_term.menu_view_resource +msgid "Resources" +msgstr "Zasoby" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.project_phase_task_list +msgid "Related Tasks" +msgstr "" + +#. module: project_long_term +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Niewłaściwy XML dla architektury widoku!" + +#. module: project_long_term +#: help:project.phase,constraint_date_start:0 +msgid "force the phase to start after this date" +msgstr "" + +#. module: project_long_term +#: field:project.phase,task_ids:0 +msgid "Project Tasks" +msgstr "Zadania projektu" + +#. module: project_long_term +#: field:project.phase,resource_ids:0 +msgid "Project Resources" +msgstr "" + +#. module: project_long_term +#: view:project.schedule.tasks:0 +msgid "_Ok" +msgstr "" + +#. module: project_long_term +#: constraint:project.phase:0 +msgid "Phase start-date must be lower than phase end-date." +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_schedule_tasks +msgid "project.schedule.tasks" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,constraint_date_start:0 +#: field:project.phase,date_start:0 +msgid "Start Date" +msgstr "Data Początkowa" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Resource Allocation" +msgstr "" + +#. module: project_long_term +#: help:project.phase,constraint_date_end:0 +msgid "force the phase to finish before this date" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_tasks.py:0 +#, python-format +msgid "Project must have members assigned !" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Draft" +msgstr "Projekt" + +#. module: project_long_term +#: constraint:ir.ui.menu:0 +msgid "Error ! You can not create recursive Menu." +msgstr "Błąd ! Nie możesz tworzyć rekurencyjnych menu." + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Pending" +msgstr "Oczekujące" + +#. module: project_long_term +#: constraint:project.task:0 +msgid "Error! Task start-date must be lower then task end-date." +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Remaining Hours" +msgstr "Pozostałe godziny" + +#. module: project_long_term +#: view:project.phase:0 +msgid "User" +msgstr "Użytkownik" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Task Detail" +msgstr "" + +#. module: project_long_term +#: view:project.compute.tasks:0 +msgid "Compute" +msgstr "Oblicz" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_compute_tasks +msgid "Project Compute Tasks" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "No responsible person assigned !" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_tasks.py:0 +#: code:addons/project_long_term/wizard/project_schedule_tasks.py:0 +#, python-format +msgid "Error" +msgstr "Błąd" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "You must assign a responsible person for phase '%s' !" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Constraints" +msgstr "Ograniczenia" + +#. module: project_long_term +#: help:project.phase,sequence:0 +msgid "Gives the sequence order when displaying a list of phases." +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_project_phase +#: model:ir.actions.act_window,name:project_long_term.act_project_phase_list +#: model:ir.ui.menu,name:project_long_term.menu_project_phase +#: view:project.phase:0 +#: field:project.project,phase_ids:0 +msgid "Project Phases" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Done" +msgstr "Wykonano" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Cancel" +msgstr "Anuluj" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "In Progress" +msgstr "W toku" + +#. module: project_long_term +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Nazwa obiektu musi zaczynać się od x_ oraz nie może zawierać znaków " +"specjalnych !" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_schedule_tasks.py:0 +#, python-format +msgid "Phase must have resources assigned !" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Other Info" +msgstr "Inne informacje" + +#. module: project_long_term +#: field:project.phase,responsible_id:0 +msgid "Responsible" +msgstr "Odpowiedzialny" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Start Phase" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "Please Specify Project to be schedule" +msgstr "" + +#. module: project_long_term +#: view:project.schedule.tasks:0 +msgid "Task Scheduling completed successfully." +msgstr "" + +#. module: project_long_term +#: view:project.resource.allocation:0 +msgid "Phase" +msgstr "Faza" + +#. module: project_long_term +#: help:project.phase,date_start:0 +#: field:project.resource.allocation,phase_id_date_start:0 +msgid "Starting Date of the phase" +msgstr "Data rozpoczęcia fazy" + +#. module: project_long_term +#: help:project.phase,state:0 +msgid "" +"If the phase is created the state 'Draft'.\n" +" If the phase is started, the state becomes 'In Progress'.\n" +" If review is needed the phase is in 'Pending' state. " +" \n" +" If the phase is over, the states is set to 'Done'." +msgstr "" + +#. module: project_long_term +#: field:project.phase,constraint_date_end:0 +#: field:project.phase,date_end:0 +msgid "End Date" +msgstr "Data końcowa" + +#. module: project_long_term +#: view:project.resource.allocation:0 +#: field:project.resource.allocation,resource_id:0 +msgid "Resource" +msgstr "Zasób" + +#. module: project_long_term +#: field:project.phase,name:0 +msgid "Name" +msgstr "Nazwa" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar +msgid "Working Period" +msgstr "Godziny pracy" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_phase_schedule +#: view:project.phase:0 +msgid "Scheduling" +msgstr "Harmonogram" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_phase +#: view:project.phase:0 +#: field:project.resource.allocation,phase_id:0 +#: field:project.task,phase_id:0 +msgid "Project Phase" +msgstr "Faza projektu" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_compute_phases +msgid "Project Compute Phases" +msgstr "" + +#. module: project_long_term +#: field:project.schedule.tasks,msg:0 +msgid "Message" +msgstr "Wiadomość" + +#. module: project_long_term +#: constraint:project.phase:0 +msgid "Loops in phases not allowed" +msgstr "" + +#. module: project_long_term +#: field:project.phase,sequence:0 +msgid "Sequence" +msgstr "Numeracja" + +#. module: project_long_term +#: selection:project.compute.phases,target_project:0 +msgid "Compute All Projects" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar_leaves +msgid "Resource Leaves" +msgstr "Niebecności zasobu" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_schedule_tasks +#: view:project.phase:0 +#: view:project.schedule.tasks:0 +msgid "Schedule Tasks" +msgstr "Planuj zadania" + +#. module: project_long_term +#: help:project.phase,duration:0 +msgid "By default in days" +msgstr "" + +#. module: project_long_term +#: field:project.phase,duration:0 +msgid "Duration" +msgstr "Czas trwania" diff --git a/addons/project_long_term/i18n/project_long_term.pot b/addons/project_long_term/i18n/project_long_term.pot new file mode 100644 index 00000000000..aa2332a2b47 --- /dev/null +++ b/addons/project_long_term/i18n/project_long_term.pot @@ -0,0 +1,565 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * project_long_term +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 6.0dev\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2010-10-18 17:46:51+0000\n" +"PO-Revision-Date: 2010-10-18 17:46:51+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: project_long_term +#: model:ir.module.module,shortdesc:project_long_term.module_meta_information +msgid "Long Term Project Management" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +msgid "Compute Scheduling of Phases" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,next_phase_ids:0 +msgid "Next Phases" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Project's Tasks" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_project_phases +msgid "Phases" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: view:project.resource.allocation:0 +msgid "Group By..." +msgstr "" + +#. module: project_long_term +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_pm_resources_project1 +#: model:ir.ui.menu,name:project_long_term.menu_view_resource +#: view:project.resource.allocation:0 +msgid "Resources" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_resouce_allocation +#: view:project.resource.allocation:0 +msgid "Resources Allocation" +msgstr "" + +#. module: project_long_term +#: field:project.compute.phases,target_project:0 +msgid "Schedule" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_resouce_allocation +msgid "Resource Allocations" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:0 +#, python-format +msgid "Day" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_task +msgid "Task" +msgstr "" + +#. module: project_long_term +#: selection:project.compute.phases,target_project:0 +msgid "Compute a Single Project" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,previous_phase_ids:0 +msgid "Previous Phases" +msgstr "" + +#. module: project_long_term +#: help:project.phase,product_uom:0 +msgid "UoM (Unit of Measure) is the unit of measurement for Duration" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_project +#: field:project.compute.phases,project_id:0 +#: field:project.compute.tasks,project_id:0 +#: view:project.phase:0 +#: field:project.phase,project_id:0 +#: view:project.resource.allocation:0 +#: field:project.resource.allocation,project_id:0 +msgid "Project" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "Error!" +msgstr "" + +#. module: project_long_term +#: selection:project.phase,state:0 +msgid "Cancelled" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:0 +#, python-format +msgid "No tasks to compute for Project '%s'." +msgstr "" + +#. module: project_long_term +#: help:project.resource.allocation,date_end:0 +msgid "Ending Date" +msgstr "" + +#. module: project_long_term +#: help:project.phase,date_end:0 +msgid "Ending Date of the phase" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Planning" +msgstr "" + +#. module: project_long_term +#: field:project.phase,constraint_date_end:0 +msgid "Deadline" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +#: view:project.compute.tasks:0 +msgid "_Cancel" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_compute_phases +#: model:ir.ui.menu,name:project_long_term.menu_compute_phase +msgid "Compute Phase Scheduling" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:0 +#, python-format +msgid " (copy)" +msgstr "" + +#. module: project_long_term +#: view:project.resource.allocation:0 +#: field:project.resource.allocation,useability:0 +msgid "Availability" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Dates" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,state:0 +msgid "State" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +#: view:project.compute.tasks:0 +msgid "C_ompute" +msgstr "" + +#. module: project_long_term +#: view:project.compute.phases:0 +msgid "Compute Scheduling of phases for all or specified project" +msgstr "" + +#. module: project_long_term +#: field:project.phase,product_uom:0 +msgid "Duration UoM" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_compute_tasks +#: model:ir.ui.menu,name:project_long_term.menu_compute_tasks +msgid "Compute Task Scheduling" +msgstr "" + +#. module: project_long_term +#: field:project.phase,constraint_date_start:0 +msgid "Minimum Start Date" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_resource_allocation +#: view:project.phase:0 +#: view:project.resource.allocation:0 +msgid "Project Resource Allocation" +msgstr "" + +#. module: project_long_term +#: view:project.compute.tasks:0 +msgid "Compute Scheduling of Task" +msgstr "" + +#. module: project_long_term +#: help:project.resource.allocation,date_start:0 +msgid "Starting Date" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.project_phase_task_list +msgid "Related Tasks" +msgstr "" + +#. module: project_long_term +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "" + +#. module: project_long_term +#: help:project.resource.allocation,useability:0 +msgid "Availability of this resource for this project phase in percentage (=50%)" +msgstr "" + +#. module: project_long_term +#: help:project.phase,constraint_date_start:0 +msgid "force the phase to start after this date" +msgstr "" + +#. module: project_long_term +#: field:project.phase,task_ids:0 +msgid "Project Tasks" +msgstr "" + +#. module: project_long_term +#: field:project.phase,resource_ids:0 +msgid "Project Resources" +msgstr "" + +#. module: project_long_term +#: view:project.schedule.tasks:0 +msgid "_Ok" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Month" +msgstr "" + +#. module: project_long_term +#: constraint:project.phase:0 +msgid "Phase start-date must be lower than phase end-date." +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_schedule_tasks +msgid "project.schedule.tasks" +msgstr "" + +#. module: project_long_term +#: field:project.phase,date_start:0 +#: field:project.resource.allocation,date_start:0 +msgid "Start Date" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Resource Allocation" +msgstr "" + +#. module: project_long_term +#: help:project.phase,constraint_date_end:0 +msgid "force the phase to finish before this date" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Draft" +msgstr "" + +#. module: project_long_term +#: constraint:ir.ui.menu:0 +msgid "Error ! You can not create recursive Menu." +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Pending" +msgstr "" + +#. module: project_long_term +#: field:project.resource.allocation,name:0 +msgid "unknown" +msgstr "" + +#. module: project_long_term +#: field:project.resource.allocation,user_id:0 +msgid "User" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Task Detail" +msgstr "" + +#. module: project_long_term +#: help:project.project,resource_calendar_id:0 +msgid "Timetable working hours to adjust the gantt diagram report" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_compute_tasks +msgid "Project Compute Tasks" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:0 +#, python-format +msgid "No responsible person assigned !" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:0 +#, python-format +msgid "Error" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:0 +#, python-format +msgid "You must assign a responsible person for phase '%s' !" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:0 +#, python-format +msgid "Should have Resources Allocation or Project Members!" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Constraints" +msgstr "" + +#. module: project_long_term +#: help:project.phase,sequence:0 +msgid "Gives the sequence order when displaying a list of phases." +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.act_project_phase +#: model:ir.actions.act_window,name:project_long_term.act_project_phase_list +#: model:ir.ui.menu,name:project_long_term.menu_project_phase +#: model:ir.ui.menu,name:project_long_term.menu_project_phase_list +#: view:project.phase:0 +#: field:project.project,phase_ids:0 +msgid "Project Phases" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "Done" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Cancel" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: selection:project.phase,state:0 +msgid "In Progress" +msgstr "" + +#. module: project_long_term +#: constraint:ir.model:0 +msgid "The Object name must start with x_ and not contain any special character !" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Remaining Hours" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Other Info" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,responsible_id:0 +msgid "Responsible" +msgstr "" + +#. module: project_long_term +#: field:project.project,resource_calendar_id:0 +msgid "Working Time" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +msgid "Start Phase" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/wizard/project_compute_phases.py:0 +#, python-format +msgid "Please Specify Project to be schedule" +msgstr "" + +#. module: project_long_term +#: view:project.phase:0 +#: field:project.phase,total_hours:0 +msgid "Total Hours" +msgstr "" + +#. module: project_long_term +#: view:project.schedule.tasks:0 +msgid "Task Scheduling completed successfully." +msgstr "" + +#. module: project_long_term +#: view:project.compute.tasks:0 +msgid "Compute Scheduling of Task for specified project." +msgstr "" + +#. module: project_long_term +#: view:project.resource.allocation:0 +msgid "Phase" +msgstr "" + +#. module: project_long_term +#: help:project.phase,date_start:0 +msgid "Starting Date of the phase" +msgstr "" + +#. module: project_long_term +#: help:project.phase,state:0 +msgid "If the phase is created the state 'Draft'.\n" +" If the phase is started, the state becomes 'In Progress'.\n" +" If review is needed the phase is in 'Pending' state. \n" +" If the phase is over, the states is set to 'Done'." +msgstr "" + +#. module: project_long_term +#: field:project.phase,date_end:0 +#: field:project.resource.allocation,date_end:0 +msgid "End Date" +msgstr "" + +#. module: project_long_term +#: view:project.resource.allocation:0 +#: field:project.resource.allocation,resource_id:0 +msgid "Resource" +msgstr "" + +#. module: project_long_term +#: field:project.phase,name:0 +msgid "Name" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar +msgid "Working Period" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_resource_resource +msgid "Resource Detail" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_phase_schedule +#: view:project.phase:0 +msgid "Scheduling" +msgstr "" + +#. module: project_long_term +#: code:addons/project_long_term/project_long_term.py:0 +#, python-format +msgid "No tasks to compute for Phase '%s'." +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_phase +#: view:project.phase:0 +#: field:project.resource.allocation,phase_id:0 +#: field:project.task,phase_id:0 +msgid "Project Phase" +msgstr "" + +#. module: project_long_term +#: model:ir.model,name:project_long_term.model_project_compute_phases +msgid "Project Compute Phases" +msgstr "" + +#. module: project_long_term +#: field:project.schedule.tasks,msg:0 +msgid "Message" +msgstr "" + +#. module: project_long_term +#: constraint:project.phase:0 +msgid "Loops in phases not allowed" +msgstr "" + +#. module: project_long_term +#: field:project.phase,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: project_long_term +#: selection:project.compute.phases,target_project:0 +msgid "Compute All Projects" +msgstr "" + +#. module: project_long_term +#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar_leaves +msgid "Resource Leaves" +msgstr "" + +#. module: project_long_term +#: model:ir.actions.act_window,name:project_long_term.action_project_schedule_tasks +#: view:project.phase:0 +#: view:project.schedule.tasks:0 +msgid "Schedule Tasks" +msgstr "" + +#. module: project_long_term +#: help:project.phase,duration:0 +msgid "By default in days" +msgstr "" + +#. module: project_long_term +#: field:project.phase,duration:0 +msgid "Duration" +msgstr "" + diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index 212af8a30dc..faea0916906 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -18,18 +18,22 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## -from lxml import etree -import mx.DateTime -import time +from datetime import datetime +from dateutil.relativedelta import relativedelta from tools.translate import _ from osv import fields, osv +from resource.faces import task as Task +import operator class project_phase(osv.osv): _name = "project.phase" _description = "Project Phase" - def _check_recursion(self, cr, uid, ids, context={}): + def _check_recursion(self, cr, uid, ids, context=None): + if context is None: + context = {} + data_phase = self.browse(cr, uid, ids[0], context=context) prev_ids = data_phase.previous_phase_ids next_ids = data_phase.next_phase_ids @@ -45,7 +49,7 @@ class project_phase(osv.osv): next_ids = [rec.id for rec in next_ids] # iter prev_ids while prev_ids: - cr.execute('select distinct prv_phase_id from project_phase_rel where next_phase_id in ('+','.join(map(str, prev_ids))+')') + cr.execute('SELECT distinct prv_phase_id FROM project_phase_rel WHERE next_phase_id IN %s', (tuple(prev_ids),)) prv_phase_ids = filter(None, map(lambda x: x[0], cr.fetchall())) if data_phase.id in prv_phase_ids: return False @@ -55,7 +59,7 @@ class project_phase(osv.osv): prev_ids = prv_phase_ids # iter next_ids while next_ids: - cr.execute('select distinct next_phase_id from project_phase_rel where prv_phase_id in ('+','.join(map(str, next_ids))+')') + cr.execute('SELECT distinct next_phase_id FROM project_phase_rel WHERE prv_phase_id IN %s', (tuple(next_ids),)) next_phase_ids = filter(None, map(lambda x: x[0], cr.fetchall())) if data_phase.id in next_phase_ids: return False @@ -65,68 +69,92 @@ class project_phase(osv.osv): next_ids = next_phase_ids return True - def _check_dates(self, cr, uid, ids, context={}): + def _check_dates(self, cr, uid, ids, context=None): for phase in self.read(cr, uid, ids, ['date_start', 'date_end'], context=context): if phase['date_start'] and phase['date_end'] and phase['date_start'] > phase['date_end']: return False return True - def _check_constraint_start(self, cr, uid, ids, context={}): + def _check_constraint_start(self, cr, uid, ids, context=None): phase = self.read(cr, uid, ids[0], ['date_start', 'constraint_date_start'], context=context) if phase['date_start'] and phase['constraint_date_start'] and phase['date_start'] < phase['constraint_date_start']: return False return True - def _check_constraint_end(self, cr, uid, ids, context={}): + def _check_constraint_end(self, cr, uid, ids, context=None): phase = self.read(cr, uid, ids[0], ['date_end', 'constraint_date_end'], context=context) if phase['date_end'] and phase['constraint_date_end'] and phase['date_end'] > phase['constraint_date_end']: return False return True + def _get_default_uom_id(self, cr, uid): + model_data_obj = self.pool.get('ir.model.data') + model_data_id = model_data_obj._get_id(cr, uid, 'product', 'uom_hour') + return model_data_obj.read(cr, uid, [model_data_id], ['res_id'])[0]['res_id'] + + def _compute(self, cr, uid, ids, field_name, arg, context=None): + res = {} + if not ids: + return res + for phase in self.browse(cr, uid, ids, context=context): + tot = 0.0 + for task in phase.task_ids: + tot += task.planned_hours + res[phase.id] = tot + return res + _columns = { 'name': fields.char("Name", size=64, required=True), - 'date_start': fields.datetime('Start Date', help="Starting Date of the phase"), - 'date_end': fields.datetime('End Date', help="Ending Date of the phase"), - 'constraint_date_start': fields.datetime('Start Date', help='force the phase to start after this date'), - 'constraint_date_end': fields.datetime('End Date', help='force the phase to finish before this date'), + 'date_start': fields.date('Start Date', help="Starting Date of the phase", states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), + 'date_end': fields.date('End Date', help="Ending Date of the phase", states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), + 'constraint_date_start': fields.date('Minimum Start Date', help='force the phase to start after this date', states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), + 'constraint_date_end': fields.date('Deadline', help='force the phase to finish before this date', states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'project_id': fields.many2one('project.project', 'Project', required=True), - 'next_phase_ids': fields.many2many('project.phase', 'project_phase_rel', 'prv_phase_id', 'next_phase_id', 'Next Phases'), - 'previous_phase_ids': fields.many2many('project.phase', 'project_phase_rel', 'next_phase_id', 'prv_phase_id', 'Previous Phases'), + 'next_phase_ids': fields.many2many('project.phase', 'project_phase_rel', 'prv_phase_id', 'next_phase_id', 'Next Phases', states={'cancelled':[('readonly',True)]}), + 'previous_phase_ids': fields.many2many('project.phase', 'project_phase_rel', 'next_phase_id', 'prv_phase_id', 'Previous Phases', states={'cancelled':[('readonly',True)]}), 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of phases."), - 'duration': fields.float('Duration', required=True, help="By default in days"), - 'product_uom': fields.many2one('product.uom', 'Duration UoM', required=True, help="UoM (Unit of Measure) is the unit of measurement for Duration"), - 'task_ids': fields.one2many('project.task', 'phase_id', "Project Tasks"), - 'resource_ids': fields.one2many('project.resource.allocation', 'phase_id', "Project Resources"), - 'responsible_id':fields.many2one('res.users', 'Responsible'), + 'duration': fields.float('Duration', required=True, help="By default in days", states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), + 'product_uom': fields.many2one('product.uom', 'Duration UoM', required=True, help="UoM (Unit of Measure) is the unit of measurement for Duration", states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), + 'task_ids': fields.one2many('project.task', 'phase_id', "Project Tasks", states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), + 'resource_ids': fields.one2many('project.resource.allocation', 'phase_id', "Project Resources",states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), + 'responsible_id': fields.many2one('res.users', 'Responsible', states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'state': fields.selection([('draft', 'Draft'), ('open', 'In Progress'), ('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')], 'State', readonly=True, required=True, help='If the phase is created the state \'Draft\'.\n If the phase is started, the state becomes \'In Progress\'.\n If review is needed the phase is in \'Pending\' state.\ - \n If the phase is over, the states is set to \'Done\'.') + \n If the phase is over, the states is set to \'Done\'.'), + 'total_hours': fields.function(_compute, method=True, string='Total Hours'), } _defaults = { 'responsible_id': lambda obj,cr,uid,context: uid, 'state': 'draft', 'sequence': 10, - 'product_uom': lambda self,cr,uid,c: self.pool.get('product.uom').search(cr, uid, [('name', '=', 'Day')], context=c)[0] + 'product_uom': lambda self,cr,uid,c: self.pool.get('product.uom').search(cr, uid, [('name', '=', _('Day'))], context=c)[0] } - _order = "name" + _order = "project_id, date_start, sequence, name" _constraints = [ (_check_recursion,'Loops in phases not allowed',['next_phase_ids', 'previous_phase_ids']), (_check_dates, 'Phase start-date must be lower than phase end-date.', ['date_start', 'date_end']), - #(_check_constraint_start, 'Phase must start-after constraint start Date.', ['date_start', 'constraint_date_start']), - #(_check_constraint_end, 'Phase must end-before constraint end Date.', ['date_end', 'constraint_date_end']), ] - def onchange_project(self, cr, uid, ids, project, context={}): + def onchange_project(self, cr, uid, ids, project, context=None): result = {} + result['date_start'] = False project_obj = self.pool.get('project.project') if project: project_id = project_obj.browse(cr, uid, project, context=context) - if project_id.date_start: - result['date_start'] = mx.DateTime.strptime(project_id.date_start, "%Y-%m-%d").strftime('%Y-%m-%d %H:%M:%S') - return {'value': result} - return {'value': {'date_start': []}} + result['date_start'] = project_id.date_start + return {'value': result} - def _check_date_start(self, cr, uid, phase, date_end, context={}): + def onchange_days(self, cr, uid, ids, project, context=None): + result = {} + for id in ids: + project_id = self.browse(cr, uid, id, context=context) + newdate = datetime.strptime(project_id.date_start, '%Y-%m-%d') + relativedelta(days=project_id.duration or 0.0) + result['date_end'] = newdate.strftime('%Y-%m-%d') + return {'value': result} + + def _check_date_start(self, cr, uid, phase, date_end, context=None): + if context is None: + context = {} """ Check And Compute date_end of phase if change in date_start < older time. """ @@ -136,18 +164,19 @@ class project_phase(osv.osv): calendar_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False resource_id = resource_obj.search(cr, uid, [('user_id', '=', phase.responsible_id.id)]) if resource_id: -# cal_id = resource_obj.browse(cr, uid, resource_id[0], context=context).calendar_id.id - res = resource_obj.read(cr, uid, resource_id[0], ['calendar_id'], context=context)[0] + res = resource_obj.read(cr, uid, resource_id, ['calendar_id'], context=context)[0] cal_id = res.get('calendar_id', False) and res.get('calendar_id')[0] or False if cal_id: calendar_id = cal_id - default_uom_id = uom_obj.search(cr, uid, [('name', '=', 'Hour')], context=context)[0] + default_uom_id = self._get_default_uom_id(cr, uid) avg_hours = uom_obj._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id) work_times = cal_obj.interval_min_get(cr, uid, calendar_id, date_end, avg_hours or 0.0, resource_id and resource_id[0] or False) - dt_start = work_times[0][0].strftime('%Y-%m-%d %H:%M:%S') - self.write(cr, uid, [phase.id], {'date_start': dt_start, 'date_end': date_end.strftime('%Y-%m-%d %H:%M:%S')}, context=context) + dt_start = work_times[0][0].strftime('%Y-%m-%d') + self.write(cr, uid, [phase.id], {'date_start': dt_start, 'date_end': date_end.strftime('%Y-%m-%d')}, context=context) - def _check_date_end(self, cr, uid, phase, date_start, context={}): + def _check_date_end(self, cr, uid, phase, date_start, context=None): + if context is None: + context = {} """ Check And Compute date_end of phase if change in date_end > older time. """ @@ -157,54 +186,71 @@ class project_phase(osv.osv): calendar_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False resource_id = resource_obj.search(cr, uid, [('user_id', '=', phase.responsible_id.id)], context=context) if resource_id: -# cal_id = resource_obj.browse(cr, uid, resource_id[0], context=context).calendar_id.id - res = resource_obj.read(cr, uid, resource_id[0], ['calendar_id'], context=context)[0] + res = resource_obj.read(cr, uid, resource_id, ['calendar_id'], context=context)[0] cal_id = res.get('calendar_id', False) and res.get('calendar_id')[0] or False if cal_id: calendar_id = cal_id - default_uom_id = uom_obj.search(cr, uid, [('name', '=', 'Hour')], context=context)[0] + default_uom_id = self._get_default_uom_id(cr, uid) avg_hours = uom_obj._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id) work_times = cal_obj.interval_get(cr, uid, calendar_id, date_start, avg_hours or 0.0, resource_id and resource_id[0] or False) - dt_end = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S') - self.write(cr, uid, [phase.id], {'date_start': date_start.strftime('%Y-%m-%d %H:%M:%S'), 'date_end': dt_end}, context=context) + dt_end = work_times[-1][1].strftime('%Y-%m-%d') + self.write(cr, uid, [phase.id], {'date_start': date_start.strftime('%Y-%m-%d'), 'date_end': dt_end}, context=context) - def write(self, cr, uid, ids, vals, context={}): + def write(self, cr, uid, ids, vals, context=None): resource_calendar_obj = self.pool.get('resource.calendar') resource_obj = self.pool.get('resource.resource') uom_obj = self.pool.get('product.uom') - if not context: + if context is None: context = {} + res = super(project_phase, self).write(cr, uid, ids, vals, context=context) if context.get('scheduler',False): - return super(project_phase, self).write(cr, uid, ids, vals, context=context) + return res # Consider calendar and efficiency if the phase is performed by a resource # otherwise consider the project's working calendar - phase = self.browse(cr, uid, ids[0], context=context) - calendar_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False - resource_id = resource_obj.search(cr, uid, [('user_id', '=', phase.responsible_id.id)],context=context) - if resource_id: + + #TOCHECK : why need this ? + if isinstance(ids, (int, long)): + ids = [ids] + default_uom_id = self._get_default_uom_id(cr, uid) + for phase in self.browse(cr, uid, ids, context=context): + calendar_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False + resource_id = resource_obj.search(cr, uid, [('user_id', '=', phase.responsible_id.id)],context=context) + if resource_id: cal_id = resource_obj.browse(cr, uid, resource_id[0], context=context).calendar_id.id if cal_id: calendar_id = cal_id - default_uom_id = uom_obj.search(cr, uid, [('name', '=', 'Hour')])[0] - avg_hours = uom_obj._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id) - # Change the date_start and date_end - # for previous and next phases respectively based on valid condition - if vals.get('date_start', False) and vals['date_start'] < phase.date_start: - dt_start = mx.DateTime.strptime(vals['date_start'],'%Y-%m-%d %H:%M:%S') + avg_hours = uom_obj._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id) + # Change the date_start and date_end + # for previous and next phases respectively based on valid condition + if vals.get('date_start', False) and vals['date_start'] < phase.date_start: + dt_start = datetime.strptime(vals['date_start'], '%Y-%m-%d') work_times = resource_calendar_obj.interval_get(cr, uid, calendar_id, dt_start, avg_hours or 0.0, resource_id and resource_id[0] or False) if work_times: - vals['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S') + vals['date_end'] = work_times[-1][1].strftime('%Y-%m-%d') for prv_phase in phase.previous_phase_ids: + if prv_phase.id == phase.id: + continue self._check_date_start(cr, uid, prv_phase, dt_start, context=context) - if vals.get('date_end', False) and vals['date_end'] > phase.date_end: - dt_end = mx.DateTime.strptime(vals['date_end'],'%Y-%m-%d %H:%M:%S') + + if vals.get('date_end', False) and vals['date_end'] > phase.date_end: + dt_end = datetime.strptime(vals['date_end'], '%Y-%m-%d') work_times = resource_calendar_obj.interval_min_get(cr, uid, calendar_id, dt_end, avg_hours or 0.0, resource_id and resource_id[0] or False) if work_times: - vals['date_start'] = work_times[0][0].strftime('%Y-%m-%d %H:%M:%S') + vals['date_start'] = work_times[0][0].strftime('%Y-%m-%d') for next_phase in phase.next_phase_ids: + if next_phase.id == phase.id: + continue self._check_date_end(cr, uid, next_phase, dt_end, context=context) - return super(project_phase, self).write(cr, uid, ids, vals, context=context) + + return res + + def copy(self, cr, uid, id, default=None, context=None): + if default is None: + default = {} + if not default.get('name', False): + default['name'] = self.browse(cr, uid, id, context=context).name + _(' (copy)') + return super(project_phase, self).copy(cr, uid, id, default, context) def set_draft(self, cr, uid, ids, *args): self.write(cr, uid, ids, {'state': 'draft'}) @@ -214,7 +260,7 @@ class project_phase(osv.osv): self.write(cr, uid, ids, {'state': 'open'}) return True - def set_pending(self, cr, uid, ids,*args): + def set_pending(self, cr, uid, ids, *args): self.write(cr, uid, ids, {'state': 'pending'}) return True @@ -226,16 +272,146 @@ class project_phase(osv.osv): self.write(cr, uid, ids, {'state': 'done'}) return True + def generate_resources(self, cr, uid, ids, context=None): + """ + Return a list of Resource Class objects for the resources allocated to the phase. + """ + res = {} + if context is None: + context = {} + resource_pool = self.pool.get('resource.resource') + for phase in self.browse(cr, uid, ids, context=context): + user_ids = map(lambda x:x.resource_id.user_id.id, phase.resource_ids) + project = phase.project_id + calendar_id = project.resource_calendar_id and project.resource_calendar_id.id or False + resource_objs = resource_pool.generate_resources(cr, uid, user_ids, calendar_id, context=context) + res[phase.id] = resource_objs + return res + + def generate_schedule(self, cr, uid, ids, start_date, calendar_id=False, context=None): + """ + Schedule phase with the start date till all the next phases are completed. + @param: start_dsate : start date for the phase + @param: calendar_id : working calendar of the project + """ + if context is None: + context = {} + resource_pool = self.pool.get('resource.resource') + resource_allocation_pool = self.pool.get('project.resource.allocation') + uom_pool = self.pool.get('product.uom') + if context is None: + context = {} + default_uom_id = self._get_default_uom_id(cr, uid) + for phase in self.browse(cr, uid, ids, context=context): + if not phase.responsible_id: + raise osv.except_osv(_('No responsible person assigned !'),_("You must assign a responsible person for phase '%s' !") % (phase.name,)) + + phase_resource_obj = resource_pool.generate_resources(cr, uid, [phase.responsible_id.id], calendar_id, context=context) + avg_hours = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id) + duration = str(avg_hours) + 'H' + # Create a new project for each phase + def Project(): + # If project has working calendar then that + # else the default one would be considered + start = start_date + minimum_time_unit = 1 + resource = phase_resource_obj + if calendar_id: + working_days = resource_pool.compute_working_calendar(cr, uid, calendar_id, context=context) + vacation = tuple(resource_pool.compute_vacation(cr, uid, calendar_id)) + + def phase(): + effort = duration + + project = Task.BalancedProject(Project) + s_date = project.phase.start.to_datetime() + e_date = project.phase.end.to_datetime() + # Recalculate date_start and date_end + # according to constraints on date start and date end on phase + if phase.constraint_date_start and str(s_date) < phase.constraint_date_start: + start_date = datetime.strptime(phase.constraint_date_start, '%Y-%m-%d') + else: + start_date = s_date + if phase.constraint_date_end and str(e_date) > phase.constraint_date_end: + end_date= datetime.strptime(phase.constraint_date_end, '%Y-%m-%d') + date_start = phase.constraint_date_end + else: + end_date = e_date + date_start = end_date + # Write the calculated dates back + ctx = context.copy() + ctx.update({'scheduler': True}) + self.write(cr, uid, [phase.id], { + 'date_start': start_date.strftime('%Y-%m-%d'), + 'date_end': end_date.strftime('%Y-%m-%d') + }, context=ctx) + # write dates into Resources Allocation + for resource in phase.resource_ids: + resource_allocation_pool.write(cr, uid, [resource.id], { + 'date_start': start_date.strftime('%Y-%m-%d'), + 'date_end': end_date.strftime('%Y-%m-%d') + }, context=ctx) + # Recursive call till all the next phases scheduled + for phase in phase.next_phase_ids: + if phase.state in ['draft', 'open', 'pending']: + id_cal = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False + self.generate_schedule(cr, uid, [phase.id], date_start, id_cal, context=context) + else: + continue + return True + + def schedule_tasks(self, cr, uid, ids, context=None): + """ + Schedule the tasks according to resource available and priority. + """ + task_pool = self.pool.get('project.task') + resource_pool = self.pool.get('resource.resource') + if context is None: + context = {} + resources_list = self.generate_resources(cr, uid, ids, context=context) + return_msg = {} + for phase in self.browse(cr, uid, ids, context=context): + start_date = phase.date_start + if not start_date and phase.project_id.date_start: + start_date = phase.project_id.date_start + if not start_date: + start_date = datetime.now().strftime("%Y-%m-%d") + resources = resources_list.get(phase.id, []) + calendar_id = phase.project_id.resource_calendar_id.id + task_ids = map(lambda x : x.id, (filter(lambda x : x.state in ['open', 'draft', 'pending'] , phase.task_ids))) + if task_ids: + task_pool.generate_schedule(cr, uid, task_ids, resources, calendar_id, start_date, context=context) + + if not task_ids: + warning_msg = _("No tasks to compute for Phase '%s'.") % (phase.name) + if "warning" not in return_msg: + return_msg["warning"] = warning_msg + else: + return_msg["warning"] = return_msg["warning"] + "\n" + warning_msg + return return_msg project_phase() class project_resource_allocation(osv.osv): _name = 'project.resource.allocation' _description = 'Project Resource Allocation' _rec_name = 'resource_id' + + def get_name(self, cr, uid, ids, field_name, arg, context=None): + res = {} + for allocation in self.browse(cr, uid, ids, context=context): + name = allocation.phase_id.name + name += ' (%s%%)' %(allocation.useability) + res[allocation.id] = name + return res _columns = { + 'name': fields.function(get_name, method=True, type='char', size=256), 'resource_id': fields.many2one('resource.resource', 'Resource', required=True), - 'phase_id': fields.many2one('project.phase', 'Project Phase', required=True), - 'useability': fields.float('Usability', help="Usability of this resource for this project phase in percentage (=50%)"), + 'phase_id': fields.many2one('project.phase', 'Project Phase', ondelete='cascade', required=True), + 'project_id': fields.related('phase_id', 'project_id', type='many2one', relation="project.project", string='Project', store=True), + 'user_id': fields.related('resource_id', 'user_id', type='many2one', relation="res.users", string='User'), + 'date_start': fields.date('Start Date', help="Starting Date"), + 'date_end': fields.date('End Date', help="Ending Date"), + 'useability': fields.float('Availability', help="Availability of this resource for this project phase in percentage (=50%)"), } _defaults = { 'useability': 100, @@ -247,124 +423,174 @@ class project(osv.osv): _inherit = "project.project" _columns = { 'phase_ids': fields.one2many('project.phase', 'project_id', "Project Phases"), - 'resource_calendar_id': fields.many2one('resource.calendar', 'Working Time', help="Timetable working hours to adjust the gantt diagram report"), + 'resource_calendar_id': fields.many2one('resource.calendar', 'Working Time', help="Timetable working hours to adjust the gantt diagram report", states={'close':[('readonly',True)]} ), } + def generate_members(self, cr, uid, ids, context=None): + """ + Return a list of Resource Class objects for the resources allocated to the phase. + """ + res = {} + resource_pool = self.pool.get('resource.resource') + if context is None: + context = {} + for project in self.browse(cr, uid, ids, context=context): + user_ids = map(lambda x:x.id, project.members) + calendar_id = project.resource_calendar_id and project.resource_calendar_id.id or False + resource_objs = resource_pool.generate_resources(cr, uid, user_ids, calendar_id, context=context) + res[project.id] = resource_objs + return res + + def schedule_phases(self, cr, uid, ids, context=None): + """ + Schedule the phases. + """ + if context is None: + context = {} + if type(ids) in (long, int,): + ids = [ids] + phase_pool = self.pool.get('project.phase') + for project in self.browse(cr, uid, ids, context=context): + phase_ids = phase_pool.search(cr, uid, [('project_id', '=', project.id), + ('state', 'in', ['draft', 'open', 'pending']), + ('previous_phase_ids', '=', False) + ]) + start_date = project.date_start + if not start_date: + start_date = datetime.now().strftime("%Y-%m-%d") + start_dt = datetime.strftime((datetime.strptime(start_date, "%Y-%m-%d")), "%Y-%m-%d %H:%M") + calendar_id = project.resource_calendar_id and project.resource_calendar_id.id or False + phase_pool.generate_schedule(cr, uid, phase_ids, start_dt, calendar_id, context=context) + return True + + def schedule_tasks(self, cr, uid, ids, context=None): + """ + Schedule the tasks according to resource available and priority. + """ + if type(ids) in (long, int,): + ids = [ids] + user_pool = self.pool.get('res.users') + task_pool = self.pool.get('project.task') + resource_pool = self.pool.get('resource.resource') + if context is None: + context = {} + + resources_list = self.generate_members(cr, uid, ids, context=context) + return_msg = {} + for project in self.browse(cr, uid, ids, context=context): + start_date = project.date_start + if not start_date: + start_date = datetime.now().strftime("%Y-%m-%d") + resources = resources_list.get(project.id, []) + calendar_id = project.resource_calendar_id.id + task_ids = task_pool.search(cr, uid, [('project_id', '=', project.id), + ('state', 'in', ['draft', 'open', 'pending']) + ]) + + + if task_ids: + task_pool.generate_schedule(cr, uid, task_ids, resources, calendar_id, start_date, context=context) + else: + warning_msg = _("No tasks to compute for Project '%s'.") % (project.name) + if "warning" not in return_msg: + return_msg["warning"] = warning_msg + else: + return_msg["warning"] = return_msg["warning"] + "\n" + warning_msg + + return return_msg project() -class task(osv.osv): +class resource_resource(osv.osv): + _inherit = "resource.resource" + def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False): + if context is None: + context = {} + if context.get('project_id',False): + project_pool = self.pool.get('project.project') + project_rec = project_pool.browse(cr, uid, context['project_id']) + user_ids = [user_id.id for user_id in project_rec.members] + args.append(('user_id','in',user_ids)) + return super(resource_resource, self).search(cr, uid, args, offset, limit, order, context, count) + +resource_resource() + +class project_task(osv.osv): _inherit = "project.task" _columns = { 'phase_id': fields.many2one('project.phase', 'Project Phase'), - 'occupation_rate': fields.float('Occupation Rate', help='The occupation rate fields indicates how much of his time a user is working on a task. A 100% occupation rate means the user works full time on the tasks. The ending date of a task is computed like this: Starting Date + Duration / Occupation Rate.'), - 'planned_hours': fields.float('Planned Hours', required=True, help='Estimated time to do the task, usually set by the project manager when the task is in draft state.'), - } - _defaults = { - 'occupation_rate': '1' } - def onchange_planned(self, cr, uid, ids, project, user_id=False, planned=0.0, effective=0.0, date_start=None, occupation_rate=0.0): - result = {} - resource = False - resource_obj = self.pool.get('resource.resource') - project_pool = self.pool.get('project.project') - resource_calendar = self.pool.get('resource.calendar') - if not project: - return {'value' : result} - if date_start: - hrs = float(planned / float(occupation_rate)) - calendar_id = project_pool.browse(cr, uid, project).resource_calendar_id.id - dt_start = mx.DateTime.strptime(date_start, '%Y-%m-%d %H:%M:%S') - resource_id = resource_obj.search(cr, uid, [('user_id','=',user_id)]) - if resource_id: - resource_data = resource_obj.browse(cr, uid, resource_id)[0] - resource = resource_data.id - hrs = planned / (float(occupation_rate) * resource_data.time_efficiency) - if resource_data.calendar_id.id: - calendar_id = resource_data.calendar_id.id - work_times = resource_calendar.interval_get(cr, uid, calendar_id, dt_start, hrs or 0.0, resource or False) - if work_times: - result['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S') - result['remaining_hours'] = planned - effective - return {'value' : result} - - def _check_date_start(self, cr, uid, task, date_end, context={}): - """ - Check And Compute date_end of task if change in date_start < older time. - """ - resource_calendar_obj = self.pool.get('resource.calendar') - resource_obj = self.pool.get('resource.resource') - calendar_id = task.project_id.resource_calendar_id and task.project_id.resource_calendar_id.id or False - hours = task.planned_hours / task.occupation_rate - resource_id = resource_obj.search(cr, uid, [('user_id', '=', task.user_id.id)], context=context) - if resource_id: - resource = resource_obj.browse(cr, uid, resource_id[0], context=context) - if resource.calendar_id.id: - calendar_id = resource.calendar_id and resource.calendar_id.id or False - hours = task.planned_hours / (float(task.occupation_rate) * resource.time_efficiency) - work_times = resource_calendar_obj.interval_min_get(cr, uid, calendar_id, date_end, hours or 0.0, resource_id and resource_id[0] or False) - dt_start = work_times[0][0].strftime('%Y-%m-%d %H:%M:%S') - self.write(cr, uid, [task.id], {'date_start' : dt_start,'date_end' : date_end.strftime('%Y-%m-%d %H:%M:%S')}) - - def _check_date_end(self, cr, uid, task, date_start, context={}): - """ - Check And Compute date_end of task if change in date_end > older time. - """ - resource_calendar_obj = self.pool.get('resource.calendar') - resource_obj = self.pool.get('resource.resource') - calendar_id = task.project_id.resource_calendar_id and task.project_id.resource_calendar_id.id or False - hours = task.planned_hours / task.occupation_rate - resource_id = resource_obj.search(cr,uid,[('user_id', '=', task.user_id.id)], context=context) - if resource_id: - resource = resource_obj.browse(cr, uid, resource_id[0], context=context) - if resource.calendar_id.id: - calendar_id = resource.calendar_id and resource.calendar_id.id or False - hours = task.planned_hours / (float(task.occupation_rate) * resource.time_efficiency) - work_times = resource_calendar_obj.interval_get(cr, uid, calendar_id, date_start, hours or 0.0, resource_id and resource_id[0] or False) - dt_end = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S') - self.write(cr, uid, [task.id], {'date_start': date_start.strftime('%Y-%m-%d %H:%M:%S'),'date_end' : dt_end}, context=context) - - def write(self, cr, uid, ids, vals, context={}): - resource_calendar_obj = self.pool.get('resource.calendar') - resource_obj = self.pool.get('resource.resource') - if not context: + def generate_schedule(self, cr, uid, ids, resources, calendar_id, start_date, context=None): + """ + Schedule the tasks according to resource available and priority. + """ + if not ids: + return False + if context is None: context = {} - if context.get('scheduler',False): - return super(task, self).write(cr, uid, ids, vals, context=context) + user_pool = self.pool.get('res.users') + project_pool = self.pool.get('project.project') + priority_dict = {'0': 1000, '1': 800, '2': 500, '3': 300, '4': 100} + # Create dynamic no of tasks with the resource specified + def create_tasks(task_number, eff, priorty=500, obj=False): + def task(): + """ + task is a dynamic method! + """ + effort = eff + if obj: + resource = obj + priority = priorty + task.__doc__ = "TaskNO%d" %task_number + task.__name__ = "task%d" %task_number + return task - # Consider calendar and efficiency if the task is performed by a resource - # otherwise consider the project's working calendar - task_id = ids - if isinstance(ids, list): - task_id = ids[0] - task_rec = self.browse(cr, uid, task_id, context=context) - calendar_id = task_rec.project_id.resource_calendar_id and task_rec.project_id.resource_calendar_id.id or False - hrs = task_rec.planned_hours / task_rec.occupation_rate - resource_id = resource_obj.search(cr, uid, [('user_id', '=', task_rec.user_id.id)], context=context) - if resource_id: - resource = resource_obj.browse(cr, uid, resource_id[0], context=context) - if resource.calendar_id.id: - calendar_id = resource.calendar_id and resource.calendar_id.id or False - hrs = task_rec.planned_hours / (float(task_rec.occupation_rate) * resource.time_efficiency) - - # Change the date_start and date_end - # for previous and next tasks respectively based on valid condition - if vals.get('date_start', False) and vals['date_start'] < task_rec.date_start: - dt_start = mx.DateTime.strptime(vals['date_start'], '%Y-%m-%d %H:%M:%S') - work_times = resource_calendar_obj.interval_get(cr, uid, calendar_id, dt_start, hrs or 0.0, resource.id or False) - if work_times: - vals['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S') - for prv_task in task_rec.parent_ids: - self._check_date_start(cr, uid, prv_task, dt_start) - if vals.get('date_end', False) and vals['date_end'] > task_rec.date_end: - dt_end = mx.DateTime.strptime(vals['date_end'], '%Y-%m-%d %H:%M:%S') - work_times = resource_calendar_obj.interval_min_get(cr, uid, calendar_id, dt_end, hrs or 0.0, resource.id or False) - if work_times: - vals['date_start'] = work_times[0][0].strftime('%Y-%m-%d %H:%M:%S') - for next_task in task_rec.child_ids: - self._check_date_end(cr, uid, next_task, dt_end) + # Create a 'Faces' project with all the tasks and resources + def Project(): + title = "Project" + start = datetime.strftime(datetime.strptime(start_date, "%Y-%m-%d"), "%Y-%m-%d %H:%M") + try: + resource = reduce(operator.or_, resources) + except: + raise osv.except_osv(_('Error'), _('Should have Resources Allocation or Project Members!')) + minimum_time_unit = 1 + if calendar_id: # If project has working calendar + working_days = resource_pool.compute_working_calendar(cr, uid, calendar_id, context=context) + vacation = tuple(resource_pool.compute_vacation(cr, uid, calendar_id, context=context)) + # Dynamic creation of tasks + task_number = 0 + for openobect_task in self.browse(cr, uid, ids, context=context): + hours = str(openobect_task.planned_hours )+ 'H' + if openobect_task.priority in priority_dict.keys(): + priorty = priority_dict[openobect_task.priority] + real_resource = False + if openobect_task.user_id: + for task_resource in resources: + if task_resource.__name__ == task_resource: + real_resource = task_resource + break - return super(task, self).write(cr, uid, ids, vals, context=context) + task = create_tasks(task_number, hours, priorty, real_resource) + task_number += 1 -task() + + face_projects = Task.BalancedProject(Project) + loop_no = 0 + # Write back the computed dates + for face_project in face_projects: + s_date = face_project.start.to_datetime() + e_date = face_project.end.to_datetime() + if loop_no > 0: + ctx = context.copy() + ctx.update({'scheduler': True}) + user_id = user_pool.search(cr, uid, [('name', '=', face_project.booked_resource[0].__name__)]) + self.write(cr, uid, [ids[loop_no-1]], { + 'date_start': s_date.strftime('%Y-%m-%d %H:%M:%S'), + 'date_end': e_date.strftime('%Y-%m-%d %H:%M:%S'), + 'user_id': user_id[0] + }, context=ctx) + + loop_no += 1 + return True +project_task() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project_long_term/project_long_term_data.xml b/addons/project_long_term/project_long_term_data.xml index 32d041544cc..8da591f1337 100644 --- a/addons/project_long_term/project_long_term_data.xml +++ b/addons/project_long_term/project_long_term_data.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <openerp> <data> + <!-- Requests Links --> <record id="req_link_project" model="res.request.link"> <field name="name">Project</field> @@ -10,5 +11,6 @@ <field name="name">Project task</field> <field name="object">project.task</field> </record> + </data> </openerp> diff --git a/addons/project_long_term/project_long_term_demo.xml b/addons/project_long_term/project_long_term_demo.xml index 24bc7ff9438..8a37f4cc444 100644 --- a/addons/project_long_term/project_long_term_demo.xml +++ b/addons/project_long_term/project_long_term_demo.xml @@ -1,912 +1,241 @@ <?xml version="1.0" ?> <openerp> <data noupdate="1"> - <!-- Users --> - - <record id="res_users_demouser1" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="address_id" ref="base.main_address"/> - <field name="context_lang">en_US</field> - <field name="name">Demo User1</field> - <field eval="[(6,0,[ref('base.group_user')])]" name="groups_id"/> - <field name="signature">Mr Demo</field> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Setup')]"/> - <field name="login">demo1</field> - <field name="password">demo1</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <record id="res_users_manager0" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="context_lang">en_US</field> - <field name="name">Manager1</field> - <field eval="[(6,0,[ref('base.group_user'),ref('project.group_project_manager')])]" name="groups_id"/> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Menu')]"/> - <field name="login">manager1</field> - <field name="password">manager1</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <record id="res_users_manager1" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="context_lang">en_US</field> - <field name="name">Manager2</field> - <field eval="[(6,0,[ref('base.group_user'),ref('project.group_project_manager')])]" name="groups_id"/> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Menu')]"/> - <field name="login">manager2</field> - <field name="password">manager2</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <record id="res_users_user0" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="context_lang">en_US</field> - <field name="name">user1</field> - <field eval="[(6,0,[ref('base.group_user'),ref('project.group_project_user')])]" name="groups_id"/> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Menu')]"/> - <field name="login">user1</field> - <field name="password">USER1</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <record id="res_users_user1" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="context_lang">en_US</field> - <field name="name">user2</field> - <field eval="[(6,0,[ref('base.group_user'),ref('project.group_project_user')])]" name="groups_id"/> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Menu')]"/> - <field name="login">user2</field> - <field name="password">user2</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <record id="res_users_userfinance0" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="context_lang">en_US</field> - <field name="name">user_finance</field> - <field eval="[(6,0,[ref('base.group_user'),ref('project.group_project_finance')])]" name="groups_id"/> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Menu')]"/> - <field name="login">user_finance</field> - <field name="password">user_finance</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <record id="res_users_userdesign0" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="context_lang">en_US</field> - <field name="name">user_design1</field> - <field eval="[(6,0,[ref('base.group_user')])]" name="groups_id"/> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Menu')]"/> - <field name="login">user_design1</field> - <field name="password">user_design1</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <record id="res_users_userdesign1" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="context_lang">en_US</field> - <field name="name">user_design2</field> - <field eval="[(6,0,[ref('base.group_user')])]" name="groups_id"/> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Menu')]"/> - <field name="login">user_design2</field> - <field name="password">user_design2</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <record id="res_users_userdeveloper0" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="context_lang">en_US</field> - <field name="name">user_developer1</field> - <field eval="[(6,0,[ref('base.group_user')])]" name="groups_id"/> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Menu')]"/> - <field name="login">user_developer1</field> - <field name="password">user_developer1</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <record id="res_users_userdeveloper1" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="context_lang">en_US</field> - <field name="name">user_developer2</field> - <field eval="[(6,0,[ref('base.group_user')])]" name="groups_id"/> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Menu')]"/> - <field name="login">user_developer2</field> - <field name="password">user_developer1</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <record id="res_users_usertester0" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="context_lang">en_US</field> - <field name="name">user_tester1</field> - <field eval="[(6,0,[ref('base.group_user')])]" name="groups_id"/> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Menu')]"/> - <field name="login">user_tester1</field> - <field name="password">user_tester1</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <record id="res_users_usertester1" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="context_lang">en_US</field> - <field name="name">user_tester2</field> - <field eval="[(6,0,[ref('base.group_user')])]" name="groups_id"/> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Menu')]"/> - <field name="login">user_tester2</field> - <field name="password">user_tester2</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <record id="res_users_useranalyst0" model="res.users"> - <field model="ir.actions.actions" name="menu_id" search="[('name', '=', u'Menu')]"/> - <field name="context_lang">en_US</field> - <field name="name">user_analyst</field> - <field eval="[(6,0,[ref('base.group_user')])]" name="groups_id"/> - <field name="company_id" ref="base.main_company"/> - <field eval="[(6,0,[])]" name="roles_id"/> - <field eval="[(6,0,[])]" name="rules_id"/> - <field eval="1" name="active"/> - <field model="ir.actions.actions" name="action_id" search="[('name', '=', u'Menu')]"/> - <field name="login">user_analyst</field> - <field name="password">user_analyst</field> - <field eval="[(6,0,[])]" name="company_ids"/> - </record> - - <!-- Resources --> - - <record id="resource_resource_analyst0" model="resource.resource"> - <field eval="1.0" name="time_efficiency"/> - <field name="user_id" ref="res_users_useranalyst0"/> +<!-- +This Demo data file Human Resources, Phases and Resources,Tasks allocation and also run scheduling of phase and tasks. +--> + <!-- Human Resources --> + <record id="resource_analyst" model="resource.resource"> + <field name="user_id" ref="project.res_users_analyst"/> <field name="name">Analyst</field> - <field name="company_id" ref="base.main_company"/> - <field eval="1" name="active"/> <field name="calendar_id" ref="resource.timesheet_group1"/> - <field name="resource_type">user</field> </record> - <record id="resource_resource_programmer0" model="resource.resource"> - <field eval="1.0" name="time_efficiency"/> - <field name="user_id" ref="res_users_userdeveloper0"/> - <field name="name">Programmer</field> - <field name="company_id" ref="base.main_company"/> - <field eval="1" name="active"/> + <record id="resource_project_manager" model="resource.resource"> + <field name="user_id" ref="project.res_users_project_manager"/> + <field name="name">Project Manager</field> <field name="calendar_id" ref="resource.timesheet_group1"/> - <field name="resource_type">user</field> </record> - <record id="resource_resource_tester0" model="resource.resource"> - <field eval="1.0" name="time_efficiency"/> - <field name="user_id" ref="res_users_usertester0"/> + <record id="resource_technical_leader" model="resource.resource"> + <field name="user_id" ref="project.res_users_technical_leader"/> + <field name="name">Technical Leader</field> + <field name="calendar_id" ref="resource.timesheet_group1"/> + </record> + + <record id="resource_developer" model="resource.resource"> + <field name="user_id" ref="project.res_users_developer"/> + <field name="name">Developer</field> + <field name="calendar_id" ref="resource.timesheet_group1"/> + </record> + + <record id="resource_designer" model="resource.resource"> + <field name="user_id" ref="project.res_users_designer"/> + <field name="name">Designer</field> + <field name="calendar_id" ref="resource.timesheet_group1"/> + </record> + + <record id="resource_tester" model="resource.resource"> + <field name="user_id" ref="project.res_users_tester"/> <field name="name">Tester</field> - <field name="company_id" ref="base.main_company"/> - <field eval="1" name="active"/> <field name="calendar_id" ref="resource.timesheet_group1"/> - <field name="resource_type">user</field> </record> - <record id="resource_resource_webdesigner0" model="resource.resource"> - <field eval="1.0" name="time_efficiency"/> - <field name="user_id" ref="res_users_userdesign0"/> - <field name="name">Web Designer</field> - <field name="company_id" ref="base.main_company"/> - <field eval="1" name="active"/> + <record id="resource_finacial_manager" model="resource.resource"> + <field name="user_id" ref="project.res_users_finacial_manager"/> + <field name="name">Project Finacial Manager</field> <field name="calendar_id" ref="resource.timesheet_group1"/> - <field name="resource_type">user</field> - </record> - - <!-- Projects --> - <record id="project_project_openerpwebsitedevelopment0" model="project.project"> - <field eval="10" name="sequence"/> - <field name="company_currency_id" ref="base.EUR"/> - <field eval="1" name="active"/> - <field eval="1" name="warn_manager"/> - <field eval="0" name="warn_customer"/> - <field name="date_start">2010-02-25</field> - <field name="company_id" ref="base.main_company"/> - <field eval="1" name="priority"/> - <field name="state">open</field> - <field name="type">normal</field> - <field name="description">Develop an OpenERP Website.</field> - <field eval="[(6,0,[ref('res_users_manager0'),ref('res_users_user0'),ref('res_users_userfinance0'),ref('res_users_userdesign0'),ref('res_users_userdeveloper0'),ref('res_users_usertester0'),ref('res_users_useranalyst0')])]" name="members"/> - <field name="date">2010-04-30</field> - <field name="user_id" ref="base.user_root"/> - <field name="currency_id" ref="base.EUR"/> - <field eval="[(6,0,[])]" name="type_ids"/> - <field name="name">OpenERP Website Development</field> </record> + + + + <!-- Project Phases --> - <record id="project_phase_informationgatheringandunderstanding0" model="project.phase"> - <field eval="[(6,0,[])]" name="previous_phase_ids"/> - <field name="name">Information Gathering and Understanding</field> + <record id="project_phase_1" model="project.phase"> + <field eval="[(6, 0, [])]" name="previous_phase_ids"/> + <field name="name">Collect Requirement and Make SRS</field> + <field name="product_uom" ref="product.uom_day"/> + <field eval="1" name="sequence"/> + <field name="duration">30</field> + <field name="responsible_id" ref="project.res_users_analyst"/> + <field name="project_id" ref="project.project_integrate_openerp"/> + </record> + + <record id="project_phase_2" model="project.phase"> + <field eval="[(6, 0, [ref('project_phase_1')])]" name="previous_phase_ids"/> + <field name="name">Design Model</field> <field name="product_uom" ref="product.uom_day"/> - <field eval="10" name="sequence"/> - <field name="constraint_date_end">2010-03-11 15:37:00</field> - <field name="date_start">2010-02-25 15:33:00</field> - <field name="state">draft</field> - <field name="responsible_id" ref="res_users_demouser1"/> - <field eval="10.0" name="duration"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field name="constraint_date_start">2010-02-24 15:37:00</field> - <field name="date_end">2010-03-10 15:33:00</field> - </record> - - <record id="project_phase_planning0" model="project.phase"> - <field eval="[(6,0,[ref('project_phase_informationgatheringandunderstanding0')])]" name="previous_phase_ids"/> - <field name="name">Planning</field> + <field eval="2" name="sequence"/> + <field name="duration">20</field> + <field name="responsible_id" ref="project.res_users_project_manager"/> + <field name="project_id" ref="project.project_integrate_openerp"/> + </record> + + <record id="project_phase_3" model="project.phase"> + <field eval="[(6, 0, [ref('project_phase_2')])]" name="previous_phase_ids"/> + <field name="name">Planning and compute Risk analysis, Time chart </field> <field name="product_uom" ref="product.uom_day"/> - <field eval="10" name="sequence"/> - <field name="constraint_date_end">2010-03-25 15:49:00</field> - <field name="date_start">2010-02-18 15:48:00</field> - <field name="state">draft</field> - <field name="responsible_id" ref="res_users_manager0"/> - <field eval="7.0" name="duration"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field name="constraint_date_start">2010-02-12 15:49:00</field> - <field name="date_end">2010-03-11 15:48:00</field> - </record> - - <record id="project_phase_webdesign0" model="project.phase"> - <field eval="[(6,0,[ref('project_phase_informationgatheringandunderstanding0'),ref('project_phase_planning0')])]" name="previous_phase_ids"/> - <field name="name">Web Design </field> + <field eval="3" name="sequence"/> + <field name="duration">20</field> + <field name="responsible_id" ref="project.res_users_project_manager"/> + <field name="project_id" ref="project.project_integrate_openerp"/> + </record> + + <record id="project_phase_4" model="project.phase"> + <field eval="[(6, 0, [ref('project_phase_2')])]" name="previous_phase_ids"/> + <field name="name">Development and Integration</field> <field name="product_uom" ref="product.uom_day"/> - <field eval="10" name="sequence"/> - <field name="constraint_date_end">2010-04-15 16:08:00</field> - <field name="date_start">2010-04-01 16:02:00</field> - <field name="state">draft</field> - <field name="responsible_id" ref="res_users_userdesign0"/> - <field eval="10.0" name="duration"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field name="constraint_date_start">2010-03-09 16:00:00</field> - <field name="date_end">2010-04-10 16:02:00</field> - </record> - - <record id="project_phase_developmentintegrationandtesting0" model="project.phase"> - <field eval="[(6,0,[ref('project_phase_informationgatheringandunderstanding0'),ref('project_phase_planning0'),ref('project_phase_webdesign0')])]" name="previous_phase_ids"/> - <field name="name">Development, Integration and Testing</field> + <field eval="4" name="sequence"/> + <field name="duration">90</field> + <field name="responsible_id" ref="project.res_users_technical_leader"/> + <field name="project_id" ref="project.project_integrate_openerp"/> + </record> + + <record id="project_phase_5" model="project.phase"> + <field eval="[(6, 0, [ref('project_phase_4')])]" name="previous_phase_ids"/> + <field name="name">Review and Testing</field> <field name="product_uom" ref="product.uom_day"/> - <field eval="10" name="sequence"/> - <field name="constraint_date_end">2010-04-27 17:29:00</field> - <field name="date_start">2010-04-12 16:10:00</field> - <field name="state">draft</field> - <field name="responsible_id" ref="res_users_manager0"/> - <field eval="15.0" name="duration"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field name="constraint_date_start">2010-03-10 16:11:00</field> - <field name="date_end">2010-04-26 16:10:00</field> - </record> - - <record id="project_phase_websitedeployment0" model="project.phase"> - <field eval="[(6,0,[ref('project_phase_informationgatheringandunderstanding0'),ref('project_phase_planning0'),ref('project_phase_webdesign0'),ref('project_phase_developmentintegrationandtesting0')])]" name="previous_phase_ids"/> - <field name="name">Website Deployment</field> + <field eval="5" name="sequence"/> + <field name="duration">30</field> + <field name="responsible_id" ref="project.res_users_project_manager"/> + <field name="project_id" ref="project.project_integrate_openerp"/> + </record> + + <record id="project_phase_6" model="project.phase"> + <field eval="[(6, 0, [ref('project_phase_5')])]" name="previous_phase_ids"/> + <field name="name">Deployement and Training</field> <field name="product_uom" ref="product.uom_day"/> - <field eval="10" name="sequence"/> - <field name="constraint_date_end">2010-04-30 16:35:00</field> - <field name="date_start">2010-04-26 16:35:00</field> - <field name="state">draft</field> - <field name="responsible_id" ref="res_users_manager0"/> - <field eval="2.0" name="duration"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field name="constraint_date_start">2010-03-10 16:35:00</field> - <field name="date_end">2010-04-27 16:34:00</field> + <field eval="5" name="sequence"/> + <field name="duration">10</field> + <field name="responsible_id" ref="project.res_users_analyst"/> + <field name="project_id" ref="project.project_integrate_openerp"/> </record> <!-- Project Resource Allocation --> - <record id="project_resource_allocation_0" model="project.resource.allocation"> - <field name="resource_id" ref="resource_resource_analyst0"/> - <field name="phase_id" ref="project_phase_informationgatheringandunderstanding0"/> - <field eval="40.0" name="useability"/> + <record id="resource_allocation_1" model="project.resource.allocation"> + <field name="resource_id" ref="resource_analyst"/> + <field name="phase_id" ref="project_phase_1"/> </record> - <record id="project_resource_allocation_1" model="project.resource.allocation"> - <field name="resource_id" ref="resource_resource_programmer0"/> - <field name="phase_id" ref="project_phase_informationgatheringandunderstanding0"/> - <field eval="60.0" name="useability"/> + <record id="resource_allocation_2" model="project.resource.allocation"> + <field name="resource_id" ref="resource_project_manager"/> + <field name="phase_id" ref="project_phase_2"/> </record> - <record id="project_resource_allocation_2" model="project.resource.allocation"> - <field name="resource_id" ref="resource_resource_tester0"/> - <field name="phase_id" ref="project_phase_informationgatheringandunderstanding0"/> - <field eval="40.0" name="useability"/> + <record id="resource_allocation_3" model="project.resource.allocation"> + <field name="resource_id" ref="resource_project_manager"/> + <field name="phase_id" ref="project_phase_3"/> </record> - <record id="project_resource_allocation_3" model="project.resource.allocation"> - <field name="resource_id" ref="resource_resource_analyst0"/> - <field name="phase_id" ref="project_phase_planning0"/> - <field eval="70.0" name="useability"/> + <record id="resource_allocation_4" model="project.resource.allocation"> + <field name="resource_id" ref="resource_technical_leader"/> + <field name="phase_id" ref="project_phase_4"/> </record> - <record id="project_resource_allocation_4" model="project.resource.allocation"> - <field name="resource_id" ref="resource_resource_programmer0"/> - <field name="phase_id" ref="project_phase_planning0"/> - <field eval="70.0" name="useability"/> + <record id="resource_allocation_5" model="project.resource.allocation"> + <field name="resource_id" ref="resource_developer"/> + <field name="phase_id" ref="project_phase_4"/> </record> - <record id="project_resource_allocation_5" model="project.resource.allocation"> - <field name="resource_id" ref="resource_resource_webdesigner0"/> - <field name="phase_id" ref="project_phase_webdesign0"/> - <field eval="80.0" name="useability"/> + <record id="resource_allocation_6" model="project.resource.allocation"> + <field name="resource_id" ref="resource_designer"/> + <field name="phase_id" ref="project_phase_4"/> </record> - <record id="project_resource_allocation_6" model="project.resource.allocation"> - <field name="resource_id" ref="resource_resource_programmer0"/> - <field name="phase_id" ref="project_phase_webdesign0"/> - <field eval="30.0" name="useability"/> + <record id="resource_allocation_7" model="project.resource.allocation"> + <field name="resource_id" ref="resource_tester"/> + <field name="phase_id" ref="project_phase_4"/> </record> - <record id="project_resource_allocation_7" model="project.resource.allocation"> - <field name="resource_id" ref="resource_resource_programmer0"/> - <field name="phase_id" ref="project_phase_developmentintegrationandtesting0"/> - <field eval="100.0" name="useability"/> + <record id="resource_allocation_8" model="project.resource.allocation"> + <field name="resource_id" ref="resource_project_manager"/> + <field name="phase_id" ref="project_phase_5"/> </record> - <record id="project_resource_allocation_8" model="project.resource.allocation"> - <field name="resource_id" ref="resource_resource_tester0"/> - <field name="phase_id" ref="project_phase_developmentintegrationandtesting0"/> - <field eval="50.0" name="useability"/> + <record id="resource_allocation_9" model="project.resource.allocation"> + <field name="resource_id" ref="resource_analyst"/> + <field name="phase_id" ref="project_phase_6"/> </record> <!-- Tasks --> - <record id="project_task_preparerequirementsdocument0" model="project.task"> - <field eval="10" name="sequence"/> - <field name="date_end">2010-03-02 11:00:00</field> - <field eval="24.0" name="planned_hours"/> - <field name="user_id" ref="res_users_user0"/> - <field name="date_start">2010-02-24 05:00:00</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Prepare Requirements Document</field> - <field name="date_deadline">2010-03-08</field> - <field eval="24.0" name="total_hours"/> - <field eval="24.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_informationgatheringandunderstanding0"/> - </record> - - <record id="project_task_definewebsitegoalspurposesandtargetaudience0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="65.0" name="planned_hours"/> - <field name="user_id" ref="res_users_useranalyst0"/> - <field name="date_start">2010-02-25 15:38:08</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Define Website Goals, Purposes and Target Audience</field> - <field name="date_deadline">2010-03-04</field> - <field eval="65.0" name="total_hours"/> - <field eval="65.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_informationgatheringandunderstanding0"/> - </record> - - <record id="project_task_usecases0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="16.0" name="planned_hours"/> - <field name="user_id" ref="res_users_userdesign0"/> - <field name="date_start">2010-02-25 15:42:42</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Use Cases</field> - <field name="date_deadline">2010-03-10</field> - <field eval="16.0" name="total_hours"/> - <field eval="16.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_informationgatheringandunderstanding0"/> - </record> - - <record id="project_task_budgetplanning0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="25.0" name="planned_hours"/> - <field name="user_id" ref="res_users_userfinance0"/> - <field name="date_start">2010-02-25 15:51:00</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Budget Planning</field> - <field name="date_deadline">2010-03-31</field> - <field eval="25.0" name="total_hours"/> - <field eval="25.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_planning0"/> - </record> - - <record id="project_task_qualityplanning0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="25.0" name="planned_hours"/> - <field name="user_id" ref="res_users_user0"/> - <field name="date_start">2010-02-25 15:54:42</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Quality Planning</field> - <field name="date_deadline">2010-03-31</field> - <field eval="25.0" name="total_hours"/> - <field eval="25.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_planning0"/> - </record> - - <record id="project_task_riskmanagementplanning0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="20.0" name="planned_hours"/> - <field name="user_id" ref="res_users_user1"/> - <field name="date_start">2010-02-25 15:55:11</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Risk Management Planning</field> - <field name="date_deadline">2010-03-31</field> - <field eval="20.0" name="total_hours"/> - <field eval="20.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_planning0"/> - </record> - - <record id="project_task_createprojectschedules0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="30.0" name="planned_hours"/> - <field name="user_id" ref="res_users_manager0"/> - <field name="date_start">2010-02-25 15:57:48</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Create Project Schedules</field> - <field name="date_deadline">2010-03-31</field> - <field eval="30.0" name="total_hours"/> - <field eval="30.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_planning0"/> - </record> - - <record id="project_task_dataflowdesign0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="10.0" name="planned_hours"/> - <field name="user_id" ref="res_users_manager0"/> - <field name="date_start">2010-02-25 16:04:16</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Dataflow Design</field> - <field name="date_deadline">2010-04-02</field> - <field eval="10.0" name="total_hours"/> - <field eval="10.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_webdesign0"/> - </record> - - <record id="project_task_userinterfacedesign0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="50.0" name="planned_hours"/> - <field name="user_id" ref="res_users_userdesign0"/> - <field name="date_start">2010-02-25 16:05:43</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">User Interface Design</field> - <field name="date_deadline">2010-04-10</field> - <field eval="50.0" name="total_hours"/> - <field eval="50.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_webdesign0"/> - </record> - - <record id="project_task_tasklevelwbs0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="40.0" name="planned_hours"/> - <field name="user_id" ref="res_users_userdesign0"/> - <field name="date_start">2010-02-25 16:06:52</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Task Level WBS</field> - <field name="date_deadline">2010-04-07</field> - <field eval="40.0" name="total_hours"/> - <field eval="40.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_webdesign0"/> - </record> - - <record id="project_task_modularprogramming0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="90.0" name="planned_hours"/> - <field name="user_id" ref="res_users_userdeveloper0"/> - <field name="date_start">2010-02-25 16:11:40</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Modular Programming</field> - <field name="date_deadline">2010-04-22</field> - <field eval="90.0" name="total_hours"/> - <field eval="90.0" name="remaining_hours"/> - </record> - - <record id="project_task_integratemodules0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="20.0" name="planned_hours"/> - <field name="user_id" ref="res_users_userdeveloper1"/> - <field name="date_start">2010-02-25 16:13:10</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Integrate Modules</field> - <field name="date_deadline">2010-04-24</field> - <field eval="20.0" name="total_hours"/> - <field eval="20.0" name="remaining_hours"/> - </record> - - <record id="project_task_unittesting0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="30.0" name="planned_hours"/> - <field name="user_id" ref="res_users_usertester0"/> - <field name="date_start">2010-02-25 16:14:32</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Unit Testing</field> - <field name="date_deadline">2010-04-24</field> - <field eval="30.0" name="total_hours"/> - <field eval="30.0" name="remaining_hours"/> - </record> - - <record id="project_task_regressiontest0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="30.0" name="planned_hours"/> - <field name="user_id" ref="res_users_usertester0"/> - <field name="date_start">2010-02-25 16:15:38</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Regression Test</field> - <field name="date_deadline">2010-04-24</field> - <field eval="30.0" name="total_hours"/> - <field eval="30.0" name="remaining_hours"/> - </record> - - <record id="project_task_documentation0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="15.0" name="planned_hours"/> - <field name="user_id" ref="res_users_demouser1"/> - <field name="date_start">2010-02-25 16:17:04</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Documentation</field> - <field name="date_deadline">2010-04-24</field> - <field eval="15.0" name="total_hours"/> - <field eval="15.0" name="remaining_hours"/> - </record> - - <record id="project_task_performancetuning0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="40.0" name="planned_hours"/> - <field name="user_id" ref="res_users_usertester1"/> - <field name="date_start">2010-02-25 16:17:42</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Performance Tuning</field> - <field name="date_deadline">2010-04-24</field> - <field eval="40.0" name="total_hours"/> - <field eval="40.0" name="remaining_hours"/> - </record> - - <record id="project_task_deploywebsite0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="5.0" name="planned_hours"/> - <field name="user_id" ref="res_users_userdeveloper0"/> - <field name="date_start">2010-02-25 16:21:15</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Deploy Website</field> - <field name="date_deadline">2010-04-26</field> - <field eval="5.0" name="total_hours"/> - <field eval="5.0" name="remaining_hours"/> - </record> - - <record id="project_task_presentation0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="5.0" name="planned_hours"/> - <field name="user_id" ref="res_users_demouser1"/> - <field name="date_start">2010-02-25 16:22:09</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Presentation</field> - <field name="date_deadline">2010-04-28</field> - <field eval="5.0" name="total_hours"/> - <field eval="5.0" name="remaining_hours"/> - </record> - - <record id="project_task_deployment0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="5.0" name="planned_hours"/> - <field name="user_id" ref="res_users_userdeveloper0"/> - <field name="date_start">2010-02-25 16:36:02</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Deployment</field> - <field name="date_deadline">2010-04-28</field> - <field eval="5.0" name="total_hours"/> - <field eval="5.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_websitedeployment0"/> - </record> - - <record id="project_task_presentation1" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="5.0" name="planned_hours"/> - <field name="user_id" ref="res_users_demouser1"/> - <field name="date_start">2010-02-25 16:36:43</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Presentation</field> - <field name="date_deadline">2010-04-29</field> - <field eval="5.0" name="total_hours"/> - <field eval="5.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_websitedeployment0"/> - </record> - - <record id="project_task_modulesintegration0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="20.0" name="planned_hours"/> - <field name="user_id" ref="res_users_userdeveloper1"/> - <field name="date_start">2010-02-25 17:22:46</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Modules Integration</field> - <field name="date_deadline">2010-04-24</field> - <field eval="20.0" name="total_hours"/> - <field eval="20.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_developmentintegrationandtesting0"/> - </record> - - <record id="project_task_unittesting1" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="30.0" name="planned_hours"/> - <field name="user_id" ref="res_users_usertester0"/> - <field name="date_start">2010-02-25 17:34:32</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Unit Testing</field> - <field name="date_deadline">2010-04-24</field> - <field eval="30.0" name="total_hours"/> - <field eval="30.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_developmentintegrationandtesting0"/> - </record> - - <record id="project_task_modulartesting0" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="20.0" name="planned_hours"/> - <field name="user_id" ref="res_users_userdeveloper1"/> - <field name="date_start">2010-02-25 17:35:46</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Modular Testing</field> - <field name="date_deadline">2010-04-24</field> - <field eval="20.0" name="total_hours"/> - <field eval="20.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_developmentintegrationandtesting0"/> - </record> - - <record id="project_task_documentation1" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="10.0" name="planned_hours"/> - <field name="user_id" ref="res_users_demouser1"/> - <field name="date_start">2010-02-25 17:36:27</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Documentation</field> - <field name="date_deadline">2010-04-28</field> - <field eval="10.0" name="total_hours"/> - <field eval="10.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_developmentintegrationandtesting0"/> - </record> - - <record id="project_task_performancetuning1" model="project.task"> - <field eval="10" name="sequence"/> - <field eval="30.0" name="planned_hours"/> - <field name="user_id" ref="res_users_usertester1"/> - <field name="date_start">2010-02-25 17:37:03</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Performance Tuning</field> - <field name="date_deadline">2010-04-27</field> - <field eval="30.0" name="total_hours"/> - <field eval="30.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_developmentintegrationandtesting0"/> - </record> - - <record id="project_task_modularprogramming1" model="project.task"> - <field eval="10" name="sequence"/> - <field name="date_end">2010-03-12 18:00:00</field> - <field eval="100.0" name="planned_hours"/> - <field name="user_id" ref="res_users_userdeveloper0"/> - <field name="date_start">2010-03-01 12:00:00</field> - <field name="company_id" ref="base.main_company"/> - <field name="priority">2</field> - <field name="state">draft</field> - <field eval="1.0" name="occupation_rate"/> - <field name="project_id" ref="project_project_openerpwebsitedevelopment0"/> - <field eval="[(6,0,[])]" name="child_ids"/> - <field eval="[(6,0,[])]" name="parent_ids"/> - <field eval="1" name="active"/> - <field name="name">Modular Programming</field> - <field name="date_deadline">2010-04-22</field> - <field eval="100.0" name="total_hours"/> - <field eval="100.0" name="remaining_hours"/> - <field name="phase_id" ref="project_phase_developmentintegrationandtesting0"/> + + <record id="project.project_task_1" model="project.task"> + <field name="phase_id" ref="project_phase_1"/> + </record> + + <record id="project.project_task_2" model="project.task"> + <field name="phase_id" ref="project_phase_1"/> + </record> + + <record id="project.project_task_3" model="project.task"> + <field name="phase_id" ref="project_phase_2"/> + </record> + + <record id="project.project_task_4" model="project.task"> + <field name="phase_id" ref="project_phase_3"/> </record> + + <record id="project.project_task_5" model="project.task"> + <field name="phase_id" ref="project_phase_3"/> + </record> + + <record id="project.project_task_6" model="project.task"> + <field name="phase_id" ref="project_phase_3"/> + </record> + + <record id="project.project_task_7" model="project.task"> + <field name="phase_id" ref="project_phase_3"/> + </record> + + <record id="project.project_task_8" model="project.task"> + <field name="phase_id" ref="project_phase_3"/> + </record> + + <record id="project.project_task_9" model="project.task"> + <field name="phase_id" ref="project_phase_3"/> + </record> + + <record id="project.project_task_10" model="project.task"> + <field name="phase_id" ref="project_phase_4"/> + </record> + + <record id="project.project_task_11" model="project.task"> + <field name="phase_id" ref="project_phase_4"/> + </record> + + <record id="project.project_task_12" model="project.task"> + <field name="phase_id" ref="project_phase_4"/> + </record> + + <record id="project.project_task_13" model="project.task"> + <field name="phase_id" ref="project_phase_4"/> + </record> + + <record id="project.project_task_14" model="project.task"> + <field name="phase_id" ref="project_phase_4"/> + </record> + + <record id="project.project_task_15" model="project.task"> + <field name="phase_id" ref="project_phase_4"/> + </record> + + <record id="project.project_task_16" model="project.task"> + <field name="phase_id" ref="project_phase_4"/> + </record> + + <record id="project.project_task_17" model="project.task"> + <field name="phase_id" ref="project_phase_6"/> + </record> + + <record id="project.project_task_18" model="project.task"> + <field name="phase_id" ref="project_phase_6"/> + </record> + + <!-- run scheduling of phase --> + <function model="project.project" name="schedule_phases" eval="(ref('project.project_integrate_openerp'),)"/> + <!-- run scheduling of tasks --> + <function model="project.project" name="schedule_tasks" eval="(ref('project.project_integrate_openerp'),)"/> + </data> -</openerp>
\ No newline at end of file +</openerp> diff --git a/addons/project_long_term/project_long_term_report.xml b/addons/project_long_term/project_long_term_report.xml index 3bbbce1874c..d8fe2a4fa6e 100644 --- a/addons/project_long_term/project_long_term_report.xml +++ b/addons/project_long_term/project_long_term_report.xml @@ -1,7 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <openerp> <data> + <report auto="False" id="report_project_task_gantt" model="project.task" name="project.tasks.gantt" string="Gantt Representation"/> <report auto="False" id="report_project_project_gantt" model="project.project" name="project.project.gantt" string="Gantt Representation"/> + </data> </openerp> diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index e681b0da57f..79f11af4bbd 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -2,21 +2,53 @@ <openerp> <data> - <menuitem id="menu_project_long_term" name="Long Term Planning" parent="base.menu_main_pm" sequence="1"/> + <menuitem id="base.menu_project_long_term" name="Long Term Planning" parent="base.menu_main_pm" sequence="1"/> # ------------------------------------------------------ # Project Resource Allocation # ------------------------------------------------------ + <record id="view_project_resource_allocation_gantt" model="ir.ui.view"> + <field name="name">project.resource.allocation.gantt</field> + <field name="model">project.resource.allocation</field> + <field name="type">gantt</field> + <field name="arch" type="xml"> + <gantt color="project_id" date_start="date_start" date_stop="date_end" mode="year"> + <level object="res.users" link="user_id" domain="[]"> + <field name="name"/> + </level> + </gantt> + </field> + </record> + + <record id="view_project_resource_allocation_calendar" model="ir.ui.view"> + <field name="name">project.resource.allocation.calendar</field> + <field name="model">project.resource.allocation</field> + <field name="type">calendar</field> + <field eval="2" name="priority"/> + <field name="arch" type="xml"> + <calendar color="resource_id" date_start="date_start" date_stop="date_end" day_length="12" string="Resources"> + <field name="phase_id"/> + <field name="project_id"/> + </calendar> + </field> + </record> + + <record id="view_project_resource_allocation_form" model="ir.ui.view"> <field name="name">project.resource.allocation.form</field> <field name="model">project.resource.allocation</field> <field name="type">form</field> <field name="arch" type="xml"> <form string="Project Resource Allocation"> - <field name="resource_id" select="1"/> - <field name="phase_id"/> - <field name="useability"/> + <group colspan="4" col="6"> + <field name="resource_id"/> + <field name="phase_id"/> + <field name="project_id"/> + <field name="date_start"/> + <field name="date_end"/> + <field name="useability" string="Availability"/> + </group> </form> </field> </record> @@ -29,7 +61,8 @@ <field name="arch" type="xml"> <tree editable="bottom" string="Project Resource Allocation"> <field name="resource_id"/> - <field name="phase_id"/> + <field name="phase_id"/> + <field name="project_id"/> <field name="useability"/> </tree> </field> @@ -40,27 +73,29 @@ <field name="model">project.resource.allocation</field> <field name="type">search</field> <field name="arch" type="xml"> - <search string="Resource Allocations"> + <search string="Resources Allocation"> <group colspan="4" col="20"> - <field name="resource_id" widget="selection"/> - <field name="phase_id" widget="selection"/> + <field name="resource_id"/> + <field name="phase_id"/> + <field name="project_id"/> </group> <newline/> - <group expand="1" string="Group By..." colspan="4" col="20"> - <filter name="resource" string="Resource" icon="terp-folder-blue" domain="[]" context="{'group_by':'resource_id'}"/> + <group expand="0" string="Group By..." colspan="4" col="20"> + <filter name="resource" string="Resource" icon="terp-personal" domain="[]" context="{'group_by':'resource_id'}"/> + <separator orientation="vertical"/> + <filter string="Project" icon="terp-folder-violet" domain="[]" context="{'group_by':'project_id'}"/> <filter string="Phase" icon="terp-project" domain="[]" context="{'group_by':'phase_id'}"/> </group> </search> </field> </record> - <record id="act_resouce_allocation" model="ir.actions.act_window"> - <field name="name">Resource Allocations</field> + <field name="name">Resources Allocation</field> <field name="res_model">project.resource.allocation</field> <field name="view_type">form</field> - <field name="view_mode">tree,form</field> - <field name="context">{'search_default_resource': 1} </field> - <!--<field name="search_view_id" ref="view_project_phase_search"/>--> + <field name="view_mode">gantt,tree,form,calendar</field> + <field name="context">{}</field> + <field name="search_view_id" ref="view_project_resource_allocation_search"/> </record> @@ -75,60 +110,52 @@ <field name="arch" type="xml"> <form string="Project Phase"> <group colspan="6" col="6"> - <field name="name" select="1"/> - <field name="project_id" on_change="onchange_project(project_id)"/> - <field name="responsible_id"/> - </group> - <group colspan="6" col="6"> - <field name="duration" /> - <field name="product_uom" nolabel="1" domain="[('category_id.name', '=', 'Working Time')]"/> - <field name="date_start"/> - <field name="date_end"/> + <group colspan="6" col="6" > + <field name="name" select="1"/> + <field name="project_id" on_change="onchange_project(project_id)"/> + <field name="responsible_id"/> + </group> + <group colspan="6" col="6"> + <field name="date_start"/> + <field name="duration" on_change="onchange_days(project_id)" /> + <field name="product_uom" nolabel="1" domain="[('category_id.name', '=', 'Working Time')]"/> + <field name="date_end"/> + </group> </group> <notebook colspan="4"> <page string="Resource Allocation"> <field colspan="4" name="resource_ids" nolabel="1"> <tree editable="bottom" string="Project Resource Allocation"> <field name="resource_id" context="{'project_id':parent.project_id}"/> + <field name="date_start"/> + <field name="date_end"/> <field name="useability"/> </tree> <form string="Project Resource Allocation"> <field name="resource_id" context="{'project_id':parent.project_id}"/> + <field name="date_start"/> + <field name="date_end"/> <field name="useability"/> </form> </field> <separator string="" colspan="4"/> <group col="12" colspan="4"> <field name="state" select="1"/> + <button string="Cancel" name="set_cancel" states="draft,open,pending" icon="gtk-cancel"/> <button string="Draft" name="set_draft" states="open" icon="gtk-indent"/> - <button string="Start Phase" name="set_open" states="pending,draft" icon="gtk-execute"/> - <button string="Done" name="set_done" states="draft,pending,open" icon="gtk-apply"/> <button string="Pending" name="set_pending" states="open" icon="gtk-media-pause"/> - <button string="Cancel" name="set_cancel" states="draft,open,pending" icon="gtk-cancel"/> + <button string="Done" name="set_done" states="pending,open" icon="terp-dialog-close"/> + <button string="Start Phase" name="set_open" states="pending,draft" icon="gtk-execute"/> </group> </page> - <page string="Other Info"> - <group colspan="2" col="2"> - <separator string="Constraints" colspan="2"/> - <field name="constraint_date_start"/> - <field name="constraint_date_end"/> - </group> - <group colspan="2" col="2"> - <separator string="Scheduling" colspan="2"/> - <field name="sequence"/> - </group> - <separator colspan="4" string="Previous Phases"/> - <field colspan="4" name="previous_phase_ids" nolabel="1"/> - <separator colspan="4" string="Next Phases"/> - <field colspan="4" name="next_phase_ids" nolabel="1"/> - </page> <page string="Task Detail"> - <separator colspan="4" string="Project's Tasks"/> <field colspan="4" name="task_ids" context="{'default_project_id' :project_id}" nolabel="1"> <tree editable="bottom" string="Project's Tasks"> <field name="name"/> <field name="user_id"/> - <field name="planned_hours" widget="float_time" on_change="onchange_planned(project_id, user_id, planned_hours, effective_hours)"/> + <field name="planned_hours" widget="float_time"/> + <field name="project_id" invisible="1"/> + <field name="total_hours" sum='Total Hours'/> </tree> <form string="Project's Tasks"> <notebook colspan="4"> @@ -142,11 +169,11 @@ <separator string="Dates" colspan="2"/> <field name="date_start"/> <field name="date_deadline"/> - <field name="occupation_rate"/> </group> <group colspan="2" col="2"> <separator string="Planning" colspan="2"/> - <field name="planned_hours" widget="float_time" on_change="onchange_planned(project_id, user_id, planned_hours, effective_hours)"/> + <field name="planned_hours" widget="float_time"/> + <field name="total_hours" widget="float_time"/> <field name="remaining_hours" widget="float_time" sum="Remaining Hours"/> <field name="effective_hours" invisible="1"/> </group> @@ -157,7 +184,22 @@ </notebook> </form> </field> - <button name="%(action_project_schedule_tasks)d" string="Schedule Tasks" type="action" icon="gtk-jump-to"/> + <button name="%(action_project_schedule_tasks)d" string="Schedule Tasks" type="action" icon="gtk-jump-to"/> + </page> + <page string="Other Info"> + <group colspan="2" col="2"> + <separator string="Constraints" colspan="2"/> + <field name="constraint_date_start"/> + <field name="constraint_date_end"/> + </group> + <group colspan="2" col="2"> + <separator string="Scheduling" colspan="2"/> + <field name="sequence"/> + </group> + <separator colspan="4" string="Previous Phases"/> + <field colspan="4" name="previous_phase_ids" nolabel="1"/> + <separator colspan="4" string="Next Phases"/> + <field colspan="4" name="next_phase_ids" nolabel="1"/> </page> </notebook> <newline/> @@ -171,14 +213,11 @@ <field name="type">tree</field> <field name="priority" eval="5"/> <field name="arch" type="xml"> - <tree string="Project Phases"> + <tree colors="grey:state in ('cancelled','done');blue:state in ('pending')" string="Project Phases"> <field name="name"/> <field name="project_id" on_change="onchange_project(project_id)"/> <field name="responsible_id"/> <field name="date_start"/> - <!--<field name="date_end"/> - <field name="duration"/> - <field name="product_uom"/>--> <field name="state"/> </tree> </field> @@ -190,9 +229,9 @@ <field name="type">calendar</field> <field eval="2" name="priority"/> <field name="arch" type="xml"> - <calendar color="responsible_id" date_start="date_start" date_stop="date_end" day_length="12" string="Phases"> + <calendar color="project_id" date_start="date_start" date_stop="date_end" day_length="12"> <field name="name"/> - <field name="project_id"/> + <field name="responsible_id"/> </calendar> </field> </record> @@ -203,7 +242,7 @@ <field name="type">gantt</field> <field eval="2" name="priority"/> <field name="arch" type="xml"> - <gantt color="responsible_id" date_stop="date_end" date_start="date_start" string="Phases"> + <gantt color="project_id" date_stop="date_end" date_start="date_start" mode="month"> <level object="project.project" link="project_id" domain="[]"> <field name="name"/> </level> @@ -218,23 +257,26 @@ <field name="arch" type="xml"> <search string="Project Phases"> <group colspan="4" col="20"> - <filter string="Draft" domain="[('state','=','draft')]" help="Draft Phases" icon="terp-check" default="1"/> + <filter string="Draft" domain="[('state','=','draft')]" help="Draft Phases" icon="terp-document-new" default="1"/> <filter string="In Progress" name="Progress" domain="[('state','=','open')]" help="Open Phases" icon="terp-camera_test"/> <filter string="Pending" domain="[('state','=','pending')]" help="Pending Phases" icon="terp-gtk-media-pause"/> <separator orientation="vertical"/> <field name="name"/> - <field name="project_id" widget="selection"> - <filter domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-folder-blue"/> + <field name="project_id"> + <filter domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-folder-violet"/> </field> - <field name="responsible_id" widget="selection"/> + <field name="responsible_id"/> <field name="date_start"/> </group> <newline/> - <group expand="1" string="Group By..." colspan="4" col="20" groups="base.group_extended"> - <filter string="Project" icon="terp-folder-blue" domain="[]" context="{'group_by':'project_id'}"/> + <group expand="0" string="Group By..." colspan="4" col="20" groups="base.group_extended"> + <filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'responsible_id'}"/> + <separator orientation="vertical"/> + <filter string="Project" icon="terp-folder-violet" domain="[]" context="{'group_by':'project_id'}" name="project"/> + <separator orientation="vertical"/> <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/> - <filter string="User" icon="terp-personal" domain="[]" context="{'group_by':'responsible_id'}"/> - <filter string="Start Date" icon="terp-gtk-jump-to-ltr" domain="[]" context="{'group_by':'date_start'}"/> + <separator orientation="vertical"/> + <filter string="Month" icon="terp-go-month" domain="[]" context="{'group_by':'date_start'}" help="Start Month"/> </group> </search> </field> @@ -245,16 +287,27 @@ <field name="res_model">project.phase</field> <field name="view_type">form</field> <field name="view_mode">gantt,tree,form,calendar</field> - <field name="context">{'search_default_responsible_id':uid}</field> + <field name="context">{'search_default_responsible_id':uid,'search_default_project':1}</field> + <field name="search_view_id" ref="view_project_phase_search"/> + <field name="help">A project can be split into the different phases. For each phase, you can define your resources allocation, describe different tasks and link your phase to previous and next ones, add date constraints for the automated scheduling. Use the long term planning in order to planify your available human resources, convert your phases into a series of tasks when you start working on it.</field> + </record> + + <record id="act_project_phase_list" model="ir.actions.act_window"> + <field name="name">Project Phases</field> + <field name="res_model">project.phase</field> + <field name="view_type">form</field> + <field name="view_mode">tree,form,calendar</field> + <field name="context">{'search_default_responsible_id':uid,'search_default_project':1}</field> <field name="search_view_id" ref="view_project_phase_search"/> </record> + # ------------------------------------------------------ # Project # ------------------------------------------------------ - <record id="view_phase_project_form1" model="ir.ui.view"> - <field name="name">phase.project.form1</field> + <record id="project.view_project_resource_form1" model="ir.ui.view"> + <field name="name">Project Resource Calendar View</field> <field name="model">project.project</field> <field name="type">form</field> <field name="inherit_id" ref="project.edit_project"/> @@ -270,41 +323,63 @@ # Project Task # ------------------------------------------------------ - <record id="view_project_phase_task_form1" model="ir.ui.view"> - <field name="name">project.phase.task.form1</field> + <record id="view_phase_task_form2" model="ir.ui.view"> + <field name="name">phase.task.form2</field> <field name="model">project.task</field> <field name="type">form</field> <field name="inherit_id" ref="project.view_task_form2"/> <field name="arch" type="xml"> - <field name="planned_hours" position="replace"> - <field name="planned_hours" widget="float_time" attrs="{'readonly':[('state','!=','draft')]}" on_change="onchange_planned(project_id, user_id, planned_hours, effective_hours, date_start, occupation_rate)"/> + <field name="sequence" position="after"> + <field name="phase_id"/> </field> + </field> + </record> + <record id="view_phase_task_search_form" model="ir.ui.view"> + <field name="name">phase.task.search.form</field> + <field name="model">project.task</field> + <field name="type">search</field> + <field name="inherit_id" ref="project.view_task_search_form"/> + <field name="arch" type="xml"> + <field name="project_id" position="after"> + <field name="phase_id" select="1"/> + </field> + </field> + </record> + <record id="view_phase_task_search_form_group" model="ir.ui.view"> + <field name="name">phase.task.search.form.group</field> + <field name="model">project.task</field> + <field name="type">search</field> + <field name="inherit_id" ref="project.view_task_search_form"/> + <field name="arch" type="xml"> + <filter string="Project" name="group_project_id" icon="terp-folder-violet" domain="[]" context="{'group_by':'project_id'}" position="after"> + <filter string="Project Phase" name="group_project_id_phase" icon="terp-folder-violet" domain="[]" context="{'group_by':'phase_id'}" groups="base.group_extended"/> + </filter> </field> - </record> + </record> - <record id="view_project_phase_task_form2" model="ir.ui.view"> - <field name="name">project.phase.task.form2</field> + <record id="view_phase_task_search_form_tree" model="ir.ui.view"> + <field name="name">phase.task.search.form.tree</field> <field name="model">project.task</field> - <field name="type">form</field> - <field name="inherit_id" ref="project.view_task_form2"/> + <field name="type">tree</field> + <field name="inherit_id" ref="project.view_task_tree2"/> <field name="arch" type="xml"> - <field name="date_end" position = "after"> - <field name="occupation_rate"/> + <field name="project_id" position="after"> + <field name="phase_id" invisible="1" groups="base.group_extended"/> </field> </field> - </record> + </record> - <act_window + <act_window id="project_phase_task_list" name="Related Tasks" res_model="project.task" src_model="project.phase" view_mode="tree,form" - domain="[('phase_id','=',active_id)]"/> + context="{'search_default_phase_id': [active_id]}"/> - <act_window - domain="[('project_id', '=', active_id)]" + <act_window + context="{'search_default_project_id': [active_id]}" id="act_project_phases" name="Phases" res_model="project.phase" @@ -316,20 +391,25 @@ # Menu Items # ------------------------------------------------------ + <menuitem action="act_project_phase_list" + groups="base.group_extended" + id="menu_project_phase_list" parent="project.menu_project_management" sequence="2"/> + <menuitem action="act_project_phase" + icon="STOCK_INDENT" groups="base.group_extended" - id="menu_project_phase" parent="menu_project_long_term" sequence="4"/> + id="menu_project_phase" parent="base.menu_project_long_term" sequence="1"/> - <menuitem id="menu_resouce_allocation" action="act_resouce_allocation" - name="Resource Allocations" parent="menu_project_long_term" /> + <menuitem id="menu_resouce_allocation" action="act_resouce_allocation" + icon="STOCK_INDENT" + name="Resource Allocations" parent="base.menu_project_long_term" sequence="2"/> - <!--<menuitem icon="terp-project" id="base.menu_main_pm" name="Project Management" sequence="1"/>--> <menuitem id="menu_pm_resources_project1" groups="base.group_extended" - name="Resources" parent="base.menu_main_pm" sequence="2"/> + name="Resources" parent="project.menu_definitions" sequence="3"/> - <menuitem id="menu_phase_schedule" name="Scheduling" parent="menu_project_long_term"/> - <menuitem action="resource.action_resource_resource_tree" id="menu_view_resource" parent="menu_pm_resources_project1" sequence="1"/> + <menuitem id="menu_phase_schedule" name="Scheduling" parent="base.menu_main_pm" sequence="4" groups="project.group_project_user,project.group_project_manager"/> + <menuitem action="resource.action_resource_resource_tree" id="menu_view_resource" parent="menu_pm_resources_project1" sequence="2"/> <menuitem action="resource.action_resource_calendar_form" id="menu_view_resource_calendar" parent="menu_pm_resources_project1" sequence="1"/> <menuitem action="resource.action_resource_calendar_leave_tree" id="menu_view_resource_calendar_leaves" parent="menu_pm_resources_project1" sequence="1"/> diff --git a/addons/project_long_term/project_long_term_wizard.xml b/addons/project_long_term/project_long_term_wizard.xml deleted file mode 100644 index fa546b9e86f..00000000000 --- a/addons/project_long_term/project_long_term_wizard.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<openerp> - <data> - - <!--<wizard id="wizard_compute_phase" menu="False" model="project.phase" name="wizard.compute.phases" string="Compute Phase Scheduling"/>--> - <!--<wizard id="wizard_schedule_task" menu="False" model="project.phase" name="phase.schedule.tasks" string="Schedule Tasks"/>--> - <!--<wizard id="wizard_compute_task" model="project.task" menu="False" name="wizard.compute.tasks" string="Compute Task Scheduling"/>--> - - <menuitem icon="terp-project" id="base.menu_main" name="Project Management" sequence="1"/> - <!--<menuitem id="base.menu_pm_planning" name="Planning" parent="base.menu_main" sequence="3"/>--> - <!-- <menuitem - action="wizard_compute_phase" - id="menu_wizard_compute_phase" - parent="base.menu_pm_planning" - type="wizard" - sequence="1"/> ---> -<!-- <menuitem - action="wizard_compute_task" - id="menu_wizard_compute_task" - parent="base.menu_pm_planning" - type="wizard" - sequence="1"/> ---> - </data> -</openerp> diff --git a/addons/project_long_term/project_long_term_workflow.xml b/addons/project_long_term/project_long_term_workflow.xml index f476ac16cd6..3a821ddd274 100644 --- a/addons/project_long_term/project_long_term_workflow.xml +++ b/addons/project_long_term/project_long_term_workflow.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <openerp> <data> + <record id="wkf_phase" model="workflow"> <field name="name">project.phase.wkf</field> <field name="osv">project.phase</field> @@ -104,5 +105,6 @@ <field name="act_to" ref="act_draft"/> <field name="signal">set_draft</field> </record> + </data> -</openerp>
\ No newline at end of file +</openerp> diff --git a/addons/project_long_term/security/ir.model.access.csv b/addons/project_long_term/security/ir.model.access.csv index 7a91ce257ed..3aaebb64294 100644 --- a/addons/project_long_term/security/ir.model.access.csv +++ b/addons/project_long_term/security/ir.model.access.csv @@ -1,3 +1,9 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_project_phase","project.phase","model_project_phase",,1,1,1,1 -"access_project_resource_allocation","project.resource.allocation","model_project_resource_allocation",,1,1,1,1 +"access_project_phase","project.phase","model_project_phase","project.group_project_user",1,1,1,0 +"access_project_resource_allocation","project.resource.allocation","model_project_resource_allocation","project.group_project_user",1,0,0,0 +"access_project_phase_manager","project.phase manager","model_project_phase","project.group_project_manager",1,0,0,0 +"access_project_resource_allocation_manager","project.resource.allocation manager","model_project_resource_allocation","project.group_project_manager",1,0,0,0 +"access_resource_resource_user","resource.resource user","resource.model_resource_resource","project.group_project_user",1,0,0,0 +"access_resource_calendar_leaves_user","resource.calendar.leaves user","resource.model_resource_calendar_leaves","project.group_project_user",1,1,1,1 +"access_resource_resource_manager","resource.resource manager","resource.model_resource_resource","project.group_project_manager",1,1,1,1 +"access_project_resource_allocation_manager","project.resource.allocation.manager","model_project_resource_allocation","project.group_project_manager",1,1,1,1 diff --git a/addons/project_long_term/test/schedule_phase_tasks.yml b/addons/project_long_term/test/schedule_phase_tasks.yml new file mode 100644 index 00000000000..aa54fa1ac57 --- /dev/null +++ b/addons/project_long_term/test/schedule_phase_tasks.yml @@ -0,0 +1,93 @@ +- + Create project 'Develop an outlook-openerp synchronization plugin' +- + !record {model: project.project, id: project_project_project0}: + name: Develop an outlook-openerp synchronization plugin + members: + - project.res_users_project_manager + - project.res_users_technical_leader + - project.res_users_developer + - project.res_users_designer + - project.res_users_tester + - project.res_users_analyst + - project.res_users_finacial_manager +- + Create phase 'Develop GUI' in Outlook +- + !record {model: project.phase, id: project_phase_phase0}: + date_start: '2010-06-02' + duration: 200.0 + name: Develop GUI in Outlook + product_uom: product.uom_day + project_id: project_project_project0 + state: draft + resource_ids: + - resource_id: project_long_term.resource_analyst + useability: 80.0 + - resource_id: project_long_term.resource_developer + useability: 30.0 + - resource_id: project_long_term.resource_designer + useability: 30.0 + + +- + Create the phase task 'Develop GUI for Server Configuration' +- + !record {model: project.task, id: project_task_t0}: + name: Develop GUI for Server Configuration + planned_hours: 20.0 + remaining_hours: 20.0 + state: draft + phase_id: project_phase_phase0 + project_id: project_project_project0 + user_id: project.res_users_developer + +- + Create the phase task 'Develop GUI for Modules Configuration' +- + !record {model: project.task, id: project_task_t1}: + name: Develop GUI for Modules Configuration + planned_hours: 25.0 + remaining_hours: 25.0 + state: draft + phase_id: project_phase_phase0 + project_id: project_project_project0 + user_id: project.res_users_developer +- + Create the phase task 'Develop GUI for OpenERP Synchronisation' +- + !record {model: project.task, id: project_task_t2}: + name: Develop GUI for OpenERP Synchronisation + planned_hours: 30.0 + remaining_hours: 30.0 + state: draft + phase_id: project_phase_phase0 + project_id: project_project_project0 + user_id: project.res_users_developer +- + Create the phase task 'Design required GUI/Menus' +- + !record {model: project.task, id: project_task_3}: + name: Design required GUI/Menus + planned_hours: 25.0 + remaining_hours: 25.0 + state: draft + phase_id: project_phase_phase0 + project_id: project_project_project0 + user_id: project.res_users_designer + +- + Schedule phase tasks +- + !python {model: project.phase}: | + res = self.schedule_tasks(cr, uid, [ref("project_phase_phase0")]) + +- + Check if tasks scheduled, check that either of task's start_date, end_date and user_id is not null +- + !python {model: project.phase}: | + phase = self.browse(cr, uid, [ref("project_phase_phase0")])[0] + for task in phase.task_ids: + if (not task.user_id) or (not task.date_start) or (not task.date_end): + raise AssertionError("Phase Tasks not scheduled: %d uid=%r start=%r end=%r" % \ + (task.id, task.user_id, task.date_start, task.date_end)) diff --git a/addons/project_long_term/test/schedule_project_phases.yml b/addons/project_long_term/test/schedule_project_phases.yml new file mode 100644 index 00000000000..e06feaaa4ca --- /dev/null +++ b/addons/project_long_term/test/schedule_project_phases.yml @@ -0,0 +1,133 @@ +- + Create a project 'World Bank's Project' +- + !record {model: project.project, id: project_project_worldbanksproject0}: + name: "World Bank's Project" + priority: 4 + +- + Create a project phase 'Defining Client's Basic Idea of Project' +- + !record {model: project.phase, id: project_phase_definingclientsbasicideaofproject0}: + date_start: '2010-06-02' + duration: 15.0 + name: "Defining Client's Basic Idea of Project" + product_uom: product.uom_day + project_id: project_project_worldbanksproject0 + + +- + Create project phase 'Establishing Project Feasibility' +- + !record {model: project.phase, id: project_phase_establishingprojectfeasibility0}: + date_start: '2010-06-02' + duration: 30.0 + name: Establishing Project Feasibility + product_uom: product.uom_day + project_id: project_project_worldbanksproject0 + +- + Create project phase 'Preparation of Engineering Designs' +- + !record {model: project.phase, id: project_phase_preparationofengineeringdesigns0}: + date_start: '2010-06-02' + duration: 100.0 + name: Preparation of Engineering Designs + product_uom: product.uom_hour + project_id: project_project_worldbanksproject0 + + +- + Create project phase 'Procurement of Works and Goods' +- + !record {model: project.phase, id: project_phase_procurementofworksandgoods0}: + date_start: '2010-06-02' + duration: 24.0 + name: Procurement of Works and Goods + product_uom: product.uom_hour + project_id: project_project_worldbanksproject0 + + +- + Create project phase 'Project Construction' +- + !record {model: project.phase, id: project_phase_projectconstruction0}: + date_start: '2010-06-02' + duration: 4320.0 + name: Project Construction + product_uom: product.uom_hour + project_id: project_project_worldbanksproject0 + + +- + Create project phase 'Project Completion' +- + !record {model: project.phase, id: project_phase_projectcompletion0}: + date_start: '2010-06-02' + duration: 240.0 + name: Project Completion + product_uom: product.uom_hour + project_id: project_project_worldbanksproject0 + +- + Set previous phase for phase 'Establishing Project Feasibility' +- + !record {model: project.phase, id: project_phase_establishingprojectfeasibility0}: + previous_phase_ids: + - project_phase_definingclientsbasicideaofproject0 + + +- + Set previous phase for phase 'Preparation of Engineering Designs' +- + !record {model: project.phase, id: project_phase_preparationofengineeringdesigns0}: + previous_phase_ids: + - project_phase_establishingprojectfeasibility0 + +- + Set previous phase for phase 'Procurement of Works and Goods' +- + !record {model: project.phase, id: project_phase_procurementofworksandgoods0}: + previous_phase_ids: + - project_phase_preparationofengineeringdesigns0 + +- + Set previous phase for phase 'Project Construction' +- + !record {model: project.phase, id: project_phase_projectconstruction0}: + previous_phase_ids: + - project_phase_procurementofworksandgoods0 + + +- + Set previous phase for phase 'Project Completion' +- + !record {model: project.phase, id: project_phase_projectcompletion0}: + previous_phase_ids: + - project_phase_projectconstruction0 + + +- + Get the project to schedule phases +- + !record {model: project.compute.phases, id: project_compute_phases_0}: + project_id: project_project_worldbanksproject0 + target_project: one + + +- + Schedule project phases +- + !python {model: project.project}: | + self.schedule_phases(cr, uid, ref("project_project_worldbanksproject0")) + +- + Check if phases scheduled, check that either of phase's start_date, end_date and user_id is not null +- + !python {model: project.project}: | + prj=self.browse(cr, uid, [ref("project_project_worldbanksproject0")])[0] + for phase in prj.phase_ids: + if (not phase.responsible_id) or (not phase.date_start) or (not phase.date_end): + raise AssertionError("Tasks not scheduled") + + diff --git a/addons/project_long_term/test/schedule_project_tasks.yml b/addons/project_long_term/test/schedule_project_tasks.yml new file mode 100644 index 00000000000..04a05437487 --- /dev/null +++ b/addons/project_long_term/test/schedule_project_tasks.yml @@ -0,0 +1,94 @@ +- + Create project 'Develop a thunderbird-openerp synchronization plugin' +- + !record {model: project.project, id: project_project_project1}: + name: Develop a thunderbird-openerp synchronization plugin + members: + - project.res_users_project_manager + - project.res_users_technical_leader + - project.res_users_developer + - project.res_users_designer + - project.res_users_tester + - project.res_users_analyst + - project.res_users_finacial_manager + +- + Create phase 'Develop GUI' in thunderbird +- + !record {model: project.phase, id: project_phase_phase1}: + date_start: '2010-06-02' + duration: 200.0 + name: Develop GUI in thunderbird + product_uom: product.uom_day + project_id: project_project_project1 + state: draft + resource_ids: + - resource_id: project_long_term.resource_analyst + useability: 80.0 + - resource_id: project_long_term.resource_developer + useability: 30.0 + - resource_id: project_long_term.resource_designer + useability: 30.0 + + +- + Create the phase task 'Develop GUI for Server Configuration' +- + !record {model: project.task, id: project_task_t10}: + name: Develop GUI for Server Configuration + planned_hours: 20.0 + remaining_hours: 20.0 + state: draft + phase_id: project_phase_phase1 + project_id: project_project_project1 + user_id: project.res_users_developer + +- + Create the phase task 'Develop GUI for Modules Configuration' +- + !record {model: project.task, id: project_task_t11}: + name: Develop GUI for Modules Configuration + planned_hours: 25.0 + remaining_hours: 25.0 + state: draft + phase_id: project_phase_phase1 + project_id: project_project_project1 + user_id: project.res_users_developer +- + Create the phase task 'Develop GUI for OpenERP Synchronisation' +- + !record {model: project.task, id: project_task_t12}: + name: Develop GUI for OpenERP Synchronisation + planned_hours: 30.0 + remaining_hours: 30.0 + state: draft + phase_id: project_phase_phase1 + project_id: project_project_project1 + user_id: project.res_users_developer +- + Create the phase task 'Design required GUI/Menus' +- + !record {model: project.task, id: project_task_13}: + name: Design required GUI/Menus + planned_hours: 25.0 + remaining_hours: 25.0 + state: draft + phase_id: project_phase_phase1 + project_id: project_project_project1 + user_id: project.res_users_designer + + +- + Schedule tasks +- + !python {model: project.project}: | + self.schedule_tasks(cr, uid, ref("project_project_project1")) + +- + Check if tasks scheduled, check that either of task's start_date, end_date and user_id is not null +- + !python {model: project.project}: | + prj = self.browse(cr, uid, [ref("project_project_project1")])[0] + for task in prj.tasks: + if (not task.user_id) or (not task.date_start) or (not task.date_end): + raise AssertionError("Project Tasks not scheduled") diff --git a/addons/project_long_term/wizard/__init__.py b/addons/project_long_term/wizard/__init__.py index fb8a29449f7..c1e6d838111 100644 --- a/addons/project_long_term/wizard/__init__.py +++ b/addons/project_long_term/wizard/__init__.py @@ -22,7 +22,5 @@ import project_compute_phases import project_compute_tasks import project_schedule_tasks -import working_calendar # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - diff --git a/addons/project_long_term/wizard/project_compute_phases.py b/addons/project_long_term/wizard/project_compute_phases.py index 5353db25be6..ade1da5c9d9 100644 --- a/addons/project_long_term/wizard/project_compute_phases.py +++ b/addons/project_long_term/wizard/project_compute_phases.py @@ -18,17 +18,10 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## -import datetime -from resource.faces import * -from new import classobj - from tools.translate import _ from osv import fields, osv -import working_calendar as wkcal - class project_compute_phases(osv.osv_memory): - _name = 'project.compute.phases' _description = 'Project Compute Phases' _columns = { @@ -37,124 +30,33 @@ class project_compute_phases(osv.osv_memory): ], 'Schedule', required = True), 'project_id': fields.many2one('project.project', 'Project') - } + } _defaults = { 'target_project': 'all' - } + } def check_selection(self, cr, uid, ids, context=None): - data_select = self.read(cr, uid, ids, ['target_project'])[0] return self.compute_date(cr, uid, ids, context=context) - def _phase_schedule(self, cr, uid, phase, start_date, calendar_id=False, context=None): - """Schedule phase with the start date till all the next phases are completed. - - Arguements: start_dsate -- start date for the phase - calendar_id -- working calendar of the project - - """ - phase_obj = self.pool.get('project.phase') - resource_obj = self.pool.get('resource.resource') - uom_obj = self.pool.get('product.uom') - phase_resource_obj = False - - if context is None: - context = {} - if phase: - leaves = [] - time_efficiency = 1.0 - resource_id = resource_obj.search(cr, uid, [('user_id', '=', phase.responsible_id.id)]) - - if resource_id: - # Create a new resource object with - # all the attributes of the Resource Class - resource = resource_obj.browse(cr, uid, resource_id, context=context)[0] - time_efficiency = resource.time_efficiency - leaves = wkcal.compute_leaves(cr, uid, calendar_id , resource.id, resource.calendar_id.id) - phase_resource_obj = classobj((phase.responsible_id.name.encode('utf8')), (Resource,), - {'__doc__': phase.responsible_id.name, - '__name__': phase.responsible_id.name, - 'vacation': tuple(leaves), - 'efficiency': time_efficiency - }) - default_uom_id = uom_obj.search(cr, uid, [('name','=','Hour')])[0] - avg_hours = uom_obj._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id) - duration = str(avg_hours) + 'H' - # Create a new project for each phase - def Project(): - start = start_date - minimum_time_unit = 1 - resource = phase_resource_obj - # If project has working calendar then that - # else the default one would be considered - if calendar_id: - working_days = wkcal.compute_working_calendar(cr, uid, calendar_id, context=context) - vacation = tuple(wkcal.compute_leaves(cr, uid, calendar_id)) - - def phase(): - effort = duration - - project = BalancedProject(Project) - s_date = project.phase.start.to_datetime() - e_date = project.phase.end.to_datetime() - # Recalculate date_start and date_end - # according to constraints on date start and date end on phase - if phase.constraint_date_start and str(s_date) < phase.constraint_date_start: - start_date = datetime.datetime.strptime(phase.constraint_date_start, '%Y-%m-%d %H:%M:%S') - else: - start_date = s_date - if phase.constraint_date_end and str(e_date) > phase.constraint_date_end: - end_date= datetime.datetime.strptime(phase.constraint_date_end, '%Y-%m-%d %H:%M:%S') - date_start = phase.constraint_date_end[:-3] - else: - end_date = e_date - date_start = end_date - # Write the calculated dates back - ctx = context.copy() - ctx.update({'scheduler': True}) - phase_obj.write(cr, uid, [phase.id], {'date_start': start_date.strftime('%Y-%m-%d %H:%M:%S'), - 'date_end': end_date.strftime('%Y-%m-%d %H:%M:%S')}, - context=ctx) - # Recursive call till all the next phases scheduled - for phase in phase.next_phase_ids: - if phase.state in ['draft','open','pending']: - id_cal = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False - self._phase_schedule(cr, uid, phase, date_start, id_cal, context=context) - else: - continue - + def compute_date(self, cr, uid, ids, context=None): """ Compute the phases for scheduling. """ - if context is None: context = {} - project_obj = self.pool.get('project.project') - phase_obj = self.pool.get('project.phase') + project_pool = self.pool.get('project.project') data = self.read(cr, uid, ids, [], context=context)[0] if not data['project_id'] and data['target_project'] == 'one': raise osv.except_osv(_('Error!'), _('Please Specify Project to be schedule')) + if data['project_id']: # If project mentioned find its phases - project_id = project_obj.browse(cr, uid, data['project_id'], context=context) - phase_ids = phase_obj.search(cr, uid, [('project_id', '=', project_id.id), - ('state', 'in', ['draft', 'open', 'pending']), - ('previous_phase_ids', '=', False) - ]) + project_ids = [data['project_id']] else: # Else take all the draft,open,pending states phases - phase_ids = phase_obj.search(cr, uid,[('state', 'in', ['draft', 'open', 'pending']), - ('previous_phase_ids', '=', False) - ], context=context) - phase_ids.sort() - phases = phase_obj.browse(cr, uid, phase_ids, context=context) - for phase in phases: - start_date = phase.project_id.date_start - if not phase.project_id.date_start: - start_date = datetime.datetime.now().strftime("%Y-%m-%d") - start_dt = datetime.datetime.strftime((datetime.datetime.strptime(start_date, "%Y-%m-%d")), "%Y-%m-%d %H:%M") - calendar_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False - self._phase_schedule(cr, uid, phase, start_dt, calendar_id, context=context) + project_ids = project_pool.search(cr, uid, [], context=context) + + project_pool.schedule_phases(cr, uid, project_ids, context=context) return self._open_phases_list(cr, uid, data, context=context) def _open_phases_list(self, cr, uid, data, context=None): @@ -165,13 +67,10 @@ class project_compute_phases(osv.osv_memory): context = {} mod_obj = self.pool.get('ir.model.data') act_obj = self.pool.get('ir.actions.act_window') - result = mod_obj._get_id(cr, uid, 'project_long_term', 'act_project_phase') + result = mod_obj._get_id(cr, uid, 'project_long_term', 'act_project_phase_list') id = mod_obj.read(cr, uid, [result], ['res_id'])[0]['res_id'] result = act_obj.read(cr, uid, [id], context=context)[0] - result['domain'] = [('state', 'not in', ['cancelled','done'])] - if data['project_id']: - result['domain'] = [('project_id', '=', data['project_id']), - ('state', 'not in', ['cancelled','done'])] + result['context'] = {"search_default_project_id":data['project_id'], "search_default_responsible_id":uid, "search_default_current": 1} return result project_compute_phases() diff --git a/addons/project_long_term/wizard/project_compute_phases_view.xml b/addons/project_long_term/wizard/project_compute_phases_view.xml index 0a3b2e12336..9d5754af09c 100644 --- a/addons/project_long_term/wizard/project_compute_phases_view.xml +++ b/addons/project_long_term/wizard/project_compute_phases_view.xml @@ -8,22 +8,18 @@ <field name="type">form</field> <field name="arch" type="xml"> <form string="Compute Scheduling of Phases"> - <group height="170" width="500"> - <group colspan="4" col="4"> - <label colspan="4" string="This wizard will schedule phases for all or specified project" /> - <newline /> - <field name="target_project" colspan="4"/> - </group> - <newline /> - <group colspan="4" col="6" attrs="{'invisible':[('target_project','=','all')]}"> - <field name="project_id"/> - </group> - <separator colspan="4"/> - <group colspan="4" col="6"> <!-- Improve me --> - <button icon="gtk-cancel" special="cancel" string="_Cancel"/> - <button icon="gtk-ok" name="check_selection" string="_Compute" type="object"/> - </group> - </group> + <group colspan="4" col="4"> + <separator colspan="4" string="Compute Scheduling of phases for all or specified project" /> + <field name="target_project" colspan="4"/> + <field name="project_id" widget="selection" colspan="4" attrs="{'invisible':[('target_project','=','all')], 'required':[('target_project','!=','all')]}"/> + <separator colspan="4"/> + <group colspan="2" col="2"> + </group> + <group colspan="2" col="2"> <!-- Improve me --> + <button icon="gtk-cancel" special="cancel" string="_Cancel"/> + <button icon="gtk-ok" name="check_selection" string="C_ompute" type="object"/> + </group> + </group> </form> </field> </record> @@ -35,12 +31,14 @@ <field name="view_type">form</field> <field name="view_mode">form</field> <field name="view_id" ref="view_project_compute_phases_select"/> - <field name="context">{'record_id' : active_id}</field> + <field name="context">{'record_id': active_id}</field> <field name="target">new</field> + <field name="help">To schedule phases of all or a specified project. It then open a gantt view. + </field> </record> <menuitem id="menu_compute_phase" name="Compute Phase Scheduling" parent="menu_phase_schedule" action="action_project_compute_phases"/> </data> -</openerp>
\ No newline at end of file +</openerp> diff --git a/addons/project_long_term/wizard/project_compute_tasks.py b/addons/project_long_term/wizard/project_compute_tasks.py index 9f2eb707c60..0d5fa22e6a8 100644 --- a/addons/project_long_term/wizard/project_compute_tasks.py +++ b/addons/project_long_term/wizard/project_compute_tasks.py @@ -18,125 +18,47 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## -import datetime -from resource.faces import * -from new import classobj -import operator -from tools.translate import _ from osv import osv, fields -import working_calendar as wkcal - class project_compute_tasks(osv.osv_memory): _name = 'project.compute.tasks' _description = 'Project Compute Tasks' _columns = { 'project_id': fields.many2one('project.project', 'Project', required=True) - } + } def compute_date(self, cr, uid, ids, context=None): """ Schedule the tasks according to resource available and priority. """ - project_obj = self.pool.get('project.project') + project_pool = self.pool.get('project.project') task_pool = self.pool.get('project.task') - resource_obj = self.pool.get('resource.resource') - user_obj = self.pool.get('res.users') - if context is None: context = {} - + context['compute_by'] = 'project' data = self.read(cr, uid, ids, [])[0] project_id = data['project_id'] - project = project_obj.browse(cr, uid, project_id, context=context) - task_ids = task_pool.search(cr, uid, [('project_id', '=', project_id), - ('state', 'in', ['draft', 'open', 'pending']) - ]) - if task_ids: - task_ids.sort() - tasks = task_pool.browse(cr, uid, task_ids, context=context) - calendar_id = project.resource_calendar_id and project.resource_calendar_id.id or False - start_date = project.date_start - if not project.date_start: - start_date = datetime.datetime.now().strftime("%Y-%m-%d") - date_start = datetime.datetime.strftime(datetime.datetime.strptime(start_date, "%Y-%m-%d"), "%Y-%m-%d %H:%M") - # Create Resource Class objects which are the Project Members - resources = [] - for user in project.members: - leaves = [] - time_efficiency = 1.0 - resource_id = resource_obj.search(cr, uid, [('user_id', '=', user.id)], context=context) - if resource_id: -# resource = resource_obj.browse(cr, uid, resource_id, context=context)[0] - resource = resource_obj.read(cr, uid, resource_id, ['calendar_id','time_efficiency'], context=context)[0] - if resource.get('calendar_id', False): - leaves = wkcal.compute_leaves(cr, uid, calendar_id , resource_id[0], resource['calendar_id'] and resource['calendar_id'][0] or False) - time_efficiency = resource.get('time_efficiency') - resources.append(classobj((user.name.encode('utf8')), (Resource,), {'__doc__': user.name, - '__name__': user.name, - 'vacation': tuple(leaves), - 'efficiency': time_efficiency - })) - priority_dict = {'0': 1000, '1': 800, '2': 500, '3': 300,'4': 100} - # Create dynamic no of tasks with the resource specified - def create_tasks(j, eff, priorty=500, obj=None): - def task(): - """ - task is a dynamic method! - """ - effort = eff - if obj: - resource = obj - priority = priorty - task.__doc__ = "TaskNO%d" %j - task.__name__ = "task%d" %j - return task + project_pool.schedule_tasks(cr, uid, [project_id], context=context) + return self._open_task_list(cr, uid, data, context=context) - # Create a 'Faces' project with all the tasks and resources - def Project(): - title = project.name - start = date_start - try: - resource = reduce(operator.or_, resources) - except: - raise osv.except_osv(_('Error'), _('Project must have members assigned !')) - minimum_time_unit = 1 - if calendar_id: # If project has calendar - working_days = wkcal.compute_working_calendar(cr, uid, calendar_id) - vacation = tuple(wkcal.compute_leaves(cr, uid, calendar_id)) - # Dynamic Creation of tasks - i = 0 - for each_task in tasks: - hours = str(each_task.planned_hours / each_task.occupation_rate)+ 'H' - if each_task.priority in priority_dict.keys(): - priorty = priority_dict[each_task.priority] - if each_task.user_id: - for resource in resources: - if resource.__name__ == each_task.user_id.name: # check me!! - task = create_tasks(i, hours, priorty, resource) - else: - task = create_tasks(i, hours, priorty) - i += 1 - - project = BalancedProject(Project) - loop_no = 0 - # Write back the computed dates - for t in project: - s_date = t.start.to_datetime() - e_date = t.end.to_datetime() - if loop_no == 0: - project_obj.write(cr, uid, [project_id], {'date' : e_date}, context=context) - else: - ctx = context.copy() - ctx.update({'scheduler': True}) - user_id = user_obj.search(cr, uid, [('name', '=', t.booked_resource[0].__name__)]) - task_pool.write(cr, uid, [tasks[loop_no-1].id], {'date_start': s_date.strftime('%Y-%m-%d %H:%M:%S'), - 'date_end': e_date.strftime('%Y-%m-%d %H:%M:%S'), - 'user_id': user_id[0]}, - context=ctx) - loop_no +=1 - return {} + def _open_task_list(self, cr, uid, data, context=None): + """ + Return the scheduled task list. + """ + if context is None: + context = {} + mod_obj = self.pool.get('ir.model.data') + act_obj = self.pool.get('ir.actions.act_window') + result = mod_obj._get_id(cr, uid, 'project', 'action_view_task') + id = mod_obj.read(cr, uid, [result], ['res_id'])[0]['res_id'] + result = {} + if not id: + return result + result = act_obj.read(cr, uid, [id], context=context)[0] + result['context'] = {"search_default_project_id":data['project_id'], "search_default_user_id":uid, "search_default_current": 1} + return result project_compute_tasks() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project_long_term/wizard/project_compute_tasks_view.xml b/addons/project_long_term/wizard/project_compute_tasks_view.xml index eff475b4f11..e6540fafff9 100644 --- a/addons/project_long_term/wizard/project_compute_tasks_view.xml +++ b/addons/project_long_term/wizard/project_compute_tasks_view.xml @@ -7,12 +7,16 @@ <field name="model">project.compute.tasks</field> <field name="type">form</field> <field name="arch" type="xml"> - <form string="Compute Scheduling of Phases"> - <group colspan="4" height="100" width="500"> - <field name="project_id"/> - <group colspan="4" col="6"> + <form string="Compute Scheduling of Task"> + <group colspan="4"> + <separator colspan="4" string="Compute Scheduling of Task for specified project." /> + <field name="project_id" widget="selection" colspan="4"/> + <separator colspan="4"/> + <group colspan="2" col="2"> + </group> + <group colspan="2" col="2"> <button icon="gtk-cancel" special="cancel" string="_Cancel"/> - <button icon="gtk-ok" name="compute_date" string="Compute" type="object"/> + <button icon="gtk-ok" name="compute_date" string="C_ompute" type="object"/> </group> </group> </form> @@ -34,4 +38,4 @@ parent="menu_phase_schedule" action="action_project_compute_tasks"/> </data> -</openerp>
\ No newline at end of file +</openerp> diff --git a/addons/project_long_term/wizard/project_schedule_tasks.py b/addons/project_long_term/wizard/project_schedule_tasks.py index 8ec2d4c16e0..48039112e86 100644 --- a/addons/project_long_term/wizard/project_schedule_tasks.py +++ b/addons/project_long_term/wizard/project_schedule_tasks.py @@ -18,142 +18,36 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## -import datetime -from resource.faces import * -from new import classobj -import operator -from tools.translate import _ -from osv import osv, fields - -import working_calendar as wkcal +from osv import fields, osv class project_schedule_task(osv.osv_memory): - _name = "project.schedule.tasks" _description = 'project.schedule.tasks' _columns = { 'msg': fields.char('Message', size=64) - } + } _defaults = { 'msg': 'Task Scheduling Completed Successfully' - } + } def default_get(self, cr, uid, fields_list, context=None): + if context is None: + context = {} res = super(project_schedule_task, self).default_get(cr, uid, fields_list, context) self.compute_date(cr, uid, context=context) return res - - def create_resources(self, cr, uid, phase, context=None): - """ - Return a list of Resource Class objects for the resources allocated to the phase. - """ - resource_objs = [] - - if context is None: - context = {} - - for resource in phase.resource_ids: - res = resource.resource_id - leaves = [] - resource_eff = res.time_efficiency - resource_cal = res.calendar_id.id - if resource_cal: - cal_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False - leaves = wkcal.compute_leaves(cr, uid, cal_id, res.id, resource_cal, context=context) - resource_objs.append(classobj(res.user_id.name.encode('utf8'), (Resource,), - {'__doc__': res.user_id.name, - '__name__': res.user_id.name, - 'vacation': tuple(leaves), - 'efficiency': resource_eff, - })) - return resource_objs - + def compute_date(self, cr, uid, context=None): """ Schedule the tasks according to resource available and priority. """ - - phase_obj = self.pool.get('project.phase') - task_obj = self.pool.get('project.task') - user_obj = self.pool.get('res.users') - + phase_pool = self.pool.get('project.phase') if context is None: context = {} - if not 'active_id' in context: return {} - phase = phase_obj.browse(cr, uid, context['active_id'], context=context) - task_ids = map(lambda x : x.id, (filter(lambda x : x.state in ['open', 'draft', 'pending'] , phase.task_ids))) - if task_ids: - task_ids.sort() - tasks = task_obj.browse(cr, uid, task_ids, context=context) - start_date = str(phase.date_start)[:-9] - if not phase.date_start: - if not phase.project_id.date_start: - start_date = datetime.datetime.now().strftime("%Y-%m-%d") - else: - start_date = phase.project_id.date_start - date_start = datetime.datetime.strftime(datetime.datetime.strptime(start_date, "%Y-%m-%d"), "%Y-%m-%d %H:%M") - calendar_id = phase.project_id.resource_calendar_id.id - resources = self.create_resources(cr, uid, phase) - priority_dict = {'0': 1000, '1': 800, '2': 500, '3': 300, '4': 100} - # Create dynamic no of tasks with the resource specified - def create_tasks(j, eff, priorty=500, obj=False): - def task(): - """ - task is a dynamic method! - """ - effort = eff - if obj: - resource = obj - priority = priorty - task.__doc__ = "TaskNO%d" %j - task.__name__ = "task%d" %j - return task - - # Create a 'Faces' project with all the tasks and resources - def Project(): - title = "Project" - start = date_start - try: - resource = reduce(operator.or_, resources) - except: - raise osv.except_osv(_('Error'), _('Phase must have resources assigned !')) - minimum_time_unit = 1 - if calendar_id: # If project has working calendar - working_days = wkcal.compute_working_calendar(cr, uid, calendar_id) - vacation = tuple(wkcal.compute_leaves(cr, uid, calendar_id)) - # Dynamic creation of tasks - i = 0 - for each_task in tasks: - hours = str(each_task.planned_hours / each_task.occupation_rate)+ 'H' - if each_task.priority in priority_dict.keys(): - priorty = priority_dict[each_task.priority] - if each_task.user_id: - for resource in resources: - if resource.__name__ == each_task.user_id.name: - task = create_tasks(i, hours, priorty, resource) - else: - task = create_tasks(i, hours, priorty) - i += 1 - - project = BalancedProject(Project) - loop_no = 0 - # Write back the computed dates - for t in project: - s_date = t.start.to_datetime() - e_date = t.end.to_datetime() - if loop_no > 0: - ctx = context.copy() - ctx.update({'scheduler': True}) - user_id = user_obj.search(cr, uid, [('name', '=', t.booked_resource[0].__name__)]) - task_obj.write(cr, uid, [tasks[loop_no-1].id], {'date_start': s_date.strftime('%Y-%m-%d %H:%M:%S'), - 'date_end': e_date.strftime('%Y-%m-%d %H:%M:%S'), - 'user_id': user_id[0]}, - context=ctx) - loop_no +=1 - return {} - + return phase_pool.schedule_tasks(cr, uid, [context['active_id']], context=context) project_schedule_task() + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project_long_term/wizard/project_schedule_tasks_view.xml b/addons/project_long_term/wizard/project_schedule_tasks_view.xml index f17d573185d..f8e2f2d828b 100644 --- a/addons/project_long_term/wizard/project_schedule_tasks_view.xml +++ b/addons/project_long_term/wizard/project_schedule_tasks_view.xml @@ -8,7 +8,7 @@ <field name="type">form</field> <field name="arch" type="xml"> <form string="Schedule Tasks"> - <group height="90" width="250"> + <group height="90" width="275"> <label string="Task Scheduling completed successfully."/> <group colspan="4" col="6"> <button icon="gtk-ok" colspan="4" special="cancel" string="_Ok"/> @@ -25,9 +25,9 @@ <field name="view_type">form</field> <field name="view_mode">form</field> <field name="view_id" ref="view_project_schedule_tasks"/> - <field name="context">{'record_id' : active_id}</field> + <field name="context">{'record_id': active_id}</field> <field name="target">new</field> </record> </data> -</openerp>
\ No newline at end of file +</openerp> diff --git a/addons/project_long_term/wizard/working_calendar.py b/addons/project_long_term/wizard/working_calendar.py deleted file mode 100644 index ba8ec7db150..00000000000 --- a/addons/project_long_term/wizard/working_calendar.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# -############################################################################## -import datetime - -import pooler - -def convert_timeformat(cr, uid, time_string, context={}): - """ Convert input time string: 8.5 to output time string 8:30.""" - - split_list = str(time_string).split('.') - hour_part = split_list[0] - mins_part = split_list[1] - round_mins = int(round(float(mins_part) * 60,-2)) - converted_string = hour_part + ':' + str(round_mins)[0:2] - return converted_string - -def compute_leaves(cr, uid, calendar_id, resource_id=False, resource_calendar=False, context={}): - - """Compute the leaves from the working calendar of the resource. - - Arguements: calendar_id -- working calendar of the project - resource_id -- resource working on phase/task - resource_calendar -- working calendar of the resource - - """ - - pool = pooler.get_pool(cr.dbname) - resource_calendar_leaves_obj = pool.get('resource.calendar.leaves') - leave_list = [] - if resource_id: - leave_ids = resource_calendar_leaves_obj.search(cr, uid, ['|', ('calendar_id', '=', calendar_id), - ('calendar_id', '=', resource_calendar), - ('resource_id', '=', resource_id) - ], context=context) - else: - leave_ids = resource_calendar_leaves_obj.search(cr, uid, [('calendar_id', '=', calendar_id), - ('resource_id', '=', False) - ], context=context) - leaves = resource_calendar_leaves_obj.read(cr, uid, leave_ids, ['date_from', 'date_to'], context=context) - for i in range(len(leaves)): - dt_start = datetime.datetime.strptime(leaves[i]['date_from'], '%Y-%m-%d %H:%M:%S') - dt_end = datetime.datetime.strptime(leaves[i]['date_to'], '%Y-%m-%d %H:%M:%S') - no = dt_end - dt_start - [leave_list.append((dt_start + datetime.timedelta(days=x)).strftime('%Y-%m-%d')) for x in range(int(no.days + 1))] - leave_list.sort() - return leave_list - -def compute_working_calendar(cr, uid, calendar_id, context={}): - - """Change the format of working calendar from 'Openerp' format to bring it into 'Faces' format. - - Arguement: calendar_id -- working calendar of the project - - """ - - pool = pooler.get_pool(cr.dbname) - resource_week_obj = pool.get('resource.calendar.week') - time_range = "8:00-8:00" - non_working = "" - week_days = {"0": "mon", "1": "tue", "2": "wed","3": "thu", "4": "fri", "5": "sat", "6": "sun"} - wk_days = {} - wk_time = {} - wktime_list = [] - wktime_cal = [] - week_ids = resource_week_obj.search(cr, uid, [('calendar_id', '=', calendar_id)], context=context) - weeks = resource_week_obj.read(cr, uid, week_ids, ['dayofweek', 'hour_from', 'hour_to'], context=context) - # Convert time formats into appropriate format required - # and create a list like [('mon', '8:00-12:00'), ('mon', '13:00-18:00')] - for week in weeks: - res_str = "" - if week_days.has_key(week['dayofweek']): - day = week_days[week['dayofweek']] - wk_days[week['dayofweek']] = week_days[week['dayofweek']] - hour_from_str = convert_timeformat(cr, uid, week['hour_from']) - hour_to_str = convert_timeformat(cr, uid, week['hour_to']) - res_str = hour_from_str + '-' + hour_to_str - wktime_list.append((day, res_str)) - # Convert into format like [('mon', '8:00-12:00', '13:00-18:00')] - for item in wktime_list: - if wk_time.has_key(item[0]): - wk_time[item[0]].append(item[1]) - else: - wk_time[item[0]] = [item[0]] - wk_time[item[0]].append(item[1]) - for k,v in wk_time.items(): - wktime_cal.append(tuple(v)) - # Add for the non-working days like: [('sat, sun', '8:00-8:00')] - for k,v in wk_days.items(): - if week_days.has_key(k): - week_days.pop(k) - for v in week_days.itervalues(): - non_working += v + ',' - if non_working: - wktime_cal.append((non_working[:-1], time_range)) - return wktime_cal -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file |
