diff --git a/addons/project_long_term/__openerp__.py b/addons/project_long_term/__openerp__.py
index 31522d63ea2..f4dd4637f0f 100644
--- a/addons/project_long_term/__openerp__.py
+++ b/addons/project_long_term/__openerp__.py
@@ -43,14 +43,9 @@ Features
"init_xml": [],
"demo_xml": ["project_long_term_demo.xml"],
"test": [
- 'test/test_schedule_phases_case1.yml',
'test/schedule_project_phases.yml',
'test/schedule_project_tasks.yml',
- 'test/test_schedule_phases_case2.yml',
- 'test/project_schedule_consecutive_day.yml',
- 'test/project_schedule_without_wroking_hour.yml',
- 'test/phase_constraint.yml',
- 'test/test_schedule_tasks_case1.yml',
+ 'test/draft2open2close_phase.yml',
],
"update_xml": [
"security/ir.model.access.csv",
diff --git a/addons/project_long_term/project_long_term_demo.xml b/addons/project_long_term/project_long_term_demo.xml
index fe3f8c8e510..ac15249499e 100644
--- a/addons/project_long_term/project_long_term_demo.xml
+++ b/addons/project_long_term/project_long_term_demo.xml
@@ -37,9 +37,9 @@
-
+
-
+
Development and Integration
@@ -60,7 +60,7 @@
Deployement and Training
-
+
10
diff --git a/addons/project_long_term/test/draft2open2close_phase.yml b/addons/project_long_term/test/draft2open2close_phase.yml
new file mode 100644
index 00000000000..610ccb8180a
--- /dev/null
+++ b/addons/project_long_term/test/draft2open2close_phase.yml
@@ -0,0 +1,40 @@
+-
+ I make "Collect Requirement and Make SRS" in open state.
+-
+ !python {model: project.phase}: |
+ self.set_open(cr, uid, [ref("project_phase_1")])
+-
+ I check state of phase after put in open.
+-
+ !assert {model: project.phase, id: project_phase_1, severity: error, string: Phase should be in open state}:
+ - state == "open"
+-
+ I make Phase in pending state because of resource problem.
+-
+ !python {model: project.phase}: |
+ self.set_pending(cr, uid, [ref("project_phase_1")])
+-
+ I check state of phase after put in pending.
+-
+ !assert {model: project.phase, id: project_phase_1, severity: error, string: Phase should be in pending state}:
+ - state == "pending"
+-
+ I make Phase in cancel state.
+-
+ !python {model: project.phase}: |
+ self.set_cancel(cr, uid, [ref("project_phase_1")])
+-
+ I check state of phase after put in cancel.
+-
+ !assert {model: project.phase, id: project_phase_1, severity: error, string: Phase should be in cancel state}:
+ - state == "cancelled"
+-
+ I make Phase "Design Model" in done state.
+-
+ !python {model: project.phase}: |
+ self.set_done(cr, uid, [ref("project_phase_2")])
+-
+ I check state of phase after put in done.
+-
+ !assert {model: project.phase, id: project_phase_2, severity: error, string: Phase should be in done state}:
+ - state == "done"
\ No newline at end of file
diff --git a/addons/project_long_term/test/phase_constraint.yml b/addons/project_long_term/test/phase_constraint.yml
deleted file mode 100644
index f4fa09e6e38..00000000000
--- a/addons/project_long_term/test/phase_constraint.yml
+++ /dev/null
@@ -1,118 +0,0 @@
--
- Given that I have a project 'Test Phases'.
--
- !record {model: project.project, id: project_project_developyamlproject0}:
- name: "Develop Yaml Project Module"
- date_start: !eval time.strftime('%Y-%m-%d')
- resource_calendar_id: resource.timesheet_group1
- members:
- - base.user_admin
--
- And I create three human ressources to work on this project, an analyst.
--
- !record {model: resource.resource, id: resource_resource_analyst1}:
- calendar_id: resource.timesheet_group1
- name: Analyst
- resource_type: user
- time_efficiency: 1.0
- user_id: base.user_admin
--
- I define a developer HR.
--
- !record {model: resource.resource, id: resource_resource_develop0}:
- calendar_id: resource.timesheet_group1
- name: Developer
- resource_type: user
- time_efficiency: 1.0
- user_id: base.user_admin
--
- I define a tester HR.
--
- !record {model: resource.resource, id: resource_resource_tester1}:
- calendar_id: resource.timesheet_group1
- name: tester
- resource_type: user
- time_efficiency: 1.0
- user_id: base.user_admin
--
- Then I create three phases for my projects; Analysis, Development, Testing.
--
- The first phase is 'Analysis' and has a duration of 6 days.
--
- !record {model: project.phase, id: project_phase_analysisflowforyaml0}:
- date_start: !eval time.strftime('%Y-%m-%d')
- duration: 6.0
- name: "Analysis"
- product_uom: product.uom_day
- project_id: project_project_developyamlproject0
- state: draft
-
--
- I update the constrain and the analysis phase to not start before 4 days.
--
- !python {model : project.phase }: |
- pass
- import datetime
- from dateutil.relativedelta import *
- start = datetime.date.today() + relativedelta(days=4)
- self.write(cr,uid, [(ref("project_phase_analysisflowforyaml0"))], {'constraint_date_start': start})
--
- The second phase is 'Development' and depend on the 'Analysis', with a duration of 6 days.
--
- !record {model: project.phase, id: project_phase_developyaml0}:
- duration: 6.0
- name: Development
- product_uom: product.uom_day
- project_id: project_project_developyamlproject0
- previous_phase_ids:
- - project_phase_analysisflowforyaml0
-
--
- I update the Constrain Date Start adn Date End for phase Develop yaml
--
- !python {model : project.phase }: |
- pass
- import datetime
- #from dateutil.relativedelta import *
- #start = datetime.date.today() - relativedelta(days=5)
- #end = datetime.date.today() + relativedelta(days=10)
- #self.write(cr,uid, [(ref("project_phase_developyaml0"))], {'constraint_date_start': start, 'constraint_date_end':end})
--
- The third phase is 'Testing' and depend on the 'Develop' phase, with a duration of 6 days.
--
- !record {model: project.phase, id: project_phase_testyaml0}:
- duration: 6.0
- name: Testing
- product_uom: product.uom_day
- project_id: project_project_developyamlproject0
- previous_phase_ids:
- - project_phase_developyaml0
--
- Then I launch the scheduler to compute starting and ending phases on all phases of this project.
--
- !record {model: project.compute.phases, id: project_compute_phases_0}:
- project_id: project_project_developyamlproject0
- target_project: one
--
- !python {model: project.project}: |
- self.schedule_phases(cr, uid, [ref("project_project_developyamlproject0")])
--
- After scheduling, I check the starting date and ending date on the phases are correct.
--
- !python {model: project.phase}: |
- import datetime
- from dateutil.relativedelta import *
- minstart = (datetime.date.today() + relativedelta(days=4)).strftime('%Y-%m-%d')
- minend = (datetime.date.today() + relativedelta(days=11)).strftime('%Y-%m-%d')
-
- phase1=self.browse(cr, uid, ref('project_phase_analysisflowforyaml0'))
- assert phase1.date_start>=minstart, 'Error, the Analysis phase '+phase1.date_start+' should start after '+str(minstart)
- assert phase1.date_end>=minend, 'Error, the Analysis phase should end after '+str(minend)
-
- phase2=self.browse(cr, uid, ref('project_phase_developyaml0'))
- assert phase2.date_start>=phase1.date_end, 'Error, the phase Development should start after the end of the Analysis phase'
-
- phase3=self.browse(cr, uid, ref('project_phase_testyaml0'))
- assert phase3.date_start>=phase2.date_end, 'Error, the phase Testing should start after the end of the Development phase'
- assert phase3.date_start=minstart, 'Error, the Collect Requirement and Make SRS phase '+phase1.date_start+' should start after '+str(minstart)
+ assert phase1.date_end>=minend, 'Error, the Collect Requirement and Make SRS phase should end after '+str(minend)
+ phase2=self.browse(cr, uid, ref('project_phase_2'))
+ assert phase2.date_start>=phase1.date_end, 'Error, the phase Design Model should start after the end of the Collect Requirement and Make SRS phase'
+
+ phase3=self.browse(cr, uid, ref('project_phase_3'))
+ assert phase3.date_start>=phase2.date_end, 'Error, the phase Development and Integration should start after the end of the Design Model phase'
+
+ phase4=self.browse(cr, uid, ref('project_phase_4'))
+ assert phase4.date_start>=phase3.date_end, 'Error, the phase Review and Testing should start after the end of the Development and Integration phase'
+
+ phase5=self.browse(cr, uid, ref('project_phase_5'))
+ assert phase5.date_start>=phase4.date_end, 'Error, the phase Deployement and Training start after the end of the Review and Testing phase'
+ assert phase5.date_start= start),'Start dates are wrong: %s < %s !' % (first_phase.date_start[:10], start)
- assert (first_phase.date_end >= end),'End dates are wrong: %s <%s!' % (first_phase.date_end, end)
-
- second_phase = self.browse(cr, uid, ref('project_phase_secondphase0_case2'))
- start = first_phase.date_end
- end = (datetime.date.today() + relativedelta(days=4)).strftime('%Y-%m-%d')
- assert second_phase.date_start >= start, 'Dates are wrong on second phase: %s < %s!' % (second_phase.date_start, start)
- assert second_phase.date_end >= end, 'Dates are wrong on second phase %s < %s!' % (second_phase.date_end, end)
-
diff --git a/addons/project_long_term/test/test_schedule_phases_case2.yml b/addons/project_long_term/test/test_schedule_phases_case2.yml
deleted file mode 100644
index 35173a897a3..00000000000
--- a/addons/project_long_term/test/test_schedule_phases_case2.yml
+++ /dev/null
@@ -1,193 +0,0 @@
--
- In order to test scheduling of project phases, I create two different
- working periods and resources. And schedule the phases.
--
- I create first working period 'Working Time A'.
--
- !record {model: resource.calendar, id: resource_calendar_workingtimea0}:
- attendance_ids:
- - dayofweek: '0'
- hour_from: 10.0
- hour_to: 16.0
- name: Monday
- - dayofweek: '1'
- hour_from: 10.0
- hour_to: 16.0
- name: Tuesday
- - dayofweek: '2'
- hour_from: 10.0
- hour_to: 16.0
- name: Wednesday
- - dayofweek: '3'
- hour_from: 10.0
- hour_to: 16.0
- name: Thursday
- name: Working Time A
-
--
- Creating a resource.calendar.attendance record
--
- !record {model: resource.calendar.attendance, id: resource_calendar_attendance_monday0}:
- calendar_id: resource_calendar_workingtimea0
- dayofweek: '0'
- hour_from: 10.0
- hour_to: 16.0
- name: Monday
--
- Creating a resource.calendar.attendance record
--
- !record {model: resource.calendar.attendance, id: resource_calendar_attendance_tuesday0}:
- calendar_id: resource_calendar_workingtimea0
- dayofweek: '1'
- hour_from: 10.0
- hour_to: 16.0
- name: Tuesday
--
- Creating a resource.calendar.attendance record
--
- !record {model: resource.calendar.attendance, id: resource_calendar_attendance_wednesday0}:
- calendar_id: resource_calendar_workingtimea0
- dayofweek: '2'
- hour_from: 10.0
- hour_to: 16.0
- name: Wednesday
--
- Creating a resource.calendar.attendance record
--
- !record {model: resource.calendar.attendance, id: resource_calendar_attendance_thursday0}:
- calendar_id: resource_calendar_workingtimea0
- dayofweek: '3'
- hour_from: 10.0
- hour_to: 16.0
- name: Thursday
--
- I create second working period 'Working Time B'.
--
- !record {model: resource.calendar, id: resource_calendar_workingtimeb0}:
- attendance_ids:
- - dayofweek: '4'
- hour_from: 9.0
- hour_to: 18.0
- name: Friday
- name: Working Time B
--
- Creating a resource.calendar.attendance record
--
- !record {model: resource.calendar.attendance, id: resource_calendar_attendance_friday0}:
- calendar_id: resource_calendar_workingtimeb0
- dayofweek: '4'
- hour_from: 9.0
- hour_to: 18.0
- name: Friday
--
- I create first resource say 'Resource X' without assigning working period.
--
- !record {model: resource.resource, id: resource_resource_resourcex0}:
- name: Resource X
- resource_type: user
- time_efficiency: 1.0
- user_id: base.user_admin
--
- I create first resource say 'Resource Y' with working period 'Working Time B'.
--
- !record {model: resource.resource, id: resource_resource_resourcey0}:
- calendar_id: resource_calendar_workingtimeb0
- name: Resource Y
- resource_type: user
- time_efficiency: 1.0
- user_id: base.user_admin
--
- I create a project 'Development and Testing' and assign working period 'Working Time A'.
--
- !record {model: project.project, id: project_project_project0}:
- balance: 0.0
- credit: 0.0
- currency_id: base.EUR
- debit: 0.0
- effective_hours: 0.0
- members:
- - base.user_admin
- name: Development and Testing
- planned_hours: 20.0
- progress_rate: 0.0
- quantity: 0.0
- quantity_max: 0.0
- resource_calendar_id: resource_calendar_workingtimea0
- state: open
- tasks:
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task 1
- planned_hours: 10.0
- remaining_hours: 10.0
- state: draft
- total_hours: 10.0
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task 2
- planned_hours: 10.0
- remaining_hours: 10.0
- state: draft
- total_hours: 10.0
- total_hours: 10.0
- members:
- - project.res_users_analyst
- - project.res_users_project_manager
- - project.res_users_technical_leader
- - project.res_users_developer
- - project.res_users_designer
- - project.res_users_tester
- type_ids:
- - project.project_tt_specification
- - project.project_tt_development
- - project.project_tt_testing
- - project.project_tt_merge
-
--
- I create a phase 'Initial Phase' for project 'Development and Testing'.
--
- !record {model: project.phase, id: project_phase_phase0}:
- date_start: '2011-01-03 08:00:00'
- duration: 0.0
- name: Initial Phase
- product_uom: product.uom_day
- project_id: project_project_project0
- state: draft
--
- I create first task 'Developing module' and assign 10h.
--
- !record {model: project.task, id: project_task_task0}:
- delay_hours: 0.0
- effective_hours: 0.0
- name: Developing module
- planned_hours: 10.0
- project_id: project_project_project0
- remaining_hours: 10.0
- state: draft
- total_hours: 10.0
- phase_id: project_phase_phase0
--
- I create first task 'Testing module' and assign 10h.
--
- !record {model: project.task, id: project_task_task1}:
- delay_hours: 0.0
- effective_hours: 0.0
- name: Testing module
- planned_hours: 10.0
- project_id: project_project_project0
- remaining_hours: 10.0
- state: draft
- total_hours: 10.0
- phase_id: project_phase_phase0
--
- Now I create a record to compute the phase of project.
--
- !record {model: project.compute.phases, id: project_compute_phases0}:
- target_project: 'one'
- project_id: project_project_project0
--
- I schedule the phases.
--
- !python {model: project.compute.phases}: |
- self.check_selection(cr, uid, [ref("project_compute_phases0")])
-
diff --git a/addons/project_long_term/test/test_schedule_tasks_case1.yml b/addons/project_long_term/test/test_schedule_tasks_case1.yml
deleted file mode 100644
index 3bb0ea87c43..00000000000
--- a/addons/project_long_term/test/test_schedule_tasks_case1.yml
+++ /dev/null
@@ -1,246 +0,0 @@
--
- In order to test scheduling of tasks, I create four tasks with different sequences and schedule them.
--
- I create first user.
--
- !record {model: res.users, id: res_users_user0}:
- company_id: base.main_company
- context_lang: en_US
- groups_id:
- - base.group_partner_manager
- - base.group_user
- login: user1
- name: User 1
- password: user1
--
- I create second user.
--
- !record {model: res.users, id: res_users_user1}:
- company_id: base.main_company
- context_lang: en_US
- groups_id:
- - base.group_partner_manager
- - base.group_user
- login: user2
- name: User 2
- password: user2
--
- I create a Project.
--
- !record {model: project.project, id: project_project_projecta0}:
- balance: 0.0
- credit: 0.0
- currency_id: base.EUR
- debit: 0.0
- effective_hours: 0.0
- name: Project A
- members:
- - res_users_user0
- - res_users_user1
- phase_ids:
- - date_start: '2011-01-06 08:00:00'
- duration: 2.0
- name: Phase A
- product_uom: product.uom_day
- state: draft
- task_ids:
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task D
- planned_hours: 5.0
- remaining_hours: 5.0
- state: draft
- total_hours: 5.0
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task C
- planned_hours: 5.0
- remaining_hours: 5.0
- sequence: 11
- state: draft
- total_hours: 5.0
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task B
- planned_hours: 5.0
- remaining_hours: 5.0
- sequence: 13
- state: draft
- total_hours: 5.0
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task A
- planned_hours: 5.0
- remaining_hours: 5.0
- sequence: 14
- state: draft
- total_hours: 5.0
- planned_hours: 20.0
- progress_rate: 0.0
- quantity: 0.0
- quantity_max: 0.0
- state: open
- tasks:
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task D
- planned_hours: 5.0
- remaining_hours: 5.0
- state: draft
- total_hours: 5.0
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task C
- planned_hours: 5.0
- remaining_hours: 5.0
- sequence: 11
- state: draft
- total_hours: 5.0
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task B
- planned_hours: 5.0
- remaining_hours: 5.0
- sequence: 13
- state: draft
- total_hours: 5.0
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task A
- planned_hours: 5.0
- remaining_hours: 5.0
- sequence: 14
- state: draft
- total_hours: 5.0
- total_hours: 15.0
--
- I create first task with highest sequence.
--
- !record {model: project.task, id: project_task_taska0}:
- delay_hours: 0.0
- effective_hours: 0.0
- name: Task A
- planned_hours: 5.0
- project_id: project_project_projecta0
- remaining_hours: 5.0
- sequence: 14
- state: draft
- total_hours: 5.0
--
- I create second task.
--
- !record {model: project.task, id: project_task_taskb0}:
- delay_hours: 0.0
- effective_hours: 0.0
- name: Task B
- planned_hours: 5.0
- project_id: project_project_projecta0
- remaining_hours: 5.0
- sequence: 13
- state: draft
- total_hours: 5.0
--
- I create third task.
--
- !record {model: project.task, id: project_task_taskc0}:
- delay_hours: 0.0
- effective_hours: 0.0
- name: Task C
- planned_hours: 5.0
- project_id: project_project_projecta0
- remaining_hours: 5.0
- sequence: 11
- state: draft
- total_hours: 5.0
--
- I create fourth task with lowest sequence.
--
- !record {model: project.task, id: project_task_taskd0}:
- delay_hours: 0.0
- effective_hours: 0.0
- name: Task D
- planned_hours: 5.0
- project_id: project_project_projecta0
- remaining_hours: 5.0
- state: draft
- total_hours: 5.0
--
- Now I create a resource for first user.
--
- !record {model: resource.resource, id: resource_resource_user0}:
- name: User 1
- resource_type: user
- time_efficiency: 1.0
- user_id: res_users_user0
--
- I create a resource for second user.
--
- !record {model: resource.resource, id: resource_resource_user1}:
- name: User 2
- resource_type: user
- time_efficiency: 1.0
- user_id: res_users_user1
--
- Now I create one phase for the project.
--
- !record {model: project.phase, id: project_phase_phasea0}:
- date_start: '2011-01-06 08:00:00'
- duration: 2.0
- name: Phase A
- product_uom: product.uom_day
- project_id: project_project_projecta0
- state: draft
- task_ids:
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task D
- planned_hours: 5.0
- project_id: project_project_projecta0
- remaining_hours: 5.0
- state: draft
- total_hours: 5.0
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task C
- planned_hours: 5.0
- project_id: project_project_projecta0
- remaining_hours: 5.0
- sequence: 11
- state: draft
- total_hours: 5.0
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task B
- planned_hours: 5.0
- project_id: project_project_projecta0
- remaining_hours: 5.0
- sequence: 13
- state: draft
- total_hours: 5.0
- - delay_hours: 0.0
- effective_hours: 0.0
- name: Task A
- planned_hours: 5.0
- project_id: project_project_projecta0
- remaining_hours: 5.0
- sequence: 14
- state: draft
- total_hours: 5.0
--
- Now I create a record to schedule the tasks of project.
--
- !record {model: project.compute.tasks, id: project_compute_tasks0}:
- project_id: project_project_projecta0
--
- I schedule the tasks.
--
- !python {model: project.compute.tasks}: |
- self.compute_date(cr, uid, [ref("project_compute_tasks0")])
--
- I check that whether the tasks now allocated to respected resources or not.
--
- !python {model: project.task}: |
- task_ids = self.search(cr, uid, [('project_id','=',ref('project_project_projecta0'))])
- for task in self.browse(cr, uid, task_ids):
- if (not task.date_start) or (not task.date_end):
- raise AssertionError("Tasks are not scheduled.")