[FIX] procurement, mrp, project_mrp: refactored the worflow in order to fix the case where mrp wasn't installed and we configured a product as mto with type=='produce'

bzr revid: qdp-launchpad@openerp.com-20121214145833-32q17yb2gw5rlhed
This commit is contained in:
Quentin (OpenERP) 2012-12-14 15:58:33 +01:00
parent 724b34b3b3
commit a26b04c921
5 changed files with 62 additions and 61 deletions

View File

@ -116,6 +116,10 @@
<!-- Procurement -->
<record id="act_need_production" model="workflow.activity">
<field name="wkf_id" ref="wkf_procurement"/>
<field name="name">need_production</field>
</record>
<record id="act_produce" model="workflow.activity">
<field name="wkf_id" ref="procurement.wkf_procurement"/>
<field name="name">produce</field>
@ -123,30 +127,34 @@
<field name="subflow_id" search="[('osv','=','mrp.production')]"/>
<field name="action">action_produce_assign_product()</field>
</record>
<record id="trans_confirm_mto_need_production" model="workflow.transition">
<field name="act_from" ref="procurement.act_confirm_mto"/>
<field name="act_to" ref="act_need_production"/>
<field name="condition">check_produce()</field>
</record>
<record id="trans_product_check_produce" model="workflow.transition">
<field name="act_from" ref="procurement.act_produce_check"/>
<field name="act_from" ref="act_need_production"/>
<field name="act_to" ref="act_produce"/>
<field name="condition">check_product()</field>
<field name="condition">is_product() and check_bom_exists()</field>
</record>
<record id="trans_produce_cancel" model="workflow.transition">
<field name="act_from" ref="act_produce"/>
<field name="act_to" ref="procurement.act_cancel"/>
<field name="signal">subflow.cancel</field>
</record>
<record id="trans_produce_make_done" model="workflow.transition">
<record id="trans_produce_finished_prod" model="workflow.transition">
<field name="act_from" ref="act_produce"/>
<field name="act_to" ref="procurement.act_make_done"/>
<field name="signal">subflow.done</field>
</record>
<record id="trans_conf_conf_wait" model="workflow.transition">
<field name="act_from" ref="procurement.act_confirm"/>
<field name="act_to" ref="procurement.act_confirm_temp"/>
<field name="condition">not test_cancel() and not get_phantom_bom_id()</field>
</record>
<record id="trans_produce_cancel" model="workflow.transition">
<field name="act_from" ref="act_produce"/>
<field name="act_to" ref="procurement.act_cancel"/>
<field name="signal">subflow.cancel</field>
</record>
</data>
</openerp>

View File

@ -33,19 +33,24 @@ class procurement_order(osv.osv):
'property_ids': fields.many2many('mrp.property', 'procurement_property_rel', 'procurement_id','property_id', 'Properties'),
'production_id': fields.many2one('mrp.production', 'Manufacturing Order'),
}
def check_produce_product(self, cr, uid, procurement, context=None):
return True
def check_bom_exists(self, cr, uid, ids, context=None):
""" Finds the bill of material for the product from procurement order.
@return: True or False
"""
properties = [x.id for x in procurement.property_ids]
bom_id = self.pool.get('mrp.bom')._bom_find(cr, uid, procurement.product_id.id, procurement.product_uom.id, properties)
if not bom_id:
cr.execute('update procurement_order set message=%s where id=%s', (_('No BoM defined for this product !'), procurement.id))
for (id, name) in self.name_get(cr, uid, procurement.id):
message = _("Procurement '%s' has an exception: 'No BoM defined for this product !'") % name
self.message_post(cr, uid, [procurement.id], body=message, context=context)
return False
for procurement in self.browse(cr, uid, ids, context=context):
product = procurement.product_id
properties = [x.id for x in procurement.property_ids]
bom_id = self.pool.get('mrp.bom')._bom_find(cr, uid, procurement.product_id.id, procurement.product_uom.id, properties)
if not bom_id:
cr.execute('update procurement_order set message=%s where id=%s', (_('No BoM defined for this product !'), procurement.id))
for (id, name) in self.name_get(cr, uid, procurement.id):
message = _("Procurement '%s' has an exception: 'No BoM defined for this product !'") % name
self.message_post(cr, uid, [procurement.id], body=message, context=context)
return False
return True
def get_phantom_bom_id(self, cr, uid, ids, context=None):

View File

@ -241,7 +241,7 @@ class procurement_order(osv.osv):
@param procurement: Current procurement.
@return: True or False.
"""
return True
return False
def check_make_to_stock(self, cr, uid, ids, context=None):
""" Checks product type.

View File

@ -63,17 +63,6 @@
<field name="kind">function</field>
<field name="action">action_move_assigned()</field>
</record>
<record id="act_produce_check" model="workflow.activity">
<field name="wkf_id" ref="wkf_procurement"/>
<field name="name">produce_check</field>
</record>
<!-- act_produce_service should be move in project_mrp module. -->
<record id="act_produce_service" model="workflow.activity">
<field name="wkf_id" ref="wkf_procurement"/>
<field name="name">produce_service</field>
<field name="kind">function</field>
<field name="action">action_produce_assign_service()</field>
</record>
<record id="act_make_done" model="workflow.activity">
<field name="wkf_id" ref="wkf_procurement"/>
@ -189,12 +178,13 @@
<field name="act_to" ref="act_make_to_stock"/>
<field name="condition">check_make_to_stock()</field>
</record>
<record id="trans_confirm_mto_produce_check" model="workflow.transition">
<record id="trans_confirm_mto_make_done" model="workflow.transition">
<field name="act_from" ref="act_confirm_mto"/>
<field name="act_to" ref="act_produce_check"/>
<field name="condition">check_produce()</field>
<field name="act_to" ref="act_make_done"/>
<field name="condition">not check_produce()</field>
</record>
<record id="trans_make_to_stock_make_done" model="workflow.transition">
<field name="act_from" ref="act_make_to_stock"/> <!-- TOFIX: If product is service product and procure method is 'make_to_stock', procurement is closed without generated service -->
<field name="act_to" ref="act_make_done"/>
@ -202,29 +192,6 @@
<field name="trigger_model" eval="False"/>
<field name="trigger_expr_id" eval="False"/>
</record>
<!-- TOFIX: Without installing 'mrp' module, If product is produce(mto), procurement never close (Its gone in idle) so sale order never close and also invoice never created if post paid invoice. solution of this issue is below, just add one transition from act_produce_check to act_make_done -->
<!--
<record id="trans_produce_make_done" model="workflow.transition">
<field name="act_from" ref="act_produce_check"/>
<field name="act_to" ref="procurement.act_make_done"/>
<field name="condition">check_product()</field>
</record> -->
<!-- TOFIX: service related transition should be move into project_mrp module. -->
<record id="trans_product_check_produce_service" model="workflow.transition">
<field name="act_from" ref="act_produce_check"/>
<field name="act_to" ref="act_produce_service"/>
<field name="condition">not check_product()</field>
</record>
<record id="trans_produce_service_cancel" model="workflow.transition">
<field name="act_from" ref="act_produce_service"/>
<field name="act_to" ref="act_cancel"/>
<field name="signal">subflow.cancel</field>
</record>
<record id="trans_produce_service_make_done" model="workflow.transition">
<field name="act_from" ref="act_produce_service"/>
<field name="act_to" ref="act_make_done"/>
</record>
<record id="trans_make_done_done" model="workflow.transition">
<field name="act_from" ref="act_make_done"/>

View File

@ -1,6 +1,27 @@
<?xml version="1.0"?>
<openerp>
<data>
<record id="act_produce_service" model="workflow.activity">
<field name="wkf_id" ref="wkf_procurement"/>
<field name="name">produce_service</field>
<field name="kind">function</field>
<field name="action">action_produce_assign_service()</field>
</record>
<record id="trans_product_check_produce_service" model="workflow.transition">
<field name="act_from" ref="mrp.act_produce_check"/>
<field name="act_to" ref="act_produce_service"/>
<field name="condition">not is_product()</field>
</record>
<record id="trans_produce_service_make_done" model="workflow.transition">
<field name="act_from" ref="act_produce_service"/>
<field name="act_to" ref="procurement.act_make_done"/>
</record>
<record id="trans_produce_service_cancel" model="workflow.transition">
<field name="act_from" ref="act_produce_service"/>
<field name="act_to" ref="procurement.act_cancel"/>
<field name="signal">subflow.cancel</field>
</record>
<record id="trans_make_done_done2" model="workflow.transition">
<field name="act_from" ref="procurement.act_make_done"/>
<field name="act_to" ref="procurement.act_done"/>