_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):
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):
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 = {