[MERGE]all yml of stock improve as per new demo data which is in comment in trunk and also improve yml as per access rights

bzr revid: sgo@tinyerp.com-20130301070037-ckbmj7p90509gqpz
This commit is contained in:
sgo@tinyerp.com
2013-03-01 12:30:37 +05:30
7 changed files with 217 additions and 154 deletions
+5 -4
View File
@@ -59,7 +59,6 @@ Dashboard / Reports for Warehouse Management will include:
'sequence': 16,
'demo': [
'stock_demo.xml',
# 'stock_demo.yml',
],
'data': [
'security/stock_security.xml',
@@ -91,9 +90,11 @@ Dashboard / Reports for Warehouse Management will include:
'res_config_view.xml',
],
'test': [
# 'test/opening_stock.yml',
# 'test/shipment.yml',
# 'test/stock_report.yml',
'test/stock_users.yml',
'stock_demo.yml',
'test/opening_stock.yml',
'test/shipment.yml',
'test/stock_report.yml',
],
'installable': True,
'application': True,
+1 -1
View File
@@ -10,7 +10,7 @@
<record id="group_stock_manager" model="res.groups">
<field name="name">Manager</field>
<field name="category_id" ref="base.module_category_warehouse_management"/>
<field name="implied_ids" eval="[(4, ref('group_stock_user'))]"/>
<field name="implied_ids" eval="[(4, ref('group_stock_user')), (4, ref('account.group_account_user'))]"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
+68 -60
View File
@@ -1,99 +1,107 @@
-
!record {model: stock.location, id: location_refrigerator}:
name: Refrigerator
Only stock manager can create location,warehouse and product, so let's check data with giving the access rights of manager
-
!context
uid: 'res_users_stock_manager'
-
!record {model: stock.location, id: location_monitor}:
name: chicago shop
usage: internal
-
!record {model: stock.location, id: location_delivery_counter}:
name: Delivery Counter
!record {model: stock.location, id: stock_location_output}:
name: Output
usage: internal
-
!record {model: stock.location, id: location_refrigerator_small}:
name: Small Refrigerator
!record {model: stock.location, id: location_monitor_small}:
name: Small chicago shop
usage: internal
location_id: location_refrigerator
location_id: location_monitor
-
!record {model: stock.location, id: location_opening}:
name: opening
usage: inventory
-
!record {model: stock.location, id: location_convenience_shop}:
name: Convenient Store
!record {model: stock.location, id: stock_location_3}:
name: IT Suppliers
usage: supplier
-
!record {model: stock.warehouse, id: warehouse_icecream}:
name: Ice Cream Shop
lot_input_id: location_refrigerator
lot_stock_id: location_refrigerator
lot_output_id: location_delivery_counter
!record {model: stock.warehouse, id: stock_warehouse_shop0}:
name: Chicago Warehouse
lot_input_id: location_monitor
lot_stock_id: location_monitor
lot_output_id: stock_location_output
-
!record {model: product.product, id: product_icecream}:
default_code: 001
name: Ice Cream
type: product
categ_id: product.product_category_1
list_price: 100.0
standard_price: 70.0
uom_id: product.product_uom_kgm
uom_po_id: product.product_uom_kgm
procure_method: make_to_stock
!record {model: product.product, id: product_product_6}:
default_code: LCD15
name: 15” LCD Monitor
type: consu
categ_id: product.product_category_8
list_price: 1200.0
standard_price: 800.0
uom_id: product.product_uom_unit
uom_po_id: product.product_uom_unit
property_stock_inventory: location_opening
valuation: real_time
cost_method: average
property_stock_account_input: account.o_expense
property_stock_account_output: account.o_income
description: Ice cream can be mass-produced and thus is widely available in developed parts of the world. Ice cream can be purchased in large cartons (vats and squrounds) from supermarkets and grocery stores, in smaller quantities from ice cream shops, convenience stores, and milk bars, and in individual servings from small carts or vans at public events.
property_stock_account_input: account.conf_o_income
property_stock_account_output: account.conf_o_expense
-
!record {model: stock.production.lot, id: lot_icecream_0}:
name: Lot0 for Ice cream
product_id: product_icecream
Stock user can handled production lot,inventory and picking, so let's check data with giving the access rights of user
-
!record {model: stock.production.lot, id: lot_icecream_1}:
name: Lot1 for Ice cream
product_id: product_icecream
!context
uid: 'res_users_stock_user'
-
!record {model: stock.inventory, id: stock_inventory_icecream}:
name: Inventory for icecream
!record {model: stock.production.lot, id: lot_monitor_0}:
name: Lot0 for LCD Monitor
product_id: product_product_6
-
!record {model: stock.inventory.line, id: stock_inventory_line_icecream_lot0}:
product_id: product_icecream
product_uom: product.product_uom_kgm
inventory_id: stock_inventory_icecream
!record {model: stock.production.lot, id: lot_monitor_1}:
name: Lot1 for LCD Monitor
product_id: product_product_6
-
!record {model: stock.inventory, id: stock_inventory_0}:
name: Starting Inventory
state: draft
-
!record {model: stock.inventory.line, id: stock_inventory_line_3}:
product_id: product_product_6
product_uom: product.product_uom_unit
inventory_id: stock_inventory_0
product_qty: 50.0
prod_lot_id: lot_icecream_0
location_id: location_refrigerator
prod_lot_id: lot_monitor_0
location_id: location_monitor
-
!record {model: stock.inventory.line, id: stock_inventory_line_icecream_lot1}:
product_id: product_icecream
product_uom: product.product_uom_kgm
inventory_id: stock_inventory_icecream
!record {model: stock.inventory.line, id: stock_inventory_line_monitor}:
product_id: product_product_6
product_uom: product.product_uom_unit
inventory_id: stock_inventory_0
product_qty: 40.0
prod_lot_id: lot_icecream_1
location_id: location_refrigerator
prod_lot_id: lot_monitor_1
location_id: location_monitor
-
!record {model: stock.picking, id: outgoing_shipment}:
type: out
location_dest_id: location_delivery_counter
location_dest_id: stock_location_output
-
!record {model: stock.move, id: outgoing_shipment_icecream}:
!record {model: stock.move, id: outgoing_shipment_monitor}:
picking_id: outgoing_shipment
product_id: product_icecream
product_uom: product.product_uom_kgm
product_id: product_product_6
product_uom: product.product_uom_unit
product_qty: 130.0
location_id: location_refrigerator
location_dest_id: location_delivery_counter
location_id: location_monitor
location_dest_id: stock_location_output
-
!record {model: stock.picking, id: incomming_shipment}:
type: in
invoice_state: 2binvoiced
partner_id: base.res_partner_address_9
location_dest_id: location_refrigerator
location_dest_id: location_monitor
-
!record {model: stock.move, id: incomming_shipment_icecream}:
!record {model: stock.move, id: incomming_shipment_monitor}:
picking_id: incomming_shipment
product_id: product_icecream
product_uom: product.product_uom_kgm
product_id: product_product_6
product_uom: product.product_uom_unit
product_qty: 50.0
location_id: location_convenience_shop
location_dest_id: location_refrigerator
location_id: stock_location_3
location_dest_id: location_monitor
+61 -31
View File
@@ -1,67 +1,87 @@
-
I update the price of the Ice-cream.
Only stock manager can change the price and update stock of products, so let's check data with giving the access rights of manager
-
!context
uid: 'res_users_stock_manager'
-
I update the price of the 15” LCD Monitor.
-
!python {model: stock.change.standard.price}: |
context.update({'active_model':'product.product', 'active_id': ref('product_icecream'), 'active_ids':[ref('product_icecream')]})
context.update({'active_model':'product.product', 'active_id': ref('product_product_6'), 'active_ids':[ref('product_product_6')]})
-
!record {model: stock.change.standard.price, id: change_price}:
new_price: 120
new_price: 1500
-
!python {model: stock.change.standard.price}: |
self.change_price(cr, uid, [ref('change_price')], context=context)
-
I check price of Ice-cream after update price.
I check price of 15” LCD Monitor after update price.
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
assert product.standard_price == 120, "Price is not updated."
product = self.browse(cr, uid, ref('product_product_6'), context=context)
assert product.standard_price == 1500, "Price is not updated."
-
I update the current stock of the Ice-cream with 10 kgm in Small Refrigerator in lot0.
I update the current stock of the 15” LCD Monitor with 10 unit in stock location shop1 in lot0.
-
!record {model: stock.change.product.qty, id: change_qty}:
location_id: location_refrigerator_small
location_id: location_monitor_small
new_quantity: 10
product_id: product_icecream
prodlot_id: lot_icecream_1
product_id: product_product_6
prodlot_id: lot_monitor_1
-
!python {model: stock.change.product.qty}: |
self.change_product_qty(cr, uid, [ref('change_qty')], context=context)
-
I check available stock of Ice-cream after update stock.
I check available stock of 15” LCD Monitor after update stock.
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
product = self.browse(cr, uid, ref('product_product_6'), context=context)
assert product.qty_available == 10, "Stock is not updated."
-
Stock user can merge inventory, so let's check data with giving the access rights of user.
-
!context
uid: 'res_users_stock_user'
-
I merge inventory.
-
!python {model: stock.inventory.merge }: |
context.update({'active_model': 'stock.inventory', 'active_id': ref('stock_inventory_icecream'), 'active_ids': [ref('stock_inventory_icecream')]})
context.update({'active_model': 'stock.inventory', 'active_id': ref('stock_inventory_0'), 'active_ids': [ref('stock_inventory_0')]})
-
!record {model: stock.inventory.merge, id: merge_inventory}:
-
!python {model: stock.inventory.merge }: |
self.do_merge(cr, uid, [ref('merge_inventory')], context=context)
-
Only stock manager cancelled inventory, so let's check data with giving the access rights of manager
-
!context
uid: 'res_users_stock_manager'
-
I cancel inventory.
-
!python {model: stock.inventory}: |
self.action_cancel_inventory(cr, uid, [ref('stock_inventory_icecream')])
self.action_cancel_inventory(cr, uid, [ref('stock_inventory_0')])
-
stock user can reset inventory, so let's check data with giving the access rights of user
-
!context
uid: 'res_users_stock_user'
-
I reset to draft inventory.
-
!python {model: stock.inventory}: |
self.action_cancel_draft(cr, uid, [ref('stock_inventory_icecream')])
self.action_cancel_draft(cr, uid, [ref('stock_inventory_0')])
-
I confirm physical inventory of Ice-cream which are came in different lots.
I confirm physical inventory of 15” LCD Monitor which are came in different lots.
-
!python {model: stock.inventory}: |
self.action_confirm(cr, uid, [ref('stock_inventory_icecream')], context=context)
self.action_confirm(cr, uid, [ref('stock_inventory_0')], context=context)
-
I check move details after confirmed physical inventory.
-
!python {model: stock.inventory}: |
inventory = self.browse(cr, uid, ref('stock_inventory_icecream'), context=context)
inventory = self.browse(cr, uid, ref('stock_inventory_0'), context=context)
assert len(inventory.move_ids) == len(inventory.inventory_line_id), "moves are not correspond."
for move_line in inventory.move_ids:
for line in inventory.inventory_line_id:
@@ -77,15 +97,15 @@
I split inventory line.
-
!python {model: stock.inventory.line.split}: |
context.update({'active_model': 'stock.inventory.line', 'active_id': ref('stock_inventory_line_icecream_lot0'), 'active_ids': [ref('stock_inventory_line_icecream_lot0')]})
context.update({'active_model': 'stock.inventory.line', 'active_id': ref('stock_inventory_line_3'), 'active_ids': [ref('stock_inventory_line_3')]})
-
!record {model: stock.inventory.line.split, id: split_inventory_lot0}:
use_exist: True
line_exist_ids:
- quantity: 6
prodlot_id: lot_icecream_0
prodlot_id: lot_monitor_0
- quantity: 4
prodlot_id: lot_icecream_0
prodlot_id: lot_monitor_0
-
!python {model: stock.inventory.line.split }: |
self.split_lot(cr, uid, [ref('split_inventory_lot0')], context=context)
@@ -93,39 +113,49 @@
I fill inventory line.
-
!python {model: stock.fill.inventory}: |
context.update({'active_model': 'stock.inventory', 'active_id': ref('stock_inventory_icecream'), 'active_ids': [ref('stock_inventory_icecream')]})
context.update({'active_model': 'stock.inventory', 'active_id': ref('stock_inventory_0'), 'active_ids': [ref('stock_inventory_0')]})
-
!record {model: stock.fill.inventory, id: fill_inventory}:
location_id: location_refrigerator
location_id: location_monitor
recursive: True
-
!python {model: stock.fill.inventory }: |
self.fill_inventory(cr, uid, [ref('fill_inventory')], context=context)
-
Now I check vitual stock of Ice-cream after confirmed physical inventory.
Now I check vitual stock of 15” LCD Monitor after confirmed physical inventory.
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
product = self.browse(cr, uid, ref('product_product_6'), context=context)
assert product.virtual_available == 100, "Vitual stock is not updated."
-
I close physical inventory of Ice-cream.
Only stock manager can close physical inventory, so let's check data with giving the access rights of manager
-
!context
uid: 'res_users_stock_manager'
-
I close physical inventory of 15” LCD Monitor.
-
!python {model: stock.inventory}: |
self.action_done(cr, uid, [ref('stock_inventory_icecream')], context=context)
self.action_done(cr, uid, [ref('stock_inventory_0')], context=context)
-
I check closed move and real stock of Ice-cream after closed physical inventory.
Stock user can check closed move and real stock, so let's check data with giving the access rights of user
-
!context
uid: 'res_users_stock_user'
-
I check closed move and real stock of 15” LCD Monitor after closed physical inventory.
-
!python {model: stock.inventory}: |
inventory = self.browse(cr, uid, ref('stock_inventory_icecream'), context=context)
inventory = self.browse(cr, uid, ref('stock_inventory_0'), context=context)
assert inventory.state == 'done', "inventory is not closed."
for move_line in inventory.move_ids:
assert move_line.state == 'done', "Move is not closed."
product = self.pool.get('product.product').browse(cr, uid, ref('product_icecream'), context=context)
product = self.pool.get('product.product').browse(cr, uid, ref('product_product_6'), context=context)
product.qty_available == 100, "Real stock is not updated."
-
I check stock in lot.
-
!python {model: stock.production.lot}: |
lot = self.browse(cr, uid, ref('lot_icecream_0'), context=context)
lot = self.browse(cr, uid, ref('lot_monitor_0'), context=context)
assert lot.stock_available == 50, "Stock in lot is not correspond."
+53 -54
View File
@@ -1,5 +1,5 @@
-
I confirm outgoing shipment of 130 kgm Ice-cream.
I confirm outgoing shipment of 130 unit 15” LCD Monitor.
-
!workflow {model: stock.picking, action: button_confirm, ref: outgoing_shipment}
-
@@ -12,18 +12,18 @@
assert move_line.state == "confirmed", "Move should be confirmed."
-
Now I check vitual stock of Ice-cream after confirmed outgoing shipment.
Now I check vitual stock of 15” LCD Monitor after confirmed outgoing shipment.
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
product = self.browse(cr, uid, ref('product_product_6'), context=context)
product.virtual_available == -30, "Vitual stock is not updated."
-
I confirm incomming shipment of 50 kgm Ice-cream.
I confirm incomming shipment of 50 unit 15” LCD Monitor.
-
!workflow {model: stock.picking, action: button_confirm, ref: incomming_shipment}
-
I receive 40kgm Ice-cream so I make backorder of incomming shipment for 40 kgm.
I receive 40 unit 15” LCD Monitor so I make backorder of incomming shipment for 40 unit.
-
!python {model: stock.partial.picking}: |
context.update({'active_model': 'stock.picking', 'active_id': ref('incomming_shipment'), 'active_ids': [ref('incomming_shipment')]})
@@ -31,11 +31,11 @@
!record {model: stock.partial.picking, id: partial_incomming}:
move_ids:
- quantity: 40
product_id: product_icecream
product_uom: product.product_uom_kgm
move_id: incomming_shipment_icecream
location_id: location_convenience_shop
location_dest_id: location_refrigerator
product_id: product_product_6
product_uom: product.product_uom_unit
move_id: incomming_shipment_monitor
location_id: stock_location_3
location_dest_id: location_monitor
-
!python {model: stock.partial.picking }: |
self.do_partial(cr, uid, [ref('partial_incomming')], context=context)
@@ -51,16 +51,16 @@
assert move_line.product_qty == 40, "Qty in backorder does not correspond."
assert move_line.state == 'done', "Move line of backorder should be closed."
-
I receive another 10kgm Ice-cream.
I receive another 10 unit 15” LCD Monitor.
-
!record {model: stock.partial.picking, id: partial_incomming}:
move_ids:
- quantity: 10
product_id: product_icecream
product_uom: product.product_uom_kgm
move_id: incomming_shipment_icecream
location_id: location_convenience_shop
location_dest_id: location_refrigerator
product_id: product_product_6
product_uom: product.product_uom_unit
move_id: incomming_shipment_monitor
location_id: stock_location_3
location_dest_id: location_monitor
-
!python {model: stock.partial.picking }: |
self.do_partial(cr, uid, [ref('partial_incomming')], context=context)
@@ -77,7 +77,7 @@
assert move_line.state == 'done', "Move line should be closed."
-
I return last incomming shipment for 10 kgm Ice-cream.
I return last incomming shipment for 10 unit 15” LCD Monitor.
-
!record {model: stock.return.picking, id: return_incomming}:
invoice_state: none
@@ -115,11 +115,11 @@
I check available stock after received incomming shipping.
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
product = self.browse(cr, uid, ref('product_product_6'), context=context)
assert product.qty_available == 140, "Stock does not correspond."
assert product.virtual_available == 0, "Vitual stock does not correspond."
-
I split incomming shipment into lots. each lot contain 10 kgm Ice-cream.
I split incomming shipment into lots. each lot contain 10 unit 15” LCD Monitor.
-
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("incomming_shipment"))
@@ -147,7 +147,7 @@
lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context)
lot_ids = self.pool.get('stock.production.lot').search(cr, uid, [('name','in',[x.name for x in lot.line_ids])])
assert len(lot_ids) == 4, 'lots of incomming shipment are not correspond.'
move_ids = self.search(cr, uid, [('location_dest_id','=',ref('location_refrigerator')),('prodlot_id','in',lot_ids)])
move_ids = self.search(cr, uid, [('location_dest_id','=',ref('location_monitor')),('prodlot_id','in',lot_ids)])
assert len(move_ids) == 4, 'move lines are not correspond per prodcution lot after splited.'
for move in self.browse(cr, uid, move_ids, context=context):
assert move.prodlot_id.name in ['incoming_lot0', 'incoming_lot1', 'incoming_lot2', 'incoming_lot3'], "lot does not correspond."
@@ -165,45 +165,45 @@
for account_move_line in account_move.line_id:
for stock_move in incomming_shipment.move_lines:
if account_move_line.account_id.id == stock_move.product_id.property_stock_account_input.id:
assert account_move_line.credit == 800.0, "Credit amount does not correspond."
assert account_move_line.credit == 10000.0, "Credit amount does not correspond."
assert account_move_line.debit == 0.0, "Debit amount does not correspond."
else:
assert account_move_line.credit == 0.0, "Credit amount does not correspond."
assert account_move_line.debit == 800.0, "Debit amount does not correspond."
assert account_move_line.debit == 10000.0, "Debit amount does not correspond."
-
I consume 1 kgm ice-cream from each incoming lots into internal production.
I consume 1 unit 15” LCD Monitor from each incoming lots into internal production.
-
!record {model: stock.move.consume, id: consume_lot_incomming}:
product_qty: 1
location_id: location_refrigerator
location_id: location_monitor
-
!python {model: stock.move.consume}: |
self.do_move_consume(cr, uid, [ref('consume_lot_incomming')], context=context)
-
I scrap 10 gm ice-cream from each incoming lots into scrap location.
I scrap 1 unit 15” LCD Monitor from each incoming lots into scrap location.
-
!record {model: stock.move.scrap, id: scrap_lot_incomming}:
product_qty: 0.010
product_qty: 1
-
!python {model: stock.move.scrap}: |
self.move_scrap(cr, uid, [ref('scrap_lot_incomming')], context=context)
-
I check stock in scrap location and refrigerator location.
I check stock in scrap location and stock location shop0.
-
!python {model: stock.location}: |
ctx = {'product_id': ref('product_icecream')}
refrigerator_location = self.pool.get('stock.location').browse(cr, uid, ref('location_refrigerator'), context=ctx)
assert refrigerator_location.stock_real == 135.96, 'stock does not correspond in refrigerator location.'
ctx = {'product_id': ref('product_product_6')}
monitor_location = self.pool.get('stock.location').browse(cr, uid, ref('location_monitor'), context=ctx)
assert monitor_location.stock_real == 136.0, 'stock does not correspond in stock location shop0.'
scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx)
assert scrapped_location.stock_real == 0.010*4, 'scraped stock does not correspond in scrap location.'
assert scrapped_location.stock_real == 1*4, 'scraped stock does not correspond in scrap location.'
-
I check availabile stock after consumed and scraped.
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
assert product.qty_available == 135.96, "Stock does not correspond."
assert round(product.virtual_available, 2) == -4.04, "Vitual stock does not correspond."
product = self.browse(cr, uid, ref('product_product_6'), context=context)
assert product.qty_available == 136.0, "Stock does not correspond."
assert round(product.virtual_available, 2) == -4.00, "Vitual stock does not correspond."
-
I trace all incoming lots.
-
@@ -212,40 +212,39 @@
lot_ids = self.search(cr, uid, [('name', 'in', [x.name for x in lot.line_ids])])
self.action_traceability(cr, uid, lot_ids, context=context)
-
I check outgoing shipment after stock availablity in refrigerator.
I check outgoing shipment after stock availablity in Chicago shop.
-
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("outgoing_shipment"), context=context)
self.pool.get('stock.move').action_assign(cr, uid, [x.id for x in shipment.move_lines]) #TOFIX: assignment of move lines should be call before testing assigment otherwise picking never gone in assign state
#TOFIX: shipment should be assigned if stock available
#assert shipment.state == "assigned", "Shipment should be assigned."
#for move_line in shipment.move_lines:
# assert move_line.state == "assigned", "Move should be assigned."
self.pool.get('stock.move').action_assign(cr, uid, [x.id for x in shipment.move_lines])
assert shipment.state == "assigned", "Shipment should be assigned."
for move_line in shipment.move_lines:
assert move_line.state == "assigned", "Move should be assigned."
self.force_assign(cr, uid, [shipment.id])
-
I deliver 5kgm Ice-cream to customer so I make partial deliver
I deliver 5 unit 15” LCD Monitor to customer so I make partial deliver
-
!python {model: stock.partial.move}: |
context.update({'active_model': 'stock.move', 'active_id': ref('outgoing_shipment_icecream'), 'active_ids': [ref('outgoing_shipment_icecream')]})
context.update({'active_model': 'stock.move', 'active_id': ref('outgoing_shipment_monitor'), 'active_ids': [ref('outgoing_shipment_monitor')]})
-
!record {model: stock.partial.move, id: partial_outgoing_icecream}:
!record {model: stock.partial.move, id: partial_outgoing_monitor}:
move_ids:
- quantity: 5
product_id: product_icecream
product_uom: product.product_uom_kgm
move_id: outgoing_shipment_icecream
location_id: location_refrigerator
location_dest_id: location_delivery_counter
product_id: product_product_6
product_uom: product.product_uom_unit
move_id: outgoing_shipment_monitor
location_id: location_monitor
location_dest_id: stock_location_output
-
!python {model: stock.partial.move }: |
self.do_partial(cr, uid, [ref('partial_outgoing_icecream')], context=context)
self.do_partial(cr, uid, [ref('partial_outgoing_monitor')], context=context)
-
I packing outgoing shipment into box per 10kgm with unique tracking lot.
I packing outgoing shipment into box per 10 unit with unique tracking lot.
-
!python {model: stock.move}: |
stock_split = self.pool.get('stock.split.into')
move = self.browse(cr, uid, ref('outgoing_shipment_icecream'), context=context)
move = self.browse(cr, uid, ref('outgoing_shipment_monitor'), context=context)
context.update({'active_model': 'stock.move', 'active_id': move.id, 'active_ids': [move.id]})
total_qty = move.product_qty
split_qty = 10
@@ -277,6 +276,6 @@
I check availaible stock after deliver.
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
assert round(product.qty_available, 2) == 5.96, "Stock does not correspond."
assert round(product.virtual_available, 2) == -4.04, "Vitual stock does not correspond."
product = self.browse(cr, uid, ref('product_product_6'), context=context)
assert round(product.qty_available, 2) == 6, "Stock does not correspond."
assert round(product.virtual_available, 2) == -4.00, "Vitual stock does not correspond."
+9 -4
View File
@@ -1,10 +1,15 @@
-
Stock user can print all reports related to stock, so let's check data with giving the access rights of user.
-
!context
uid: 'res_users_stock_user'
-
I print a stock overview report of location.
-
!python {model: stock.location}: |
import os
from openerp import netsvc, tools
(data, format) = netsvc.LocalService('report.lot.stock.overview').create(cr, uid, [ref('location_refrigerator')], {}, {})
(data, format) = netsvc.LocalService('report.lot.stock.overview').create(cr, uid, [ref('location_monitor')], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-overview'+format), 'wb+').write(data)
-
@@ -13,7 +18,7 @@
!python {model: stock.location}: |
import os
from openerp import netsvc, tools
(data, format) = netsvc.LocalService('report.lot.stock.overview_all').create(cr, uid, [ref('location_refrigerator')], {}, {})
(data, format) = netsvc.LocalService('report.lot.stock.overview_all').create(cr, uid, [ref('location_monitor')], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-overviewall'+format), 'wb+').write(data)
-
@@ -22,7 +27,7 @@
!python {model: stock.inventory}: |
import os
from openerp import netsvc, tools
(data, format) = netsvc.LocalService('report.stock.inventory.move').create(cr, uid, [ref('stock_inventory_icecream')], {}, {})
(data, format) = netsvc.LocalService('report.stock.inventory.move').create(cr, uid, [ref('stock_inventory_0')], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-stock_inventory_move.'+format), 'wb+').write(data)
-
@@ -40,7 +45,7 @@
!python {model: product.product}: |
import os
from openerp import netsvc, tools
(data, format) = netsvc.LocalService('report.stock.product.history').create(cr, uid, [ref('product_icecream')], {}, {})
(data, format) = netsvc.LocalService('report.stock.product.history').create(cr, uid, [ref('product_product_6')], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-product_stock_report.'+format), 'wb+').write(data)
+20
View File
@@ -0,0 +1,20 @@
-
Create a user as 'Stock Manager'
-
!record {model: res.users, id: res_users_stock_manager}:
company_id: base.main_company
name: Stock Manager
login: sam
password: sam
groups_id:
- stock.group_stock_manager
-
Create a user as 'Stock User'
-
!record {model: res.users, id: res_users_stock_user}:
company_id: base.main_company
name: Stock User
login: sau
password: sau
groups_id:
- stock.group_stock_user