[FIX] improved fix of lp725028 (Stock picking rate wrongly computed when delivering...
[odoo/odoo.git] / addons / project_mrp / project_mrp.py
index 20471aa..ea12103 100644 (file)
@@ -27,7 +27,7 @@ class project_task(osv.osv):
     _inherit = "project.task"
     _columns = {
         'procurement_id': fields.many2one('procurement.order', 'Procurement', ondelete='set null'),
-        'sale_id': fields.many2one('sale.order','Sale Order')
+        '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):
@@ -45,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):
@@ -63,43 +62,39 @@ class sale_order(osv.osv):
             return {}
         res_sale = {}
         res = super(sale_order, self)._picked_rate(cr, uid, ids, name, arg, context=context)
-        cr.execute('''select so.id as sale_id, t.state as task_state ,
-                    t.id as task_id, count(t.id) as total
+        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 as so on so.id = t.sale_id
-                    where so.id in %s group by so.id,t.state,t.id ''',(tuple(ids),))
+                    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,
-                'percentage': 0.0,
-                'number_of_stockable': 0.0,
                 'total_no_task': 0,
-                'total': 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'] += 1
-            else: 
-                pass
+                res_sale[item['sale_id']]['number_of_done'] += item['total']
+
         for sale in self.browse(cr, uid, ids, context=context):
-            # Percent of service + other' Type product
-            res_sale[sale.id]['percentage'] = res_sale[sale.id]['total_no_task'] and (float(res_sale[sale.id]['number_of_done']) / res_sale[sale.id]['total_no_task']) * 100
-            res_sale[sale.id]['number_of_stockable'] = len(sale.order_line) - res_sale[sale.id]['total_no_task']
-            if res_sale[sale.id]['percentage'] == 100 and res[sale.id] == 100 or res_sale[sale.id]['total_no_task'] == 0:
-                continue
-            elif res_sale[sale.id]['number_of_stockable'] == 0:
-                res[sale.id] = (res_sale[sale.id]['percentage'])
-            else:
-                res[sale.id] = round((res[sale.id] + res_sale[sale.id]['percentage']) / (res_sale[sale.id]['total_no_task']), 2)
-                if res[sale.id] > 100:
-                    res[sale.id] = 100
+            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 = {