- In order to test the mrp phantom bom type in OpenERP, I will create products and then I will create Phantom bom structure for those products. - I create BOM category fluid for Orange Juice - !record {model: product.uom.categ, id: product_uom_categ_fluid}: name: Fluid - I create the products required to produce some orange juices with Oranges, Sugar and Water. - !record {model: product.uom, id: product_uom_litre0}: category_id: product_uom_categ_fluid factor: 1.0 name: Litre rounding: 0.01 - I create record for product Orange Juice. - !record {model: product.product, id: product_product_orangejuice0}: categ_id: product.cat1 name: Orange Juice procure_method: make_to_order supply_method: produce type: product uom_id: product_uom_litre0 uom_po_id: product_uom_litre0 property_stock_inventory: stock.location_inventory property_stock_procurement: stock.location_procurement property_stock_production: stock.location_production - I create record for product Orange. - !record {model: product.product, id: product_product_orange0}: categ_id: product.cat1 name: Orange procure_method: make_to_stock seller_ids: - delay: 1 name: base.res_partner_asus min_qty: 1.0 product_uom: product.product_uom_kgm supply_method: buy type: product uom_id: product.product_uom_kgm uom_po_id: product.product_uom_kgm property_stock_inventory: stock.location_inventory property_stock_procurement: stock.location_procurement property_stock_production: stock.location_production - I create record for product Sugar. - !record {model: product.product, id: product_product_sugar0}: categ_id: product.cat1 name: Sugar procure_method: make_to_stock seller_ids: - delay: 1 name: base.res_partner_desertic_hispafuentes min_qty: 2.0 product_uom: product.product_uom_kgm supply_method: buy type: product uom_id: product.product_uom_kgm uom_po_id: product.product_uom_kgm property_stock_inventory: stock.location_inventory property_stock_procurement: stock.location_procurement property_stock_production: stock.location_production - I create record for product Water. - !record {model: product.product, id: product_product_water0}: categ_id: product.cat1 name: Water procure_method: make_to_order seller_ids: - delay: 1 name: base.res_partner_agrolait product_uom: product_uom_litre0 min_qty: 2.0 supply_method: buy type: consu uom_id: product_uom_litre0 uom_po_id: product_uom_litre0 property_stock_inventory: stock.location_inventory property_stock_procurement: stock.location_procurement property_stock_production: stock.location_production - I define the BoM to produce an orange juice. - !record {model: mrp.bom, id: mrp_bom_orangejuice0}: company_id: base.main_company name: Orange Juice product_efficiency: 1.0 product_id: product_product_orangejuice0 product_qty: 1.0 product_uom: product_uom_litre0 type: phantom - I create bom lines for BoM for Orange Juice. - !record {model: mrp.bom, id: mrp_bom_orangejuice0}: bom_lines: - bom_id: mrp_bom_orangejuice0 company_id: base.main_company name: Orange product_efficiency: 1.0 product_id: product_product_orange0 product_qty: 0.5 product_uom: product.product_uom_kgm type: normal - bom_id: mrp_bom_orangejuice0 company_id: base.main_company name: Sugar product_efficiency: 1.0 product_id: product_product_sugar0 product_qty: 0.02 product_uom: product.product_uom_kgm type: normal - bom_id: mrp_bom_orangejuice0 company_id: base.main_company name: Water product_efficiency: 1.0 product_id: product_product_water0 product_qty: 0.80000000000000004 product_uom: product_uom_litre0 type: normal - I define Minimum stock rules for my stockable product "Orange". - !record {model: stock.warehouse.orderpoint, id: stock_warehouse_orderpoint_op0}: company_id: base.main_company location_id: stock.stock_location_stock logic: max name: OP/00002 product_id: product_product_orange0 product_max_qty: 10.0 product_min_qty: 5.0 product_uom: product.product_uom_kgm qty_multiple: 1 warehouse_id: stock.warehouse0 - I define Minimum stock rules for my stockable product "Sugar". - !record {model: stock.warehouse.orderpoint, id: stock_warehouse_orderpoint_op1}: company_id: base.main_company location_id: stock.stock_location_stock logic: max name: OP/00003 product_id: product_product_sugar0 product_max_qty: 4.0 product_min_qty: 2.0 product_uom: product.product_uom_kgm qty_multiple: 1 warehouse_id: stock.warehouse0 - I want to produce 100 litres of Orange juice. I am creating a manufacturing order for this. I want to see how much quantities of sub products I need, to produce the Orange juice. - I compute the data. I get the bill of material of Orange juice and list of scheduled products according to my bom. - !record {model: mrp.production, id: mrp_production_mo0}: company_id: base.main_company date_planned: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S") location_dest_id: stock.stock_location_output location_src_id: stock.stock_location_stock product_id: product_product_orangejuice0 product_qty: 100.0 product_uom: product_uom_litre0 - Creating an mrp.production record. Computing Bills of materials. - !record {model: mrp.production, id: mrp_production_mo0}: bom_id: mrp.mrp_bom_orangejuice0 company_id: base.main_company date_planned: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S") location_dest_id: stock.stock_location_output location_src_id: stock.stock_location_stock name: MO/00002 product_id: mrp.product_product_orangejuice0 product_lines: - name: Orange product_id: mrp.product_product_orange0 product_qty: 50.0 product_uom: product.product_uom_kgm production_id: mrp_production_mo0 - name: Sugar product_id: mrp.product_product_sugar0 product_qty: 2.0 product_uom: product.product_uom_kgm production_id: mrp_production_mo0 - name: Water product_id: mrp.product_product_water0 product_qty: 80.0 product_uom: mrp.product_uom_litre0 production_id: mrp_production_mo0 product_qty: 100.0 product_uom: mrp.product_uom_litre0 - I confirm the order. - !workflow {model: mrp.production, action: button_confirm, ref: mrp_production_mo0} - I am checking Procurement orders. There are 3 orders generated for Oranges, Sugar and Water. - !python {model: procurement.order}: | proc_ids = self.search(cr, uid, [('product_id','in',[ref('product_product_orange0'),ref('product_product_sugar0'),ref('product_product_water0')])]) assert proc_ids, 'No Procurements!' - The scheduler runs. - !function {model: procurement.order, name: run_scheduler}: - model: procurement.order search: "[]" - I am checking Internal picking. I see one picking for Orange juice and its stock moves for Oranges, Sugar and Water made correctly. - !python {model: stock.picking}: | pick_ids = self.search(cr, uid, [('type','=','internal')]) assert pick_ids, 'No Internal Pickings!' - According to minimum stock rules. I have 2 purchase orders for Sugar with 6 Kg from Axelor and Orange 60 Kg from ASUStek. - I confirm the purchase order of Sugar and Orange. - !python {model: purchase.order}: | import netsvc purch_ids = self.search(cr, uid, [('state','=','draft')]) assert purch_ids, 'No Purchase Orders were made!' wf_service = netsvc.LocalService("workflow") for p_id in purch_ids: wf_service.trg_validate(uid, 'purchase.order', p_id, 'purchase_confirm', cr) - I see two incoming pickings for Orange and Sugar, and receive them. - !python {model: stock.picking}: | pick_ids = self.search(cr, uid, [('type','=','in')]) assert pick_ids, 'No Incoming Shipments found!' stock_partial_picking = self.pool.get('stock.partial.picking') for pick_id in pick_ids: partial_id = stock_partial_picking.create(cr, uid, {}, context={'active_model': 'stock.picking', 'active_ids': [pick_id]}) stock_partial_picking.do_partial(cr, uid, [partial_id]) - Again the scheduler runs. - !function {model: procurement.order, name: run_scheduler}: - model: procurement.order search: "[]" - I check my internal picking of "Orange Juice" is done. - !python {model: stock.picking}: | pick_ids = self.search(cr, uid, [('type','=','internal'),('state','=','done')]) assert pick_ids, 'Internal Picking is not done yet!' - I check my manufacturing order for "Orange Juice" is ready or not. - !python {model: mrp.production}: | prod_ids = self.search(cr, uid, [('state','=','ready'),('id','=',ref('mrp_production_mo0'))]) assert prod_ids, 'Manufacturing order is not ready!' - I start the production order. - !workflow {model: mrp.production, action: button_produce, ref: mrp_production_mo0}