Anup(OpenERP) has proposed merging 
lp:~openerp-dev/openobject-addons/6.0-opw-6125-ach into 
lp:openobject-addons/6.0.

Requested reviews:
  Jay Vora (OpenERP) (jvo-openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/6.0-opw-6125-ach/+merge/63838

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.
-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/6.0-opw-6125-ach/+merge/63838
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-addons/6.0-opw-6125-ach.
=== modified file 'project/project.py'
--- project/project.py	2011-01-18 22:45:39 +0000
+++ project/project.py	2011-06-08 10:01:20 +0000
@@ -320,14 +320,19 @@
     # Compute: effective_hours, total_hours, progress
     def _hours_get(self, cr, uid, ids, field_names, args, context=None):
         res = {}
+        if context is None:
+            context = {}
         cr.execute("SELECT task_id, COALESCE(SUM(hours),0) FROM project_task_work WHERE task_id IN %s GROUP BY task_id",(tuple(ids),))
         hours = dict(cr.fetchall())
         for task in self.browse(cr, uid, ids, context=context):
-            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)}
+            rem_hours = task.remaining_hours
+            work_hours = self.pool.get('project.task.work').compute_worked_hours(cr, uid, hours.get(task.id, 0.0), task.id, context=context)
+            total_hours = rem_hours + work_hours
+            res[task.id] = {'effective_hours': work_hours, 'total_hours': total_hours}
             res[task.id]['delay_hours'] = res[task.id]['total_hours'] - task.planned_hours
             res[task.id]['progress'] = 0.0
-            if (task.remaining_hours + hours.get(task.id, 0.0)):
-                res[task.id]['progress'] = round(min(100.0 * hours.get(task.id, 0.0) / res[task.id]['total_hours'], 99.99),2)
+            if (rem_hours + work_hours):
+                res[task.id]['progress'] = round(min(100.0 * work_hours / res[task.id]['total_hours'], 99.99),2)
             if task.state in ('done','cancelled'):
                 res[task.id]['progress'] = 100.0
         return res
@@ -721,11 +726,28 @@
     }
 
     _order = "date desc"
+    
+    def compute_worked_hours(self, cr, uid, worked_hours, task_id, context=None):
+        if context is None:
+            context = {}
+        task = self.pool.get('project.task').browse(cr, uid, task_id, context=context)
+        proj_time_unit = task.company_id.project_time_mode_id.name
+        if proj_time_unit != _('Hour'):
+            prod_uom_obj = self.pool.get('product.uom')
+            proj_time_unit_id = task.company_id.project_time_mode_id.id
+            task_uom_ids = prod_uom_obj.search(cr, uid, [('name','like','Hour')], context=context)
+            task_uom_id = task_uom_ids and task_uom_ids[0]
+            worked_hours = prod_uom_obj._compute_qty(cr, uid, task_uom_id, worked_hours, proj_time_unit_id)
+        return worked_hours
+    
     def create(self, cr, uid, vals, *args, **kwargs):
         if 'hours' in vals and (not vals['hours']):
             vals['hours'] = 0.00
         if 'task_id' in vals:
-            cr.execute('update project_task set remaining_hours=remaining_hours - %s where id=%s', (vals.get('hours',0.0), vals['task_id']))
+            worked_hours = vals.get('hours')
+            context = kwargs.get('context',{})
+            worked_hours = self.compute_worked_hours(cr, uid, worked_hours, vals.get('task_id'), context=context)
+            cr.execute('update project_task set remaining_hours=remaining_hours - %s where id=%s', (worked_hours, vals['task_id']))
         return super(project_work,self).create(cr, uid, vals, *args, **kwargs)
 
     def write(self, cr, uid, ids, vals, context=None):
@@ -733,12 +755,16 @@
             vals['hours'] = 0.00
         if 'hours' in vals:
             for work in self.browse(cr, uid, ids, context=context):
-                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))
+                worked_hours = self.compute_worked_hours(cr, uid, vals.get('hours'), work.task_id.id, context=context)
+                old_work_hours = self.compute_worked_hours(cr, uid, work.hours, work.task_id.id, context=context)
+                cr.execute('update project_task set remaining_hours=remaining_hours - %s + (%s) where id=%s', (worked_hours, old_work_hours, work.task_id.id))
         return super(project_work,self).write(cr, uid, ids, vals, context)
 
     def unlink(self, cr, uid, ids, *args, **kwargs):
         for work in self.browse(cr, uid, ids):
-            cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (work.hours, work.task_id.id))
+            context = kwargs.get('context',{})
+            work_hours = self.compute_worked_hours(cr, uid, work.hours, work.task_id.id, context=context)
+            cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (work_hours, work.task_id.id))
         return super(project_work,self).unlink(cr, uid, ids,*args, **kwargs)
 project_work()
 

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to