diff --git a/addons/account/account_analytic_line.py b/addons/account/account_analytic_line.py index c1c6e3f854b..1792525a7f6 100644 --- a/addons/account/account_analytic_line.py +++ b/addons/account/account_analytic_line.py @@ -20,7 +20,6 @@ ############################################################################## import time -import decimal_precision as dp from osv import fields from osv import osv @@ -94,11 +93,12 @@ class account_analytic_line(osv.osv): # Compute based on pricetype pricetype=self.pool.get('product.price.type').browse(cr, uid, company_obj.browse(cr,uid,company_id).property_valuation_price_type.id) # Take the company currency as the reference one - context['currency_id']=company_obj.browse(cr, uid, company_id).currency_id.id - amount_unit=prod.price_get(pricetype.field, context)[prod.id] + amount_unit = prod.price_get(pricetype.field, context)[prod.id] + amount = amount_unit*unit_amount or 1.0 + prec = self.pool.get('decimal.precision').precision_get(cr, uid, 'Account') amount = amount_unit*unit_amount or 1.0 return {'value': { - 'amount': - round(amount, 2), + 'amount': - round(amount, prec), 'general_account_id': a, }} return {} diff --git a/addons/project/project.py b/addons/project/project.py index 559b5f31961..f0e1ceaaddd 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -104,14 +104,6 @@ where prp.id in %s''',(tuple(ids),)) user_uom = obj_tm.id return user_uom, default_uom - def _compute_duration(self, cr, uid, duration=0.0, to_uom='default'): - uom_obj = self.pool.get('product.uom') - user_uom, default_uom = self._get_user_and_default_uom_ids(cr, uid) - if to_uom == 'default': - return uom_obj._compute_qty(cr, uid, user_uom, duration, default_uom) - else: - return uom_obj._compute_qty(cr, uid, default_uom, duration, user_uom) - def _progress_rate(self, cr, uid, ids, names, arg, context=None): res = {}.fromkeys(ids, 0.0) progress = {} @@ -146,12 +138,13 @@ where prp.id in %s''',(tuple(ids),)) p = tocompute.pop() for i in range(3): s[i] += progress.get(p, (0.0, 0.0, 0.0))[i] - + + uom_obj = self.pool.get('product.uom') user_uom, def_uom = self._get_user_and_default_uom_ids(cr, uid) if user_uom != def_uom: - s[0] = self._compute_duration(cr, uid, s[0]) - s[1] = self._compute_duration(cr, uid, s[1]) - s[2] = self._compute_duration(cr, uid, s[2]) + s[0] = uom_obj._compute_qty(cr, uid, user_uom, s[0], def_uom) + s[1] = uom_obj._compute_qty(cr, uid, user_uom, s[1], def_uom) + s[2] = uom_obj._compute_qty(cr, uid, user_uom, s[2], def_uom) if project.state == 'close': progress_rate = 100.0 @@ -345,7 +338,7 @@ class task(osv.osv): def search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False): for domain in args: - if len(domain) == 3 and domain[0] == 'project_id': + if domain[0] == 'project_id' and (not isinstance(domain[2], str)): id = isinstance(domain[2], list) and int(domain[2][0]) or int(domain[2]) if id: if self.pool.get('project.project').read(cr, user, id, ['state'])['state'] == 'template': @@ -364,11 +357,12 @@ class task(osv.osv): 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()) + uom_obj = self.pool.get('product.uom') user_uom, default_uom = project_obj._get_user_and_default_uom_ids(cr, uid) if user_uom != default_uom: for task in self.browse(cr, uid, ids, context=context): if hours.get(task.id, False): - dur_in_user_uom = project_obj._compute_duration(cr, uid, duration=hours.get(task.id, 0.0), to_uom='user') + dur_in_user_uom = uom_obj._compute_qty(cr, uid, default_uom, hours.get(task.id, 0.0), user_uom) hours[task.id] = dur_in_user_uom for task in self.browse(cr, uid, ids, context=context): @@ -665,11 +659,12 @@ class project_work(osv.osv): vals['hours'] = 0.00 project_obj = self.pool.get('project.project') + uom_obj = self.pool.get('product.uom') user_uom, default_uom = project_obj._get_user_and_default_uom_ids(cr, uid) duration = vals['hours'] if user_uom != default_uom: - duration = project_obj._compute_duration(cr, uid, duration=duration, to_uom='user') + duration = uom_obj._compute_qty(cr, uid, default_uom, duration, user_uom) cr.execute('update project_task set remaining_hours=remaining_hours - %s where id=%s', (duration, vals['task_id'])) return super(project_work,self).create(cr, uid, vals, *args, **kwargs) @@ -680,6 +675,7 @@ class project_work(osv.osv): vals['hours'] = 0.00 project_obj = self.pool.get('project.project') + uom_obj = self.pool.get('product.uom') user_uom, default_uom = project_obj._get_user_and_default_uom_ids(cr, uid) duration = vals['hours'] @@ -688,8 +684,8 @@ class project_work(osv.osv): cr.execute('update project_task set remaining_hours=remaining_hours - %s + (%s) where id=%s', (duration, work.hours, work.task_id.id)) else: for work in self.browse(cr, uid, ids, context): - duration = project_obj._compute_duration(cr, uid, duration=duration, to_uom='user') - del_work = project_obj._compute_duration(cr, uid, duration=work.hours, to_uom='user') + duration = uom_obj._compute_qty(cr, uid, default_uom, duration, user_uom) + del_work = uom_obj._compute_qty(cr, uid, default_uom, work.hours, user_uom) cr.execute('update project_task set remaining_hours=remaining_hours - %s + (%s) where id=%s', (duration, del_work, work.task_id.id)) return super(project_work,self).write(cr, uid, ids, vals, context) @@ -704,7 +700,7 @@ class project_work(osv.osv): cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (work.hours, work.task_id.id)) else: for work in self.browse(cr, uid, ids, context): - duration = project_obj._compute_duration(cr, uid, duration=work.hours, to_uom='user') + duration = uom_obj._compute_qty(cr, uid, default_uom, work.hours, user_uom) cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (duration, work.task_id.id)) return super(project_work,self).unlink(cr, uid, ids, *args, **kwargs) @@ -735,7 +731,35 @@ class config_compute_remaining(osv.osv_memory): _defaults = { 'remaining_hours': _get_remaining } + + def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): + users_obj = self.pool.get('res.users') + obj_tm = users_obj.browse(cr, uid, uid, context).company_id.project_time_mode_id + tm = obj_tm and obj_tm.name or 'Hours' + + res = super(config_compute_remaining, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu=submenu) + + if tm in ['Hours','Hour']: + return res + + eview = etree.fromstring(res['arch']) + + def _check_rec(eview): + if eview.attrib.get('widget','') == 'float_time': + eview.set('widget','float') + for child in eview: + _check_rec(child) + return True + + _check_rec(eview) + + res['arch'] = etree.tostring(eview) + + for f in res['fields']: + if 'Hours' in res['fields'][f]['string']: + res['fields'][f]['string'] = res['fields'][f]['string'].replace('Hours',tm) + return res def compute_hours(self, cr, uid, ids, context=None): if context is None: context = {} @@ -762,7 +786,7 @@ class config_compute_remaining(osv.osv_memory): return { 'type': 'ir.actions.act_window_close', } - + config_compute_remaining() class message(osv.osv): diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index d9b78e16e72..32421308671 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -214,7 +214,7 @@ form
- + diff --git a/addons/project_mrp/project_procurement.py b/addons/project_mrp/project_procurement.py index d4f703b4eae..2e8f8c6dff8 100644 --- a/addons/project_mrp/project_procurement.py +++ b/addons/project_mrp/project_procurement.py @@ -64,10 +64,13 @@ class procurement_order(osv.osv): # Creating a project for task.Project is created from Procurement. project_obj = self.pool.get('project.project') proj_name = tools.ustr(so_ref) - product_project_id =procurement.product_id.project_id and procurement.product_id.project_id.id or False + product_project = procurement.product_id.project_id or False proj_exist_id = project_obj.search(cr, uid, [('name', '=', proj_name)], context=context) - if not proj_exist_id: - project_id = project_obj.create(cr, uid, {'name': proj_name, 'partner_id': partner_id,'parent_id':product_project_id}) + if not proj_exist_id: + parent_project = False + if product_project: + parent_project = product_project.analytic_account_id.id + project_id = project_obj.create(cr, uid, {'name': proj_name, 'partner_id': partner_id, 'parent_id': parent_project}) else: project_id = proj_exist_id[0] diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index d020fa9a8b6..861d22025aa 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -60,7 +60,10 @@ class project_work(osv.osv): def create(self, cr, uid, vals, *args, **kwargs): obj_timesheet = self.pool.get('hr.analytic.timesheet') + project_obj = self.pool.get('project.project') task_obj = self.pool.get('project.task') + uom_obj = self.pool.get('product.uom') + vals_line = {} context = kwargs.get('context', {}) obj_task = task_obj.browse(cr, uid, vals['task_id']) @@ -69,7 +72,12 @@ class project_work(osv.osv): vals_line['user_id'] = vals['user_id'] vals_line['product_id'] = result['product_id'] vals_line['date'] = vals['date'][:10] + + #calculate quantity based on employee's product's uom vals_line['unit_amount'] = vals['hours'] + user_uom, default_uom = project_obj._get_user_and_default_uom_ids(cr, uid) + 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']) acc_id = obj_task.project_id.analytic_account_id.id vals_line['account_id'] = acc_id res = obj_timesheet.on_change_account_id(cr, uid, False, acc_id) @@ -88,7 +96,7 @@ class project_work(osv.osv): amount_unit = obj_timesheet.on_change_unit_amount(cr, uid, timeline_id, prod_id, amount, unit, context=context) if amount_unit and 'amount' in amount_unit.get('value',{}): - updv = { 'amount': amount_unit['value']['amount'] * (-1.0) } + updv = { 'amount': amount_unit['value']['amount'] } obj_timesheet.write(cr, uid, [timeline_id], updv, context=context) vals['hr_analytic_timesheet_id'] = timeline_id return super(project_work,self).create(cr, uid, vals, *args, **kwargs) @@ -98,6 +106,9 @@ class project_work(osv.osv): context = {} obj = self.pool.get('hr.analytic.timesheet') timesheet_obj = self.pool.get('hr.analytic.timesheet') + project_obj = self.pool.get('project.project') + uom_obj = self.pool.get('product.uom') + if isinstance(ids, (long, int)): ids = [ids,] @@ -120,15 +131,20 @@ class project_work(osv.osv): if 'date' in vals: vals_line['date'] = vals['date'][:10] if 'hours' in vals: + user_uom, default_uom = project_obj._get_user_and_default_uom_ids(cr, uid) vals_line['unit_amount'] = vals['hours'] prod_id = vals_line.get('product_id', line_id.product_id.id) # False may be set + + if result['product_uom_id'] 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']) + # Compute based on pricetype amount_unit = obj.on_change_unit_amount(cr, uid, line_id.id, prod_id=prod_id, unit_amount=vals_line['unit_amount'], unit=False, context=context) if amount_unit and 'amount' in amount_unit.get('value',{}): - vals_line['amount'] = amount_unit['value']['amount'] * (-1.0) + vals_line['amount'] = amount_unit['value']['amount'] obj.write(cr, uid, [line_id.id], vals_line, context=context) @@ -139,7 +155,7 @@ class project_work(osv.osv): hat_ids = [] for task in self.browse(cr, uid, ids): if task.hr_analytic_timesheet_id: - hat_ids.append(task.hr_analytic_timesheet_id) + hat_ids.append(task.hr_analytic_timesheet_id.id) # delete entry from timesheet too while deleting entry to task. if hat_ids: hat_obj.unlink(cr, uid, hat_ids, *args, **kwargs) diff --git a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml index 7e275067673..42e780642bf 100644 --- a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml +++ b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml @@ -91,7 +91,6 @@ work_ids: - date: '2010-06-03 15:04:47' hours: 10.0 - hr_analytic_timesheet_id: 3L name: Get work calendar of all employees user_id: res_users_hrmanager0