Merge lp:~openerp-dev/openobject-addons/6.0-opw-6125-ach into lp:openobject-addons/6.0

Proposed by Anup(SerpentCS)
Status: Needs review
Proposed branch: lp:~openerp-dev/openobject-addons/6.0-opw-6125-ach
Merge into: lp:openobject-addons/6.0
Diff against target: 74 lines (+32/-6)
1 file modified
project/project.py (+32/-6)
To merge this branch: bzr merge lp:~openerp-dev/openobject-addons/6.0-opw-6125-ach
Reviewer Review Type Date Requested Status
Jay Vora (Serpent Consulting Services) Pending
Review via email: mp+63838@code.launchpad.net

Description of the change

Hello,

  There is an issue with Task when Project Unit Time is other than Hour.

Steps to generate the problem.

1.Change the Project Unit Time to Day.
2.Create a Sale Order for a Service Product for 20 Days.
3.A Task is created of 20 Days.
4.Enter Working entry for say 4 hours.
5.The Remaining Hours come as 16 Days.

This fixes the issue.

Thanks.

To post a comment you must log in.

Unmerged revisions

4643. By Anup(SerpentCS)

[FIX] project : If Project Unit Time is changed to Day the Remaining Hours and Total Hours were not calculated properly, Fixed(Case:6125)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'project/project.py'
2--- project/project.py 2011-01-18 22:45:39 +0000
3+++ project/project.py 2011-06-08 10:01:20 +0000
4@@ -320,14 +320,19 @@
5 # Compute: effective_hours, total_hours, progress
6 def _hours_get(self, cr, uid, ids, field_names, args, context=None):
7 res = {}
8+ if context is None:
9+ context = {}
10 cr.execute("SELECT task_id, COALESCE(SUM(hours),0) FROM project_task_work WHERE task_id IN %s GROUP BY task_id",(tuple(ids),))
11 hours = dict(cr.fetchall())
12 for task in self.browse(cr, uid, ids, context=context):
13- res[task.id] = {'effective_hours': hours.get(task.id, 0.0), 'total_hours': (task.remaining_hours or 0.0) + hours.get(task.id, 0.0)}
14+ rem_hours = task.remaining_hours
15+ work_hours = self.pool.get('project.task.work').compute_worked_hours(cr, uid, hours.get(task.id, 0.0), task.id, context=context)
16+ total_hours = rem_hours + work_hours
17+ res[task.id] = {'effective_hours': work_hours, 'total_hours': total_hours}
18 res[task.id]['delay_hours'] = res[task.id]['total_hours'] - task.planned_hours
19 res[task.id]['progress'] = 0.0
20- if (task.remaining_hours + hours.get(task.id, 0.0)):
21- res[task.id]['progress'] = round(min(100.0 * hours.get(task.id, 0.0) / res[task.id]['total_hours'], 99.99),2)
22+ if (rem_hours + work_hours):
23+ res[task.id]['progress'] = round(min(100.0 * work_hours / res[task.id]['total_hours'], 99.99),2)
24 if task.state in ('done','cancelled'):
25 res[task.id]['progress'] = 100.0
26 return res
27@@ -721,11 +726,28 @@
28 }
29
30 _order = "date desc"
31+
32+ def compute_worked_hours(self, cr, uid, worked_hours, task_id, context=None):
33+ if context is None:
34+ context = {}
35+ task = self.pool.get('project.task').browse(cr, uid, task_id, context=context)
36+ proj_time_unit = task.company_id.project_time_mode_id.name
37+ if proj_time_unit != _('Hour'):
38+ prod_uom_obj = self.pool.get('product.uom')
39+ proj_time_unit_id = task.company_id.project_time_mode_id.id
40+ task_uom_ids = prod_uom_obj.search(cr, uid, [('name','like','Hour')], context=context)
41+ task_uom_id = task_uom_ids and task_uom_ids[0]
42+ worked_hours = prod_uom_obj._compute_qty(cr, uid, task_uom_id, worked_hours, proj_time_unit_id)
43+ return worked_hours
44+
45 def create(self, cr, uid, vals, *args, **kwargs):
46 if 'hours' in vals and (not vals['hours']):
47 vals['hours'] = 0.00
48 if 'task_id' in vals:
49- cr.execute('update project_task set remaining_hours=remaining_hours - %s where id=%s', (vals.get('hours',0.0), vals['task_id']))
50+ worked_hours = vals.get('hours')
51+ context = kwargs.get('context',{})
52+ worked_hours = self.compute_worked_hours(cr, uid, worked_hours, vals.get('task_id'), context=context)
53+ cr.execute('update project_task set remaining_hours=remaining_hours - %s where id=%s', (worked_hours, vals['task_id']))
54 return super(project_work,self).create(cr, uid, vals, *args, **kwargs)
55
56 def write(self, cr, uid, ids, vals, context=None):
57@@ -733,12 +755,16 @@
58 vals['hours'] = 0.00
59 if 'hours' in vals:
60 for work in self.browse(cr, uid, ids, context=context):
61- cr.execute('update project_task set remaining_hours=remaining_hours - %s + (%s) where id=%s', (vals.get('hours',0.0), work.hours, work.task_id.id))
62+ worked_hours = self.compute_worked_hours(cr, uid, vals.get('hours'), work.task_id.id, context=context)
63+ old_work_hours = self.compute_worked_hours(cr, uid, work.hours, work.task_id.id, context=context)
64+ cr.execute('update project_task set remaining_hours=remaining_hours - %s + (%s) where id=%s', (worked_hours, old_work_hours, work.task_id.id))
65 return super(project_work,self).write(cr, uid, ids, vals, context)
66
67 def unlink(self, cr, uid, ids, *args, **kwargs):
68 for work in self.browse(cr, uid, ids):
69- cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (work.hours, work.task_id.id))
70+ context = kwargs.get('context',{})
71+ work_hours = self.compute_worked_hours(cr, uid, work.hours, work.task_id.id, context=context)
72+ cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (work_hours, work.task_id.id))
73 return super(project_work,self).unlink(cr, uid, ids,*args, **kwargs)
74 project_work()
75