Amit Dodiya (OpenERP) has proposed merging 
lp:~openerp-dev/openobject-addons/6.1-opw-576096-ado into 
lp:openobject-addons/6.1.

Requested reviews:
  Naresh(OpenERP) (nch-openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/6.1-opw-576096-ado/+merge/118510

Hello,

"[FIX] For project when we set the company "Project time unit" to work by day 
for task encoding the time encoding is consider in day so problem is that you 
encode 8 hours in timesheet entry it actually consider it as 8 days it should 
consider 8 hours"

There is a bug when you want to encode time in a task. If you set the company 
to work by day for task encoding the time encoding is still in hour. The 
problem is that you encode 8 hours, it actually consider it as 8 days. I have 
created a task with 10 Planned days, and I encoded a work of 8 hours, but my 
Remaining day is 2.

Steps:
1). Set the "Project time unit = Day" in company configuration
2). Create a task with 10 days and add taskwork entry for 2 hours
You will see it will deduct 2 days instead of 2 hours.
It should deduct 2 hours from 10 days.
So the system has taken days instead of hours, It should always take hours. 

Regards,
Amit Dodiya

-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/6.1-opw-576096-ado/+merge/118510
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-addons/6.1-opw-576096-ado.
=== modified file 'project/project.py'
--- project/project.py	2012-07-20 15:12:03 +0000
+++ project/project.py	2012-08-07 08:37:26 +0000
@@ -530,22 +530,32 @@
             border[0]+' '+(task.name or '')+'\n'+ \
             (task.description or '')+'\n\n'
 
+
+    def convert_hours(self, cr, uid, ids, hours):
+        if not hours:
+            hours = 0.0
+        new_hours = hours / self.pool.get('hr.employee').browse(cr, uid, uid).product_id.uom_id.factor
+        return new_hours
     # Compute: effective_hours, total_hours, progress
     def _hours_get(self, cr, uid, ids, field_names, args, context=None):
         res = {}
         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())
+        new_hours = 0.0
         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)}
+            if task.company_id.project_time_mode_id.name == 'Day':
+                new_hours = self.convert_hours(cr, uid, ids, hours.get(task.id, 0.0))
+            else:
+                new_hours = hours.get(task.id, 0.0)
+            res[task.id] = {'effective_hours': new_hours, 'total_hours': (task.remaining_hours or 0.0) + new_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 (task.remaining_hours + new_hours):
+                res[task.id]['progress'] = round(min(100.0 * new_hours / res[task.id]['total_hours'], 99.99),2)
             if task.state in ('done','cancelled'):
                 res[task.id]['progress'] = 100.0
         return res
 
-
     def onchange_remaining(self, cr, uid, ids, remaining=0.0, planned = 0.0):
         if remaining and not planned:
             return {'value':{'planned_hours': remaining}}
@@ -1104,26 +1114,46 @@
         'user_id': lambda obj, cr, uid, context: uid,
         'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S')
     }
-
+    
     _order = "date desc"
     def create(self, cr, uid, vals, *args, **kwargs):
+        old_hours = vals['hours']
+        task_obj = self.pool.get('project.task')
+        if self.pool.get('res.company').browse(cr, uid, uid).project_time_mode_id.name == 'Day':
+            vals.update({'hours': task_obj.convert_hours(cr, uid, uid, hours=vals['hours'])})
         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']))
+        vals.update({'hours': old_hours})
         return super(project_work,self).create(cr, uid, vals, *args, **kwargs)
 
     def write(self, cr, uid, ids, vals, context=None):
+        task_obj = self.pool.get('project.task')
         if 'hours' in vals and (not vals['hours']):
             vals['hours'] = 0.00
         if 'hours' in vals:
+            old_hours = vals['hours']
             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))
+                if self.pool.get('res.company').browse(cr, uid, uid).project_time_mode_id.name == 'Day':
+                    new_hours = 0.0
+                    vals.update({'hours': task_obj.convert_hours(cr, uid, uid, hours=vals['hours']) })
+                    new_hours = task_obj.convert_hours(cr, uid, ids, hours=work.hours)
+                else:
+                    new_hours = work.hours
+                cr.execute('update project_task set remaining_hours=remaining_hours - %s + (%s) where id=%s', (vals.get('hours',0.0), new_hours, work.task_id.id))
+            vals.update({'hours': old_hours})
         return super(project_work,self).write(cr, uid, ids, vals, context)
 
     def unlink(self, cr, uid, ids, *args, **kwargs):
+        user_data = self.pool.get('res.company').browse(cr, uid, uid)
+        task_obj = self.pool.get('project.task')
         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))
+            if user_data.project_time_mode_id.name == 'Day':
+                new_hours = task_obj.convert_hours(cr, uid, ids, hours=work.hours)
+            else:
+                new_hours = work.hours
+            cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (new_hours, work.task_id.id))
         return super(project_work,self).unlink(cr, uid, ids,*args, **kwargs)
 project_work()
 

=== modified file 'project_timesheet/project_timesheet.py'
--- project_timesheet/project_timesheet.py	2012-01-31 13:36:57 +0000
+++ project_timesheet/project_timesheet.py	2012-08-07 08:37:26 +0000
@@ -79,7 +79,7 @@
         project_obj = self.pool.get('project.project')
         task_obj = self.pool.get('project.task')
         uom_obj = self.pool.get('product.uom')
-        
+        old_hours = 0.0
         vals_line = {}
         context = kwargs.get('context', {})
         if not context.get('no_analytic_entry',False):
@@ -93,9 +93,13 @@
             #calculate quantity based on employee's product's uom 
             vals_line['unit_amount'] = vals['hours']
 
-            default_uom = self.pool.get('res.users').browse(cr, uid, uid).company_id.project_time_mode_id.id
-            if result['product_uom_id'] != default_uom:
-                vals_line['unit_amount'] = uom_obj._compute_qty(cr, uid, default_uom, vals['hours'], result['product_uom_id'])
+            default_uom = self.pool.get('res.users').browse(cr, uid, uid).company_id.project_time_mode_id
+            if result['product_uom_id'] != default_uom.id:
+                if default_uom.name == 'Day':
+                    old_hours = task_obj.convert_hours(cr, uid, uid, hours=vals['hours'])
+                else:
+                    old_hours = vals['hours']
+                vals_line['unit_amount'] = uom_obj._compute_qty(cr, uid, default_uom.id, old_hours, result['product_uom_id'])
             acc_id = obj_task.project_id and obj_task.project_id.analytic_account_id.id or False
             if acc_id:
                 vals_line['account_id'] = acc_id
@@ -126,7 +130,9 @@
         timesheet_obj = self.pool.get('hr.analytic.timesheet')
         project_obj = self.pool.get('project.project')
         uom_obj = self.pool.get('product.uom')
+        task_obj = self.pool.get('project.task')
         result = {}
+        old_hours = 0.0
         
         if isinstance(ids, (long, int)):
             ids = [ids,]
@@ -150,12 +156,16 @@
             if 'date' in vals:
                 vals_line['date'] = vals['date'][:10]
             if 'hours' in vals:
-                default_uom = self.pool.get('res.users').browse(cr, uid, uid).company_id.project_time_mode_id.id
+                default_uom = self.pool.get('res.users').browse(cr, uid, uid).company_id.project_time_mode_id
                 vals_line['unit_amount'] = vals['hours']
                 prod_id = vals_line.get('product_id', line_id.product_id.id) # False may be set
 
-                if result.get('product_uom_id',False) and (not result['product_uom_id'] == default_uom):
-                    vals_line['unit_amount'] = uom_obj._compute_qty(cr, uid, default_uom, vals['hours'], result['product_uom_id'])
+                if result.get('product_uom_id',False) and (not result['product_uom_id'] == default_uom.id):
+                    if default_uom.name == 'Day':
+                        old_hours = task_obj.convert_hours(cr, uid, ids, hours=vals['hours'])
+                    else:
+                        old_hours = vals['hours']
+                    vals_line['unit_amount'] = uom_obj._compute_qty(cr, uid, default_uom.id, old_hours, result['product_uom_id'])
                     
                 # Compute based on pricetype
                 amount_unit = timesheet_obj.on_change_unit_amount(cr, uid, line_id.id,

_______________________________________________
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