[FIX] improved fix of lp725028 (Stock picking rate wrongly computed when delivering tasks with project_mrp)
lp bug: https://launchpad.net/bugs/725028 fixed bzr revid: qdp-launchpad@openerp.com-20110916113832-63sig807dkbgugo2
This commit is contained in:
commit
68905a0562
|
@ -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:
|
||||
|
|
|
@ -24,7 +24,18 @@
|
|||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="view_project_mrp_inherit_form2" model="ir.ui.view">
|
||||
<field name="name">project.mrp.form.view.inherit</field>
|
||||
<field name="model">project.task</field>
|
||||
<field name="type">form</field>
|
||||
<field name="inherit_id" ref="project.view_task_form2"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="/form/notebook/page[@string='Extra Info']/separator[@string='Notes']" position="before">
|
||||
<field name="sale_line_id"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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})
|
||||
|
|
Loading…
Reference in New Issue