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. --> +