279 lines
9.2 KiB
YAML
279 lines
9.2 KiB
YAML
-
|
|
In order to test the flow of procurement orders. I will put some orders with
|
|
different procurement methods. I have installed sale, mrp and purchase modules.
|
|
-
|
|
I am creating products.
|
|
-
|
|
I create record for product Shirt.
|
|
-
|
|
!record {model: product.product, id: product_product_shirt0}:
|
|
categ_id: product.cat1
|
|
cost_method: standard
|
|
list_price: 350.0
|
|
mes_type: fixed
|
|
name: Shirt
|
|
procure_method: make_to_stock
|
|
property_stock_inventory: stock.location_inventory
|
|
property_stock_procurement: stock.location_procurement
|
|
property_stock_production: stock.location_production
|
|
seller_delay: '1'
|
|
standard_price: 300.0
|
|
supply_method: produce
|
|
type: product
|
|
uom_id: product.product_uom_unit
|
|
uom_po_id: product.product_uom_unit
|
|
volume: 0.0
|
|
warranty: 0.0
|
|
weight: 0.0
|
|
weight_net: 0.0
|
|
-
|
|
I create record for product Cloth.
|
|
-
|
|
!record {model: product.product, id: product_product_cloth0}:
|
|
categ_id: product.cat1
|
|
cost_method: standard
|
|
mes_type: fixed
|
|
name: Cloth
|
|
procure_method: make_to_order
|
|
property_stock_inventory: stock.location_inventory
|
|
property_stock_procurement: stock.location_procurement
|
|
property_stock_production: stock.location_production
|
|
seller_delay: '1'
|
|
seller_ids:
|
|
- delay: 1
|
|
name: base.res_partner_maxtor
|
|
product_uom: product.product_uom_unit
|
|
min_qty: 300.0
|
|
standard_price: 1.0
|
|
supply_method: buy
|
|
type: product
|
|
uom_id: product.product_uom_unit
|
|
uom_po_id: product.product_uom_unit
|
|
volume: 0.0
|
|
warranty: 0.0
|
|
weight: 0.0
|
|
weight_net: 0.0
|
|
-
|
|
I create record for product Buttons.
|
|
-
|
|
!record {model: product.product, id: product_product_buttons0}:
|
|
categ_id: product.cat1
|
|
cost_method: standard
|
|
mes_type: fixed
|
|
name: Buttons
|
|
procure_method: make_to_stock
|
|
property_stock_inventory: stock.location_inventory
|
|
property_stock_procurement: stock.location_procurement
|
|
property_stock_production: stock.location_production
|
|
seller_delay: '1'
|
|
seller_ids:
|
|
- delay: 1
|
|
name: base.res_partner_asus
|
|
product_uom: product.product_uom_kgm
|
|
min_qty: 100.0
|
|
standard_price: 1.0
|
|
supply_method: buy
|
|
type: product
|
|
uom_id: product.product_uom_kgm
|
|
uom_po_id: product.product_uom_kgm
|
|
volume: 0.0
|
|
warranty: 0.0
|
|
weight: 0.0
|
|
weight_net: 0.0
|
|
-
|
|
I am creating bills of material for 'Shirt'.
|
|
-
|
|
I create bills of material for Shirt.
|
|
-
|
|
!record {model: mrp.bom, id: mrp_bom_shirt0}:
|
|
bom_lines:
|
|
- company_id: base.main_company
|
|
name: Cloth
|
|
product_efficiency: 1.0
|
|
product_id: product_product_cloth0
|
|
product_qty: 1.0
|
|
product_uom: product.product_uom_unit
|
|
product_uos_qty: 0.0
|
|
sequence: 0.0
|
|
type: normal
|
|
- company_id: base.main_company
|
|
name: Buttons
|
|
product_efficiency: 1.0
|
|
product_id: product_product_buttons0
|
|
product_qty: 8.0
|
|
product_uom: product.product_uom_kgm
|
|
product_uos_qty: 0.0
|
|
sequence: 0.0
|
|
type: normal
|
|
company_id: base.main_company
|
|
name: Shirt
|
|
product_efficiency: 1.0
|
|
product_id: product_product_shirt0
|
|
product_qty: 1.0
|
|
product_uom: product.product_uom_unit
|
|
product_uos_qty: 0.0
|
|
sequence: 0.0
|
|
type: normal
|
|
-
|
|
I create minimum stock rule for product Buttons
|
|
-
|
|
!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/00007
|
|
product_id: mrp.product_product_buttons0
|
|
product_max_qty: 50.0
|
|
product_min_qty: 10.0
|
|
product_uom: product.product_uom_kgm
|
|
qty_multiple: 1
|
|
warehouse_id: stock.warehouse0
|
|
-
|
|
I create a procurement order for product Shirt.
|
|
-
|
|
!record {model: procurement.order, id: procurement_order_shirt0}:
|
|
name: 'PROC: Shirt'
|
|
product_id: product_product_shirt0
|
|
product_qty: 5.00
|
|
location_id: stock.stock_location_stock
|
|
product_uom: product.product_uom_unit
|
|
-
|
|
I confirm the procurement order.
|
|
-
|
|
!workflow {model: procurement.order, action: button_confirm, ref: procurement_order_shirt0}
|
|
-
|
|
I run the procurement.
|
|
-
|
|
!workflow {model: procurement.order, action: button_check, ref: procurement_order_shirt0}
|
|
-
|
|
I see that there is a manufacturing order for Shirt.
|
|
-
|
|
!python {model: mrp.production}: |
|
|
from tools.translate import _
|
|
order_ids = self.search(cr, uid, [('product_id','=',ref('product_product_shirt0'))])
|
|
assert order_ids, 'No Manufacturing Order.'
|
|
-
|
|
I also check that there are two more procurement orders for sub products Cloth and Buttons.
|
|
-
|
|
!python {model: procurement.order}: |
|
|
from tools.translate import _
|
|
proc_ids = self.search(cr, uid, [('product_id','in',[ref('product_product_cloth0'),ref('product_product_buttons0')])])
|
|
assert proc_ids, 'No Procurements.'
|
|
-
|
|
The scheduler runs.
|
|
-
|
|
!function {model: procurement.order, name: run_scheduler}:
|
|
- model: procurement.order
|
|
search: "[]"
|
|
-
|
|
I check that there is one purchase order for Cloth.
|
|
-
|
|
!python {model: purchase.order}: |
|
|
purch_ids = self.search(cr, uid, [('partner_id.name','=','Maxtor')])
|
|
assert purch_ids, 'No Purchase Orders.'
|
|
-
|
|
I confirm purchase order for Cloth.
|
|
-
|
|
!python {model: purchase.order}: |
|
|
import netsvc
|
|
purch_ids = self.search(cr, uid, [('partner_id.name','=','Maxtor')])
|
|
wf_service = netsvc.LocalService("workflow")
|
|
for p_id in purch_ids:
|
|
wf_service.trg_validate(uid, 'purchase.order', p_id, 'purchase_confirm', cr)
|
|
|
|
-
|
|
I confirm purchase order for Buttons.
|
|
-
|
|
!python {model: purchase.order}: |
|
|
import netsvc
|
|
purch_ids = self.search(cr, uid, [('partner_id.name','=','ASUStek')])
|
|
wf_service = netsvc.LocalService("workflow")
|
|
for p_id in purch_ids:
|
|
wf_service.trg_validate(uid, 'purchase.order', p_id, 'purchase_confirm', cr)
|
|
|
|
-
|
|
I Check incoming shipments for cloth. And receive products.
|
|
-
|
|
!python {model: stock.picking}: |
|
|
pick_ids = self.search(cr, uid, [('address_id.name','=','Wong'),('state','=','assigned')])
|
|
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])
|
|
-
|
|
I Check incoming shipments for buttons and receive products.
|
|
-
|
|
!python {model: stock.picking}: |
|
|
pick_ids = self.search(cr, uid, [('address_id.name','=','Tang'),('state','=','assigned')])
|
|
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])
|
|
-
|
|
Run scheduler again.
|
|
-
|
|
!function {model: procurement.order, name: run_scheduler}:
|
|
- model: procurement.order
|
|
search: "[]"
|
|
-
|
|
Check state of manufacturing order for Shirt.
|
|
-
|
|
!python {model: mrp.production}: |
|
|
from tools.translate import _
|
|
order_ids = self.search(cr, uid, [('product_id','=',ref('product_product_shirt0')),('state','=','ready')])
|
|
assert order_ids, 'No Manufacturing Order in Ready state.'
|
|
-
|
|
I start production order for Shirt.
|
|
-
|
|
!python {model: mrp.production}: |
|
|
from tools.translate import _
|
|
import netsvc
|
|
prod_ids = self.search(cr, uid, [('state','=','ready')])
|
|
assert prod_ids, _('No Ready Manufacturing Orders found!')
|
|
wf_service = netsvc.LocalService("workflow")
|
|
for p_id in prod_ids:
|
|
wf_service.trg_validate(uid, 'mrp.production', p_id, 'button_produce', cr)
|
|
-
|
|
I create record for producing products with quantity 5.00.
|
|
-
|
|
!record {model: mrp.product.produce, id: mrp_product_produce0}:
|
|
product_qty: 5.00
|
|
mode: 'consume_produce'
|
|
-
|
|
I produce 2 products with 5.00 quantities each.
|
|
-
|
|
!python {model: mrp.product.produce}: |
|
|
prod_obj = self.pool.get('mrp.production')
|
|
prod_ids = prod_obj.search(cr, uid, [('product_id.name','=','Shirt')])
|
|
self.do_produce(cr, uid, [ref('mrp_product_produce0')], context={'active_ids': prod_ids})
|
|
-
|
|
I create record for remaining products with quantity 35.00.
|
|
-
|
|
!record {model: stock.move.consume, id: stock_move_consume0}:
|
|
product_id: product_product_buttons0
|
|
product_qty: 35.00
|
|
product_uom: product.product_uom_unit
|
|
location_id: stock.stock_location_stock
|
|
-
|
|
I produce remaining product Buttons with 35.00 quantity.
|
|
-
|
|
!python {model: stock.move.consume}: |
|
|
from tools.translate import _
|
|
stock_obj = self.pool.get('stock.move')
|
|
stock_ids = stock_obj.search(cr, uid, [('product_id.name','=','Buttons')])
|
|
self.do_move_consume(cr, uid, [ref('stock_move_consume0')], context={'active_ids': stock_ids})
|
|
-
|
|
And finally production order is done.
|
|
-
|
|
!python {model: mrp.product.produce}: |
|
|
prod_obj = self.pool.get('mrp.production')
|
|
prod_ids = prod_obj.search(cr, uid, [('product_id.name','=','Shirt')])
|
|
self.do_produce(cr, uid, [ref('mrp_product_produce0')], context={'active_ids': prod_ids})
|
|
|