[IMP] nan_prodlot_quality_control: finalized (re)implementation of Quality Control for Production Lots, with complet YAML tests included.
This commit is contained in:
commit
3067b86fcf
|
@ -0,0 +1,32 @@
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Copyright (c) 2010-2012 NaN Projectes de Programari Lliure, S.L.
|
||||||
|
# All Rights Reserved.
|
||||||
|
# http://www.NaN-tic.com
|
||||||
|
#
|
||||||
|
# WARNING: This program as such is intended to be used by professional
|
||||||
|
# programmers who take the whole responsability of assessing all potential
|
||||||
|
# consequences resulting from its eventual inadequacies and bugs
|
||||||
|
# End users who are looking for a ready-to-use solution with commercial
|
||||||
|
# garantees and support are strongly adviced to contract a Free Software
|
||||||
|
# Service Company
|
||||||
|
#
|
||||||
|
# This program is Free Software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU Affero General Public License
|
||||||
|
# as published by the Free Software Foundation; either version 2
|
||||||
|
# of the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
import stock
|
||||||
|
|
||||||
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -0,0 +1,62 @@
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Copyright (c) 2010-2012 NaN Projectes de Programari Lliure, S.L.
|
||||||
|
# All Rights Reserved.
|
||||||
|
# http://www.NaN-tic.com
|
||||||
|
#
|
||||||
|
# WARNING: This program as such is intended to be used by professional
|
||||||
|
# programmers who take the whole responsability of assessing all potential
|
||||||
|
# consequences resulting from its eventual inadequacies and bugs
|
||||||
|
# End users who are looking for a ready-to-use solution with commercial
|
||||||
|
# garantees and support are strongly adviced to contract a Free Software
|
||||||
|
# Service Company
|
||||||
|
#
|
||||||
|
# This program is Free Software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU Affero General Public License
|
||||||
|
# as published by the Free Software Foundation; either version 2
|
||||||
|
# of the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
{
|
||||||
|
"name" : "Production Lot Quality Control - Input",
|
||||||
|
"version" : "0.2",
|
||||||
|
"author" : "NaN Projectes de Programari Lliure S.L.",
|
||||||
|
"category" : "Generic Modules/Quality Control",
|
||||||
|
"website": "http://www.nan-tic.com",
|
||||||
|
"description": """
|
||||||
|
Module developed for Trod y Avia, S.L.
|
||||||
|
|
||||||
|
This module adds quality control to Production Lots on arrival (input
|
||||||
|
pickings).
|
||||||
|
The idea is that the first test will be 'Generic' and check for things like
|
||||||
|
correct packaging. The second will be specific to the product in question.
|
||||||
|
""",
|
||||||
|
"depends" : [
|
||||||
|
'nan_prodlot_quality_control',
|
||||||
|
'stock',
|
||||||
|
],
|
||||||
|
"init_xml" : [],
|
||||||
|
"update_xml" : [
|
||||||
|
'quality_control_data.xml',
|
||||||
|
],
|
||||||
|
"demo_xml" : [
|
||||||
|
'prodlot_quality_control_input_demo.xml',
|
||||||
|
],
|
||||||
|
"test": [
|
||||||
|
'test/prodlot_quality_control_input.yml',
|
||||||
|
],
|
||||||
|
"active": False,
|
||||||
|
"installable": True,
|
||||||
|
}
|
||||||
|
|
||||||
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<openerp>
|
||||||
|
<data noupdate="1">
|
||||||
|
<record id="qc_posible_value_yes0" model="qc.posible.value">
|
||||||
|
<field name="name">Yes</field>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
<field name="active" eval="1"/>
|
||||||
|
</record>
|
||||||
|
<record id="qc_posible_value_no0" model="qc.posible.value">
|
||||||
|
<field name="name">No</field>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
<field name="active" eval="1"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="qc_proof_simpleproof0" model="qc.proof">
|
||||||
|
<field name="name">Simple Proof</field>
|
||||||
|
<field name="type">qualitative</field>
|
||||||
|
<field name="value_ids" eval="[(6,0,[ref('qc_posible_value_yes0'),ref('qc_posible_value_no0')])]"/>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
<field name="active" eval="1"/>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
<data noupdate="1">
|
||||||
|
<record id="qc_test_template_generic0" model="qc.test.template">
|
||||||
|
<field name="name">Generic Template for Input Lots</field>
|
||||||
|
<field name="type">generic</field>
|
||||||
|
<field name="fill_correct_values" eval="0"/>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
<field name="active" eval="1"/>
|
||||||
|
</record>
|
||||||
|
<record id="qc_test_template_line_generic0" model="qc.test.template.line">
|
||||||
|
<field name="test_template_id" ref="qc_test_template_generic0"/>
|
||||||
|
<field name="sequence" eval="1"/>
|
||||||
|
<field name="proof_id" ref="qc_proof_simpleproof0"/>
|
||||||
|
<field name="type">qualitative</field>
|
||||||
|
<field name="valid_value_ids" eval="[(6,0,[ref('qc_posible_value_yes0')])]"/>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
<data noupdate="1">
|
||||||
|
<record id="qc_test_template_related0" model="qc.test.template">
|
||||||
|
<field name="name">Specific Template for Input Lots</field>
|
||||||
|
<field name="type">related</field>
|
||||||
|
<field name="fill_correct_values" eval="0"/>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
<field name="active" eval="1"/>
|
||||||
|
</record>
|
||||||
|
<record id="qc_test_template_line_related0" model="qc.test.template.line">
|
||||||
|
<field name="test_template_id" ref="qc_test_template_related0"/>
|
||||||
|
<field name="sequence" eval="1"/>
|
||||||
|
<field name="proof_id" ref="qc_proof_simpleproof0"/>
|
||||||
|
<field name="type">qualitative</field>
|
||||||
|
<field name="valid_value_ids" eval="[(6,0,[ref('qc_posible_value_yes0')])]"/>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</openerp>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<openerp>
|
||||||
|
<data>
|
||||||
|
<record id="qc_trigger_input" model="qc.trigger">
|
||||||
|
<field name="name">Input</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</openerp>
|
|
@ -0,0 +1,125 @@
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Copyright (c) 2010-2012 NaN Projectes de Programari Lliure, S.L.
|
||||||
|
# All Rights Reserved.
|
||||||
|
# http://www.NaN-tic.com
|
||||||
|
#
|
||||||
|
# WARNING: This program as such is intended to be used by professional
|
||||||
|
# programmers who take the whole responsability of assessing all potential
|
||||||
|
# consequences resulting from its eventual inadequacies and bugs
|
||||||
|
# End users who are looking for a ready-to-use solution with commercial
|
||||||
|
# garantees and support are strongly adviced to contract a Free Software
|
||||||
|
# Service Company
|
||||||
|
#
|
||||||
|
# This program is Free Software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU Affero General Public License
|
||||||
|
# as published by the Free Software Foundation; either version 2
|
||||||
|
# of the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
from osv import osv
|
||||||
|
|
||||||
|
class stock_move(osv.osv):
|
||||||
|
_inherit = 'stock.move'
|
||||||
|
|
||||||
|
# stock.move
|
||||||
|
def _calc_qc_test_input_vals(self, cr, uid, move, context):
|
||||||
|
reference = 'stock.production.lot,%d' % move.prodlot_id.id
|
||||||
|
return {
|
||||||
|
'object_id': reference,
|
||||||
|
}
|
||||||
|
|
||||||
|
# stock.move
|
||||||
|
def _calc_qc_test_trigger_ids_input_vals(self, cr, uid, move, trigger_id,
|
||||||
|
context):
|
||||||
|
if (not move.picking_id or move.picking_id.type != 'in' or
|
||||||
|
not move.prodlot_id or move.prodlot_id.state != 'draft' or
|
||||||
|
trigger_id in
|
||||||
|
[x.id for x in move.prodlot_id.qc_trigger_ids] or
|
||||||
|
trigger_id not in
|
||||||
|
[x.id for x in move.product_id.qc_trigger_ids]):
|
||||||
|
return False
|
||||||
|
|
||||||
|
qc_test_proxy = self.pool.get('qc.test')
|
||||||
|
test_trigger_vals = []
|
||||||
|
for template_trigger in move.product_id.qc_template_trigger_ids:
|
||||||
|
if template_trigger.trigger_id.id != trigger_id:
|
||||||
|
continue
|
||||||
|
|
||||||
|
test_vals = self._calc_qc_test_input_vals(cr, uid, move, context)
|
||||||
|
test_id = qc_test_proxy.create(cr, uid, test_vals, context)
|
||||||
|
|
||||||
|
qc_test_proxy.set_test_template(cr, uid, [test_id],
|
||||||
|
template_trigger.template_id.id, context)
|
||||||
|
|
||||||
|
test_trigger_vals.append((0, 0, {
|
||||||
|
'sequence': template_trigger.sequence,
|
||||||
|
'trigger_id': template_trigger.trigger_id.id,
|
||||||
|
'template_type': template_trigger.template_type,
|
||||||
|
'test_id': test_id,
|
||||||
|
}))
|
||||||
|
return test_trigger_vals
|
||||||
|
|
||||||
|
|
||||||
|
# stock.move
|
||||||
|
def create(self, cr, uid, vals, context=None):
|
||||||
|
if context is None:
|
||||||
|
context = {}
|
||||||
|
|
||||||
|
move_id = super(stock_move, self).create(cr, uid, vals, context)
|
||||||
|
|
||||||
|
if 'input' in context.get('no_create_trigger_test',[]):
|
||||||
|
return move_id
|
||||||
|
|
||||||
|
input_trigger_id = self.pool.get('qc.trigger').search(cr, uid,
|
||||||
|
[('name','=','Input')], context=context)
|
||||||
|
if not input_trigger_id:
|
||||||
|
return move_id
|
||||||
|
|
||||||
|
move = self.browse(cr, uid, move_id, context)
|
||||||
|
if (not move.picking_id or move.picking_id.type != 'in' or
|
||||||
|
not move.prodlot_id):
|
||||||
|
return move_id
|
||||||
|
|
||||||
|
self.pool.get('stock.production.lot').create_qc_test_triggers(cr, uid,
|
||||||
|
move.prodlot_id, input_trigger_id[0], True, context)
|
||||||
|
|
||||||
|
return move_id
|
||||||
|
|
||||||
|
|
||||||
|
# stock.move
|
||||||
|
def write(self, cr, uid, ids, vals, context=None):
|
||||||
|
prodlot_proxy = self.pool.get('stock.production.lot')
|
||||||
|
|
||||||
|
res = super(stock_move, self).write(cr, uid, ids, vals,
|
||||||
|
context)
|
||||||
|
|
||||||
|
if 'input' in context.get('no_create_trigger_test',[]):
|
||||||
|
return res
|
||||||
|
|
||||||
|
input_trigger_id = self.pool.get('qc.trigger').search(cr, uid,
|
||||||
|
[('name','=','Input')], context=context)
|
||||||
|
if not input_trigger_id:
|
||||||
|
return res
|
||||||
|
|
||||||
|
for move in self.browse(cr, uid, ids, context):
|
||||||
|
if (not move.picking_id or move.picking_id.type != 'in' or
|
||||||
|
not move.prodlot_id):
|
||||||
|
continue
|
||||||
|
prodlot_proxy.create_qc_test_triggers(cr, uid, move.prodlot_id,
|
||||||
|
input_trigger_id[0], True, context)
|
||||||
|
|
||||||
|
return res
|
||||||
|
stock_move()
|
||||||
|
|
||||||
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -0,0 +1,406 @@
|
||||||
|
-
|
||||||
|
------ Prodlot Quality Control on Input ------
|
||||||
|
-
|
||||||
|
In order to test functionality of set Quality Control Tests to Production Lots
|
||||||
|
in Input Pickings...
|
||||||
|
-
|
||||||
|
I create a Product without Quality Control
|
||||||
|
-
|
||||||
|
!record {model: product.product, id: product_product_wo_qc0}:
|
||||||
|
name: Product without quality control
|
||||||
|
type: product
|
||||||
|
categ_id: product.cat0
|
||||||
|
procure_method: make_to_stock
|
||||||
|
supply_method: buy
|
||||||
|
cost_method: standard
|
||||||
|
valuation: manual_periodic
|
||||||
|
standard_price: 200.0
|
||||||
|
uom_id: product.product_uom_unit
|
||||||
|
uom_po_id: product.product_uom_unit
|
||||||
|
|
||||||
|
-
|
||||||
|
I create a Production Lot of Product
|
||||||
|
-
|
||||||
|
!record {model: stock.production.lot, id: prodlot_wo_qc0}:
|
||||||
|
product_id: nan_prodlot_quality_control_input.product_product_wo_qc0
|
||||||
|
|
||||||
|
-
|
||||||
|
I create a Product with the generic template assigned with Input trigger
|
||||||
|
-
|
||||||
|
!record {model: product.product, id: product_product_generic0}:
|
||||||
|
name: Product with generic test
|
||||||
|
type: product
|
||||||
|
categ_id: product.cat0
|
||||||
|
procure_method: make_to_stock
|
||||||
|
supply_method: buy
|
||||||
|
cost_method: standard
|
||||||
|
valuation: manual_periodic
|
||||||
|
standard_price: 300.0
|
||||||
|
uom_id: product.product_uom_unit
|
||||||
|
uom_po_id: product.product_uom_unit
|
||||||
|
qc_template_trigger_ids:
|
||||||
|
- sequence: 1
|
||||||
|
trigger_id: nan_prodlot_quality_control_input.qc_trigger_input
|
||||||
|
template_type: generic
|
||||||
|
template_id: nan_prodlot_quality_control_input.qc_test_template_generic0
|
||||||
|
|
||||||
|
-
|
||||||
|
I create a Production Lot of Product
|
||||||
|
-
|
||||||
|
!record {model: stock.production.lot, id: prodlot_generic0}:
|
||||||
|
product_id: nan_prodlot_quality_control_input.product_product_generic0
|
||||||
|
|
||||||
|
-
|
||||||
|
I create a Product with the generic and specific template assigned with Input trigger
|
||||||
|
-
|
||||||
|
!record {model: product.product, id: product_product_related0}:
|
||||||
|
name: Product with specific test
|
||||||
|
type: product
|
||||||
|
categ_id: product.cat0
|
||||||
|
procure_method: make_to_stock
|
||||||
|
supply_method: buy
|
||||||
|
cost_method: standard
|
||||||
|
valuation: manual_periodic
|
||||||
|
standard_price: 450.0
|
||||||
|
uom_id: product.product_uom_unit
|
||||||
|
uom_po_id: product.product_uom_unit
|
||||||
|
qc_template_trigger_ids:
|
||||||
|
- sequence: 1
|
||||||
|
trigger_id: nan_prodlot_quality_control_input.qc_trigger_input
|
||||||
|
template_type: generic
|
||||||
|
template_id: nan_prodlot_quality_control_input.qc_test_template_generic0
|
||||||
|
- sequence: 2
|
||||||
|
trigger_id: nan_prodlot_quality_control_input.qc_trigger_input
|
||||||
|
template_type: related
|
||||||
|
template_id: nan_prodlot_quality_control_input.qc_test_template_related0
|
||||||
|
|
||||||
|
-
|
||||||
|
Checking the Product has two Template Trigger lines
|
||||||
|
-
|
||||||
|
!assert {model: product.product, id: product_product_related0, string: The Product with generic and specific templates doesn't have two lines of Template Triggers!}:
|
||||||
|
- len(qc_template_trigger_ids) == 2
|
||||||
|
|
||||||
|
-
|
||||||
|
I create a Production Lot of Product
|
||||||
|
-
|
||||||
|
!record {model: stock.production.lot, id: prodlot_related0}:
|
||||||
|
product_id: nan_prodlot_quality_control_input.product_product_related0
|
||||||
|
|
||||||
|
-
|
||||||
|
Creating an Input Picking with three movements for the three Lots
|
||||||
|
-
|
||||||
|
!record {model: stock.picking, id: stock_picking_input0}:
|
||||||
|
type: in
|
||||||
|
# name: AC120002
|
||||||
|
partner_id: base.main_partner
|
||||||
|
address_id: base.main_address
|
||||||
|
invoice_state: none
|
||||||
|
move_type: direct
|
||||||
|
date: '2012-02-21 17:19:01'
|
||||||
|
max_date: '2012-02-21 17:19:31'
|
||||||
|
min_date: '2012-02-21 17:19:17'
|
||||||
|
move_lines:
|
||||||
|
- name: Product without quality control
|
||||||
|
product_id: nan_prodlot_quality_control_input.product_product_wo_qc0
|
||||||
|
prodlot_id: nan_prodlot_quality_control_input.prodlot_wo_qc0
|
||||||
|
product_uom: product.product_uom_unit
|
||||||
|
product_qty: 5.0
|
||||||
|
product_uos_qty: 5.0
|
||||||
|
location_id: stock.stock_location_suppliers
|
||||||
|
location_dest_id: stock.stock_location_stock
|
||||||
|
company_id: base.main_company
|
||||||
|
- name: Product with generic test
|
||||||
|
product_id: nan_prodlot_quality_control_input.product_product_generic0
|
||||||
|
prodlot_id: nan_prodlot_quality_control_input.prodlot_generic0
|
||||||
|
product_uom: product.product_uom_unit
|
||||||
|
product_qty: 3.0
|
||||||
|
product_uos_qty: 3.0
|
||||||
|
location_id: stock.stock_location_suppliers
|
||||||
|
location_dest_id: stock.stock_location_stock
|
||||||
|
company_id: base.main_company
|
||||||
|
- name: Product with specific test
|
||||||
|
product_id: nan_prodlot_quality_control_input.product_product_related0
|
||||||
|
prodlot_id: nan_prodlot_quality_control_input.prodlot_related0
|
||||||
|
product_uom: product.product_uom_unit
|
||||||
|
product_qty: 1.0
|
||||||
|
product_uos_qty: 1.0
|
||||||
|
location_id: stock.stock_location_suppliers
|
||||||
|
location_dest_id: stock.stock_location_stock
|
||||||
|
company_id: base.main_company
|
||||||
|
company_id: base.main_company
|
||||||
|
|
||||||
|
-
|
||||||
|
Checking the Production Lot of product without Quality Control is in 'Valid'
|
||||||
|
state, doesn't have current Test nor any Trigger Test line
|
||||||
|
-
|
||||||
|
!assert {model: stock.production.lot, id: prodlot_wo_qc0, string: The Lot of product without Quality Control is not in the expected 'Valid' state!}:
|
||||||
|
- state == 'valid'
|
||||||
|
- not current_qc_test_id
|
||||||
|
- len(qc_test_trigger_ids) == 0
|
||||||
|
|
||||||
|
-
|
||||||
|
Checking the Production Lot of product with generic QC Template is in
|
||||||
|
'Pending Test' state and it has only one Test Trigger
|
||||||
|
#-
|
||||||
|
# !assert {model: stock.production.lot, id: prodlot_generic0, string: The lot of product with generic qc template is not in the expected 'pending test' state or it hasn't the expected number of test triggers (expected only one)!}:
|
||||||
|
# - state == 'pending_test'
|
||||||
|
# - current_qc_test_id.test_template_id.id == ref('qc_test_template_generic0')
|
||||||
|
# - len(qc_test_trigger_ids) == 1
|
||||||
|
-
|
||||||
|
!python {model: stock.production.lot}: |
|
||||||
|
lot = self.browse(cr, uid, ref('prodlot_generic0'), context)
|
||||||
|
assert lot.state == 'pending_test', "The State of Lot is not the expected 'pending_test'. It is '%s'" % lot.state
|
||||||
|
assert lot.current_qc_test_id.test_template_id.id == ref('qc_test_template_generic0'), "The template of current Test Trigger is not the expected '%d'. It is '%d'" % (ref('qc_test_template_generic0'), lot.current_qc_test_id.test_template_id.id)
|
||||||
|
assert len(lot.qc_test_trigger_ids) == 1, "The number of Test Trigger lines is not 1 as expected. It is %d" % len(lot.qc_test_trigger_ids)
|
||||||
|
|
||||||
|
-
|
||||||
|
Checking the Production Lot of product with generic and related QC Template
|
||||||
|
is in 'Pending Test' state and it has two Test Trigger
|
||||||
|
#-
|
||||||
|
# !assert {model: stock.production.lot, id: prodlot_related0, string: The lot of product with generic and related qc template is not in the expected 'pending test' state or it hasn't the expected number of test triggers (expected only two)!}:
|
||||||
|
# - state == 'pending_test'
|
||||||
|
# - current_qc_test_id.test_template_id.id == ref('qc_test_template_generic0')
|
||||||
|
# - len(qc_test_trigger_ids) == 2
|
||||||
|
-
|
||||||
|
!python {model: stock.production.lot}: |
|
||||||
|
lot = self.browse(cr, uid, ref('prodlot_related0'), context)
|
||||||
|
assert lot.state == 'pending_test', "The State of Lot is not the expected 'pending_test'. It is '%s'" % lot.state
|
||||||
|
assert lot.current_qc_test_id.test_template_id.id == ref('qc_test_template_generic0'), "The template of current Test Trigger is not the expected '%d'. It is '%d'" % (ref('qc_test_template_generic0'), lot.current_qc_test_id.test_template_id.id)
|
||||||
|
assert len(lot.qc_test_trigger_ids) == 2, "The number of Test Trigger lines is not 2 as expected. It is %d" % len(lot.qc_test_trigger_ids)
|
||||||
|
|
||||||
|
-
|
||||||
|
Filling up the two current Quality Tests with valid values and 'Confirm' it
|
||||||
|
-
|
||||||
|
!python {model: stock.production.lot}: |
|
||||||
|
import netsvc
|
||||||
|
|
||||||
|
test_line_proxy = self.pool.get('qc.test.line')
|
||||||
|
wf_service = netsvc.LocalService("workflow")
|
||||||
|
|
||||||
|
lot1 = self.browse(cr, uid, ref('prodlot_generic0'), context)
|
||||||
|
lot2 = self.browse(cr, uid, ref('prodlot_related0'), context)
|
||||||
|
|
||||||
|
test_line_proxy.write(cr, uid, [
|
||||||
|
lot1.current_qc_test_id.test_line_ids[0].id,
|
||||||
|
lot2.current_qc_test_id.test_line_ids[0].id,
|
||||||
|
], {'actual_value_ql': ref('qc_posible_value_yes0')}, context)
|
||||||
|
|
||||||
|
wf_service.trg_validate(uid, 'qc.test', lot1.current_qc_test_id.id,
|
||||||
|
'confirm', cr)
|
||||||
|
wf_service.trg_validate(uid, 'qc.test', lot2.current_qc_test_id.id,
|
||||||
|
'confirm', cr)
|
||||||
|
|
||||||
|
-
|
||||||
|
Checking the Production Lot of product with generic QC Template remains in
|
||||||
|
'Pending Test' state and its test is success and in 'Waiting' state
|
||||||
|
-
|
||||||
|
!assert {model: stock.production.lot, id: prodlot_generic0, string: The lot of product with generic qc template is not in the expected 'pending test' state or its test is not in expected 'Waiting' state!}:
|
||||||
|
- state == 'pending_test'
|
||||||
|
- current_qc_test_id.state == 'waiting'
|
||||||
|
- current_qc_test_id.success == True
|
||||||
|
|
||||||
|
-
|
||||||
|
Checking the Production Lot of product with generic and related QC Template
|
||||||
|
remains in 'Pending Test' state and its test is success and in 'Waiting' state
|
||||||
|
-
|
||||||
|
!assert {model: stock.production.lot, id: prodlot_related0, string: The lot of product with generic and related qc template is not in the expected 'pending test' state or its test is not in expected 'Waiting' state!}:
|
||||||
|
- state == 'pending_test'
|
||||||
|
- current_qc_test_id.state == 'waiting'
|
||||||
|
- current_qc_test_id.success == True
|
||||||
|
|
||||||
|
-
|
||||||
|
Aproving the two current Quality Tests
|
||||||
|
-
|
||||||
|
!python {model: stock.production.lot}: |
|
||||||
|
import netsvc
|
||||||
|
wf_service = netsvc.LocalService("workflow")
|
||||||
|
|
||||||
|
lot1 = self.browse(cr, uid, ref('prodlot_generic0'), context)
|
||||||
|
lot2 = self.browse(cr, uid, ref('prodlot_related0'), context)
|
||||||
|
|
||||||
|
wf_service.trg_validate(uid, 'qc.test', lot1.current_qc_test_id.id,
|
||||||
|
'approve', cr)
|
||||||
|
wf_service.trg_validate(uid, 'qc.test', lot2.current_qc_test_id.id,
|
||||||
|
'approve', cr)
|
||||||
|
|
||||||
|
-
|
||||||
|
Checking the Production Lot of product with generic QC Template is in 'Valid'
|
||||||
|
state and its test is in 'Success' state
|
||||||
|
-
|
||||||
|
!assert {model: stock.production.lot, id: prodlot_generic0, string: The lot of product with generic qc template is not in the expected 'Valid' state or its test is not in expected 'Success' state!}:
|
||||||
|
- state == 'valid'
|
||||||
|
- current_qc_test_id.state == 'success'
|
||||||
|
|
||||||
|
-
|
||||||
|
Canceling the Quality Test of Lot with generic Template and checking test is
|
||||||
|
in 'Draft' state and the Lot is in 'Pending Test'
|
||||||
|
-
|
||||||
|
!python {model: stock.production.lot}: |
|
||||||
|
import netsvc
|
||||||
|
wf_service = netsvc.LocalService("workflow")
|
||||||
|
|
||||||
|
lot = self.browse(cr, uid, ref('prodlot_generic0'), context)
|
||||||
|
print "First Test Trigger: %s (%d, %s)" % (str(lot.qc_test_trigger_ids[0]), lot.qc_test_trigger_ids[0].test_id.id, lot.qc_test_trigger_ids[0].test_id.state)
|
||||||
|
print "Current Trigger: %s (%d, %s)" % (str(lot.current_qc_test_trigger_id), lot.current_qc_test_trigger_id.test_id.id, lot.current_qc_test_trigger_id.test_id.state)
|
||||||
|
print "State: %s" % lot.state
|
||||||
|
|
||||||
|
|
||||||
|
wkf_instance_ids = self.pool.get('workflow.instance').search(cr, uid, [('wkf_id','=',16),('res_id','=',lot.id)], context=context)
|
||||||
|
for wkf_instance in self.pool.get('workflow.instance').browse(cr, uid, wkf_instance_ids):
|
||||||
|
print "Wkf instance %d: state=%s" % (wkf_instance.id, wkf_instance.state)
|
||||||
|
|
||||||
|
wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','in',wkf_instance_ids)], context=context)
|
||||||
|
for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||||
|
print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||||
|
|
||||||
|
wkf_workitem_ids = self.pool.get('workflow.workitem').search(cr, uid, [('inst_id','in',wkf_instance_ids)], context=context)
|
||||||
|
print "Workitems: ",wkf_workitem_ids
|
||||||
|
for wkf_workitem in self.pool.get('workflow.workitem').browse(cr, uid, wkf_workitem_ids):
|
||||||
|
print "Wkf workitem for instance %d in activity %s: subflow_id=%d and state=%s" % (
|
||||||
|
wkf_workitem.inst_id.id,
|
||||||
|
wkf_workitem.act_id.name,
|
||||||
|
wkf_workitem.subflow_id.id,
|
||||||
|
wkf_workitem.state)
|
||||||
|
if wkf_workitem.subflow_id:
|
||||||
|
print "Wkf instance %d (%s, %d): state=%s" % (
|
||||||
|
wkf_workitem.subflow_id.id,
|
||||||
|
wkf_workitem.subflow_id.res_type,
|
||||||
|
wkf_workitem.subflow_id.res_id,
|
||||||
|
wkf_workitem.subflow_id.state)
|
||||||
|
|
||||||
|
wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','=',wkf_workitem.subflow_id.id)], context=context)
|
||||||
|
for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||||
|
print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||||
|
|
||||||
|
|
||||||
|
wf_service.trg_validate(uid, 'qc.test', lot.current_qc_test_id.id, 'cancel', cr)
|
||||||
|
|
||||||
|
lot = self.browse(cr, uid, ref('prodlot_generic0'), context)
|
||||||
|
print "First Test Trigger: %s (%d, %s)" % (str(lot.qc_test_trigger_ids[0]), lot.qc_test_trigger_ids[0].test_id.id, lot.qc_test_trigger_ids[0].test_id.state)
|
||||||
|
print "Current Trigger: %s (%d, %s)" % (str(lot.current_qc_test_trigger_id), lot.current_qc_test_trigger_id.test_id.id, lot.current_qc_test_trigger_id.test_id.state)
|
||||||
|
print "State: %s" % lot.state
|
||||||
|
|
||||||
|
|
||||||
|
wkf_instance_ids = self.pool.get('workflow.instance').search(cr, uid, [('wkf_id','=',16),('res_id','=',lot.id)], context=context)
|
||||||
|
for wkf_instance in self.pool.get('workflow.instance').browse(cr, uid, wkf_instance_ids):
|
||||||
|
print "Wkf instance %d: state=%s" % (wkf_instance.id, wkf_instance.state)
|
||||||
|
|
||||||
|
wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','in',wkf_instance_ids)], context=context)
|
||||||
|
for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||||
|
print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||||
|
|
||||||
|
wkf_workitem_ids = self.pool.get('workflow.workitem').search(cr, uid, [('inst_id','in',wkf_instance_ids)], context=context)
|
||||||
|
print "Workitems: ",wkf_workitem_ids
|
||||||
|
for wkf_workitem in self.pool.get('workflow.workitem').browse(cr, uid, wkf_workitem_ids):
|
||||||
|
print "Wkf workitem for instance %d in activity %s: subflow_id=%d and state=%s" % (
|
||||||
|
wkf_workitem.inst_id.id,
|
||||||
|
wkf_workitem.act_id.name,
|
||||||
|
wkf_workitem.subflow_id.id,
|
||||||
|
wkf_workitem.state)
|
||||||
|
if wkf_workitem.subflow_id:
|
||||||
|
print "Wkf instance %d (%s, %d): state=%s" % (
|
||||||
|
wkf_workitem.subflow_id.id,
|
||||||
|
wkf_workitem.subflow_id.res_type,
|
||||||
|
wkf_workitem.subflow_id.res_id,
|
||||||
|
wkf_workitem.subflow_id.state)
|
||||||
|
|
||||||
|
wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','=',wkf_workitem.subflow_id.id)], context=context)
|
||||||
|
for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||||
|
print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||||
|
|
||||||
|
-
|
||||||
|
Checking the Production Lot of product with generic and related QC Template
|
||||||
|
is in 'Pending Test' state because its current test is now the second test
|
||||||
|
(related)
|
||||||
|
#-
|
||||||
|
# !assert {model: stock.production.lot, id: prodlot_related0, string: The lot of product with generic and related qc template is not in the expected 'pending test' state!}:
|
||||||
|
# - state == 'pending_test'
|
||||||
|
# - current_qc_test_id.test_template_id.id == ref('qc_test_template_related0')
|
||||||
|
# - current_qc_test_id.state == 'draft'
|
||||||
|
-
|
||||||
|
!python {model: stock.production.lot}: |
|
||||||
|
import netsvc
|
||||||
|
wf_service = netsvc.LocalService("workflow")
|
||||||
|
|
||||||
|
lot = self.browse(cr, uid, ref('prodlot_related0'), context)
|
||||||
|
print "First Test Trigger: %s (%d, %s)" % (str(lot.qc_test_trigger_ids[0]), lot.qc_test_trigger_ids[0].test_id.id, lot.qc_test_trigger_ids[0].test_id.state)
|
||||||
|
print "Second Test Trigger: %s (%d, %s)" % (str(lot.qc_test_trigger_ids[1]), lot.qc_test_trigger_ids[1].test_id.id, lot.qc_test_trigger_ids[1].test_id.state)
|
||||||
|
print "Current Trigger: %s (%d, %s)" % (str(lot.current_qc_test_trigger_id), lot.current_qc_test_trigger_id.test_id.id, lot.current_qc_test_trigger_id.test_id.state)
|
||||||
|
print "State: %s" % lot.state
|
||||||
|
|
||||||
|
|
||||||
|
wkf_instance_ids = self.pool.get('workflow.instance').search(cr, uid, [('wkf_id','=',16),('res_id','=',lot.id)], context=context)
|
||||||
|
for wkf_instance in self.pool.get('workflow.instance').browse(cr, uid, wkf_instance_ids):
|
||||||
|
print "Wkf instance %d: state=%s" % (wkf_instance.id, wkf_instance.state)
|
||||||
|
|
||||||
|
wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','in',wkf_instance_ids)], context=context)
|
||||||
|
for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||||
|
print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||||
|
|
||||||
|
wkf_workitem_ids = self.pool.get('workflow.workitem').search(cr, uid, [('inst_id','in',wkf_instance_ids)], context=context)
|
||||||
|
print "Workitems: ",wkf_workitem_ids
|
||||||
|
for wkf_workitem in self.pool.get('workflow.workitem').browse(cr, uid, wkf_workitem_ids):
|
||||||
|
print "Wkf workitem for instance %d in activity %s: subflow_id=%d and state=%s" % (
|
||||||
|
wkf_workitem.inst_id.id,
|
||||||
|
wkf_workitem.act_id.name,
|
||||||
|
wkf_workitem.subflow_id.id,
|
||||||
|
wkf_workitem.state)
|
||||||
|
if wkf_workitem.subflow_id:
|
||||||
|
print "Wkf instance %d (%s, %d): state=%s" % (
|
||||||
|
wkf_workitem.subflow_id.id,
|
||||||
|
wkf_workitem.subflow_id.res_type,
|
||||||
|
wkf_workitem.subflow_id.res_id,
|
||||||
|
wkf_workitem.subflow_id.state)
|
||||||
|
|
||||||
|
wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','=',wkf_workitem.subflow_id.id)], context=context)
|
||||||
|
for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||||
|
print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||||
|
|
||||||
|
|
||||||
|
# wf_service.trg_validate(uid, 'stock.production.lot', lot.id, 'next_test', cr)
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# lot = self.browse(cr, uid, ref('prodlot_related0'), context)
|
||||||
|
# print "First Test Trigger: %s (%d, %s)" % (str(lot.qc_test_trigger_ids[0]), lot.qc_test_trigger_ids[0].test_id.id, lot.qc_test_trigger_ids[0].test_id.state)
|
||||||
|
# print "Second Test Trigger: %s (%d, %s)" % (str(lot.qc_test_trigger_ids[1]), lot.qc_test_trigger_ids[1].test_id.id, lot.qc_test_trigger_ids[1].test_id.state)
|
||||||
|
# print "Current Trigger: %s (%d, %s)" % (str(lot.current_qc_test_trigger_id), lot.current_qc_test_trigger_id.test_id.id, lot.current_qc_test_trigger_id.test_id.state)
|
||||||
|
# print "State: %s" % lot.state
|
||||||
|
#
|
||||||
|
# wkf_instance_ids = self.pool.get('workflow.instance').search(cr, uid, [('wkf_id','=',16),('res_id','=',lot.id)], context=context)
|
||||||
|
# for wkf_instance in self.pool.get('workflow.instance').browse(cr, uid, wkf_instance_ids):
|
||||||
|
# print "Wkf instance %d: state=%s" % (wkf_instance.id, wkf_instance.state)
|
||||||
|
#
|
||||||
|
# wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','in',wkf_instance_ids)], context=context)
|
||||||
|
# for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||||
|
# print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||||
|
#
|
||||||
|
# wkf_workitem_ids = self.pool.get('workflow.workitem').search(cr, uid, [('inst_id','in',wkf_instance_ids)], context=context)
|
||||||
|
# print "Workitems: ",wkf_workitem_ids
|
||||||
|
# for wkf_workitem in self.pool.get('workflow.workitem').browse(cr, uid, wkf_workitem_ids):
|
||||||
|
# print "Wkf workitem for instance %d in activity %s: subflow_id=%d and state=%s" % (
|
||||||
|
# wkf_workitem.inst_id.id,
|
||||||
|
# wkf_workitem.act_id.name,
|
||||||
|
# wkf_workitem.subflow_id.id,
|
||||||
|
# wkf_workitem.state)
|
||||||
|
# if wkf_workitem.subflow_id:
|
||||||
|
# print "Wkf instance %d (%s, %d): state=%s" % (
|
||||||
|
# wkf_workitem.subflow_id.id,
|
||||||
|
# wkf_workitem.subflow_id.res_type,
|
||||||
|
# wkf_workitem.subflow_id.res_id,
|
||||||
|
# wkf_workitem.subflow_id.state)
|
||||||
|
#
|
||||||
|
# wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','=',wkf_workitem.subflow_id.id)], context=context)
|
||||||
|
# for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||||
|
# print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||||
|
|
||||||
|
assert lot.state == 'pending_test', "The State of Lot is not the expected 'pending_test'. It is '%s'" % lot.state
|
||||||
|
assert lot.current_qc_test_id.test_template_id.id == ref('qc_test_template_related0'), "The template of current Test Trigger is not the expected '%d'. It is '%d'" % (ref('qc_test_template_related0'), lot.current_qc_test_id.test_template_id.id)
|
||||||
|
|
||||||
|
|
||||||
|
-
|
||||||
|
END OK!!
|
||||||
|
-
|
||||||
|
!python {model: stock.production.lot}: |
|
||||||
|
print "ADEU"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue