From aa64cc273781ff94db664cf61d243a7f1b11c295 Mon Sep 17 00:00:00 2001 From: skh Date: Thu, 14 Apr 2011 17:19:50 +0530 Subject: [PATCH] [FIX] [6.0] sale.order picked_rate is wrong lp bug: https://launchpad.net/bugs/725028 fixed bzr revid: skh@tinyerp.com-20110414114950-cy55v185kkwsrxlw --- addons/project/project.py | 2 + addons/project_mrp/project_mrp.py | 7 +- addons/project_mrp/project_mrp_view.xml | 2 + addons/project_mrp/project_procurement.py | 84 ++++++++++++++++++++++- addons/sale/sale.py | 7 +- 5 files changed, 94 insertions(+), 8 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index 137ef3f8a3f..6fa1e8f21f8 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -328,6 +328,7 @@ class task(osv.osv): # 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()) @@ -339,6 +340,7 @@ class task(osv.osv): res[task.id]['progress'] = round(min(100.0 * hours.get(task.id, 0.0) / res[task.id]['total_hours'], 99.99),2) if task.state in ('done','cancelled'): res[task.id]['progress'] = 100.0 + return res diff --git a/addons/project_mrp/project_mrp.py b/addons/project_mrp/project_mrp.py index b027e9eb60f..c7f6c7368c1 100644 --- a/addons/project_mrp/project_mrp.py +++ b/addons/project_mrp/project_mrp.py @@ -26,7 +26,8 @@ class project_task(osv.osv): _name = "project.task" _inherit = "project.task" _columns = { - 'procurement_id': fields.many2one('procurement.order', 'Procurement', ondelete='set null') + 'procurement_id': fields.many2one('procurement.order', 'Procurement', ondelete='set null'), + 'sale_id': fields.many2one('sale.order','Sale Order') } def _validate_subflows(self, cr, uid, ids): @@ -44,7 +45,8 @@ class project_task(osv.osv): res = super(project_task, self).do_cancel(cr, uid, ids, *args, **kwargs) self._validate_subflows(cr, uid, ids) return res - + + project_task() class product_product(osv.osv): @@ -55,4 +57,5 @@ class product_product(osv.osv): product_product() + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project_mrp/project_mrp_view.xml b/addons/project_mrp/project_mrp_view.xml index c8ed6fbc447..a50ccf9d832 100644 --- a/addons/project_mrp/project_mrp_view.xml +++ b/addons/project_mrp/project_mrp_view.xml @@ -24,6 +24,8 @@ + + diff --git a/addons/project_mrp/project_procurement.py b/addons/project_mrp/project_procurement.py index 0a7fa12ce6f..2e0fea81d71 100644 --- a/addons/project_mrp/project_procurement.py +++ b/addons/project_mrp/project_procurement.py @@ -27,7 +27,8 @@ class procurement_order(osv.osv): _name = "procurement.order" _inherit = "procurement.order" _columns = { - 'task_id': fields.many2one('project.task', 'Task') + 'task_id': fields.many2one('project.task', 'Task'), + 'sale_line_id': fields.many2one('sale.order.line', 'Sale order line') } def check_produce_service(self, cr, uid, procurement, context=None): return True @@ -49,10 +50,87 @@ class procurement_order(osv.osv): 'project_id': procurement.product_id.project_id and procurement.product_id.project_id.id or False, 'state': 'draft', 'company_id': procurement.company_id.id, + 'sale_id':procurement.sale_line_id.order_id.id },context=context) - self.write(cr, uid, [procurement.id],{'task_id':task_id}) + self.write(cr, uid, [procurement.id],{'task_id':task_id}) return task_id - + procurement_order() +class sale_order(osv.osv): + _inherit ='sale.order' + + def _picked_rate(self, cr, uid, ids, name, arg, context=None): + temp = {} + if not ids: + return {} + res = super(sale_order, self)._picked_rate(cr, uid, ids, name, arg, context=context) + cr.execute('''select so.id as sale_id, t.planned_hours, t.state as task_state , + t.id as task_id, ptw.hours as task_hours + from project_task as t + left join sale_order as so on so.id = t.sale_id + left join project_task_work as ptw on t.id = ptw.task_id + where so.id in %s ''',(tuple(ids),)) + r1 = cr.dictfetchall() + if not r1: + return res + test = {} + for id in ids: + test[id] = {} + test[id]['number_of_done'] = 0 + test[id]['number_of_others'] = 0 + test[id]['total_no_task'] = 0 + test[id]['percentage'] = 0.0 + test[id]['number_of_stockable'] = 0.0 + test[id]['number_of_planned'] = 0.0 + test[id]['time_spent'] = 0.0 + + for item in r1: + flag = False + flag2 = False + if not item['task_hours'] and item['task_state'] == 'done': # If Task hours not given and task completed + flag = True + + if item['task_hours'] and item['task_state'] == 'done': #If Task hours but Task in Done state as well as task work != planned hours + flag2 = True + + if item['task_hours']: # If task work in the task + test[item['sale_id']]['time_spent'] += item['task_hours'] + + if item['task_state'] == 'done': # If State is in done state + test[item['sale_id']]['number_of_done'] += 1 + else: # Else Part + test[item['sale_id']]['number_of_others'] += 1 + + # dict calculated here + test[item['sale_id']]['number_of_planned'] += item['planned_hours'] + test[item['sale_id']]['total_no_task'] += 1 + test[item['sale_id']]['percentage'] = float(test[item['sale_id']]['time_spent']) / test[item['sale_id']]['number_of_planned'] * 100 + + + if flag: # Flag If Task is done without Task hours + test[item['sale_id']]['percentage'] = (float(test[item['sale_id']]['number_of_done']) / test[item['sale_id']]['number_of_planned']) * 100 + + if flag2: # Flag 2 Task with work and state is in done state as well as task work != planned hours + test[item['sale_id']]['percentage'] = (float(test[item['sale_id']]['number_of_done']) / test[item['sale_id']]['number_of_planned']) * 100 + + + for sale in self.browse(cr,uid,ids,context=None): + # Non service type products are calculated here + test[item['sale_id']]['number_of_stockable'] = len(sale.order_line) - test[item['sale_id']]['total_no_task'] + + # condition for the percent calculation + if test[item['sale_id']]['percentage'] == 100 and res[sale.id] == 100: + continue + elif test[item['sale_id']]['number_of_stockable'] == 0: + res[sale.id] = (test[sale.id]['percentage']) + else: + res[sale.id] = (res[sale.id] + test[sale.id]['percentage']) / (test[item['sale_id']]['number_of_stockable'] + test[item['sale_id']]['total_no_task']) + return res + + _columns = { + 'picked_rate': fields.function(_picked_rate, method=True, string='Picked', type='float'), + } + +sale_order() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale/sale.py b/addons/sale/sale.py index f80d610eb03..452cb6b01a1 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -109,7 +109,7 @@ class sale_order(osv.osv): for item in cr.dictfetchall(): if item['move_state'] == 'cancel': continue - + if item['picking_type'] == 'in':#this is a returned picking tmp[item['sale_order_id']]['total'] -= item['nbr'] or 0.0 # Deducting the return picking qty if item['procurement_state'] == 'done' or item['move_state'] == 'done': @@ -118,13 +118,13 @@ class sale_order(osv.osv): tmp[item['sale_order_id']]['total'] += item['nbr'] or 0.0 if item['procurement_state'] == 'done' or item['move_state'] == 'done': tmp[item['sale_order_id']]['picked'] += item['nbr'] or 0.0 - + for order in self.browse(cr, uid, ids, context=context): if order.shipped: res[order.id] = 100.0 else: res[order.id] = tmp[order.id]['total'] and (100.0 * tmp[order.id]['picked'] / tmp[order.id]['total']) or 0.0 - return res + return res def _invoiced_rate(self, cursor, user, ids, name, arg, context=None): res = {} @@ -728,6 +728,7 @@ class sale_order(osv.osv): 'move_id': move_id, 'property_ids': [(6, 0, [x.id for x in line.property_ids])], 'company_id': order.company_id.id, + 'sale_line_id': line.id, }) proc_ids.append(proc_id) self.pool.get('sale.order.line').write(cr, uid, [line.id], {'procurement_id': proc_id})