diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 3c0c35b..2e756de 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -1,14 +1,24 @@
-#
+#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+msgctxt "error:stock.picking.box.out.assign:"
+msgid ""
+"Shipment \"%(shipment)s\" can not assign in box \"%(box)s\" because there is"
+" another shipment assigned. Please select a new box."
+msgstr ""
+"L'albarà \"%(shipment)s\" no es pot assignar en el box \"%(box)s\" perque ja"
+" existeix un altre albarà ja assignat. Seleccione un nou box."
+
+msgctxt "error:stock.picking.box.out.assign:"
+msgid "Shipment \"%(shipment)s\" is available in box \"%(box)s\"."
+msgstr "L'albarà \"%(shipment)s\" ja es troba en el box \"%(box)s\"."
+
msgctxt "error:stock.picking.box.shipment.out:"
msgid ""
-"Shipment\"%(shipment)s\" could not assign any box. Please try again or wait "
-"to available new box."
-msgstr ""
-"L'albarà \"%(shipment)s\" no s'ha pogut assignar a cap box. Torni a provar-"
-"ho o esperi que estigui disponible un box."
+"Shipment \"%(shipment)s\" could not assign any box. Please try again or wait"
+" to available new box."
+msgstr "L'albarà \"%(shipment)s\" ja es troba en el box \"%(box)s\"."
msgctxt "field:stock.picking.box.out,active:"
msgid "Active"
@@ -26,6 +36,10 @@ msgctxt "field:stock.picking.box.out,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:stock.picking.box.out,location:"
+msgid "Location"
+msgstr "Ubicació"
+
msgctxt "field:stock.picking.box.out,name:"
msgid "Name"
msgstr "Nom"
@@ -38,6 +52,10 @@ msgctxt "field:stock.picking.box.out,sequence:"
msgid "Sequence"
msgstr "Seqüència"
+msgctxt "field:stock.picking.box.out,type:"
+msgid "Type"
+msgstr "Tipus"
+
msgctxt "field:stock.picking.box.out,warehouse:"
msgid "Warehouse"
msgstr "Magatzem"
@@ -102,6 +120,10 @@ msgctxt "field:stock.picking.box.shipment.out.result,shipment:"
msgid "Shipment"
msgstr "Albarà client"
+msgctxt "field:stock.picking.box.shipment.out.start,box:"
+msgid "Box"
+msgstr "Box"
+
msgctxt "field:stock.picking.box.shipment.out.start,id:"
msgid "ID"
msgstr "ID"
@@ -112,15 +134,15 @@ msgstr "Albarà client"
msgctxt "model:ir.action,name:act_stock_picking_box_out"
msgid "Picking Boxes Out"
-msgstr "Boxes d'empaquetament sortida"
+msgstr "Boxes d'albarans de client"
msgctxt "model:ir.action,name:act_stock_picking_box_out_assign"
msgid "Picking Boxes Out Assign"
-msgstr "Assignació box empaqueta sortida"
+msgstr "Assigna box d'albarans de client"
msgctxt "model:ir.action,name:act_stock_picking_box_shipment_out"
msgid "Stock Picking Box Out"
-msgstr "Box empaqueta sortida"
+msgstr "Box albarans de client"
msgctxt ""
"model:ir.action.act_window.domain,name:act_stock_picking_box_out_assign_all"
@@ -147,35 +169,43 @@ msgstr "Boxes d'empaquetament"
msgctxt "model:ir.ui.menu,name:menu_stock_picking_box_out"
msgid "Picking Box Out"
-msgstr "Box empaqueta sortida"
+msgstr "Box albarans de client"
msgctxt "model:ir.ui.menu,name:menu_stock_picking_box_out_assign"
msgid "Picking Box Out"
-msgstr "Box empaqueta sortida"
+msgstr "Box albarans de client"
msgctxt "model:ir.ui.menu,name:menu_stock_picking_box_shipment_out"
msgid "Picking Box Out"
-msgstr "Box empaqueta sortida"
+msgstr "Box albarans de client"
msgctxt "model:stock.picking.box.out,name:"
msgid "Stock Picking Box Out"
-msgstr "Box empaqueta sortida"
+msgstr "Box albarans de client"
msgctxt "model:stock.picking.box.out.assign,name:"
msgid "Stock Picking Box Out Assign"
-msgstr "Assignació box empaqueta sortida"
+msgstr "Assignar box albarans de client"
msgctxt "model:stock.picking.box.shipment.out.result,name:"
msgid "Shipment Picking Box Shipment Out Result"
-msgstr "Resultat box empaquetament albarà sortida"
+msgstr "Resultat box albarà de client"
msgctxt "model:stock.picking.box.shipment.out.start,name:"
msgid "Shipment Picking Box Shipment Out Start"
-msgstr "Inici box empaquetament albarà sortida"
+msgstr "Assignació box albarà de client"
+
+msgctxt "selection:stock.picking.box.out,type:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "selection:stock.picking.box.out,type:"
+msgid "Picking"
+msgstr "Empaquetament"
msgctxt "selection:stock.picking.box.out.assign,state:"
msgid "Done"
-msgstr "Finalitzat"
+msgstr "Finalitza"
msgctxt "selection:stock.picking.box.out.assign,state:"
msgid "Waiting"
@@ -191,11 +221,11 @@ msgstr "General"
msgctxt "view:stock.picking.box.out.assign:"
msgid "Picking Box Out Assign"
-msgstr "Assigna box empaqueta sortida"
+msgstr "Assigna box albarà de client"
msgctxt "view:stock.picking.box.out.assign:"
msgid "Picking Boxes Out Assign"
-msgstr "Assigna box empaqueta sortida"
+msgstr "Assignació box d'albarans de client"
msgctxt "view:stock.picking.box.out.assign:"
msgid "Waiting"
@@ -203,15 +233,15 @@ msgstr "En espera"
msgctxt "view:stock.picking.box.out:"
msgid "Picking Box Out"
-msgstr "Box empaqueta sortida"
+msgstr "Box albarans de client"
msgctxt "view:stock.picking.box.out:"
msgid "Picking Boxes Out"
-msgstr "Boxes d'empaquetament sortida"
+msgstr "Boxes d'albarans de client"
msgctxt "view:stock.picking.box.shipment.out.result:"
msgid "Picking Box Shipment Out Result"
-msgstr "Resultat box empaquetament sortida"
+msgstr "Resultat box albarà de client"
msgctxt "view:stock.picking.box.shipment.out.result:"
msgid "Successfully shipment assigned. Leave the shipment on the box"
@@ -219,7 +249,7 @@ msgstr "S'ha assignat l'albarà. Deixi l'albarà en el box."
msgctxt "view:stock.picking.box.shipment.out.start:"
msgid "Picking Box Shipment Out Start"
-msgstr "Inici box empaquetament sortida"
+msgstr "Assignació box albarà de client"
msgctxt "wizard_button:stock.picking.box.shipment.out,picking,assign:"
msgid "Assign"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 1f8f9e9..a63757f 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -1,14 +1,26 @@
-#
+#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+msgctxt "error:stock.picking.box.out.assign:"
+msgid ""
+"Shipment \"%(shipment)s\" can not assign in box \"%(box)s\" because there is"
+" another shipment assigned. Please select a new box."
+msgstr ""
+"El albarán \"%(shipment)s\" no se puede asignar en el box \"%(box)s\" porque"
+" existe otro albarán ya asignado. Selecciona un nuevo box."
+
+msgctxt "error:stock.picking.box.out.assign:"
+msgid "Shipment \"%(shipment)s\" is available in box \"%(box)s\"."
+msgstr "El albarán \"%(shipment)s\" ya se encuentra en el box \"%(box)s\"."
+
msgctxt "error:stock.picking.box.shipment.out:"
msgid ""
-"Shipment\"%(shipment)s\" could not assign any box. Please try again or wait "
-"to available new box."
+"Shipment \"%(shipment)s\" could not assign any box. Please try again or wait"
+" to available new box."
msgstr ""
-"El albarán \"%(shipment)s\" no se ha podido asignar a ningún box. Vuelve a "
-"probarlo o espere que esté disponible un box."
+"El albarán \"%(shipment)s\" no se puede asignar en ningún box. Intente más "
+"tarde o espere que se libre un box."
msgctxt "field:stock.picking.box.out,active:"
msgid "Active"
@@ -26,6 +38,10 @@ msgctxt "field:stock.picking.box.out,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:stock.picking.box.out,location:"
+msgid "Location"
+msgstr "Ubicación"
+
msgctxt "field:stock.picking.box.out,name:"
msgid "Name"
msgstr "Nombre"
@@ -38,6 +54,10 @@ msgctxt "field:stock.picking.box.out,sequence:"
msgid "Sequence"
msgstr "Secuencia"
+msgctxt "field:stock.picking.box.out,type:"
+msgid "Type"
+msgstr "Tipo"
+
msgctxt "field:stock.picking.box.out,warehouse:"
msgid "Warehouse"
msgstr "Almacén"
@@ -102,6 +122,10 @@ msgctxt "field:stock.picking.box.shipment.out.result,shipment:"
msgid "Shipment"
msgstr "Albarán cliente"
+msgctxt "field:stock.picking.box.shipment.out.start,box:"
+msgid "Box"
+msgstr "Box"
+
msgctxt "field:stock.picking.box.shipment.out.start,id:"
msgid "ID"
msgstr "ID"
@@ -112,15 +136,15 @@ msgstr "Albarán cliente"
msgctxt "model:ir.action,name:act_stock_picking_box_out"
msgid "Picking Boxes Out"
-msgstr "Boxes de empaquetamiento salida"
+msgstr "Boxes de albaranes de cliente"
msgctxt "model:ir.action,name:act_stock_picking_box_out_assign"
msgid "Picking Boxes Out Assign"
-msgstr "Asignación boxes de empaquetamiento salida"
+msgstr "Asignar boxes de albaranes cliente"
msgctxt "model:ir.action,name:act_stock_picking_box_shipment_out"
msgid "Stock Picking Box Out"
-msgstr "Box empaquetar salida"
+msgstr "Box albaranes cliente"
msgctxt ""
"model:ir.action.act_window.domain,name:act_stock_picking_box_out_assign_all"
@@ -147,35 +171,43 @@ msgstr "Boxes de empaquetamiento"
msgctxt "model:ir.ui.menu,name:menu_stock_picking_box_out"
msgid "Picking Box Out"
-msgstr "Box empaquetar salida"
+msgstr "Box albaranes de cliente"
msgctxt "model:ir.ui.menu,name:menu_stock_picking_box_out_assign"
msgid "Picking Box Out"
-msgstr "Box empaquetar salida"
+msgstr "Box albaranes de cliente"
msgctxt "model:ir.ui.menu,name:menu_stock_picking_box_shipment_out"
msgid "Picking Box Out"
-msgstr "Box empaquetar salida"
+msgstr "Box albaranes de cliente"
msgctxt "model:stock.picking.box.out,name:"
msgid "Stock Picking Box Out"
-msgstr "Box empaquetar salida"
+msgstr "Box albaranes cliente"
msgctxt "model:stock.picking.box.out.assign,name:"
msgid "Stock Picking Box Out Assign"
-msgstr "Asignación box empaquetar salida"
+msgstr "Asignar box albaranes cliente"
msgctxt "model:stock.picking.box.shipment.out.result,name:"
msgid "Shipment Picking Box Shipment Out Result"
-msgstr "Resultado box empaquetamiento albaranes de salida"
+msgstr "Resultado box albarán de salida"
msgctxt "model:stock.picking.box.shipment.out.start,name:"
msgid "Shipment Picking Box Shipment Out Start"
-msgstr "Inicio box empaquetamiento albaranes de salida"
+msgstr "Assignación box albarán de salida"
+
+msgctxt "selection:stock.picking.box.out,type:"
+msgid "Fixed"
+msgstr "Fijo"
+
+msgctxt "selection:stock.picking.box.out,type:"
+msgid "Picking"
+msgstr "Empaquetar"
msgctxt "selection:stock.picking.box.out.assign,state:"
msgid "Done"
-msgstr "Realizado"
+msgstr "Realizar"
msgctxt "selection:stock.picking.box.out.assign,state:"
msgid "Waiting"
@@ -191,11 +223,11 @@ msgstr "General"
msgctxt "view:stock.picking.box.out.assign:"
msgid "Picking Box Out Assign"
-msgstr "Asignación box empaquetar salida"
+msgstr "Asignación box albaranes de salida"
msgctxt "view:stock.picking.box.out.assign:"
msgid "Picking Boxes Out Assign"
-msgstr "Asignación boxes de empaquetamiento salida"
+msgstr "Asignación boxes de albaranes cliente"
msgctxt "view:stock.picking.box.out.assign:"
msgid "Waiting"
@@ -203,15 +235,15 @@ msgstr "En espera"
msgctxt "view:stock.picking.box.out:"
msgid "Picking Box Out"
-msgstr "Box empaquetar salida"
+msgstr "Box albaranes de cliente"
msgctxt "view:stock.picking.box.out:"
msgid "Picking Boxes Out"
-msgstr "Boxes de empaquetamiento salida"
+msgstr "Boxes de albaranes de cliente"
msgctxt "view:stock.picking.box.shipment.out.result:"
msgid "Picking Box Shipment Out Result"
-msgstr "Resultado box empaquetamiento salida"
+msgstr "Resultado box box albarán de salida"
msgctxt "view:stock.picking.box.shipment.out.result:"
msgid "Successfully shipment assigned. Leave the shipment on the box"
@@ -219,7 +251,7 @@ msgstr "Se ha asignado el albarán. Deje el albarán en el box."
msgctxt "view:stock.picking.box.shipment.out.start:"
msgid "Picking Box Shipment Out Start"
-msgstr "Inicio box empaquetamiento salida"
+msgstr "Assignación box albarán de salida"
msgctxt "wizard_button:stock.picking.box.shipment.out,picking,assign:"
msgid "Assign"
diff --git a/stock_picking_box.py b/stock_picking_box.py
index f8b5c71..b2ad52a 100644
--- a/stock_picking_box.py
+++ b/stock_picking_box.py
@@ -3,7 +3,7 @@
#the full copyright notices and license terms.
from trytond.model import ModelView, ModelSQL, fields
from trytond.wizard import Wizard, StateTransition, StateView, Button
-from trytond.pool import Pool, PoolMeta
+from trytond.pool import Pool
from trytond.pyson import Eval, Equal, Not
from trytond.transaction import Transaction
import logging
@@ -21,8 +21,14 @@ class StockPickingBoxOut(ModelSQL, ModelView):
name = fields.Char('Name', required=True)
warehouse = fields.Many2One('stock.location', 'Warehouse',
domain=[('type', '=', 'warehouse')], required=True)
+ location = fields.Many2One('stock.location', 'Location',
+ domain=[('type', '=', 'storage')])
sequence = fields.Integer('Sequence')
active = fields.Boolean('Active', select=True)
+ type = fields.Selection([
+ ('fixed', 'Fixed'),
+ ('picking', 'Picking'),
+ ], 'Type')
@staticmethod
def default_sequence():
@@ -32,6 +38,10 @@ class StockPickingBoxOut(ModelSQL, ModelView):
def default_active():
return True
+ @staticmethod
+ def default_type():
+ return 'fixed'
+
class StockPickingBoxOutAssign(ModelSQL, ModelView):
'Stock Picking Box Out Assign'
@@ -56,6 +66,13 @@ class StockPickingBoxOutAssign(ModelSQL, ModelView):
@classmethod
def __setup__(cls):
super(StockPickingBoxOutAssign, cls).__setup__()
+ cls._error_messages.update({
+ 'not_box_available': 'Shipment "%(shipment)s" can not assign '
+ 'in box "%(box)s" because there is another shipment assigned. '
+ 'Please select a new box.',
+ 'not_reassign_shipment': 'Shipment "%(shipment)s" is available '
+ 'in box "%(box)s".',
+ })
cls._buttons.update({
'done': {
'invisible': Eval('state') == 'done',
@@ -88,26 +105,58 @@ class StockPickingBoxOutAssign(ModelSQL, ModelView):
})
@classmethod
- def assign(cls, shipment, attempts=0, total_attempts=5):
+ def assign(cls, shipment, box=None, attempts=0, total_attempts=5):
+ '''Assign a shipment in a box
+ 1. Reassign a shipment to other box
+ 2. Assign a shipment to new box
+ 3. Assign a shipment to new box (search a free box)'''
pool = Pool()
StockPickingBoxOut = pool.get('stock.picking.box.out')
User = pool.get('res.user')
+ # 1. Reassign a shipment to other box
+ assigned_boxes = cls.search([
+ ('shipment', '=', shipment),
+ ('state', '=', 'waiting'),
+ ])
+ if assigned_boxes:
+ assigned_box, = assigned_boxes
+ if box:
+ # assign shipment to new box
+ cls.write([assigned_box], {'box': box})
+ return box
+ cls.raise_user_error('not_reassign_shipment', {
+ 'shipment': shipment.rec_name,
+ 'box': assigned_box.box.rec_name,
+ })
+
+ # 2. Assign a shipment to new box
+ if box:
+ assigned = cls.search([
+ ('box', '=', box),
+ ('state', '=', 'waiting'),
+ ])
+ if assigned:
+ cls.raise_user_error('not_box_available', {
+ 'shipment': shipment.rec_name,
+ 'box': box.rec_name,
+ })
+ # assign shipment to box
+ cls.create([{
+ 'shipment': shipment,
+ 'box': box,
+ }])
+ return box
+
+ # 3. Assign a shipment to new box (search a free box)
transaction = Transaction()
user = User(transaction.user)
warehouse = None
+ locations = None
if hasattr(user, 'stock_warehouse'):
warehouse = user.stock_warehouse
-
- # check if shipment is assigned in a waiting box
- assigned = cls.search([
- ('shipment', '=', shipment),
- ('state', '=', 'waiting'),
- ])
- if assigned:
- return
-
+ locations = user.stock_locations
try:
# Locks transaction. Nobody can query this table
transaction.cursor.lock(cls._table)
@@ -124,13 +173,17 @@ class StockPickingBoxOutAssign(ModelSQL, ModelView):
domain = [('state', '=', 'waiting')]
if warehouse:
domain.append(('box.warehouse', '=', warehouse))
+ if locations:
+ domain.append(('box.location', 'in', locations))
boxes_assigned = cls.search(domain)
- domain = []
+ domain = [('type', '=', 'fixed')]
if boxes_assigned:
domain.append(('id', 'not in', [b.box.id for b in boxes_assigned]))
if warehouse:
domain.append(('warehouse', '=', warehouse))
+ if locations:
+ domain.append(('location', 'in', locations))
boxes = StockPickingBoxOut.search(domain, limit=1)
if not boxes:
@@ -149,6 +202,7 @@ class StockPickingBoxShipmentOutStart(ModelView):
'Shipment Picking Box Shipment Out Start'
__name__ = 'stock.picking.box.shipment.out.start'
shipment = fields.Many2One('stock.shipment.out', 'Shipment', required=True)
+ box = fields.Many2One('stock.picking.box.out', 'Box')
class StockPickingBoxShipmentOutResult(ModelView):
@@ -178,9 +232,9 @@ class StockPickingBoxShipmentOut(Wizard):
def __setup__(cls):
super(StockPickingBoxShipmentOut, cls).__setup__()
cls._error_messages.update({
- 'not_box': 'Shipment"%(shipment)s" could not assign any box. '
+ 'not_box': 'Shipment "%(shipment)s" could not assign any box. '
'Please try again or wait to available new box.',
- })
+ })
def transition_start(self):
return 'picking'
@@ -190,15 +244,16 @@ class StockPickingBoxShipmentOut(Wizard):
StockPickingBoxOutAssign = pool.get('stock.picking.box.out.assign')
shipment = self.picking.shipment
+ box = self.picking.box
- box = StockPickingBoxOutAssign.assign(shipment)
- if not box:
+ box_assigned = StockPickingBoxOutAssign.assign(shipment, box)
+ if not box_assigned:
self.raise_user_error('not_box', {
'shipment': shipment.rec_name,
})
self.result.shipment = shipment
- self.result.box = box
+ self.result.box = box_assigned
return 'result'
def default_result(self, fields):
diff --git a/view/stock_picking_box_out_assign_tree.xml b/view/stock_picking_box_out_assign_tree.xml
index 224190a..7fb218b 100644
--- a/view/stock_picking_box_out_assign_tree.xml
+++ b/view/stock_picking_box_out_assign_tree.xml
@@ -7,4 +7,6 @@ copyright notices and license terms. -->