270 lines
9.2 KiB
YAML
270 lines
9.2 KiB
YAML
-
|
|
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}
|