Added supplier/customer return packings

This commit is contained in:
Bertrand Chenal committed 2009-01-27 15:15:01 +01:00
1 parent 11545034fd
commit 6f36dacad5
3 files changed
+1031 -13

No files matched your search

+8
View File
@@ -39,6 +39,10 @@ class Move(OSV):
readonly=True, select=1)
packing_out = fields.Many2One('stock.packing.out', 'Customer Packing',
readonly=True, select=1)
packing_out_return = fields.Many2One('stock.packing.out.return',
'Customer Return Packing', readonly=True, select=1)
packing_in_return = fields.Many2One('stock.packing.in.return',
'Supplier Return Packing', readonly=True, select=1)
packing_internal = fields.Many2One('stock.packing.internal',
'Internal Packing', readonly=True, select=1)
planned_date = fields.Date("Planned Date", states=STATES, select=2)
@@ -161,6 +165,10 @@ class Move(OSV):
supplier = party_obj.browse(cursor, user, context['supplier'],
context=context)
res = supplier.supplier_location.id
elif context.get('customer'):
customer = party_obj.browse(cursor, user, context['customer'],
context=context)
res = customer.customer_location.id
if context.get('from_location'):
res = context.get('from_location')
+504
View File
@@ -287,6 +287,158 @@ class PackingIn(OSV):
PackingIn()
class PackingInReturn(OSV):
"Supplier Return Packing"
_name = 'stock.packing.in.return'
_description = __doc__
_rec_name = 'code'
effective_date =fields.Date('Effective Date', readonly=True)
planned_date = fields.Date(
'Planned Date', states={'readonly': "state != 'draft'",})
code = fields.Char("Code", size=None, select=1, readonly=True)
reference = fields.Char(
"Reference", size=None, select=1,
states={'readonly': "state != 'draft'",})
from_location = fields.Many2One(
'stock.location', "From Location", required=True,
states={ 'readonly': "state != 'draft' or bool(moves)", },
domain=[('type', '=', 'storage')])
to_location = fields.Many2One('stock.location', "To Location",
required=True, states={
'readonly': "state != 'draft' or bool(moves)",
}, domain=[('type', '=', 'supplier')])
moves = fields.One2Many(
'stock.move', 'packing_in_return', 'Moves',
states={'readonly': "state != 'draft' or "\
"not(bool(from_location) and bool (to_location))"},
context="{'from_location': from_location,"
"'to_location': to_location,"
"'planned_date': planned_date}",
)
state = fields.Selection([
('draft', 'Draft'),
('cancel', 'Cancel'),
('assigned', 'Assigned'),
('waiting', 'Waiting'),
('done', 'Done'),
], 'State', readonly=True)
def default_state(self, cursor, user, context=None):
return 'draft'
def button_draft(self, cursor, user, ids, context=None):
workflow_service = LocalService('workflow')
for packing in self.browse(cursor, user, ids, context=context):
workflow_service.trg_create(user, self._name, packing.id, cursor,
context=context)
return True
def __init__(self):
super(PackingInReturn, self).__init__()
self._rpc_allowed += [
'button_draft',
]
self._order[0] = ('id', 'DESC')
def create(self, cursor, user, values, context=None):
values = values.copy()
values['code'] = self.pool.get('ir.sequence').get(
cursor, user, 'stock.packing.in.return', context=context)
return super(PackingInReturn, self).create(
cursor, user, values, context=context)
def set_state_draft(self, cursor, user, packing_id, context=None):
move_obj = self.pool.get('stock.move')
packing = self.browse(cursor, user, packing_id, context=context)
self.write(
cursor, user, packing_id, {'state': 'draft'}, context=context)
move_obj.write(
cursor, user, [m.id for m in packing.moves], {'state': 'draft'},
context=context)
def set_state_waiting(self, cursor, user, packing_id, context=None):
move_obj = self.pool.get('stock.move')
packing = self.browse(cursor, user, packing_id, context=context)
move_obj.write(cursor, user, [m.id for m in packing.moves], {
'state': 'draft',
'planned_date': packing.planned_date,
}, context=context)
self.write(
cursor, user, packing_id, {'state': 'waiting'}, context=context)
def set_state_assigned(self, cursor, user, packing_id, context=None):
self.write(
cursor, user, packing_id, {'state': 'assigned'}, context=context)
def set_state_done(self, cursor, user, packing_id, context=None):
move_obj = self.pool.get('stock.move')
packing = self.browse(cursor, user, packing_id, context=context)
move_obj.write(
cursor, user, [m.id for m in packing.moves], {'state': 'done'},
context=context)
self.write( cursor, user, packing_id,
{'state': 'done',
'effective_date': datetime.date.today()},
context=context)
def set_state_cancel(self, cursor, user, packing_id, context=None):
move_obj = self.pool.get('stock.move')
packing = self.browse(cursor, user, packing_id, context=context)
move_obj.write(
cursor, user, [m.id for m in packing.moves], {'state': 'cancel'},
context=context)
self.write(
cursor, user, packing_id, {'state': 'cancel'}, context=context)
def assign_try(self, cursor, user, packing_id, context=None):
product_obj = self.pool.get('product.product')
uom_obj = self.pool.get('product.uom')
date_obj = self.pool.get('ir.date')
packing = self.browse(cursor, user, packing_id, context=context)
cursor.execute('LOCK TABLE stock_move')
local_ctx = context and context.copy() or {}
local_ctx['stock_date_end'] = date_obj.today(cursor, user,
context=context)
local_ctx['stock_assign'] = True
location_ids = [m.from_location.id for m in packing.moves]
pbl = product_obj.products_by_location(cursor, user,
location_ids=location_ids,
product_ids=[m.product.id for m in packing.moves],
context=local_ctx)
for move in packing.moves:
if move.state != 'draft':
continue
if (move.from_location.id, move.product.id) in pbl:
qty_default_uom = pbl[(move.from_location.id, move.product.id)]
qty = uom_obj.compute_qty(
cursor, user, move.product.default_uom, qty_default_uom,
move.uom, round=False, context=context)
if qty < move.quantity:
return False
pbl[(move.from_location.id, move.product.id)] = \
pbl[(move.from_location.id, move.product.id)] - qty_default_uom
move_obj.write(cursor, user, [m.id for m in packing.moves],
{'state': 'assigned'}, context=context)
return True
def assign_force(self, cursor, user, packing_id, context=None):
packing = self.browse(cursor, user, packing_id, context=context)
move_obj = self.pool.get('stock.move')
move_obj.write(cursor, user, [m.id for m in packing.moves], {
'state': 'assigned',
}, context=context)
return True
PackingInReturn()
class PackingOut(OSV):
"Customer Packing"
_name = 'stock.packing.out'
@@ -675,6 +827,289 @@ class PackingOut(OSV):
PackingOut()
class PackingOutReturn(OSV):
"Customer Return Packing"
_name = 'stock.packing.out.return'
_description = __doc__
_rec_name = 'code'
effective_date = fields.Date('Effective Date', readonly=True)
planned_date = fields.Date('Planned Date',
states={
'readonly': "state != 'draft'",
})
customer = fields.Many2One('party.party', 'Customer', required=True,
states={
'readonly': "state != 'draft' or bool(incoming_moves)",
}, on_change=['customer'])
delivery_address = fields.Many2One('party.address',
'Delivery Address', required=True,
states={
'readonly': "state != 'draft'",
}, domain="[('party', '=', customer)]")
reference = fields.Char("Reference", size=None, select=1,
states={
'readonly': "state != 'draft'",
})
warehouse = fields.Many2One('stock.location', "Warehouse", required=True,
states={
'readonly': "state != 'draft' or bool(incoming_moves)",
}, domain=[('type', '=', 'warehouse')])
customer_location = fields.Many2One('stock.location', "Customer Location",
required=True, states={
'readonly': "state != 'draft'",
}, domain="[('type', '=', 'customer')]")
incoming_moves = fields.Function('get_incoming_moves', type='one2many',
relation='stock.move', string='Incoming Moves',
fnct_inv='set_incoming_moves',
states={
'readonly':"state != 'draft'",
}, context="{'warehouse': warehouse, 'type': 'incoming'," \
"'customer': customer}")
inventory_moves = fields.Function('get_inventory_moves', type='one2many',
relation='stock.move', string='Inventory Moves',
fnct_inv='set_inventory_moves',
states={
'readonly':"state in ('draft', 'cancel', 'done')",
}, context="{'warehouse': warehouse, 'type': 'inventory_out',}")
moves = fields.One2Many('stock.move', 'packing_out_return', 'Moves',
readonly=True)
code = fields.Char("Code", size=None, select=1, readonly=True)
state = fields.Selection([
('draft', 'Draft'),
('done', 'Done'),
('cancel', 'Cancel'),
('received', 'Received'),
], 'State', readonly=True)
def __init__(self):
super(PackingOutReturn, self).__init__()
self._rpc_allowed += [
'button_draft',
]
self._order[0] = ('id', 'DESC')
self._error_messages.update({
'incoming_move_input_dest': 'Incoming Moves must ' \
'have the warehouse input location as destination location!',
'inventory_move_input_source': 'Inventory Moves must ' \
'have the warehouse input location as source location!',
})
def default_state(self, cursor, user, context=None):
return 'draft'
def default_warehouse(self, cursor, user, context=None):
location_obj = self.pool.get('stock.location')
location_ids = location_obj.search(cursor, user,
self.warehouse._domain, context=context)
if len(location_ids) == 1:
return location_obj.name_get(cursor, user, location_ids,
context=context)[0]
return False
def on_change_customer(self, cursor, user, ids, values, context=None):
if not values.get('customer'):
return {'delivery_address': False,
'customer_location': False}
party_obj = self.pool.get("party.party")
address_id = party_obj.address_get(cursor, user, values['customer'],
type='delivery', context=context)
party = party_obj.browse(cursor, user, values['customer'], context=context)
return {
'delivery_address': address_id,
'customer_location': party.customer_location.id,
}
def get_incoming_moves(self, cursor, user, ids, name, arg, context=None):
res = {}
for packing in self.browse(cursor, user, ids, context=context):
res[packing.id] = []
for move in packing.moves:
if move.to_location.id == \
packing.warehouse.input_location.id:
res[packing.id].append(move.id)
return res
def set_incoming_moves(self, cursor, user, packing_id, name, value, arg,
context=None):
move_obj = self.pool.get('stock.move')
if not value:
return
packing = self.browse(cursor, user, packing_id, context=context)
move_ids = []
for act in value:
if act[0] == 'create':
if 'to_location' in act[1]:
if act[1]['to_location'] != \
packing.warehouse.input_location.id:
self.raise_user_error(cursor,
'incoming_move_input_dest', context=context)
elif act[0] == 'write':
if 'to_location' in act[2]:
if act[2]['to_location'] != \
packing.warehouse.input_location.id:
self.raise_user_error(cursor,
'incoming_move_input_dest', context=context)
elif act[0] == 'add':
move_ids.append(act[1])
elif act[0] == 'set':
move_ids.extend(act[1])
moves = move_obj.browse(cursor, user, move_ids, context=context)
for move in moves:
if move.to_location.id != \
packing.warehouse.input_location.id:
self.raise_user_error(cursor,
'incoming_move_input_dest', context=context)
self.write(cursor, user, packing_id, {
'moves': value,
}, context=context)
def get_inventory_moves(self, cursor, user, ids, name, arg, context=None):
res = {}
for packing in self.browse(cursor, user, ids, context=context):
res[packing.id] = []
for move in packing.moves:
if move.from_location.id == \
packing.warehouse.input_location.id:
res[packing.id].append(move.id)
return res
def set_inventory_moves(self, cursor, user, packing_id, name, value, arg,
context=None):
move_obj = self.pool.get('stock.move')
if not value:
return
packing = self.browse(cursor, user, packing_id, context=context)
move_ids = []
for act in value:
if act[0] == 'create':
if 'from_location' in act[1]:
if act[1]['from_location'] != \
packing.warehouse.input_location.id:
self.raise_user_error(cursor,
'inventory_move_input_source', context=context)
elif act[0] == 'write':
if 'from_location' in act[2]:
if act[2]['from_location'] != \
packing.warehouse.input_location.id:
self.raise_user_error(cursor,
'inventory_move_input_source', context=context)
elif act[0] == 'add':
move_ids.append(act[1])
elif act[0] == 'set':
move_ids.extend(act[1])
moves = move_obj.browse(cursor, user, move_ids, context=context)
for move in moves:
if move.from_location.id != \
packing.warehouse.input_location.id:
self.raise_user_error(cursor,
'inventory_move_input_source', context=context)
self.write(cursor, user, packing_id, {
'moves': value,
}, context=context)
def create(self, cursor, user, values, context=None):
values = values.copy()
values['code'] = self.pool.get('ir.sequence').get(
cursor, user, 'stock.packing.out.return', context=context)
return super(PackingOutReturn, self).create(cursor, user, values,
context=context)
def copy(self, cursor, user, ids, default=None, context=None):
if default is None:
default = {}
default = default.copy()
default['inventory_moves']= False
default['incoming_moves']= False
return super(PackingOutReturn, self).copy(cursor, user, ids,
default=default, context=context)
def button_draft(self, cursor, user, ids, context=None):
workflow_service = LocalService('workflow')
for packing in self.browse(cursor, user, ids, context=context):
workflow_service.trg_create(user, self._name, packing.id, cursor,
context=context)
def set_state_done(self, cursor, user, packing_id, context=None):
move_obj = self.pool.get('stock.move')
packing = self.browse(cursor, user, packing_id, context=context)
move_obj.write(
cursor, user, [m.id for m in packing.inventory_moves],
{'state': 'done'}, context)
self.write(cursor, user, packing_id,{
'state': 'done',
'effective_date': datetime.date.today(),
}, context=context)
def set_state_cancel(self, cursor, user, packing_id, context=None):
move_obj = self.pool.get('stock.move')
packing = self.browse(cursor, user, packing_id, context=context)
move_obj.write(
cursor, user, [m.id for m in packing.incoming_moves] +\
[m.id for m in packing.inventory_moves], {'state': 'cancel'},
context)
self.write(cursor, user, packing_id, {'state': 'cancel'},
context=context)
def set_state_received(self, cursor, user, packing_id, context=None):
move_obj = self.pool.get('stock.move')
packing = self.browse(cursor, user, packing_id, context=context)
move_obj.write(
cursor, user, [m.id for m in packing.incoming_moves],
{'state': 'done'}, context=context)
self.write(cursor, user, packing_id, {
'state': 'received'
}, context=context)
def set_state_draft(self, cursor, user, packing_id, context=None):
move_obj = self.pool.get('stock.move')
packing = self.browse(cursor, user, packing_id, context=context)
move_obj.write(cursor, user, [m.id for m in packing.incoming_moves
if m.state != 'draft'], {
'state': 'draft',
}, context=context)
move_obj.delete(cursor, user,
[m.id for m in packing.inventory_moves], context=context)
self.write(cursor, user, packing_id, {
'state': 'draft',
}, context=context)
def _get_inventory_moves(self, cursor, user, incoming_move, context=None):
res = {}
if incoming_move.quantity <= 0.0:
return None
res['product'] = incoming_move.product.id
res['uom'] = incoming_move.uom.id
res['quantity'] = incoming_move.quantity
res['from_location'] = incoming_move.to_location.id
res['to_location'] = incoming_move.packing_out_return.warehouse.\
storage_location.id
res['state'] = 'draft'
res['company'] = incoming_move.company.id
return res
def create_inventory_moves(self, cursor, user, packing_id, context=None):
packing = self.browse(cursor, user, packing_id, context=context)
for incoming_move in packing.incoming_moves:
vals = self._get_inventory_moves(cursor, user, incoming_move,
context=context)
if vals:
self.write(cursor, user, packing.id, {
'inventory_moves': [('create', vals)]
}, context=context)
PackingOutReturn()
class AssignPackingOutAskForce(WizardOSV):
'Assign Packing Out Ask Force'
_name = 'stock.packing.out.assign.ask_force'
@@ -939,6 +1374,75 @@ class AssignPackingInternal(Wizard):
AssignPackingInternal()
class AssignPackingInReturnAskForce(WizardOSV):
'Assign Supplier return Packing Ask Force'
_name = 'stock.packing.in.return.assign.ask_force'
_description = __doc__
moves = fields.Many2Many('stock.move', None, None, None, 'Moves',
readonly=True)
AssignPackingInReturnAskForce()
class AssignPackingInReturn(Wizard):
'Assign Supplier Return Packing'
_name = 'stock.packing.in.return.assign'
states = {
'init': {
'result': {
'type': 'choice',
'next_state': '_choice',
},
},
'ask_force': {
'actions': ['_moves'],
'result': {
'type': 'form',
'object': 'stock.packing.in.return.assign.ask_force',
'state': [
('force', 'Force Assign', 'tryton-go-next'),
('end', 'Ok', 'tryton-ok', True),
],
},
},
'force': {
'result': {
'type': 'action',
'action': '_force',
'state': 'end',
},
},
}
def _choice(self, cursor, user, data, context=None):
workflow_service = LocalService('workflow')
packing_internal_obj = self.pool.get('stock.packing.in.return')
workflow_service.trg_validate(user, 'stock.packing.in.return',
data['id'], 'assign', cursor, context=context)
packing = packing_internal_obj.browse(cursor, user, data['id'],
context=context)
if not [x.id for x in packing.moves if x.state == 'draft']:
return 'end'
else:
return 'ask_force'
def _moves(self, cursor, user, data, context=None):
packing_internal_obj = self.pool.get('stock.packing.in.return')
packing = packing_internal_obj.browse(cursor, user, data['id'],
context=context)
return {'moves': [x.id for x in packing.moves if x.state == 'draft']}
def _force(self, cursor, user, data, context=None):
workflow_service = LocalService('workflow')
workflow_service.trg_validate(user, 'stock.packing.in.return',
data['id'], 'force_assign', cursor, context=context)
return {}
AssignPackingInReturn()
class Address(OSV):
_name = 'party.address'
delivery = fields.Boolean('Delivery')
+519 -13
View File
@@ -146,14 +146,140 @@ this repository contains the full copyright notices and license terms. -->
action="act_packing_in_form_received"
id="menu_packing_in_received"/>
<record model="ir.sequence.type" id="sequence_type_packing_in">
<field name="name">Supplier Packing</field>
<field name="code">stock.packing.in</field>
<!-- Packing In Return view-->
<record model="ir.action.wizard" id="wizard_packing_in_return_assign">
<field name="name">Assign Purchase Return Packing</field>
<field name="wiz_name">stock.packing.in.return.assign</field>
<field name="model">stock.packing.in.return</field>
</record>
<record model="ir.sequence" id="sequence_packing_in">
<field name="name">Supplier Packing</field>
<field name="code">stock.packing.in</field>
<record model="ir.ui.view" id="packing_in_return_view_form">
<field name="model">stock.packing.in.return</field>
<field name="type">form</field>
<field name="arch" type="xml">
<![CDATA[
<form string="Supplier Return Packing" col="4" cursor="from_location">
<label name="reference"/>
<field name="reference"/>
<label name="code"/>
<field name="code"/>
<label name="from_location"/>
<field name="from_location"/>
<label name="to_location"/>
<field name="to_location"/>
<label name="planned_date"/>
<field name="planned_date"/>
<label name="effective_date"/>
<field name="effective_date"/>
<separator name="moves" colspan="4"/>
<field name="moves" colspan="4"/>
<label name="state"/>
<field name="state"/>
<group col="6" colspan="2" id="buttons">
<button string="Cancel" name="cancel"
states="{'invisible': '''state in ('cancel', 'done') ''', 'readonly': '''%(group_stock)d not in groups'''}"
icon="tryton-cancel"/>
<button string="Draft" name="draft"
states="{'invisible': '''state != 'waiting' ''', 'readonly': '''%(group_stock)d not in groups'''}"
icon="tryton-go-previous"/>
<button string="Waiting" name="waiting"
states="{'invisible': '''state not in ('assigned', 'draft')''', 'readonly': '''%(group_stock)d not in groups''', 'icon': '''state == 'assigned' and 'tryton-go-previous' or state == 'draft' and 'tryton-go-next' or False'''}"/>
<button string="Assign" name="%(wizard_packing_in_return_assign)d"
type="action"
states="{'invisible': '''state != 'waiting' ''', 'readonly': '''%(group_stock)d not in groups'''}"
icon="tryton-go-next"/>
<button string="Reset to Draft" name="button_draft"
type="object" states="{'invisible': '''state != 'cancel' ''', 'readonly': '''%(group_stock)d not in groups'''}"
icon="tryton-clear"/>
<button string="Done" name="done"
states="{'invisible': '''state != 'assigned' ''', 'readonly': '''%(group_stock)d not in groups'''}"
icon="tryton-ok"/>
</group>
</form>
]]>
</field>
</record>
<record model="ir.ui.view" id="packing_in_return_view_tree">
<field name="model">stock.packing.in.return</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<![CDATA[
<tree string="Supplier Return Packings">
<field name="code" select="1"/>
<field name="reference" select="2"/>
<field name="planned_date" select="2"/>
<field name="effective_date" select="2"/>
<field name="from_location" select="2"/>
<field name="to_location" select="2"/>
<field name="state" select="1"/>
</tree>
]]>
</field>
</record>
<record model="ir.action.act_window" id="act_packing_in_return_form">
<field name="name">Supplier Return Packings</field>
<field name="res_model">stock.packing.in.return</field>
<field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_packing_in_return_form_view1">
<field name="sequence" eval="1"/>
<field name="view" ref="packing_in_return_view_tree"/>
<field name="act_window" ref="act_packing_in_return_form"/>
</record>
<record model="ir.action.act_window.view"
id="act_packing_in_return_form_view2">
<field name="sequence" eval="2"/>
<field name="view" ref="packing_in_return_view_form"/>
<field name="act_window" ref="act_packing_in_return_form"/>
</record>
<menuitem parent="menu_packing_in_form" sequence="40"
action="act_packing_in_return_form"
id="menu_packing_in_return_form"/>
<record model="ir.action.act_window" id="act_packing_in_return_new_form">
<field name="name">New Supplier Return Packing</field>
<field name="res_model">stock.packing.in.return</field>
<field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_packing_in_return_new_form_view1">
<field name="sequence" eval="2"/>
<field name="view" ref="packing_in_return_view_tree"/>
<field name="act_window" ref="act_packing_in_return_new_form"/>
</record>
<record model="ir.action.act_window.view"
id="act_packing_in_return_new_form_view2">
<field name="sequence" eval="1"/>
<field name="view" ref="packing_in_return_view_form"/>
<field name="act_window" ref="act_packing_in_return_new_form"/>
</record>
<menuitem parent="menu_packing_in_return_form" sequence="10"
action="act_packing_in_return_new_form"
id="menu_packing_in_return_new_form"/>
<record model="ir.ui.view" id="packing_in_return_assign_ask_force_view_form">
<field name="model">stock.packing.in.return.assign.ask_force</field>
<field name="type">form</field>
<field name="arch" type="xml">
<![CDATA[
<form string="Unable to Assign" col="2">
<image name="tryton-dialog-information"/>
<group col="1" id="labels">
<separator string="Unable to assign those products:"
id="unable"/>
<field name="moves">
<tree string="Moves" fill="1">
<field name="product"/>
<field name="quantity"/>
<field name="uom"/>
<field name="unit_digits" tree_invisible="1"/>
</tree>
</field>
</group>
</form>
]]>
</field>
</record>
<!--Packing out view-->
@@ -554,16 +680,128 @@ this repository contains the full copyright notices and license terms. -->
</field>
</record>
<!-- Sequence packing out -->
<record model="ir.sequence.type" id="sequence_type_packing_out">
<field name="name">Customer Packing</field>
<field name="code">stock.packing.out</field>
<!--Return Packing Out view-->
<record model="ir.ui.view" id="packing_out_return_view_form">
<field name="model">stock.packing.out.return</field>
<field name="type">form</field>
<field name="arch" type="xml">
<![CDATA[
<form string="Customer Return Packing" col="4" cursor="customer">
<label name="reference"/>
<field name="reference"/>
<label name="code"/>
<field name="code"/>
<label name="customer"/>
<field name="customer"/>
<label name="delivery_address"/>
<field name="delivery_address"/>
<label name="warehouse"/>
<field name="warehouse"/>
<label name="customer_location"/>
<field name="customer_location"/>
<label name="planned_date"/>
<field name="planned_date"/>
<label name="effective_date"/>
<field name="effective_date"/>
<notebook colspan="6">
<page string="Incoming Moves" id="incoming_moves">
<field name="incoming_moves" colspan="4">
<tree string="Moves">
<field name="product" select="1"/>
<field name="from_location" select="2"/>
<field name="to_location" select="2"/>
<field name="quantity" select="1"/>
<field name="uom" select="1"/>
<field name="planned_date" select="1"/>
<field name="state" select="2"/>
<field name="unit_digits" tree_invisible="1"/>
</tree>
</field>
</page>
<page string="Inventory Moves" id="inventory_moves">
<field name="inventory_moves" colspan="4"/>
</page>
</notebook>
<group col="4" colspan="6" id="state_buttons">
<label name="state"/>
<field name="state"/>
<group col="5" colspan="2" id="buttons">
<button string="Cancel" name="cancel"
states="{'invisible': '''state in ('cancel', 'done') ''', 'readonly': '''%(group_stock)d not in groups'''}"
icon="tryton-cancel"/>
<button string="Received" name="received"
states="{'invisible': '''state != 'draft' ''', 'readonly': '''%(group_stock)d not in groups'''}"
icon="tryton-go-next"/>
<button string="Done" name="done"
states="{'invisible': '''state != 'received' ''', 'readonly': '''%(group_stock)d not in groups'''}"
icon="tryton-ok"/>
<button string="Reset to Draft" name="button_draft"
type="object"
states="{'invisible': '''state != 'cancel' ''', 'readonly': '''%(group_stock)d not in groups'''}"
icon="tryton-clear"/>
</group>
</group>
</form>
]]>
</field>
</record>
<record model="ir.ui.view" id="packing_out_return_view_tree">
<field name="model">stock.packing.out.return</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<![CDATA[
<tree string="Customer Return Packings">
<field name="code" select="1"/>
<field name="reference" select="1"/>
<field name="state" select="1"/>
<field name="planned_date" select="2"/>
<field name="effective_date" select="2"/>
<field name="customer" select="2"/>
<field name="delivery_address" select="2"/>
</tree>
]]>
</field>
</record>
<record model="ir.action.act_window" id="act_packing_out_return_form">
<field name="name">Customer Return Packings</field>
<field name="res_model">stock.packing.out.return</field>
<field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_packing_out_return_form_view1">
<field name="sequence" eval="1"/>
<field name="view" ref="packing_out_return_view_tree"/>
<field name="act_window" ref="act_packing_out_return_form"/>
</record>
<record model="ir.action.act_window.view"
id="act_packing_out_return_form_view2">
<field name="sequence" eval="2"/>
<field name="view" ref="packing_out_return_view_form"/>
<field name="act_window" ref="act_packing_out_return_form"/>
</record>
<menuitem parent="menu_packing_out_form" sequence="40"
action="act_packing_out_return_form"
id="menu_packing_out_return_form"/>
<record model="ir.sequence" id="sequence_packing_out">
<field name="name">Customer Packing</field>
<field name="code">stock.packing.out</field>
<record model="ir.action.act_window" id="act_packing_out_return_form2">
<field name="name">New Customer Return Packing</field>
<field name="res_model">stock.packing.out.return</field>
<field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_packing_out_return_form2_view1">
<field name="sequence" eval="1"/>
<field name="view" ref="packing_out_return_view_form"/>
<field name="act_window" ref="act_packing_out_return_form2"/>
</record>
<record model="ir.action.act_window.view"
id="act_packing_out_return_form2_view2">
<field name="sequence" eval="2"/>
<field name="view" ref="packing_out_return_view_tree"/>
<field name="act_window" ref="act_packing_out_return_form2"/>
</record>
<menuitem parent="menu_packing_out_return_form" sequence="10"
action="act_packing_out_return_form2" id="menu_packing_out_return_form2"/>
<!-- Workflow packing in -->
<record model="workflow" id="wkf_packingin">
@@ -894,6 +1132,227 @@ this repository contains the full copyright notices and license terms. -->
<field name="signal">cancel</field>
</record>
<!-- Workflow packing out return -->
<record model="workflow" id="wkf_packing_out_return">
<field name="name">Customer Return Packing</field>
<field name="osv">stock.packing.out.return</field>
<field name="on_create">True</field>
</record>
<record model="workflow.activity" id="packing_out_return_act_draft">
<field name="workflow" ref="wkf_packing_out_return"/>
<field name="flow_start">True</field>
<field name="kind">function</field>
<field name="action">set_state_draft()</field>
<field name="name">Draft</field>
</record>
<record model="workflow.activity" id="packing_out_return_act_cancel">
<field name="workflow" ref="wkf_packing_out_return"/>
<field name="flow_stop">True</field>
<field name="name">Cancel</field>
<field name="kind">function</field>
<field name="action">set_state_cancel()</field>
</record>
<record model="workflow.activity" id="packing_out_return_act_done">
<field name="workflow" ref="wkf_packing_out_return"/>
<field name="flow_stop">True</field>
<field name="name">Done</field>
<field name="kind">function</field>
<field name="action">set_state_done()</field>
</record>
<record model="workflow.activity" id="packing_out_return_act_received">
<field name="name">Received</field>
<field name="kind">function</field>
<field name="workflow" ref="wkf_packing_out_return"/>
<field name="action">set_state_received()&#10;create_inventory_moves()</field>
</record>
<record model="workflow.transition"
id="packing_out_return_trans_draft_received">
<field name="act_from" ref="packing_out_return_act_draft"/>
<field name="act_to" ref="packing_out_return_act_received"/>
<field name="group" ref="group_stock"/>
<field name="signal">received</field>
</record>
<record model="workflow.transition"
id="packing_out_return_trans_received_draft">
<field name="act_from" ref="packing_out_return_act_received"/>
<field name="act_to" ref="packing_out_return_act_draft"/>
<field name="group" ref="group_stock"/>
<field name="signal">draft</field>
</record>
<record model="workflow.transition" id="packing_out_return_trans_received_done">
<field name="act_from" ref="packing_out_return_act_received"/>
<field name="act_to" ref="packing_out_return_act_done"/>
<field name="group" ref="group_stock"/>
<field name="signal">done</field>
</record>
<record model="workflow.transition" id="packing_out_return_trans_draft_cancel">
<field name="act_from" ref="packing_out_return_act_draft"/>
<field name="act_to" ref="packing_out_return_act_cancel"/>
<field name="group" ref="group_stock"/>
<field name="signal">cancel</field>
</record>
<record model="workflow.transition"
id="packing_out_return_trans_received_cancel">
<field name="act_from" ref="packing_out_return_act_received"/>
<field name="act_to" ref="packing_out_return_act_cancel"/>
<field name="group" ref="group_stock"/>
<field name="signal">cancel</field>
</record>
<!-- Workflow purchase return packing -->
<record model="workflow" id="wkf_packing_in_return">
<field name="name">Supplier Return Packing</field>
<field name="osv">stock.packing.in.return</field>
<field name="on_create">True</field>
</record>
<record model="workflow.activity" id="packing_in_return_act_draft">
<field name="workflow" ref="wkf_packing_in_return"/>
<field name="flow_start">True</field>
<field name="kind">function</field>
<field name="action">set_state_draft()</field>
<field name="name">Draft</field>
</record>
<record model="workflow.activity" id="packing_in_return_act_cancel">
<field name="workflow" ref="wkf_packing_in_return"/>
<field name="flow_stop">True</field>
<field name="name">Cancel</field>
<field name="kind">function</field>
<field name="action">set_state_cancel()</field>
</record>
<record model="workflow.activity" id="packing_in_return_act_done">
<field name="workflow" ref="wkf_packing_in_return"/>
<field name="flow_stop">True</field>
<field name="name">Done</field>
<field name="kind">function</field>
<field name="action">set_state_done()</field>
</record>
<record model="workflow.activity" id="packing_in_return_act_waiting">
<field name="name">Waiting</field>
<field name="kind">function</field>
<field name="workflow" ref="wkf_packing_in_return"/>
<field name="action">set_state_waiting()</field>
</record>
<record model="workflow.activity" id="packing_in_return_act_assigned">
<field name="name">Assigned</field>
<field name="kind">function</field>
<field name="workflow" ref="wkf_packing_in_return"/>
<field name="action">set_state_assigned()</field>
</record>
<record model="workflow.transition"
id="packing_in_return_trans_draft_waiting">
<field name="act_from" ref="packing_in_return_act_draft"/>
<field name="act_to" ref="packing_in_return_act_waiting"/>
<field name="group" ref="group_stock"/>
<field name="signal">waiting</field>
</record>
<record model="workflow.transition"
id="packing_in_return_trans_waiting_draft">
<field name="act_from" ref="packing_in_return_act_waiting"/>
<field name="act_to" ref="packing_in_return_act_draft"/>
<field name="group" ref="group_stock"/>
<field name="signal">draft</field>
</record>
<record model="workflow.transition"
id="packing_in_return_trans_waiting_assigned">
<field name="act_from" ref="packing_in_return_act_waiting"/>
<field name="act_to" ref="packing_in_return_act_assigned"/>
<field name="group" ref="group_stock"/>
<field name="signal">assign</field>
<field name="condition">assign_try()</field>
</record>
<record model="workflow.transition"
id="packing_in_return_trans_assigned_waiting">
<field name="act_from" ref="packing_in_return_act_assigned"/>
<field name="act_to" ref="packing_in_return_act_waiting"/>
<field name="group" ref="group_stock"/>
<field name="signal">waiting</field>
</record>
<record model="workflow.transition"
id="packing_in_return_trans_waiting_assigned_force">
<field name="act_from" ref="packing_in_return_act_waiting"/>
<field name="act_to" ref="packing_in_return_act_assigned"/>
<field name="group" ref="group_stock"/>
<field name="signal">force_assign</field>
<field name="condition">assign_force()</field>
</record>
<record model="workflow.transition" id="packing_in_return_trans_assigned_done">
<field name="act_from" ref="packing_in_return_act_assigned"/>
<field name="act_to" ref="packing_in_return_act_done"/>
<field name="group" ref="group_stock"/>
<field name="signal">done</field>
</record>
<record model="workflow.transition" id="packing_in_return_trans_draft_cancel">
<field name="act_from" ref="packing_in_return_act_draft"/>
<field name="act_to" ref="packing_in_return_act_cancel"/>
<field name="group" ref="group_stock"/>
<field name="signal">cancel</field>
</record>
<record model="workflow.transition"
id="packing_in_return_trans_waiting_cancel">
<field name="act_from" ref="packing_in_return_act_waiting"/>
<field name="act_to" ref="packing_in_return_act_cancel"/>
<field name="group" ref="group_stock"/>
<field name="signal">cancel</field>
</record>
<record model="workflow.transition"
id="packing_in_return_trans_assigned_cancel">
<field name="act_from" ref="packing_in_return_act_assigned"/>
<field name="act_to" ref="packing_in_return_act_cancel"/>
<field name="group" ref="group_stock"/>
<field name="signal">cancel</field>
</record>
<!-- Sequence packing out -->
<record model="ir.sequence.type" id="sequence_type_packing_out">
<field name="name">Customer Packing</field>
<field name="code">stock.packing.out</field>
</record>
<record model="ir.sequence" id="sequence_packing_out">
<field name="name">Customer Packing</field>
<field name="code">stock.packing.out</field>
</record>
<!-- Sequence packing in -->
<record model="ir.sequence.type" id="sequence_type_packing_in">
<field name="name">Supplier Packing</field>
<field name="code">stock.packing.in</field>
</record>
<record model="ir.sequence" id="sequence_packing_in">
<field name="name">Supplier Packing</field>
<field name="code">stock.packing.in</field>
</record>
<!-- Sequence packing internal -->
<record model="ir.sequence.type" id="sequence_type_packing_internal">
<field name="name">Internal Packing</field>
<field name="code">stock.packing.internal</field>
</record>
<record model="ir.sequence" id="sequence_packing_internal">
<field name="name">InternalPacking</field>
<field name="code">stock.packing.internal</field>
</record>
<!-- Sequence packing out return-->
<record model="ir.sequence.type" id="sequence_type_packing_out_return">
<field name="name">Customer Return Packing</field>
<field name="code">stock.packing.out.return</field>
</record>
<record model="ir.sequence" id="sequence_packing_out_return">
<field name="name">Customer Retrun Packing</field>
<field name="code">stock.packing.out.return</field>
</record>
<!-- Sequence packing in return -->
<record model="ir.sequence.type" id="sequence_type_packing_in_return">
<field name="name">Supplier Return Packing</field>
<field name="code">stock.packing.in.return</field>
</record>
<record model="ir.sequence" id="sequence_packing_in_return">
<field name="name">Supplier Retrun Packing</field>
<field name="code">stock.packing.in.return</field>
</record>
<!-- Add delivery field on address -->
<record model="ir.ui.view" id="address_view_tree">
@@ -999,5 +1458,52 @@ this repository contains the full copyright notices and license terms. -->
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_packing_out_return">
<field name="model" search="[('model', '=', 'stock.packing.out.return')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_packing_out_return_group_stock">
<field name="model" search="[('model', '=', 'stock.packing.out.return')]"/>
<field name="group" ref="group_stock"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_packing_out_return_group_stock_admin">
<field name="model" search="[('model', '=', 'stock.packing.out.return')]"/>
<field name="group" ref="group_stock_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_packing_in_return">
<field name="model" search="[('model', '=', 'stock.packing.in.return')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_packing_in_return_group_stock">
<field name="model" search="[('model', '=', 'stock.packing.in.return')]"/>
<field name="group" ref="group_stock"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_packing_in_return_group_stock_admin">
<field name="model" search="[('model', '=', 'stock.packing.in.return')]"/>
<field name="group" ref="group_stock_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
</data>
</tryton>