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