diff --git a/addons/project_mrp/project_mrp.py b/addons/project_mrp/project_mrp.py index b027e9eb60f..ea121033b5b 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_line_id': fields.related('procurement_id', 'sale_line_id', type='many2one', relation='sale.order.line', store=True, string='Sale Order Line'), } def _validate_subflows(self, cr, uid, ids): @@ -44,7 +45,6 @@ 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): @@ -54,5 +54,52 @@ class product_product(osv.osv): } product_product() +class sale_order(osv.osv): + _inherit ='sale.order' + def _picked_rate(self, cr, uid, ids, name, arg, context=None): + if not ids: + return {} + res_sale = {} + res = super(sale_order, self)._picked_rate(cr, uid, ids, name, arg, context=context) + cr.execute('''select sol.order_id as sale_id, t.state as task_state , + t.id as task_id, sum(sol.product_uom_qty) as total + from project_task as t + left join sale_order_line as sol on sol.id = t.sale_line_id + where sol.order_id in %s group by sol.order_id,t.state,t.id ''',(tuple(ids),)) + sale_task_data = cr.dictfetchall() + + if not sale_task_data: + return res + + for id in ids: + res_sale[id] = { + 'number_of_done': 0, + 'total_no_task': 0, + } + #compute the sum of quantity for each SO + cr.execute('''select sol.order_id as sale_id, sum(sol.product_uom_qty) as total + from sale_order_line sol where sol.order_id in %s group by sol.order_id''',(tuple(ids),)) + total_qtty_ref = cr.dictfetchall() + for item in total_qtty_ref: + res_sale[item['sale_id']]['number_of_stockable'] = item['total'] + + for item in sale_task_data: + res_sale[item['sale_id']]['total_no_task'] += item['total'] + if item['task_state'] == 'done': + res_sale[item['sale_id']]['number_of_done'] += item['total'] + + for sale in self.browse(cr, uid, ids, context=context): + res_sale[sale.id]['number_of_stockable'] -= res_sale[sale.id]['total_no_task'] + #adjust previously percentage because now we must also count the product of type service + res[sale.id] = res[sale.id] * float(res_sale[sale.id]['number_of_stockable']) / (res_sale[sale.id]['number_of_stockable'] + res_sale[sale.id]['total_no_task']) + #add the task + res[sale.id] += res_sale[sale.id]['number_of_done'] * 100 / (res_sale[sale.id]['number_of_stockable'] + res_sale[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/project_mrp/project_mrp_view.xml b/addons/project_mrp/project_mrp_view.xml index c8ed6fbc447..b5ce4e8190d 100644 --- a/addons/project_mrp/project_mrp_view.xml +++ b/addons/project_mrp/project_mrp_view.xml @@ -24,7 +24,18 @@ - + + + project.mrp.form.view.inherit + project.task + form + + + + + + + - \ No newline at end of file + diff --git a/addons/project_mrp/project_procurement.py b/addons/project_mrp/project_procurement.py index 0a7fa12ce6f..f022f952792 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 @@ -50,7 +51,7 @@ class procurement_order(osv.osv): 'state': 'draft', 'company_id': procurement.company_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() diff --git a/addons/sale/sale.py b/addons/sale/sale.py index bde5ba4fa26..ae66471806e 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})