[tryton-debian-vcs] tryton-modules-stock branch debian updated. debian/2.8.2-1-6-g037a0c8

git repository hosting tryton-debian-vcs at m9s.biz
Mon Nov 25 19:37:45 UTC 2013


The following commit has been merged in the debian branch:
http://debian.tryton.org/gitweb/?p=packages/tryton-modules-stock.git;a=commitdiff;h=debian/2.8.2-1-6-g037a0c8

commit 037a0c8e80a67bc426176f204d35a0ae6921e5e3
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Nov 25 20:30:34 2013 +0100

    Releasing debian version 3.0.0-1.

diff --git a/debian/changelog b/debian/changelog
index e108c09..3b3a88c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+tryton-modules-stock (3.0.0-1) unstable; urgency=low
+
+  * Removing inadvertently commited .pc directory.
+  * Merging upstream version 3.0.0.
+  * Updating to standards version 3.9.5, no changes needed.
+  * Changing to buildsystem pybuild.
+  * Adding python-sql to Depends.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Mon, 25 Nov 2013 17:55:21 +0100
+
 tryton-modules-stock (2.8.2-1) unstable; urgency=low
 
   * Adapting the rules file to work also with git-buildpackage.
commit 8d38f4d00bdff4f4e890de846519b32c1465a729
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Nov 25 17:48:45 2013 +0100

    Adding python-sql to Depends.

diff --git a/debian/control b/debian/control
index 39befc2..5879c91 100644
--- a/debian/control
+++ b/debian/control
@@ -18,7 +18,8 @@ Depends:
  tryton-modules-company (>= ${version:major}),
  tryton-modules-currency (>= ${version:major}),
  tryton-modules-party (>= ${version:major}),
- tryton-modules-product (>= ${version:major}), python-pkg-resources
+ tryton-modules-product (>= ${version:major}),
+ python-sql, python-pkg-resources
 Description: Tryton Application Platform (Stock Module)
  Tryton is a high-level general purpose application platform written in Python
  and using PostgreSQL as database engine. It is the core base of a complete
commit b7a42457cbe8a1262441bd151c011b74af98d084
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 19:51:52 2013 +0100

    Changing to buildsystem pybuild.

diff --git a/debian/control b/debian/control
index 19b1ac9..39befc2 100644
--- a/debian/control
+++ b/debian/control
@@ -3,7 +3,8 @@ Section: python
 Priority: optional
 Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
 Uploaders: Mathias Behrle <mathiasb at m9s.biz>
-Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
+Build-Depends:
+ debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools, dh-python
 Standards-Version: 3.9.5
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-stock.git
diff --git a/debian/rules b/debian/rules
index 30074ad..5b8c326 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,24 +1,17 @@
 #!/usr/bin/make -f
 
-MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
-PACKAGE_NAME := $(shell python setup.py --name)
-
-%:
-	dh ${@} --with python2
+# needed for pbuilder
+export LC_ALL=C.UTF-8
 
-override_dh_auto_clean:
-	dh_auto_clean
+MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
+PACKAGE_NAME := tryton-modules-$(shell python setup.py --name | sed s/^trytond_// | sed s/_/-/g)
+export PYBUILD_DESTDIR_python2=debian/${PACKAGE_NAME}
 
-override_dh_auto_build:
-	mv $(PACKAGE_NAME).egg-info $(PACKAGE_NAME).hen-info
-	mv PKG-INFO PKG-INFO.hen
-	dh_auto_build
+# Don't run tests for Tryton modules, they try to download dependencies from pypi
+export PYBUILD_DISABLE_python2.7=test
 
-override_dh_auto_install:
-	dh_auto_install
-	rm -rf *.egg-info
-	mv $(PACKAGE_NAME).hen-info $(PACKAGE_NAME).egg-info
-	mv PKG-INFO.hen PKG-INFO
+%:
+	dh ${@} --with python2 --buildsystem=pybuild
 
 override_dh_gencontrol:
 	dh_gencontrol -- -Vversion:major="$(MAJOR)"
commit c70c480363f3e462490acd06341e0a81d842de74
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 19:14:21 2013 +0100

    Updating to standards version 3.9.5, no changes needed.

diff --git a/debian/control b/debian/control
index 870017a..19b1ac9 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
 Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
 Uploaders: Mathias Behrle <mathiasb at m9s.biz>
 Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
-Standards-Version: 3.9.4
+Standards-Version: 3.9.5
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-stock.git
 Vcs-Git: git://debian.tryton.org/packages/tryton-modules-stock.git
commit 8a721e7292443e00c38963214235932d1440882b
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 17:28:22 2013 +0100

    Merging upstream version 3.0.0.

diff --git a/CHANGELOG b/CHANGELOG
index 733a200..9e73b97 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,8 +1,10 @@
-Version 2.8.2 - 2013-07-22
-* Bug fixes (see mercurial logs for details)
-
-Version 2.8.1 - 2013-06-09
+Version 3.0.0 - 2013-10-21
 * Bug fixes (see mercurial logs for details)
+* Add Mixin class with helper to setup stock quantity fields
+* Allow to customize move creation of Inventory
+* Allow to customize unique constraint on Inventory
+* Allow specific grouping Period Cache
+* Add grouping on products_by_location and assign_try
 
 Version 2.8.0 - 2013-04-22
 * Bug fixes (see mercurial logs for details)
diff --git a/INSTALL b/INSTALL
index 0f555d0..3902b76 100644
--- a/INSTALL
+++ b/INSTALL
@@ -6,6 +6,7 @@ Prerequisites
 
  * Python 2.6 or later (http://www.python.org/)
  * trytond (http://www.tryton.org/)
+ * python-sql (http://code.google.com/p/python-sql/)
  * trytond_party (http://www.tryton.org/)
  * trytond_product (http://www.tryton.org/)
  * trytond_company (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index d1026ee..dd79515 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond_stock
-Version: 2.8.2
+Version: 3.0.0
 Summary: Tryton module for stock and inventory
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.8/
+Download-URL: http://downloads.tryton.org/3.0/
 Description: trytond_stock
         =============
         
@@ -60,6 +60,7 @@ Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
 Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovenian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python :: 2.6
diff --git a/configuration.py b/configuration.py
index f2bd881..c62473b 100644
--- a/configuration.py
+++ b/configuration.py
@@ -12,30 +12,30 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
     shipment_in_sequence = fields.Property(fields.Many2One('ir.sequence',
             'Supplier Shipment Sequence', domain=[
                 ('company', 'in',
-                    [Get(Eval('context', {}), 'company'), None]),
+                    [Eval('context', {}).get('company', -1), None]),
                 ('code', '=', 'stock.shipment.in'),
                 ], required=True))
     shipment_in_return_sequence = fields.Property(fields.Many2One(
             'ir.sequence', 'Supplier Return Shipment Sequence', domain=[
                 ('company', 'in',
-                    [Get(Eval('context', {}), 'company'), None]),
+                    [Eval('context', {}).get('company', -1), None]),
                 ('code', '=', 'stock.shipment.in.return'),
                 ], required=True))
     shipment_out_sequence = fields.Property(fields.Many2One('ir.sequence',
             'Customer Shipment Sequence', domain=[
                 ('company', 'in',
-                    [Get(Eval('context', {}), 'company'), None]),
+                    [Eval('context', {}).get('company', -1), None]),
                 ('code', '=', 'stock.shipment.out'),
                 ], required=True))
     shipment_out_return_sequence = fields.Property(fields.Many2One(
             'ir.sequence', 'Customer Return Shipment Sequence', domain=[
                 ('company', 'in',
-                    [Get(Eval('context', {}), 'company'), None]),
+                    [Eval('context', {}).get('company', -1), None]),
                 ('code', '=', 'stock.shipment.out.return'),
                 ], required=True))
     shipment_internal_sequence = fields.Property(fields.Many2One(
             'ir.sequence', 'Internal Shipment Sequence', domain=[
                 ('company', 'in',
-                    [Get(Eval('context', {}), 'company'), None]),
+                    [Eval('context', {}).get('company', -1), None]),
                 ('code', '=', 'stock.shipment.internal'),
                 ], required=True))
diff --git a/customer_return_restocking_list.odt b/customer_return_restocking_list.odt
index 3c76dff..d9a9ff4 100644
Binary files a/customer_return_restocking_list.odt and b/customer_return_restocking_list.odt differ
diff --git a/delivery_note.odt b/delivery_note.odt
index 0c5dbff..0e83fb3 100644
Binary files a/delivery_note.odt and b/delivery_note.odt differ
diff --git a/internal_shipment.odt b/internal_shipment.odt
index 6ff9790..8eabf98 100644
Binary files a/internal_shipment.odt and b/internal_shipment.odt differ
diff --git a/inventory.py b/inventory.py
index 50bf3ef..b4c6218 100644
--- a/inventory.py
+++ b/inventory.py
@@ -2,7 +2,7 @@
 #of this repository contains the full copyright notices and license terms.
 from trytond.model import Workflow, ModelView, ModelSQL, fields
 from trytond.pyson import Not, Equal, Eval, Or, Bool
-from trytond.backend import TableHandler
+from trytond import backend
 from trytond.transaction import Transaction
 from trytond.pool import Pool
 
@@ -54,6 +54,8 @@ class Inventory(Workflow, ModelSQL, ModelView):
         cls._error_messages.update({
                 'delete_cancel': ('Inventory "%s" must be cancelled before '
                     'deletion.'),
+                'unique_line': ('Line "%s" is not unique '
+                    'on Inventory "%s".'),
                 })
         cls._transitions |= set((
                 ('draft', 'done'),
@@ -73,6 +75,7 @@ class Inventory(Workflow, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         super(Inventory, cls).__register__(module_name)
         cursor = Transaction().cursor
 
@@ -116,7 +119,13 @@ class Inventory(Workflow, ModelSQL, ModelView):
         Move = Pool().get('stock.move')
         move_ids = []
         for inventory in inventories:
+            keys = set()
             for line in inventory.lines:
+                key = line.unique_key
+                if key in keys:
+                    self.raise_user_error('unique_line',
+                        (line.rec_name, inventory.rec_name))
+                keys.add(key)
                 move_id = line.create_move()
                 if move_id:
                     move_ids.append(move_id)
@@ -164,6 +173,7 @@ class Inventory(Workflow, ModelSQL, ModelView):
         Line = pool.get('stock.inventory.line')
         Product = pool.get('product.product')
 
+        to_create = []
         for inventory in inventories:
             # Compute product quantities
             with Transaction().set_context(stock_date_end=inventory.date):
@@ -200,7 +210,6 @@ class Inventory(Workflow, ModelSQL, ModelView):
                     Line.write([line], values)
 
             # Create lines if needed
-            to_create = []
             for product_id in product_qty:
                 if (product2type[product_id] != 'goods'
                         or product2consumable[product_id]):
@@ -209,8 +218,8 @@ class Inventory(Workflow, ModelSQL, ModelView):
                 values = Line.create_values4complete(product_id, inventory,
                     quantity, uom_id)
                 to_create.append(values)
-            if to_create:
-                Line.create(to_create)
+        if to_create:
+            Line.create(to_create)
 
 
 class InventoryLine(ModelSQL, ModelView):
@@ -241,11 +250,20 @@ class InventoryLine(ModelSQL, ModelView):
         cls._sql_constraints += [
             ('check_line_qty_pos',
                 'CHECK(quantity >= 0.0)', 'Line quantity must be positive.'),
-            ('inventory_product_uniq', 'UNIQUE(inventory, product)',
-                'Product must be unique by inventory.'),
             ]
         cls._order.insert(0, ('product', 'ASC'))
 
+    @classmethod
+    def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
+        cursor = Transaction().cursor
+
+        super(InventoryLine, cls).__register__(module_name)
+
+        table = TableHandler(cursor, cls, module_name)
+        # Migration from 2.8: Remove constraint inventory_product_uniq
+        table.drop_constraint('inventory_product_uniq')
+
     @staticmethod
     def default_unit_digits():
         return 2
@@ -263,12 +281,19 @@ class InventoryLine(ModelSQL, ModelView):
             change['unit_digits'] = self.product.default_uom.digits
         return change
 
+    def get_rec_name(self, name):
+        return self.product.rec_name
+
     def get_uom(self, name):
         return self.product.default_uom.id
 
     def get_unit_digits(self, name):
         return self.product.default_uom.digits
 
+    @property
+    def unique_key(self):
+        return (self.product,)
+
     @classmethod
     def cancel_move(cls, lines):
         Move = Pool().get('stock.move')
@@ -278,9 +303,9 @@ class InventoryLine(ModelSQL, ModelView):
             'move': None,
             })
 
-    def create_move(self):
+    def _get_move(self):
         '''
-        Create move for an inventory line and return id
+        Return Move instance for the inventory line
         '''
         pool = Pool()
         Move = pool.get('stock.move')
@@ -291,24 +316,30 @@ class InventoryLine(ModelSQL, ModelView):
             self.uom)
         if delta_qty == 0.0:
             return
-        from_location = self.inventory.location.id
-        to_location = self.inventory.lost_found.id
+        from_location = self.inventory.location
+        to_location = self.inventory.lost_found
         if delta_qty < 0:
             (from_location, to_location, delta_qty) = \
                 (to_location, from_location, -delta_qty)
 
-        move, = Move.create([{
-                    'from_location': from_location,
-                    'to_location': to_location,
-                    'quantity': delta_qty,
-                    'product': self.product.id,
-                    'uom': self.uom.id,
-                    'company': self.inventory.company.id,
-                    'effective_date': self.inventory.date,
-                    }])
-        self.move = move
+        move = Move(
+            from_location=from_location,
+            to_location=to_location,
+            quantity=delta_qty,
+            product=self.product,
+            uom=self.uom,
+            company=self.inventory.company,
+            effective_date=self.inventory.date,
+            )
+        return move
+
+    def create_move(self):
+        '''
+        Create move for an inventory line and return id
+        '''
+        self.move = self._get_move()
         self.save()
-        return move.id
+        return self.move.id if self.move else None
 
     def update_values4complete(self, quantity, uom_id):
         '''
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index e17965d..1fe13bc 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -14,12 +14,12 @@ msgctxt "error:stock.inventory.line:"
 msgid "Line quantity must be positive."
 msgstr ""
 
-msgctxt "error:stock.inventory.line:"
-msgid "Product must be unique by inventory."
+msgctxt "error:stock.inventory:"
+msgid "Inventory \"%s\" must be cancelled before deletion."
 msgstr ""
 
 msgctxt "error:stock.inventory:"
-msgid "Inventory \"%s\" must be cancelled before deletion."
+msgid "Line \"%s\" is not unique on Inventory \"%s\"."
 msgstr ""
 
 msgctxt "error:stock.location:"
@@ -55,9 +55,13 @@ msgid "You can not modify move \"%(move)s\" because period \"%(period)s\" is clo
 msgstr ""
 
 msgctxt "error:stock.move:"
+msgid "You can not modify stock move \"%s\" because it is in \"Assigned\" state."
+msgstr ""
+
+msgctxt "error:stock.move:"
 msgid ""
-"You can not modify stock move \"%s\"because it is in \"Assigned\", \"Done\" "
-"or \"Cancel\" state."
+"You can not modify stock move \"%s\" because it is in \"Done\" or \"Cancel\""
+" state."
 msgstr ""
 
 msgctxt "error:stock.move:"
@@ -666,6 +670,10 @@ msgctxt "field:stock.shipment.in,moves:"
 msgid "Moves"
 msgstr "Движения"
 
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.in,planned_date:"
 msgid "Planned Date"
 msgstr "Планирана дата"
@@ -742,6 +750,10 @@ msgctxt "field:stock.shipment.in.return,moves:"
 msgid "Moves"
 msgstr "Движения"
 
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.in.return,planned_date:"
 msgid "Planned Date"
 msgstr "Планирана дата"
@@ -890,6 +902,10 @@ msgctxt "field:stock.shipment.out,moves:"
 msgid "Moves"
 msgstr "Движения"
 
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.out,outgoing_moves:"
 msgid "Outgoing Moves"
 msgstr "Изходящи движения"
@@ -986,6 +1002,10 @@ msgctxt "field:stock.shipment.out.return,moves:"
 msgid "Moves"
 msgstr "Движения"
 
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.out.return,planned_date:"
 msgid "Planned Date"
 msgstr "Планирана дата"
@@ -1735,10 +1755,20 @@ msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "/"
 msgstr "/"
 
+#, fuzzy
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Code:"
 msgstr "Код:"
 
+#, fuzzy
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Клиент"
+
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "E-Mail:"
 msgstr "E-Mail:"
@@ -1772,10 +1802,6 @@ msgid "Restocking List"
 msgstr "Списък за увеличаване наличност на продукт"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Supplier:"
-msgstr "Доставчик:"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "To Location"
 msgstr "Към местонахождение"
 
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index e0f76b3..856c644 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -14,13 +14,13 @@ msgctxt "error:stock.inventory.line:"
 msgid "Line quantity must be positive."
 msgstr "La quantitat de la línia ha de ser positiva."
 
-msgctxt "error:stock.inventory.line:"
-msgid "Product must be unique by inventory."
-msgstr "El producte ha de ser únic per inventari."
-
 msgctxt "error:stock.inventory:"
 msgid "Inventory \"%s\" must be cancelled before deletion."
-msgstr "Heu de cancel·lar l'inventari \"%s\" abans de ser eliminat."
+msgstr "Cal cancel·lar l'inventari \"%s\" abans d'eliminar-lo."
+
+msgctxt "error:stock.inventory:"
+msgid "Line \"%s\" is not unique on Inventory \"%s\"."
+msgstr "La línia \"%s\" no és única en l'inventari \"%s\"."
 
 msgctxt "error:stock.location:"
 msgid "Location \"%(location)s\" must be a child of warehouse \"%(warehouse)s\"."
@@ -63,12 +63,18 @@ msgstr ""
 "\"%(period)s\" està tancat."
 
 msgctxt "error:stock.move:"
+msgid "You can not modify stock move \"%s\" because it is in \"Assigned\" state."
+msgstr ""
+"No podeu canviar el moviment d'estoc \"%s\" perquè es troba en l'estat "
+"\"Assignat\"."
+
+msgctxt "error:stock.move:"
 msgid ""
-"You can not modify stock move \"%s\"because it is in \"Assigned\", \"Done\" "
-"or \"Cancel\" state."
+"You can not modify stock move \"%s\" because it is in \"Done\" or \"Cancel\""
+" state."
 msgstr ""
-"No podeu modificar el moviment d'estoc \"%s\" perquè està en estat "
-"\"Assignat\", \"Realitzat\" o \"Cancel·lat\"."
+"No podeu canviar el moviment d'estoc \"%s\" perquè es troba en l'estat "
+"\"Realitzat\" o \"Cancel·lat\"."
 
 msgctxt "error:stock.move:"
 msgid "You can not set stock move \"%s\" to assigned state."
@@ -673,6 +679,10 @@ msgctxt "field:stock.shipment.in,moves:"
 msgid "Moves"
 msgstr "Moviments"
 
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Orígens"
+
 msgctxt "field:stock.shipment.in,planned_date:"
 msgid "Planned Date"
 msgstr "Data estimada"
@@ -749,6 +759,10 @@ msgctxt "field:stock.shipment.in.return,moves:"
 msgid "Moves"
 msgstr "Moviments"
 
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Orígens"
+
 msgctxt "field:stock.shipment.in.return,planned_date:"
 msgid "Planned Date"
 msgstr "Data estimada"
@@ -897,6 +911,10 @@ msgctxt "field:stock.shipment.out,moves:"
 msgid "Moves"
 msgstr "Moviments"
 
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Orígens"
+
 msgctxt "field:stock.shipment.out,outgoing_moves:"
 msgid "Outgoing Moves"
 msgstr "Moviments de sortida"
@@ -993,6 +1011,10 @@ msgctxt "field:stock.shipment.out.return,moves:"
 msgid "Moves"
 msgstr "Moviments"
 
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Orígens"
+
 msgctxt "field:stock.shipment.out.return,planned_date:"
 msgid "Planned Date"
 msgstr "Data estimada"
@@ -1723,10 +1745,18 @@ msgid "/"
 msgstr "/"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Code:"
 msgstr "Codi:"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "E-Mail:"
 msgstr "Correu electrònic:"
 
@@ -1759,10 +1789,6 @@ msgid "Restocking List"
 msgstr "Llista de renovació d'existències"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Supplier:"
-msgstr "Proveïdor:"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "To Location"
 msgstr "A la ubicació"
 
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index fce392e..4e74862 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -12,12 +12,12 @@ msgctxt "error:stock.inventory.line:"
 msgid "Line quantity must be positive."
 msgstr ""
 
-msgctxt "error:stock.inventory.line:"
-msgid "Product must be unique by inventory."
+msgctxt "error:stock.inventory:"
+msgid "Inventory \"%s\" must be cancelled before deletion."
 msgstr ""
 
 msgctxt "error:stock.inventory:"
-msgid "Inventory \"%s\" must be cancelled before deletion."
+msgid "Line \"%s\" is not unique on Inventory \"%s\"."
 msgstr ""
 
 msgctxt "error:stock.location:"
@@ -53,9 +53,13 @@ msgid "You can not modify move \"%(move)s\" because period \"%(period)s\" is clo
 msgstr ""
 
 msgctxt "error:stock.move:"
+msgid "You can not modify stock move \"%s\" because it is in \"Assigned\" state."
+msgstr ""
+
+msgctxt "error:stock.move:"
 msgid ""
-"You can not modify stock move \"%s\"because it is in \"Assigned\", \"Done\" "
-"or \"Cancel\" state."
+"You can not modify stock move \"%s\" because it is in \"Done\" or \"Cancel\""
+" state."
 msgstr ""
 
 msgctxt "error:stock.move:"
@@ -653,6 +657,10 @@ msgctxt "field:stock.shipment.in,moves:"
 msgid "Moves"
 msgstr ""
 
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.in,planned_date:"
 msgid "Planned Date"
 msgstr ""
@@ -729,6 +737,10 @@ msgctxt "field:stock.shipment.in.return,moves:"
 msgid "Moves"
 msgstr ""
 
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.in.return,planned_date:"
 msgid "Planned Date"
 msgstr ""
@@ -877,6 +889,10 @@ msgctxt "field:stock.shipment.out,moves:"
 msgid "Moves"
 msgstr ""
 
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.out,outgoing_moves:"
 msgid "Outgoing Moves"
 msgstr ""
@@ -973,6 +989,10 @@ msgctxt "field:stock.shipment.out.return,moves:"
 msgid "Moves"
 msgstr ""
 
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.out.return,planned_date:"
 msgid "Planned Date"
 msgstr ""
@@ -1695,10 +1715,18 @@ msgid "/"
 msgstr ""
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ""
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Code:"
 msgstr ""
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "E-Mail:"
 msgstr ""
 
@@ -1731,10 +1759,6 @@ msgid "Restocking List"
 msgstr ""
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Supplier:"
-msgstr ""
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "To Location"
 msgstr ""
 
diff --git a/locale/de_DE.po b/locale/de_DE.po
index c838d1c..1ddfd41 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -14,16 +14,16 @@ msgctxt "error:stock.inventory.line:"
 msgid "Line quantity must be positive."
 msgstr "Anzahl auf der Zeile muss einen positiven Wert aufweisen."
 
-msgctxt "error:stock.inventory.line:"
-msgid "Product must be unique by inventory."
-msgstr "Ein Artikel kann nur einmal pro Bestandsänderung eingetragen werden."
-
 msgctxt "error:stock.inventory:"
 msgid "Inventory \"%s\" must be cancelled before deletion."
 msgstr ""
 "Bestandsänderung \"%s\" muss annulliert werden, bevor sie gelöscht werden "
 "kann."
 
+msgctxt "error:stock.inventory:"
+msgid "Line \"%s\" is not unique on Inventory \"%s\"."
+msgstr "Zeile \"%s\" kann nur einmal für Lagerbestand \"%s\" vergeben werden."
+
 msgctxt "error:stock.location:"
 msgid "Location \"%(location)s\" must be a child of warehouse \"%(warehouse)s\"."
 msgstr ""
@@ -65,12 +65,18 @@ msgstr ""
 "\"%(period)s\" geschlossen ist."
 
 msgctxt "error:stock.move:"
+msgid "You can not modify stock move \"%s\" because it is in \"Assigned\" state."
+msgstr ""
+"Eine Lagerbewegung in Status \"Zugewiesen\" (\"%s\") kann nicht verändert "
+"werden."
+
+msgctxt "error:stock.move:"
 msgid ""
-"You can not modify stock move \"%s\"because it is in \"Assigned\", \"Done\" "
-"or \"Cancel\" state."
+"You can not modify stock move \"%s\" because it is in \"Done\" or \"Cancel\""
+" state."
 msgstr ""
-"Änderung von Lagerbewegung \"%s\" nicht möglich, weil sie in Status "
-"\"Zugewiesen\", \"Erledigt\" oder \"Annulliert\" ist."
+"Lagerbegungen mit Status \"Erledigt\" oder \"Annulliert\" (\"%s\") können "
+"nicht verändert werden."
 
 msgctxt "error:stock.move:"
 msgid "You can not set stock move \"%s\" to assigned state."
@@ -455,7 +461,7 @@ msgstr "ID"
 
 msgctxt "field:stock.move,internal_quantity:"
 msgid "Internal Quantity"
-msgstr "Anzahl Intern"
+msgstr "Interne Anzahl"
 
 msgctxt "field:stock.move,origin:"
 msgid "Origin"
@@ -571,7 +577,7 @@ msgstr "ID"
 
 msgctxt "field:stock.period.cache,internal_quantity:"
 msgid "Internal Quantity"
-msgstr "Anzahl Intern"
+msgstr "Interne Anzahl"
 
 msgctxt "field:stock.period.cache,location:"
 msgid "Location"
@@ -685,6 +691,10 @@ msgctxt "field:stock.shipment.in,moves:"
 msgid "Moves"
 msgstr "Bewegungen"
 
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Herkünfte"
+
 msgctxt "field:stock.shipment.in,planned_date:"
 msgid "Planned Date"
 msgstr "Geplantes Datum"
@@ -761,6 +771,10 @@ msgctxt "field:stock.shipment.in.return,moves:"
 msgid "Moves"
 msgstr "Bewegungen"
 
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Herkünfte"
+
 msgctxt "field:stock.shipment.in.return,planned_date:"
 msgid "Planned Date"
 msgstr "Geplantes Datum"
@@ -909,6 +923,10 @@ msgctxt "field:stock.shipment.out,moves:"
 msgid "Moves"
 msgstr "Bewegungen"
 
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Herkünfte"
+
 msgctxt "field:stock.shipment.out,outgoing_moves:"
 msgid "Outgoing Moves"
 msgstr "Ausgehende Bewegungen"
@@ -1005,6 +1023,10 @@ msgctxt "field:stock.shipment.out.return,moves:"
 msgid "Moves"
 msgstr "Bewegungen"
 
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Herkünfte"
+
 msgctxt "field:stock.shipment.out.return,planned_date:"
 msgid "Planned Date"
 msgstr "Geplantes Datum"
@@ -1362,7 +1384,7 @@ msgstr "Lagerorte"
 
 msgctxt "model:ir.ui.menu,name:menu_move_form"
 msgid "Moves"
-msgstr "Bewegungen"
+msgstr "Lagerbewegungen"
 
 msgctxt "model:ir.ui.menu,name:menu_period_list"
 msgid "Periods"
@@ -1733,10 +1755,18 @@ msgid "/"
 msgstr "/"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Code:"
 msgstr "Code:"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Kunde"
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "E-Mail:"
 msgstr "E-Mail:"
 
@@ -1769,10 +1799,6 @@ msgid "Restocking List"
 msgstr "Einlagerungsliste"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Supplier:"
-msgstr "Lieferant:"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "To Location"
 msgstr "Zu Lagerort"
 
@@ -2010,7 +2036,7 @@ msgstr "Bewegung"
 
 msgctxt "view:stock.move:"
 msgid "Moves"
-msgstr "Bewegungen"
+msgstr "Lagerbewegungen"
 
 msgctxt "view:stock.period.cache:"
 msgid "Period Cache"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index c2dbd39..d3b2834 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -14,14 +14,14 @@ msgctxt "error:stock.inventory.line:"
 msgid "Line quantity must be positive."
 msgstr "La cantidad de la línea debe ser positiva."
 
-msgctxt "error:stock.inventory.line:"
-msgid "Product must be unique by inventory."
-msgstr "El producto debe ser único por inventario."
-
 msgctxt "error:stock.inventory:"
 msgid "Inventory \"%s\" must be cancelled before deletion."
 msgstr "Debe cancelar el inventario «%s» antes de eliminar."
 
+msgctxt "error:stock.inventory:"
+msgid "Line \"%s\" is not unique on Inventory \"%s\"."
+msgstr "La línea «%s» no es única en el inventario «%s»."
+
 msgctxt "error:stock.location:"
 msgid "Location \"%(location)s\" must be a child of warehouse \"%(warehouse)s\"."
 msgstr ""
@@ -63,12 +63,18 @@ msgstr ""
 "está cerrado."
 
 msgctxt "error:stock.move:"
+msgid "You can not modify stock move \"%s\" because it is in \"Assigned\" state."
+msgstr ""
+"No puede modificar el movimiento de stock «%s» porque se encuentra en estado"
+" «Asignado»."
+
+msgctxt "error:stock.move:"
 msgid ""
-"You can not modify stock move \"%s\"because it is in \"Assigned\", \"Done\" "
-"or \"Cancel\" state."
+"You can not modify stock move \"%s\" because it is in \"Done\" or \"Cancel\""
+" state."
 msgstr ""
-"No puede modificar el movimiento de stock «%s» porque está en estado "
-"«Asignado», «Realizado» o «Cancelado»."
+"No puede modificar el movimiento de stock «%s» porque se encuentra en estado"
+" «Realizado» o «Cancelado»."
 
 msgctxt "error:stock.move:"
 msgid "You can not set stock move \"%s\" to assigned state."
@@ -94,7 +100,7 @@ msgstr ""
 msgctxt "error:stock.shipment.in.return:"
 msgid "Supplier Return Shipment \"%s\" must be cancelled before deletion."
 msgstr ""
-"Debe cancelar el envío de devolución a proveedor «%s» antes de eliminar."
+"Debe cancelar el Remito de devolución a proveedor «%s» antes de eliminar."
 
 msgctxt "error:stock.shipment.in:"
 msgid ""
@@ -113,28 +119,28 @@ msgstr ""
 
 msgctxt "error:stock.shipment.in:"
 msgid "Supplier Shipment \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar el envío de proveedor «%s» antes de eliminar."
+msgstr "Debe cancelar el Remito de proveedor «%s» antes de eliminar."
 
 msgctxt "error:stock.shipment.internal:"
 msgid "Internal Shipment \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar el envío interno «%s» antes de eliminar."
+msgstr "Debe cancelar el Remito interno «%s» antes de eliminar."
 
 msgctxt "error:stock.shipment.out.return.create:"
 msgid "The shipment with code \"%s\" is not yet sent."
-msgstr "El envío con código «%s» todavía no se ha enviado."
+msgstr "El remito con código «%s» todavía no se ha enviado."
 
 msgctxt "error:stock.shipment.out.return.create:"
 msgid "You can not create return shipment"
-msgstr "No puede crear paquetes de retorno"
+msgstr "No puede crear remito de devolución"
 
 msgctxt "error:stock.shipment.out.return:"
 msgid "Customer Return Shipment \"%s\" must be cancelled before deletion."
 msgstr ""
-"Debe cancelar el envío de devolución de cliente «%s» antes de eliminar."
+"Debe cancelar el Remito de devolución de cliente «%s» antes de eliminar."
 
 msgctxt "error:stock.shipment.out:"
 msgid "Customer Shipment \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar el envío de cliente «%s» antes de eliminar."
+msgstr "Debe cancelar el Remito de cliente «%s» antes de eliminar."
 
 msgctxt "field:party.address,delivery:"
 msgid "Delivery"
@@ -198,23 +204,23 @@ msgstr "Nombre"
 
 msgctxt "field:stock.configuration,shipment_in_return_sequence:"
 msgid "Supplier Return Shipment Sequence"
-msgstr "Secuencia de envío de devolución a proveedor"
+msgstr "Secuencia de Remito de devolución a proveedor"
 
 msgctxt "field:stock.configuration,shipment_in_sequence:"
 msgid "Supplier Shipment Sequence"
-msgstr "Secuencia de envío de proveedor"
+msgstr "Secuencia de Remito de proveedor"
 
 msgctxt "field:stock.configuration,shipment_internal_sequence:"
 msgid "Internal Shipment Sequence"
-msgstr "Secuencia de envío interno"
+msgstr "Secuencia de Remito interno"
 
 msgctxt "field:stock.configuration,shipment_out_return_sequence:"
 msgid "Customer Return Shipment Sequence"
-msgstr "Secuencia de envío de devolución de cliente"
+msgstr "Secuencia de Remito de devolución de cliente"
 
 msgctxt "field:stock.configuration,shipment_out_sequence:"
 msgid "Customer Shipment Sequence"
-msgstr "Secuencia de envío a cliente"
+msgstr "Secuencia de Remito a cliente"
 
 msgctxt "field:stock.configuration,write_date:"
 msgid "Write Date"
@@ -426,7 +432,7 @@ msgstr "Usuario creación"
 
 msgctxt "field:stock.move,currency:"
 msgid "Currency"
-msgstr "Divisa"
+msgstr "Moneda"
 
 msgctxt "field:stock.move,effective_date:"
 msgid "Effective Date"
@@ -470,7 +476,7 @@ msgstr "Nombre"
 
 msgctxt "field:stock.move,shipment:"
 msgid "Shipment"
-msgstr "Envío"
+msgstr "Remito"
 
 msgctxt "field:stock.move,state:"
 msgid "State"
@@ -672,6 +678,10 @@ msgctxt "field:stock.shipment.in,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Origen"
+
 msgctxt "field:stock.shipment.in,planned_date:"
 msgid "Planned Date"
 msgstr "Fecha estimada"
@@ -748,6 +758,10 @@ msgctxt "field:stock.shipment.in.return,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Origen"
+
 msgctxt "field:stock.shipment.in.return,planned_date:"
 msgid "Planned Date"
 msgstr "Fecha estimada"
@@ -896,6 +910,10 @@ msgctxt "field:stock.shipment.out,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Origen"
+
 msgctxt "field:stock.shipment.out,outgoing_moves:"
 msgid "Outgoing Moves"
 msgstr "Movimientos de salida"
@@ -992,6 +1010,10 @@ msgctxt "field:stock.shipment.out.return,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Origen"
+
 msgctxt "field:stock.shipment.out.return,planned_date:"
 msgid "Planned Date"
 msgstr "Fecha estimada"
@@ -1093,31 +1115,31 @@ msgstr "Productos"
 
 msgctxt "model:ir.action,name:act_shipment_in_form"
 msgid "Supplier Shipments"
-msgstr "Envíos de proveedor"
+msgstr "Remitos de proveedor"
 
 msgctxt "model:ir.action,name:act_shipment_in_return_form"
 msgid "Supplier Return Shipments"
-msgstr "Envíos de devolución a proveedor"
+msgstr "Remitos de devolución a proveedor"
 
 msgctxt "model:ir.action,name:act_shipment_internal_form"
 msgid "Internal Shipments"
-msgstr "Envíos internos"
+msgstr "Remitos internos"
 
 msgctxt "model:ir.action,name:act_shipment_out_form"
 msgid "Customer Shipments"
-msgstr "Envíos a cliente"
+msgstr "Remitos a cliente"
 
 msgctxt "model:ir.action,name:act_shipment_out_form2"
 msgid "Customer Shipments"
-msgstr "Envíos a cliente"
+msgstr "Remitos a cliente"
 
 msgctxt "model:ir.action,name:act_shipment_out_form3"
 msgid "Supplier Shipments"
-msgstr "Envíos de proveedor"
+msgstr "Remitos de proveedor"
 
 msgctxt "model:ir.action,name:act_shipment_out_return_form"
 msgid "Customer Return Shipments"
-msgstr "Envíos de devoluciones de cliente"
+msgstr "Remitos de devolución de cliente"
 
 msgctxt "model:ir.action,name:act_stock_configuration_form"
 msgid "Stock Configuration"
@@ -1125,7 +1147,7 @@ msgstr "Configuración de stock"
 
 msgctxt "model:ir.action,name:create_shipment_out_return"
 msgid "Create Return Shipment"
-msgstr "Crear envío de devolución"
+msgstr "Crear Remito de devolución"
 
 msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
 msgid "Restocking List"
@@ -1133,7 +1155,7 @@ msgstr "Lista reabastecimiento"
 
 msgctxt "model:ir.action,name:report_shipment_internal"
 msgid "Internal Shipment"
-msgstr "Envío interno"
+msgstr "Remito interno"
 
 msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
 msgid "Delivery Note"
@@ -1161,15 +1183,15 @@ msgstr "Productos por ubicaciones"
 
 msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
 msgid "Assign Purchase Return Shipment"
-msgstr "Asignar envío de devolución de compra"
+msgstr "Asignar Remito de devolución de compra"
 
 msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
 msgid "Assign Shipment Internal"
-msgstr "Asignar envío interno"
+msgstr "Asignar Remito interno"
 
 msgctxt "model:ir.action,name:wizard_shipment_out_assign"
 msgid "Assign Shipment Out"
-msgstr "Asignación de envío de salida"
+msgstr "Asignación de Remito de salida"
 
 msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
 msgid "All"
@@ -1296,43 +1318,43 @@ msgstr "Recibido"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_in"
 msgid "Supplier Shipment"
-msgstr "Envío de proveedor"
+msgstr "Remito de proveedor"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
 msgid "Supplier Return Shipment"
-msgstr "Envío de devolución a proveedor"
+msgstr "Remito de devolución a proveedor"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_internal"
 msgid "Internal Shipment"
-msgstr "Envío interno"
+msgstr "Remito interno"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_out"
 msgid "Customer Shipment"
-msgstr "Envío a cliente"
+msgstr "Remito a cliente"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
 msgid "Customer Return Shipment"
-msgstr "Envío de devolución de cliente"
+msgstr "Remito de devolución de cliente"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
 msgid "Supplier Shipment"
-msgstr "Envío de proveedor"
+msgstr "Remito de proveedor"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
 msgid "Supplier Return Shipment"
-msgstr "Envío de devolución a proveedor"
+msgstr "Remito de devolución a proveedor"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
 msgid "Internal Shipment"
-msgstr "Envío interno"
+msgstr "Remito interno"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
 msgid "Customer Shipment"
-msgstr "Envío a cliente"
+msgstr "Remito a cliente"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
 msgid "Customer Return Shipment"
-msgstr "Envío de devolución de cliente"
+msgstr "Remito de devolución de cliente"
 
 msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
@@ -1364,23 +1386,23 @@ msgstr "Informes"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
 msgid "Supplier Shipments"
-msgstr "Envíos de proveedor"
+msgstr "Remitos de proveedor"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
 msgid "Supplier Return Shipments"
-msgstr "Envíos de devolución a proveedor"
+msgstr "Devoluciones a proveedor"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
 msgid "Internal Shipments"
-msgstr "Envíos internos"
+msgstr "Remitos internos"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
 msgid "Customer Shipments"
-msgstr "Envíos a cliente"
+msgstr "Remitos a cliente"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
 msgid "Customer Return Shipments"
-msgstr "Envíos de devolución de cliente"
+msgstr "Devoluciones de cliente"
 
 msgctxt "model:ir.ui.menu,name:menu_stock"
 msgid "Inventory & Stock"
@@ -1476,35 +1498,35 @@ msgstr "Productos por ubicaciones"
 
 msgctxt "model:stock.shipment.in,name:"
 msgid "Supplier Shipment"
-msgstr "Envío de proveedor"
+msgstr "Remito de proveedor"
 
 msgctxt "model:stock.shipment.in.return,name:"
 msgid "Supplier Return Shipment"
-msgstr "Envío de devolución a proveedor"
+msgstr "Remito de devolución a proveedor"
 
 msgctxt "model:stock.shipment.in.return.assign.failed,name:"
 msgid "Assign Supplier Return Shipment"
-msgstr "Asignar envío de devolución de proveedor"
+msgstr "Asignar Remito de devolución de proveedor"
 
 msgctxt "model:stock.shipment.internal,name:"
 msgid "Internal Shipment"
-msgstr "Envío interno"
+msgstr "Remito interno"
 
 msgctxt "model:stock.shipment.internal.assign.failed,name:"
 msgid "Assign Shipment Internal"
-msgstr "Asignar envío interno"
+msgstr "Asignar Remito interno"
 
 msgctxt "model:stock.shipment.out,name:"
 msgid "Customer Shipment"
-msgstr "Envío a cliente"
+msgstr "Remito a cliente"
 
 msgctxt "model:stock.shipment.out.assign.failed,name:"
 msgid "Assign Shipment Out"
-msgstr "Asignación de envío de salida"
+msgstr "Asignación de Remito de salida"
 
 msgctxt "model:stock.shipment.out.return,name:"
 msgid "Customer Return Shipment"
-msgstr "Envío de devolución de cliente"
+msgstr "Remito de devolución de cliente"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "/"
@@ -1584,7 +1606,7 @@ msgstr "Desde ubicación:"
 
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "Internal Shipment"
-msgstr "Envío interno"
+msgstr "Remito interno"
 
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "Phone:"
@@ -1656,7 +1678,7 @@ msgstr "Referencia:"
 
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Shipment Number:"
-msgstr "Número de envío:"
+msgstr "Número de Remito:"
 
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "VAT Number:"
@@ -1723,10 +1745,18 @@ msgid "/"
 msgstr "/"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Code:"
 msgstr "Código:"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "E-Mail:"
 msgstr "Correo electrónico:"
 
@@ -1759,10 +1789,6 @@ msgid "Restocking List"
 msgstr "Lista reabastecimiento"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Supplier:"
-msgstr "Proveedor:"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "To Location"
 msgstr "A ubicación"
 
@@ -2064,11 +2090,11 @@ msgstr "Borrador"
 
 msgctxt "view:stock.shipment.in.return:"
 msgid "Supplier Return Shipment"
-msgstr "Envío de devolución a proveedor"
+msgstr "Remito de devolución a proveedor"
 
 msgctxt "view:stock.shipment.in.return:"
 msgid "Supplier Return Shipments"
-msgstr "Envíos de devolución a proveedor"
+msgstr "Remitos de devolución a proveedor"
 
 msgctxt "view:stock.shipment.in.return:"
 msgid "Wait"
@@ -2100,11 +2126,11 @@ msgstr "Restablecer a borrador"
 
 msgctxt "view:stock.shipment.in:"
 msgid "Supplier Shipment"
-msgstr "Envío de proveedor"
+msgstr "Remito de proveedor"
 
 msgctxt "view:stock.shipment.in:"
 msgid "Supplier Shipments"
-msgstr "Envíos de proveedor"
+msgstr "Remitos de proveedor"
 
 msgctxt "view:stock.shipment.internal.assign.failed:"
 msgid "Unable to Assign"
@@ -2132,11 +2158,11 @@ msgstr "Borrador"
 
 msgctxt "view:stock.shipment.internal:"
 msgid "Internal Shipment"
-msgstr "Envío interno"
+msgstr "Remito interno"
 
 msgctxt "view:stock.shipment.internal:"
 msgid "Internal Shipments"
-msgstr "Envíos internos"
+msgstr "Remitos internos"
 
 msgctxt "view:stock.shipment.internal:"
 msgid "Waiting"
@@ -2156,11 +2182,11 @@ msgstr "Cancelar"
 
 msgctxt "view:stock.shipment.out.return:"
 msgid "Customer Return Shipment"
-msgstr "Envío de devolución de cliente"
+msgstr "Remito de devolución de cliente"
 
 msgctxt "view:stock.shipment.out.return:"
 msgid "Customer Return Shipments"
-msgstr "Envíos de devolución de cliente"
+msgstr "Remitos de devolución de cliente"
 
 msgctxt "view:stock.shipment.out.return:"
 msgid "Done"
@@ -2192,11 +2218,11 @@ msgstr "Cancelar"
 
 msgctxt "view:stock.shipment.out:"
 msgid "Customer Shipment"
-msgstr "Envío a cliente"
+msgstr "Remito a cliente"
 
 msgctxt "view:stock.shipment.out:"
 msgid "Customer Shipments"
-msgstr "Envíos a cliente"
+msgstr "Remitos a cliente"
 
 msgctxt "view:stock.shipment.out:"
 msgid "Done"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index bea695a..4a4e37e 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -14,14 +14,14 @@ msgctxt "error:stock.inventory.line:"
 msgid "Line quantity must be positive."
 msgstr "La cantidad en la línea debe ser positiva."
 
-msgctxt "error:stock.inventory.line:"
-msgid "Product must be unique by inventory."
-msgstr "El producto debe ser único por inventario."
-
 msgctxt "error:stock.inventory:"
 msgid "Inventory \"%s\" must be cancelled before deletion."
 msgstr "El inventario \"%s\" debe ser cancelado antes de ser eliminado."
 
+msgctxt "error:stock.inventory:"
+msgid "Line \"%s\" is not unique on Inventory \"%s\"."
+msgstr "La línea \"%s\" no es única en el Inventario \"%s\"."
+
 msgctxt "error:stock.location:"
 msgid "Location \"%(location)s\" must be a child of warehouse \"%(warehouse)s\"."
 msgstr ""
@@ -63,12 +63,18 @@ msgstr ""
 "\"%(period)s\" esta cerrado."
 
 msgctxt "error:stock.move:"
+msgid "You can not modify stock move \"%s\" because it is in \"Assigned\" state."
+msgstr ""
+"No puede modificar el movimiento de inventario \"%s\" porque esta en estado "
+"\"Asignado\"."
+
+msgctxt "error:stock.move:"
 msgid ""
-"You can not modify stock move \"%s\"because it is in \"Assigned\", \"Done\" "
-"or \"Cancel\" state."
+"You can not modify stock move \"%s\" because it is in \"Done\" or \"Cancel\""
+" state."
 msgstr ""
-"Usted no puede modificar los movimientos de inventarios \"%s\" porque estan "
-"en estado \"Asignado\", \"Hecho\" o \"Cancelado\". "
+"No puede modificar el movimiento de inventario \"%s\" porque esta en estado "
+"\"Hecho\" o \"Cancelado\"."
 
 msgctxt "error:stock.move:"
 msgid "You can not set stock move \"%s\" to assigned state."
@@ -203,7 +209,7 @@ msgstr "Secuencia Envío de Devolución a Proveedor"
 
 msgctxt "field:stock.configuration,shipment_in_sequence:"
 msgid "Supplier Shipment Sequence"
-msgstr "Secuencia Envío de proveedor"
+msgstr "Secuencia Envío de Proveedor"
 
 msgctxt "field:stock.configuration,shipment_internal_sequence:"
 msgid "Internal Shipment Sequence"
@@ -215,7 +221,7 @@ msgstr "Secuencia Devolución de Cliente"
 
 msgctxt "field:stock.configuration,shipment_out_sequence:"
 msgid "Customer Shipment Sequence"
-msgstr "Secuencia Envío a cliente"
+msgstr "Secuencia Envío a Cliente"
 
 msgctxt "field:stock.configuration,write_date:"
 msgid "Write Date"
@@ -673,6 +679,10 @@ msgctxt "field:stock.shipment.in,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Orígenes"
+
 msgctxt "field:stock.shipment.in,planned_date:"
 msgid "Planned Date"
 msgstr "Fecha Planeada"
@@ -749,6 +759,10 @@ msgctxt "field:stock.shipment.in.return,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Orígenes"
+
 msgctxt "field:stock.shipment.in.return,planned_date:"
 msgid "Planned Date"
 msgstr "Fecha Planeada"
@@ -897,6 +911,10 @@ msgctxt "field:stock.shipment.out,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Orígenes"
+
 msgctxt "field:stock.shipment.out,outgoing_moves:"
 msgid "Outgoing Moves"
 msgstr "Movimientos de Salida"
@@ -993,6 +1011,10 @@ msgctxt "field:stock.shipment.out.return,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Orígenes"
+
 msgctxt "field:stock.shipment.out.return,planned_date:"
 msgid "Planned Date"
 msgstr "Fecha planeada"
@@ -1722,10 +1744,18 @@ msgid "/"
 msgstr "/"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ""
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Code:"
 msgstr "Código:"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "E-Mail:"
 msgstr "Correo electrónico:"
 
@@ -1758,10 +1788,6 @@ msgid "Restocking List"
 msgstr "Lista de renovación de existencias"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Supplier:"
-msgstr "Proveedor:"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "To Location"
 msgstr "A Bodega"
 
@@ -1991,7 +2017,7 @@ msgstr "Cantidad en Bodega"
 
 msgctxt "view:stock.location:"
 msgid "Locations"
-msgstr "Consultas Bodegas"
+msgstr "Bodegas"
 
 msgctxt "view:stock.move:"
 msgid "Move"
@@ -2003,11 +2029,11 @@ msgstr "Movimientos"
 
 msgctxt "view:stock.period.cache:"
 msgid "Period Cache"
-msgstr "Caché de período"
+msgstr "Caché de Período"
 
 msgctxt "view:stock.period.cache:"
 msgid "Period Caches"
-msgstr "Cachés de periodo"
+msgstr "Cachés de Periodo"
 
 msgctxt "view:stock.period:"
 msgid "Close"
@@ -2207,7 +2233,7 @@ msgstr "Borrador"
 
 msgctxt "view:stock.shipment.out:"
 msgid "Inventory Moves"
-msgstr "Movimientos de inventario"
+msgstr "Movimientos de Inventario"
 
 msgctxt "view:stock.shipment.out:"
 msgid "Make shipment"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 64b2f81..bd028a9 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -7,24 +7,23 @@ msgid ""
 "You cannot change the default uom for a product which is associated to stock"
 " moves."
 msgstr ""
-"No puede cambiar la UdM por defecto de un producto que está asociado con "
-"movimientos de stock."
+"No puede cambiar la UdM por defecto de un producto con movimientos de stock."
 
 msgctxt "error:stock.inventory.line:"
 msgid "Line quantity must be positive."
 msgstr "La cantidad de la línea debe ser positiva."
 
-msgctxt "error:stock.inventory.line:"
-msgid "Product must be unique by inventory."
-msgstr "El producto debe ser único en el inventario."
-
 msgctxt "error:stock.inventory:"
 msgid "Inventory \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar el inventario \"%s\" antes de borrar."
+msgstr "Debe cancelar el inventario \"%s\" antes de borrarlo."
+
+msgctxt "error:stock.inventory:"
+msgid "Line \"%s\" is not unique on Inventory \"%s\"."
+msgstr "La línea \"%s\" no es única en el inventario \"%s\"."
 
 msgctxt "error:stock.location:"
 msgid "Location \"%(location)s\" must be a child of warehouse \"%(warehouse)s\"."
-msgstr "La ubicación \"%(location)s\" debe ser un hijo del almacén \"%(warehouse)s\"."
+msgstr "La ubicación \"%(location)s\" debe ser hija del almacén \"%(warehouse)s\"."
 
 msgctxt "error:stock.location:"
 msgid ""
@@ -40,7 +39,7 @@ msgstr "La cantidad del movimiento interno debe ser positiva."
 
 msgctxt "error:stock.move:"
 msgid "Move quantity must be positive"
-msgstr "La cantidad a mover tiene que ser positiva."
+msgstr "La cantidad del movimiento tiene que ser positiva."
 
 msgctxt "error:stock.move:"
 msgid "Source and destination location must be different"
@@ -61,12 +60,18 @@ msgstr ""
 "\"%(period)s\" está cerrado."
 
 msgctxt "error:stock.move:"
+msgid "You can not modify stock move \"%s\" because it is in \"Assigned\" state."
+msgstr ""
+"No puede establecer el movimiento de stock \"%s\" porque se encuentra en "
+"estado \"Asignado\"."
+
+msgctxt "error:stock.move:"
 msgid ""
-"You can not modify stock move \"%s\"because it is in \"Assigned\", \"Done\" "
-"or \"Cancel\" state."
+"You can not modify stock move \"%s\" because it is in \"Done\" or \"Cancel\""
+" state."
 msgstr ""
-"No puede modificar el movimiento de stock \"%s\" porque está en estado "
-"\"Asignado\", \"Realizado\" o \"Cancelado\"."
+"No puede establecer el movimiento de stock \"%s\" porque se encuentra en "
+"estado \"Realizado\" o \"Cancelado\"."
 
 msgctxt "error:stock.move:"
 msgid "You can not set stock move \"%s\" to assigned state."
@@ -82,7 +87,7 @@ msgstr "No puede establecer el movimiento de stock \"%s\" al estado borrador."
 
 msgctxt "error:stock.period:"
 msgid "You can not close a period in the future or today."
-msgstr "No puede cerrar un período con fecha de hoy o proximamente."
+msgstr "No puede cerrar un período con fecha futura o de hoy."
 
 msgctxt "error:stock.period:"
 msgid "You can not close a period when there still are assigned moves."
@@ -91,30 +96,29 @@ msgstr ""
 
 msgctxt "error:stock.shipment.in.return:"
 msgid "Supplier Return Shipment \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar el albarán devolución proveedor\"%s\" antes de borrar."
+msgstr "Debe cancelar el albarán devolución proveedor \"%s\" antes de borrarlo."
 
 msgctxt "error:stock.shipment.in:"
 msgid ""
 "Incoming Moves must have the warehouse input location as destination "
 "location."
 msgstr ""
-"Movimientos de entrada debe disponer de un almacén de entrada como ubicación"
-" destino."
+"Los movimientos de entrada indicar una ubicación de entrada como destino."
 
 msgctxt "error:stock.shipment.in:"
 msgid ""
 "Inventory Moves must have the warehouse input location as source location."
 msgstr ""
-"Los movimientos del inventario deben disponer de un almacén de entrada como "
-"ubicación incial."
+"Los movimientos de inventario deben  indicar una ubicación de entrada como "
+"origen."
 
 msgctxt "error:stock.shipment.in:"
 msgid "Supplier Shipment \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar el albarán de proveedor \"%s\" antes de borrar."
+msgstr "Debe cancelar el albarán de proveedor \"%s\" antes de borrarlo."
 
 msgctxt "error:stock.shipment.internal:"
 msgid "Internal Shipment \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar el albarán interno \"%s\" antes de borrar."
+msgstr "Debe cancelar el albarán interno \"%s\" antes de borrarlo."
 
 msgctxt "error:stock.shipment.out.return.create:"
 msgid "The shipment with code \"%s\" is not yet sent."
@@ -126,11 +130,11 @@ msgstr "No puede crear albarán de devolución."
 
 msgctxt "error:stock.shipment.out.return:"
 msgid "Customer Return Shipment \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar el albarán devolución de cliente \"%s\" antes de borrar."
+msgstr "Debe cancelar el albarán devolución de cliente \"%s\" antes de borrarlo."
 
 msgctxt "error:stock.shipment.out:"
 msgid "Customer Shipment \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar el albarán de cliente \"%s\" antes de borrar."
+msgstr "Debe cancelar el albarán de cliente \"%s\" antes de borrarlo."
 
 msgctxt "field:party.address,delivery:"
 msgid "Delivery"
@@ -668,6 +672,10 @@ msgctxt "field:stock.shipment.in,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Orígen"
+
 msgctxt "field:stock.shipment.in,planned_date:"
 msgid "Planned Date"
 msgstr "Fecha estimada"
@@ -698,11 +706,11 @@ msgstr "Almacén"
 
 msgctxt "field:stock.shipment.in,warehouse_input:"
 msgid "Warehouse Input"
-msgstr "Almacén entrada"
+msgstr "Almacén-ubicación de entrada"
 
 msgctxt "field:stock.shipment.in,warehouse_storage:"
 msgid "Warehouse Storage"
-msgstr "Almacén interno"
+msgstr "Ubicación de almacenamiento"
 
 msgctxt "field:stock.shipment.in,write_date:"
 msgid "Write Date"
@@ -744,6 +752,10 @@ msgctxt "field:stock.shipment.in.return,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Orígen"
+
 msgctxt "field:stock.shipment.in.return,planned_date:"
 msgid "Planned Date"
 msgstr "Fecha estimada"
@@ -886,12 +898,16 @@ msgstr "ID"
 
 msgctxt "field:stock.shipment.out,inventory_moves:"
 msgid "Inventory Moves"
-msgstr "Movimientos internos"
+msgstr "Movimientos de inventario"
 
 msgctxt "field:stock.shipment.out,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Origen"
+
 msgctxt "field:stock.shipment.out,outgoing_moves:"
 msgid "Outgoing Moves"
 msgstr "Movimientos de salida"
@@ -918,11 +934,11 @@ msgstr "Almacén"
 
 msgctxt "field:stock.shipment.out,warehouse_output:"
 msgid "Warehouse Output"
-msgstr "Almacén salida"
+msgstr "Ubicación de salida"
 
 msgctxt "field:stock.shipment.out,warehouse_storage:"
 msgid "Warehouse Storage"
-msgstr "Almacén interno"
+msgstr "Ubicación de almacenamiento"
 
 msgctxt "field:stock.shipment.out,write_date:"
 msgid "Write Date"
@@ -988,6 +1004,10 @@ msgctxt "field:stock.shipment.out.return,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Orígen"
+
 msgctxt "field:stock.shipment.out.return,planned_date:"
 msgid "Planned Date"
 msgstr "Fecha estimada"
@@ -1010,11 +1030,11 @@ msgstr "Almacén"
 
 msgctxt "field:stock.shipment.out.return,warehouse_input:"
 msgid "Warehouse Input"
-msgstr "Almacén entrada"
+msgstr "Ubicación de entrada"
 
 msgctxt "field:stock.shipment.out.return,warehouse_storage:"
 msgid "Warehouse Storage"
-msgstr "Almacén interno"
+msgstr "Ubicación de almacenamiento"
 
 msgctxt "field:stock.shipment.out.return,write_date:"
 msgid "Write Date"
@@ -1080,7 +1100,7 @@ msgstr "Configuración de períodos"
 
 msgctxt "model:ir.action,name:act_product_quantities_warehouse"
 msgid "Product Quantities By Warehouse"
-msgstr "Unidades de producto por almazén"
+msgstr "Unidades de producto por almacén"
 
 msgctxt "model:ir.action,name:act_products_by_locations"
 msgid "Products"
@@ -1112,7 +1132,7 @@ msgstr "Albaranes proveedor"
 
 msgctxt "model:ir.action,name:act_shipment_out_return_form"
 msgid "Customer Return Shipments"
-msgstr "Albaranes cliente devolución"
+msgstr "Albaranes devolución cliente "
 
 msgctxt "model:ir.action,name:act_stock_configuration_form"
 msgid "Stock Configuration"
@@ -1148,7 +1168,7 @@ msgstr "Producto por ubicación"
 
 msgctxt "model:ir.action,name:wizard_product_quantities_warehouse"
 msgid "Product Quantities By Warehouse"
-msgstr "Unidades de producto por almazén"
+msgstr "Unidades de producto por almacén"
 
 msgctxt "model:ir.action,name:wizard_products_by_locations"
 msgid "Products by Locations"
@@ -1291,7 +1311,7 @@ msgstr "Recibido"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_in"
 msgid "Supplier Shipment"
-msgstr "Albarán de proveedor"
+msgstr "Albarán proveedor"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
 msgid "Supplier Return Shipment"
@@ -1363,7 +1383,7 @@ msgstr "Albaranes proveedor"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
 msgid "Supplier Return Shipments"
-msgstr "Devolución"
+msgstr "Devoluciones"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
 msgid "Internal Shipments"
@@ -1375,7 +1395,7 @@ msgstr "Albaranes cliente"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
 msgid "Customer Return Shipments"
-msgstr "Devolución"
+msgstr "Devoluciones"
 
 msgctxt "model:ir.ui.menu,name:menu_stock"
 msgid "Inventory & Stock"
@@ -1427,7 +1447,7 @@ msgstr "Zona de entrada"
 
 msgctxt "model:stock.location,name:location_lost_found"
 msgid "Lost and Found"
-msgstr "Perdido y encontrado"
+msgstr "Perdido/encontrado"
 
 msgctxt "model:stock.location,name:location_output"
 msgid "Output Zone"
@@ -1459,11 +1479,11 @@ msgstr "Período stock precalculado"
 
 msgctxt "model:stock.product_quantities_warehouse,name:"
 msgid "Product Quantities By Warehouse"
-msgstr "Unidades de producto por almazén"
+msgstr "Unidades de producto por almacén"
 
 msgctxt "model:stock.product_quantities_warehouse.start,name:"
 msgid "Product Quantities By Warehouse"
-msgstr "Unidades de producto por almazén"
+msgstr "Unidades de producto por almacén"
 
 msgctxt "model:stock.products_by_locations.start,name:"
 msgid "Products by Locations"
@@ -1655,7 +1675,7 @@ msgstr "Número de albarán:"
 
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "VAT Number:"
-msgstr "Número CIF/NIF:"
+msgstr "CIF/NIF:"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "/"
@@ -1707,7 +1727,7 @@ msgstr "A ubicación"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "VAT Number:"
-msgstr "Número CIF/NIF:"
+msgstr "CIF/NIF:"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Warehouse:"
@@ -1718,10 +1738,18 @@ msgid "/"
 msgstr "/"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Code:"
 msgstr "Código:"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "E-Mail:"
 msgstr "Correo electrónico:"
 
@@ -1754,16 +1782,12 @@ msgid "Restocking List"
 msgstr "Lista reabastecimiento"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Supplier:"
-msgstr "Proveedor:"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "To Location"
 msgstr "A ubicación"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "VAT Number:"
-msgstr "Número CIF/NIF:"
+msgstr "CIF/NIF:"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Warehouse:"
@@ -2023,11 +2047,11 @@ msgstr "Períodos"
 
 msgctxt "view:stock.product_quantities_warehouse.start:"
 msgid "Product Quantities By Warehouse"
-msgstr "Unidades de producto por almazén"
+msgstr "Unidades de producto por almacén"
 
 msgctxt "view:stock.product_quantities_warehouse:"
 msgid "Product Quantities By Warehouse"
-msgstr "Unidades de producto por almazén"
+msgstr "Unidades de producto por almacén"
 
 msgctxt "view:stock.products_by_locations.start:"
 msgid "Products by Locations"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index d5b92ed..7a721e8 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -10,26 +10,18 @@ msgstr ""
 "Vous ne pouvez pas changer l'UDM par défaut pour un produit qui a déjà fait "
 "l'objet de mouvements de stock"
 
-msgctxt "error:product.template:"
-msgid ""
-"You cannot change the default uom for a product which is associated to stock"
-" moves."
-msgstr ""
-"Vous ne pouvez pas changer l'UDM par défaut pour un produit qui a déjà fait "
-"l'objet de mouvements de stock"
-
 msgctxt "error:stock.inventory.line:"
 msgid "Line quantity must be positive."
 msgstr "La quantité de la ligne doit être positive."
 
-msgctxt "error:stock.inventory.line:"
-msgid "Product must be unique by inventory."
-msgstr "Le produit par inventaire doit être unique"
-
 msgctxt "error:stock.inventory:"
 msgid "Inventory \"%s\" must be cancelled before deletion."
 msgstr "l'inventaire \"%s\" doit être annulé avant sa suppression"
 
+msgctxt "error:stock.inventory:"
+msgid "Line \"%s\" is not unique on Inventory \"%s\"."
+msgstr "La ligne \"%s\" n'est pas unique pour l'inventaire \"%s\"."
+
 msgctxt "error:stock.location:"
 msgid "Location \"%(location)s\" must be a child of warehouse \"%(warehouse)s\"."
 msgstr ""
@@ -49,22 +41,10 @@ msgid "Internal move quantity must be positive"
 msgstr "La quantité interne doit être positive"
 
 msgctxt "error:stock.move:"
-msgid "Internal move quantity must be positive"
-msgstr "La quantité interne doit être positive"
-
-msgctxt "error:stock.move:"
 msgid "Move quantity must be positive"
 msgstr "La quantité sur le mouvement doit être positive."
 
 msgctxt "error:stock.move:"
-msgid "Move quantity must be positive"
-msgstr "La quantité sur le mouvement doit être positive."
-
-msgctxt "error:stock.move:"
-msgid "Source and destination location must be different"
-msgstr "Les emplacements d'origine et de destination doivent être distincts"
-
-msgctxt "error:stock.move:"
 msgid "Source and destination location must be different"
 msgstr "Les emplacements d'origine et de destination doivent être distincts"
 
@@ -83,12 +63,18 @@ msgstr ""
 "\"%(period)s\" est fermée."
 
 msgctxt "error:stock.move:"
+msgid "You can not modify stock move \"%s\" because it is in \"Assigned\" state."
+msgstr ""
+"Vous ne pouvez pas modifier le mouvement de stock \"%s\" parce qu'il est "
+"dans l'état \"Assigné\"."
+
+msgctxt "error:stock.move:"
 msgid ""
-"You can not modify stock move \"%s\"because it is in \"Assigned\", \"Done\" "
-"or \"Cancel\" state."
+"You can not modify stock move \"%s\" because it is in \"Done\" or \"Cancel\""
+" state."
 msgstr ""
-"Vous ne pouvez modifier le le mouvement de stock \"%s\" car il est dans "
-"l'état \"Assigné\", \"Fait\" ou \"Annulé\"."
+"Vous ne pouvez pas modifier le mouvement de stock \"%s\" parce qu'il est "
+"dans l'état \"Fait\" ou \"Annulé\"."
 
 msgctxt "error:stock.move:"
 msgid "You can not set stock move \"%s\" to assigned state."
@@ -96,11 +82,11 @@ msgstr "Vous ne pouvez passer dans l'état assigné le mouvement de stock \"%s\"
 
 msgctxt "error:stock.move:"
 msgid "You can not set stock move \"%s\" to done state."
-msgstr "Vous ne pouvez passer dans l'état \"Fait\" le mouvement \"%s\"."
+msgstr "Vous ne pouvez passer dans l'état \"Fait\" le mouvement de stock \"%s\"."
 
 msgctxt "error:stock.move:"
 msgid "You can not set stock move \"%s\" to draft state."
-msgstr "Vous ne pouvez remettre en brouilon le mouvement \"%s\"."
+msgstr "Vous ne pouvez remettre en brouilon le mouvement de stock \"%s\"."
 
 msgctxt "error:stock.period:"
 msgid "You can not close a period in the future or today."
@@ -124,8 +110,8 @@ msgid ""
 "Incoming Moves must have the warehouse input location as destination "
 "location."
 msgstr ""
-"Les mouvement d'entrées doivent avoir comme destination la location d'entrée"
-" de l'entrepôt."
+"Les mouvement entrants doivent avoir comme destination la location d'entrée "
+"de l'entrepôt."
 
 msgctxt "error:stock.shipment.in:"
 msgid ""
@@ -153,10 +139,6 @@ msgctxt "error:stock.shipment.out.return.create:"
 msgid "You can not create return shipment"
 msgstr "Vous ne pouvez pas créer d'expédition retour"
 
-msgctxt "error:stock.shipment.out.return.create:"
-msgid "You can not create return shipment"
-msgstr "Vous ne pouvez pas créer d'expédition retour"
-
 msgctxt "error:stock.shipment.out.return:"
 msgid "Customer Return Shipment \"%s\" must be cancelled before deletion."
 msgstr ""
@@ -231,23 +213,23 @@ msgstr "Nom"
 
 msgctxt "field:stock.configuration,shipment_in_return_sequence:"
 msgid "Supplier Return Shipment Sequence"
-msgstr "Séquence des retours expédition fournisseur"
+msgstr "Séquence de retour d'expédition fournisseur"
 
 msgctxt "field:stock.configuration,shipment_in_sequence:"
 msgid "Supplier Shipment Sequence"
-msgstr "Séquence des expédition fournisseur"
+msgstr "Séquence d'expédition fournisseur"
 
 msgctxt "field:stock.configuration,shipment_internal_sequence:"
 msgid "Internal Shipment Sequence"
-msgstr "Séquence des expédition interne"
+msgstr "Séquence d'expédition interne"
 
 msgctxt "field:stock.configuration,shipment_out_return_sequence:"
 msgid "Customer Return Shipment Sequence"
-msgstr "Séquence des retours d'expédition client"
+msgstr "Séquence de retour d'expédition client"
 
 msgctxt "field:stock.configuration,shipment_out_sequence:"
 msgid "Customer Shipment Sequence"
-msgstr "Séquence des expéditions client"
+msgstr "Séquence d'expéditions client"
 
 msgctxt "field:stock.configuration,write_date:"
 msgid "Write Date"
@@ -705,6 +687,10 @@ msgctxt "field:stock.shipment.in,moves:"
 msgid "Moves"
 msgstr "Mouvements"
 
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Origines"
+
 msgctxt "field:stock.shipment.in,planned_date:"
 msgid "Planned Date"
 msgstr "Date planifiée"
@@ -781,6 +767,10 @@ msgctxt "field:stock.shipment.in.return,moves:"
 msgid "Moves"
 msgstr "Mouvements"
 
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Origines"
+
 msgctxt "field:stock.shipment.in.return,planned_date:"
 msgid "Planned Date"
 msgstr "Date planifiée"
@@ -929,9 +919,13 @@ msgctxt "field:stock.shipment.out,moves:"
 msgid "Moves"
 msgstr "Mouvements"
 
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Origines"
+
 msgctxt "field:stock.shipment.out,outgoing_moves:"
 msgid "Outgoing Moves"
-msgstr "Mouvements de sortie"
+msgstr "Mouvements sortants"
 
 msgctxt "field:stock.shipment.out,planned_date:"
 msgid "Planned Date"
@@ -1025,6 +1019,10 @@ msgctxt "field:stock.shipment.out.return,moves:"
 msgid "Moves"
 msgstr "Mouvements"
 
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Origines"
+
 msgctxt "field:stock.shipment.out.return,planned_date:"
 msgid "Planned Date"
 msgstr "Date planifiée"
@@ -1093,7 +1091,7 @@ msgstr "Inventaires"
 
 msgctxt "model:ir.action,name:act_location_form"
 msgid "Locations"
-msgstr "Éditer les emplacements"
+msgstr "Emplacements"
 
 msgctxt "model:ir.action,name:act_location_quantity_tree"
 msgid "Locations"
@@ -1332,7 +1330,7 @@ msgstr "Retour d'expédition fournisseur"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_internal"
 msgid "Internal Shipment"
-msgstr "Expédition Interne"
+msgstr "Expédition interne"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_out"
 msgid "Customer Shipment"
@@ -1488,11 +1486,7 @@ msgstr "Période de stock"
 
 msgctxt "model:stock.period.cache,name:"
 msgid "Stock Period Cache"
-msgstr ""
-"\n"
-"Cache de période de stock\n"
-"\n"
-"C'est utilisé pour stocker en cache les calculs de quantités de stock."
+msgstr "Cache de période et stock"
 
 msgctxt "model:stock.product_quantities_warehouse,name:"
 msgid "Product Quantities By Warehouse"
@@ -1543,14 +1537,6 @@ msgid "/"
 msgstr "/"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "/"
-msgstr "/"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "Code:"
-msgstr "Code :"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Code:"
 msgstr "Code :"
 
@@ -1559,14 +1545,6 @@ msgid "E-Mail:"
 msgstr "E-Mail :"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "E-Mail:"
-msgstr "E-Mail :"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "From Location"
-msgstr "Emplacement d'origine"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "From Location"
 msgstr "Emplacement d'origine"
 
@@ -1575,14 +1553,6 @@ msgid "Phone:"
 msgstr "Téléphone :"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "Phone:"
-msgstr "Téléphone :"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "Planned Date:"
-msgstr "Date planifiée :"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Planned Date:"
 msgstr "Date planifiée :"
 
@@ -1591,14 +1561,6 @@ msgid "Product"
 msgstr "Produit"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "Product"
-msgstr "Produit"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "Quantity"
-msgstr "Quantité"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Quantity"
 msgstr "Quantité"
 
@@ -1607,14 +1569,6 @@ msgid "Reference:"
 msgstr "Référence :"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "Reference:"
-msgstr "Référence :"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "Restocking List"
-msgstr "Liste de restockage"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Restocking List"
 msgstr "Liste de restockage"
 
@@ -1623,14 +1577,6 @@ msgid "Supplier:"
 msgstr "Fournisseur :"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "Supplier:"
-msgstr "Fournisseur :"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "To Location"
-msgstr "Emplacement de destination"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "To Location"
 msgstr "Emplacement de destination"
 
@@ -1639,14 +1585,6 @@ msgid "VAT Number:"
 msgstr "Numéro TVA :"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "VAT Number:"
-msgstr "Numéro TVA :"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
-msgid "Warehouse:"
-msgstr "Entrepôt :"
-
-msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Warehouse:"
 msgstr "Entrepôt :"
 
@@ -1655,14 +1593,6 @@ msgid "/"
 msgstr "/"
 
 msgctxt "odt:stock.shipment.internal.report:"
-msgid "/"
-msgstr "/"
-
-msgctxt "odt:stock.shipment.internal.report:"
-msgid "Code:"
-msgstr "Code :"
-
-msgctxt "odt:stock.shipment.internal.report:"
 msgid "Code:"
 msgstr "Code :"
 
@@ -1671,14 +1601,6 @@ msgid "E-Mail:"
 msgstr "E-Mail :"
 
 msgctxt "odt:stock.shipment.internal.report:"
-msgid "E-Mail:"
-msgstr "E-Mail :"
-
-msgctxt "odt:stock.shipment.internal.report:"
-msgid "From Location"
-msgstr "Emplacement d'origine"
-
-msgctxt "odt:stock.shipment.internal.report:"
 msgid "From Location"
 msgstr "Emplacement d'origine"
 
@@ -1687,14 +1609,6 @@ msgid "From Location:"
 msgstr "Emplacement d'origine :"
 
 msgctxt "odt:stock.shipment.internal.report:"
-msgid "From Location:"
-msgstr "Emplacement d'origine :"
-
-msgctxt "odt:stock.shipment.internal.report:"
-msgid "Internal Shipment"
-msgstr "Expédition interne"
-
-msgctxt "odt:stock.shipment.internal.report:"
 msgid "Internal Shipment"
 msgstr "Expédition interne"
 
@@ -1703,14 +1617,6 @@ msgid "Phone:"
 msgstr "Téléphone :"
 
 msgctxt "odt:stock.shipment.internal.report:"
-msgid "Phone:"
-msgstr "Téléphone :"
-
-msgctxt "odt:stock.shipment.internal.report:"
-msgid "Planned Date:"
-msgstr "Date planifiée :"
-
-msgctxt "odt:stock.shipment.internal.report:"
 msgid "Planned Date:"
 msgstr "Date planifiée :"
 
@@ -1719,14 +1625,6 @@ msgid "Product"
 msgstr "Produit"
 
 msgctxt "odt:stock.shipment.internal.report:"
-msgid "Product"
-msgstr "Produit"
-
-msgctxt "odt:stock.shipment.internal.report:"
-msgid "Quantity"
-msgstr "Quantité"
-
-msgctxt "odt:stock.shipment.internal.report:"
 msgid "Quantity"
 msgstr "Quantité"
 
@@ -1735,14 +1633,6 @@ msgid "Reference:"
 msgstr "Référence :"
 
 msgctxt "odt:stock.shipment.internal.report:"
-msgid "Reference:"
-msgstr "Référence :"
-
-msgctxt "odt:stock.shipment.internal.report:"
-msgid "To Location"
-msgstr "Emplacement de destination"
-
-msgctxt "odt:stock.shipment.internal.report:"
 msgid "To Location"
 msgstr "Emplacement de destination"
 
@@ -1751,14 +1641,6 @@ msgid "To Location:"
 msgstr "Emplacement de destination :"
 
 msgctxt "odt:stock.shipment.internal.report:"
-msgid "To Location:"
-msgstr "Emplacement de destination :"
-
-msgctxt "odt:stock.shipment.internal.report:"
-msgid "VAT Number:"
-msgstr "Numéro TVA :"
-
-msgctxt "odt:stock.shipment.internal.report:"
 msgid "VAT Number:"
 msgstr "Numéro TVA :"
 
@@ -1767,14 +1649,6 @@ msgid "/"
 msgstr "/"
 
 msgctxt "odt:stock.shipment.out.delivery_note:"
-msgid "/"
-msgstr "/"
-
-msgctxt "odt:stock.shipment.out.delivery_note:"
-msgid "Customer Code:"
-msgstr "Code client :"
-
-msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Customer Code:"
 msgstr "Code client :"
 
@@ -1783,14 +1657,6 @@ msgid "Date:"
 msgstr "Date :"
 
 msgctxt "odt:stock.shipment.out.delivery_note:"
-msgid "Date:"
-msgstr "Date :"
-
-msgctxt "odt:stock.shipment.out.delivery_note:"
-msgid "Delivery Note"
-msgstr "Bon de livraison"
-
-msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Delivery Note"
 msgstr "Bon de livraison"
 
@@ -1799,14 +1665,6 @@ msgid "E-Mail:"
 msgstr "E-Mail :"
 
 msgctxt "odt:stock.shipment.out.delivery_note:"
-msgid "E-Mail:"
-msgstr "E-Mail :"
-
-msgctxt "odt:stock.shipment.out.delivery_note:"
-msgid "Phone:"
-msgstr "Téléphone :"
-
-msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Phone:"
 msgstr "Téléphone :"
 
@@ -1815,14 +1673,6 @@ msgid "Product"
 msgstr "Produit"
 
 msgctxt "odt:stock.shipment.out.delivery_note:"
-msgid "Product"
-msgstr "Produit"
-
-msgctxt "odt:stock.shipment.out.delivery_note:"
-msgid "Quantity"
-msgstr "Quantité"
-
-msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Quantity"
 msgstr "Quantité"
 
@@ -1831,14 +1681,6 @@ msgid "Reference:"
 msgstr "Référence :"
 
 msgctxt "odt:stock.shipment.out.delivery_note:"
-msgid "Reference:"
-msgstr "Référence :"
-
-msgctxt "odt:stock.shipment.out.delivery_note:"
-msgid "Shipment Number:"
-msgstr "Numéro d'expédition :"
-
-msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Shipment Number:"
 msgstr "Numéro d'expédition :"
 
@@ -1846,14 +1688,6 @@ msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "VAT Number:"
 msgstr "Numéro TVA :"
 
-msgctxt "odt:stock.shipment.out.delivery_note:"
-msgid "VAT Number:"
-msgstr "Numéro TVA :"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "/"
-msgstr "/"
-
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "/"
 msgstr "/"
@@ -1863,14 +1697,6 @@ msgid "Code:"
 msgstr "Code :"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "Code:"
-msgstr "Code :"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "Customer:"
-msgstr "Client :"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Customer:"
 msgstr "Client :"
 
@@ -1879,14 +1705,6 @@ msgid "E-Mail:"
 msgstr "E-Mail:"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "E-Mail:"
-msgstr "E-Mail:"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "From Location"
-msgstr "Emplacement d'origine"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "From Location"
 msgstr "Emplacement d'origine"
 
@@ -1895,14 +1713,6 @@ msgid "Phone:"
 msgstr "Téléphone :"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "Phone:"
-msgstr "Téléphone :"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "Picking List"
-msgstr "Liste de prélèvement"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Picking List"
 msgstr "Liste de prélèvement"
 
@@ -1911,14 +1721,6 @@ msgid "Planned Date:"
 msgstr "Date planifiée :"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "Planned Date:"
-msgstr "Date planifiée :"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "Product"
-msgstr "Produit"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Product"
 msgstr "Produit"
 
@@ -1927,14 +1729,6 @@ msgid "Quantity"
 msgstr "Quantité"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "Quantity"
-msgstr "Quantité"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "Reference:"
-msgstr "Référence :"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Reference:"
 msgstr "Référence :"
 
@@ -1943,14 +1737,6 @@ msgid "To Location"
 msgstr "Emplacement de destination"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "To Location"
-msgstr "Emplacement de destination"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "VAT Number:"
-msgstr "Numéro TVA :"
-
-msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "VAT Number:"
 msgstr "Numéro TVA :"
 
@@ -1958,29 +1744,21 @@ msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Warehouse:"
 msgstr "Entrepôt :"
 
-msgctxt "odt:stock.shipment.out.picking_list:"
-msgid "Warehouse:"
-msgstr "Entrepôt :"
-
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "/"
 msgstr "/"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "/"
-msgstr "/"
+msgid ":"
+msgstr ":"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Code:"
 msgstr "Code :"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Code:"
-msgstr "Code :"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "E-Mail:"
-msgstr "E-Mail :"
+msgid "Customer"
+msgstr "Client"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "E-Mail:"
@@ -1991,14 +1769,6 @@ msgid "From Location"
 msgstr "Emplacement d'origine"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "From Location"
-msgstr "Emplacement d'origine"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Phone:"
-msgstr "Téléphone :"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Phone:"
 msgstr "Téléphone :"
 
@@ -2007,14 +1777,6 @@ msgid "Planned Date:"
 msgstr "Date planifiée :"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Planned Date:"
-msgstr "Date planifiée :"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Product"
-msgstr "Produit"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Product"
 msgstr "Produit"
 
@@ -2023,14 +1785,6 @@ msgid "Quantity"
 msgstr "Quantité"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Quantity"
-msgstr "Quantité"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Reference:"
-msgstr "Référence :"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Reference:"
 msgstr "Référence :"
 
@@ -2039,30 +1793,10 @@ msgid "Restocking List"
 msgstr "Liste de restockage"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Restocking List"
-msgstr "Liste de restockage"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Supplier:"
-msgstr "Fournisseur :"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Supplier:"
-msgstr "Fournisseur :"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "To Location"
 msgstr "Emplacement de destination"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "To Location"
-msgstr "Emplacement de destination"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "VAT Number:"
-msgstr "Numéro TVA :"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "VAT Number:"
 msgstr "Numéro TVA :"
 
@@ -2070,14 +1804,6 @@ msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Warehouse:"
 msgstr "Entrepôt :"
 
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Warehouse:"
-msgstr "Entrepôt :"
-
-msgctxt "selection:stock.inventory,state:"
-msgid "Canceled"
-msgstr "Annulé"
-
 msgctxt "selection:stock.inventory,state:"
 msgid "Canceled"
 msgstr "Annulé"
@@ -2087,14 +1813,6 @@ msgid "Done"
 msgstr "Fait"
 
 msgctxt "selection:stock.inventory,state:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "selection:stock.inventory,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:stock.inventory,state:"
 msgid "Draft"
 msgstr "Brouillon"
 
@@ -2103,22 +1821,10 @@ msgid "Customer"
 msgstr "Client"
 
 msgctxt "selection:stock.location,type:"
-msgid "Customer"
-msgstr "Client"
-
-msgctxt "selection:stock.location,type:"
 msgid "Lost and Found"
 msgstr "Pertes et surplus"
 
 msgctxt "selection:stock.location,type:"
-msgid "Lost and Found"
-msgstr "Pertes et surplus"
-
-msgctxt "selection:stock.location,type:"
-msgid "Production"
-msgstr "Production"
-
-msgctxt "selection:stock.location,type:"
 msgid "Production"
 msgstr "Production"
 
@@ -2127,14 +1833,6 @@ msgid "Storage"
 msgstr "Magasin"
 
 msgctxt "selection:stock.location,type:"
-msgid "Storage"
-msgstr "Magasin"
-
-msgctxt "selection:stock.location,type:"
-msgid "Supplier"
-msgstr "Fournisseur"
-
-msgctxt "selection:stock.location,type:"
 msgid "Supplier"
 msgstr "Fournisseur"
 
@@ -2143,14 +1841,6 @@ msgid "View"
 msgstr "Vue"
 
 msgctxt "selection:stock.location,type:"
-msgid "View"
-msgstr "Vue"
-
-msgctxt "selection:stock.location,type:"
-msgid "Warehouse"
-msgstr "Entrepôt"
-
-msgctxt "selection:stock.location,type:"
 msgid "Warehouse"
 msgstr "Entrepôt"
 
@@ -2159,22 +1849,10 @@ msgid "Assigned"
 msgstr "Assigné"
 
 msgctxt "selection:stock.move,state:"
-msgid "Assigned"
-msgstr "Assigné"
-
-msgctxt "selection:stock.move,state:"
 msgid "Canceled"
 msgstr "Annulé"
 
 msgctxt "selection:stock.move,state:"
-msgid "Canceled"
-msgstr "Annulé"
-
-msgctxt "selection:stock.move,state:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "selection:stock.move,state:"
 msgid "Done"
 msgstr "Fait"
 
@@ -2182,14 +1860,6 @@ msgctxt "selection:stock.move,state:"
 msgid "Draft"
 msgstr "Brouillon"
 
-msgctxt "selection:stock.move,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:stock.period,state:"
-msgid "Closed"
-msgstr "Fermé"
-
 msgctxt "selection:stock.period,state:"
 msgid "Closed"
 msgstr "Fermé"
@@ -2198,14 +1868,6 @@ msgctxt "selection:stock.period,state:"
 msgid "Draft"
 msgstr "Brouillon"
 
-msgctxt "selection:stock.period,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:stock.shipment.in,state:"
-msgid "Canceled"
-msgstr "Annulé"
-
 msgctxt "selection:stock.shipment.in,state:"
 msgid "Canceled"
 msgstr "Annulé"
@@ -2215,22 +1877,10 @@ msgid "Done"
 msgstr "Fait"
 
 msgctxt "selection:stock.shipment.in,state:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "selection:stock.shipment.in,state:"
 msgid "Draft"
 msgstr "Brouillon"
 
 msgctxt "selection:stock.shipment.in,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:stock.shipment.in,state:"
-msgid "Received"
-msgstr "Reçu"
-
-msgctxt "selection:stock.shipment.in,state:"
 msgid "Received"
 msgstr "Reçu"
 
@@ -2239,14 +1889,6 @@ msgid "Assigned"
 msgstr "Assigné"
 
 msgctxt "selection:stock.shipment.in.return,state:"
-msgid "Assigned"
-msgstr "Assigné"
-
-msgctxt "selection:stock.shipment.in.return,state:"
-msgid "Canceled"
-msgstr "Annulé"
-
-msgctxt "selection:stock.shipment.in.return,state:"
 msgid "Canceled"
 msgstr "Annulé"
 
@@ -2255,14 +1897,6 @@ msgid "Done"
 msgstr "Fait"
 
 msgctxt "selection:stock.shipment.in.return,state:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "selection:stock.shipment.in.return,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:stock.shipment.in.return,state:"
 msgid "Draft"
 msgstr "Brouillon"
 
@@ -2270,23 +1904,11 @@ msgctxt "selection:stock.shipment.in.return,state:"
 msgid "Waiting"
 msgstr "En attente"
 
-msgctxt "selection:stock.shipment.in.return,state:"
-msgid "Waiting"
-msgstr "En attente"
-
 msgctxt "selection:stock.shipment.internal,state:"
 msgid "Assigned"
 msgstr "Assigné"
 
 msgctxt "selection:stock.shipment.internal,state:"
-msgid "Assigned"
-msgstr "Assigné"
-
-msgctxt "selection:stock.shipment.internal,state:"
-msgid "Canceled"
-msgstr "Annulé"
-
-msgctxt "selection:stock.shipment.internal,state:"
 msgid "Canceled"
 msgstr "Annulé"
 
@@ -2295,14 +1917,6 @@ msgid "Done"
 msgstr "Fait"
 
 msgctxt "selection:stock.shipment.internal,state:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "selection:stock.shipment.internal,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:stock.shipment.internal,state:"
 msgid "Draft"
 msgstr "Brouillon"
 
@@ -2310,14 +1924,6 @@ msgctxt "selection:stock.shipment.internal,state:"
 msgid "Waiting"
 msgstr "En attente"
 
-msgctxt "selection:stock.shipment.internal,state:"
-msgid "Waiting"
-msgstr "En attente"
-
-msgctxt "selection:stock.shipment.out,state:"
-msgid "Assigned"
-msgstr "Assigné"
-
 msgctxt "selection:stock.shipment.out,state:"
 msgid "Assigned"
 msgstr "Assigné"
@@ -2327,22 +1933,10 @@ msgid "Canceled"
 msgstr "Annulé"
 
 msgctxt "selection:stock.shipment.out,state:"
-msgid "Canceled"
-msgstr "Annulé"
-
-msgctxt "selection:stock.shipment.out,state:"
 msgid "Done"
 msgstr "Fait"
 
 msgctxt "selection:stock.shipment.out,state:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "selection:stock.shipment.out,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:stock.shipment.out,state:"
 msgid "Draft"
 msgstr "Brouillon"
 
@@ -2351,14 +1945,6 @@ msgid "Packed"
 msgstr "Emballé"
 
 msgctxt "selection:stock.shipment.out,state:"
-msgid "Packed"
-msgstr "Emballé"
-
-msgctxt "selection:stock.shipment.out,state:"
-msgid "Waiting"
-msgstr "En attente"
-
-msgctxt "selection:stock.shipment.out,state:"
 msgid "Waiting"
 msgstr "En attente"
 
@@ -2367,14 +1953,6 @@ msgid "Canceled"
 msgstr "Annulé"
 
 msgctxt "selection:stock.shipment.out.return,state:"
-msgid "Canceled"
-msgstr "Annulé"
-
-msgctxt "selection:stock.shipment.out.return,state:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "selection:stock.shipment.out.return,state:"
 msgid "Done"
 msgstr "Fait"
 
@@ -2383,14 +1961,6 @@ msgid "Draft"
 msgstr "Brouillon"
 
 msgctxt "selection:stock.shipment.out.return,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:stock.shipment.out.return,state:"
-msgid "Received"
-msgstr "Reçu"
-
-msgctxt "selection:stock.shipment.out.return,state:"
 msgid "Received"
 msgstr "Reçu"
 
@@ -2398,10 +1968,6 @@ msgctxt "view:party.party:"
 msgid "Stock"
 msgstr "Stock"
 
-msgctxt "view:party.party:"
-msgid "Stock"
-msgstr "Stock"
-
 msgctxt "view:product.by_location.start:"
 msgid "Product by Location"
 msgstr "Produits par emplacement"
@@ -2410,14 +1976,6 @@ msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Produits"
 
-msgctxt "view:product.product:"
-msgid "Products"
-msgstr "Produits"
-
-msgctxt "view:stock.configuration:"
-msgid "Stock Configuration"
-msgstr "Configuration des stocks"
-
 msgctxt "view:stock.configuration:"
 msgid "Stock Configuration"
 msgstr "Configuration des stocks"
@@ -2427,21 +1985,9 @@ msgid "Inventory Line"
 msgstr "Ligne d'inventaire"
 
 msgctxt "view:stock.inventory.line:"
-msgid "Inventory Line"
-msgstr "Ligne d'inventaire"
-
-msgctxt "view:stock.inventory.line:"
 msgid "Inventory Lines"
 msgstr "Lignes d'inventaire"
 
-msgctxt "view:stock.inventory.line:"
-msgid "Inventory Lines"
-msgstr "Lignes d'inventaire"
-
-msgctxt "view:stock.inventory:"
-msgid "Add an inventory line for each missing products"
-msgstr "Ajouter une ligne d'inventaire pour chaque produit manquant"
-
 msgctxt "view:stock.inventory:"
 msgid "Add an inventory line for each missing products"
 msgstr "Ajouter une ligne d'inventaire pour chaque produit manquant"
@@ -2451,14 +1997,6 @@ msgid "Cancel"
 msgstr "Annuler"
 
 msgctxt "view:stock.inventory:"
-msgid "Cancel"
-msgstr "Annuler"
-
-msgctxt "view:stock.inventory:"
-msgid "Complete Inventory"
-msgstr "Compléter l'inventaire"
-
-msgctxt "view:stock.inventory:"
 msgid "Complete Inventory"
 msgstr "Compléter l'inventaire"
 
@@ -2467,14 +2005,6 @@ msgid "Confirm"
 msgstr "Confirmer"
 
 msgctxt "view:stock.inventory:"
-msgid "Confirm"
-msgstr "Confirmer"
-
-msgctxt "view:stock.inventory:"
-msgid "Inventories"
-msgstr "Inventaires"
-
-msgctxt "view:stock.inventory:"
 msgid "Inventories"
 msgstr "Inventaires"
 
@@ -2482,14 +2012,6 @@ msgctxt "view:stock.inventory:"
 msgid "Inventory"
 msgstr "Inventaire"
 
-msgctxt "view:stock.inventory:"
-msgid "Inventory"
-msgstr "Inventaire"
-
-msgctxt "view:stock.location:"
-msgid "Location"
-msgstr "Emplacement"
-
 msgctxt "view:stock.location:"
 msgid "Location"
 msgstr "Emplacement"
@@ -2502,23 +2024,11 @@ msgctxt "view:stock.location:"
 msgid "Locations"
 msgstr "Emplacements"
 
-msgctxt "view:stock.location:"
-msgid "Locations"
-msgstr "Emplacements"
-
 msgctxt "view:stock.move:"
 msgid "Move"
 msgstr "Mouvement"
 
 msgctxt "view:stock.move:"
-msgid "Move"
-msgstr "Mouvement"
-
-msgctxt "view:stock.move:"
-msgid "Moves"
-msgstr "Mouvements"
-
-msgctxt "view:stock.move:"
 msgid "Moves"
 msgstr "Mouvements"
 
@@ -2527,14 +2037,6 @@ msgid "Period Cache"
 msgstr "Cache de la période"
 
 msgctxt "view:stock.period.cache:"
-msgid "Period Cache"
-msgstr "Cache de la période"
-
-msgctxt "view:stock.period.cache:"
-msgid "Period Caches"
-msgstr "Caches des périodes"
-
-msgctxt "view:stock.period.cache:"
 msgid "Period Caches"
 msgstr "Caches des périodes"
 
@@ -2543,22 +2045,10 @@ msgid "Close"
 msgstr "Fermer"
 
 msgctxt "view:stock.period:"
-msgid "Close"
-msgstr "Fermer"
-
-msgctxt "view:stock.period:"
 msgid "Draft"
 msgstr "Brouillon"
 
 msgctxt "view:stock.period:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "view:stock.period:"
-msgid "Period"
-msgstr "Période"
-
-msgctxt "view:stock.period:"
 msgid "Period"
 msgstr "Période"
 
@@ -2566,10 +2056,6 @@ msgctxt "view:stock.period:"
 msgid "Periods"
 msgstr "Périodes"
 
-msgctxt "view:stock.period:"
-msgid "Periods"
-msgstr "Périodes"
-
 msgctxt "view:stock.product_quantities_warehouse.start:"
 msgid "Product Quantities By Warehouse"
 msgstr "Quantités de produit par entrepôt"
@@ -2595,22 +2081,10 @@ msgid "Assign"
 msgstr "Assigner"
 
 msgctxt "view:stock.shipment.in.return:"
-msgid "Assign"
-msgstr "Assigner"
-
-msgctxt "view:stock.shipment.in.return:"
 msgid "Cancel"
 msgstr "Annuler"
 
 msgctxt "view:stock.shipment.in.return:"
-msgid "Cancel"
-msgstr "Annuler"
-
-msgctxt "view:stock.shipment.in.return:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "view:stock.shipment.in.return:"
 msgid "Done"
 msgstr "Fait"
 
@@ -2619,56 +2093,28 @@ msgid "Draft"
 msgstr "Brouillon"
 
 msgctxt "view:stock.shipment.in.return:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "view:stock.shipment.in.return:"
 msgid "Supplier Return Shipment"
 msgstr "Retour d'expédition fournisseur"
 
 msgctxt "view:stock.shipment.in.return:"
-msgid "Supplier Return Shipment"
-msgstr "Retour d'expédition fournisseur"
-
-msgctxt "view:stock.shipment.in.return:"
-msgid "Supplier Return Shipments"
-msgstr "Retours d'expédition fournisseur"
-
-msgctxt "view:stock.shipment.in.return:"
 msgid "Supplier Return Shipments"
 msgstr "Retours d'expédition fournisseur"
 
 msgctxt "view:stock.shipment.in.return:"
 msgid "Wait"
-msgstr "Attente"
+msgstr "Attendre"
 
 msgctxt "view:stock.shipment.in:"
 msgid "Cancel"
 msgstr "Annuler"
 
 msgctxt "view:stock.shipment.in:"
-msgid "Cancel"
-msgstr "Annuler"
-
-msgctxt "view:stock.shipment.in:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "view:stock.shipment.in:"
 msgid "Done"
 msgstr "Fait"
 
 msgctxt "view:stock.shipment.in:"
 msgid "Incoming Moves"
-msgstr "Mouvements en entrée"
-
-msgctxt "view:stock.shipment.in:"
-msgid "Incoming Moves"
-msgstr "Mouvements en entrée"
-
-msgctxt "view:stock.shipment.in:"
-msgid "Inventory Moves"
-msgstr "Mouvements internes"
+msgstr "Mouvements entrants"
 
 msgctxt "view:stock.shipment.in:"
 msgid "Inventory Moves"
@@ -2676,11 +2122,7 @@ msgstr "Mouvements internes"
 
 msgctxt "view:stock.shipment.in:"
 msgid "Receive"
-msgstr "Réception"
-
-msgctxt "view:stock.shipment.in:"
-msgid "Reset to Draft"
-msgstr "Remettre en brouillon"
+msgstr "Recevoir"
 
 msgctxt "view:stock.shipment.in:"
 msgid "Reset to Draft"
@@ -2691,14 +2133,6 @@ msgid "Supplier Shipment"
 msgstr "Expédition fournisseur"
 
 msgctxt "view:stock.shipment.in:"
-msgid "Supplier Shipment"
-msgstr "Expédition fournisseur"
-
-msgctxt "view:stock.shipment.in:"
-msgid "Supplier Shipments"
-msgstr "Expéditions fournisseur"
-
-msgctxt "view:stock.shipment.in:"
 msgid "Supplier Shipments"
 msgstr "Expéditions fournisseur"
 
@@ -2715,14 +2149,6 @@ msgid "Assign"
 msgstr "Assigner"
 
 msgctxt "view:stock.shipment.internal:"
-msgid "Assign"
-msgstr "Assigner"
-
-msgctxt "view:stock.shipment.internal:"
-msgid "Cancel"
-msgstr "Annuler"
-
-msgctxt "view:stock.shipment.internal:"
 msgid "Cancel"
 msgstr "Annuler"
 
@@ -2731,22 +2157,10 @@ msgid "Done"
 msgstr "Fait"
 
 msgctxt "view:stock.shipment.internal:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "view:stock.shipment.internal:"
 msgid "Draft"
 msgstr "Brouillon"
 
 msgctxt "view:stock.shipment.internal:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "view:stock.shipment.internal:"
-msgid "Internal Shipment"
-msgstr "Expédition interne"
-
-msgctxt "view:stock.shipment.internal:"
 msgid "Internal Shipment"
 msgstr "Expédition interne"
 
@@ -2755,14 +2169,6 @@ msgid "Internal Shipments"
 msgstr "Expéditions internes"
 
 msgctxt "view:stock.shipment.internal:"
-msgid "Internal Shipments"
-msgstr "Expéditions internes"
-
-msgctxt "view:stock.shipment.internal:"
-msgid "Waiting"
-msgstr "En attente"
-
-msgctxt "view:stock.shipment.internal:"
 msgid "Waiting"
 msgstr "En attente"
 
@@ -2779,14 +2185,6 @@ msgid "Cancel"
 msgstr "Annuler"
 
 msgctxt "view:stock.shipment.out.return:"
-msgid "Cancel"
-msgstr "Annuler"
-
-msgctxt "view:stock.shipment.out.return:"
-msgid "Customer Return Shipment"
-msgstr "Retour d'expédition client"
-
-msgctxt "view:stock.shipment.out.return:"
 msgid "Customer Return Shipment"
 msgstr "Retour d'expédition client"
 
@@ -2795,14 +2193,6 @@ msgid "Customer Return Shipments"
 msgstr "Retours d'expédition client"
 
 msgctxt "view:stock.shipment.out.return:"
-msgid "Customer Return Shipments"
-msgstr "Retours d'expédition client"
-
-msgctxt "view:stock.shipment.out.return:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "view:stock.shipment.out.return:"
 msgid "Done"
 msgstr "Fait"
 
@@ -2815,22 +2205,10 @@ msgid "Incoming Moves"
 msgstr "Mouvements entrants"
 
 msgctxt "view:stock.shipment.out.return:"
-msgid "Incoming Moves"
-msgstr "Mouvements entrants"
-
-msgctxt "view:stock.shipment.out.return:"
 msgid "Inventory Moves"
 msgstr "Mouvements internes"
 
 msgctxt "view:stock.shipment.out.return:"
-msgid "Inventory Moves"
-msgstr "Mouvements internes"
-
-msgctxt "view:stock.shipment.out.return:"
-msgid "Received"
-msgstr "Reçu"
-
-msgctxt "view:stock.shipment.out.return:"
 msgid "Received"
 msgstr "Reçu"
 
@@ -2839,14 +2217,6 @@ msgid "Assign"
 msgstr "Assigner"
 
 msgctxt "view:stock.shipment.out:"
-msgid "Assign"
-msgstr "Assigner"
-
-msgctxt "view:stock.shipment.out:"
-msgid "Cancel"
-msgstr "Annuler"
-
-msgctxt "view:stock.shipment.out:"
 msgid "Cancel"
 msgstr "Annuler"
 
@@ -2855,22 +2225,10 @@ msgid "Customer Shipment"
 msgstr "Expédition client"
 
 msgctxt "view:stock.shipment.out:"
-msgid "Customer Shipment"
-msgstr "Expédition client"
-
-msgctxt "view:stock.shipment.out:"
 msgid "Customer Shipments"
 msgstr "Expéditions client"
 
 msgctxt "view:stock.shipment.out:"
-msgid "Customer Shipments"
-msgstr "Expéditions client"
-
-msgctxt "view:stock.shipment.out:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "view:stock.shipment.out:"
 msgid "Done"
 msgstr "Fait"
 
@@ -2879,14 +2237,6 @@ msgid "Draft"
 msgstr "Brouillon"
 
 msgctxt "view:stock.shipment.out:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "view:stock.shipment.out:"
-msgid "Inventory Moves"
-msgstr "Mouvements internes"
-
-msgctxt "view:stock.shipment.out:"
 msgid "Inventory Moves"
 msgstr "Mouvements internes"
 
@@ -2895,20 +2245,8 @@ msgid "Make shipment"
 msgstr "Faire l'expédition"
 
 msgctxt "view:stock.shipment.out:"
-msgid "Make shipment"
-msgstr "Faire l'expédition"
-
-msgctxt "view:stock.shipment.out:"
 msgid "Outgoing Moves"
-msgstr "Mouvements en sortie"
-
-msgctxt "view:stock.shipment.out:"
-msgid "Outgoing Moves"
-msgstr "Mouvements en sortie"
-
-msgctxt "view:stock.shipment.out:"
-msgid "Waiting"
-msgstr "En attente"
+msgstr "Mouvements sortants"
 
 msgctxt "view:stock.shipment.out:"
 msgid "Waiting"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index 79691de..fcf82c8 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -12,12 +12,12 @@ msgctxt "error:stock.inventory.line:"
 msgid "Line quantity must be positive."
 msgstr ""
 
-msgctxt "error:stock.inventory.line:"
-msgid "Product must be unique by inventory."
+msgctxt "error:stock.inventory:"
+msgid "Inventory \"%s\" must be cancelled before deletion."
 msgstr ""
 
 msgctxt "error:stock.inventory:"
-msgid "Inventory \"%s\" must be cancelled before deletion."
+msgid "Line \"%s\" is not unique on Inventory \"%s\"."
 msgstr ""
 
 msgctxt "error:stock.location:"
@@ -53,9 +53,13 @@ msgid "You can not modify move \"%(move)s\" because period \"%(period)s\" is clo
 msgstr ""
 
 msgctxt "error:stock.move:"
+msgid "You can not modify stock move \"%s\" because it is in \"Assigned\" state."
+msgstr ""
+
+msgctxt "error:stock.move:"
 msgid ""
-"You can not modify stock move \"%s\"because it is in \"Assigned\", \"Done\" "
-"or \"Cancel\" state."
+"You can not modify stock move \"%s\" because it is in \"Done\" or \"Cancel\""
+" state."
 msgstr ""
 
 msgctxt "error:stock.move:"
@@ -701,6 +705,10 @@ msgctxt "field:stock.shipment.in,moves:"
 msgid "Moves"
 msgstr "Boekingen"
 
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.in,planned_date:"
 msgid "Planned Date"
 msgstr ""
@@ -786,6 +794,10 @@ msgctxt "field:stock.shipment.in.return,moves:"
 msgid "Moves"
 msgstr "Boekingen"
 
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.in.return,planned_date:"
 msgid "Planned Date"
 msgstr ""
@@ -951,6 +963,10 @@ msgctxt "field:stock.shipment.out,moves:"
 msgid "Moves"
 msgstr "Boekingen"
 
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.out,outgoing_moves:"
 msgid "Outgoing Moves"
 msgstr ""
@@ -1056,6 +1072,10 @@ msgctxt "field:stock.shipment.out.return,moves:"
 msgid "Moves"
 msgstr "Boekingen"
 
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.out.return,planned_date:"
 msgid "Planned Date"
 msgstr ""
@@ -1827,11 +1847,20 @@ msgid "/"
 msgstr ""
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ""
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Code:"
 msgstr ""
 
 #, fuzzy
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Klant"
+
+#, fuzzy
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "E-Mail:"
 msgstr "E-mail:"
 
@@ -1868,10 +1897,6 @@ msgid "Restocking List"
 msgstr ""
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Supplier:"
-msgstr ""
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "To Location"
 msgstr ""
 
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index ba0c4b5..d25fcea 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -14,14 +14,14 @@ msgctxt "error:stock.inventory.line:"
 msgid "Line quantity must be positive."
 msgstr "Количество в строке должно быть положительным."
 
-msgctxt "error:stock.inventory.line:"
-msgid "Product must be unique by inventory."
-msgstr "Продукты должны быть уникальны в инвентаризации."
-
 msgctxt "error:stock.inventory:"
 msgid "Inventory \"%s\" must be cancelled before deletion."
 msgstr "Инвентаризация \"%s\" должна быть отменена перед удалением."
 
+msgctxt "error:stock.inventory:"
+msgid "Line \"%s\" is not unique on Inventory \"%s\"."
+msgstr ""
+
 msgctxt "error:stock.location:"
 msgid "Location \"%(location)s\" must be a child of warehouse \"%(warehouse)s\"."
 msgstr ""
@@ -63,12 +63,14 @@ msgstr ""
 " уже закрыт."
 
 msgctxt "error:stock.move:"
+msgid "You can not modify stock move \"%s\" because it is in \"Assigned\" state."
+msgstr ""
+
+msgctxt "error:stock.move:"
 msgid ""
-"You can not modify stock move \"%s\"because it is in \"Assigned\", \"Done\" "
-"or \"Cancel\" state."
+"You can not modify stock move \"%s\" because it is in \"Done\" or \"Cancel\""
+" state."
 msgstr ""
-"Вы не можете изменить проводку \"%s\" так как она находится в состоянии "
-"\"Передана\", \"Выполнена\" или \"Отменена\"."
 
 msgctxt "error:stock.move:"
 msgid "You can not set stock move \"%s\" to assigned state."
@@ -669,6 +671,10 @@ msgctxt "field:stock.shipment.in,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.in,planned_date:"
 msgid "Planned Date"
 msgstr "Плановая дата"
@@ -745,6 +751,10 @@ msgctxt "field:stock.shipment.in.return,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.in.return,planned_date:"
 msgid "Planned Date"
 msgstr "Плановая дата"
@@ -893,6 +903,10 @@ msgctxt "field:stock.shipment.out,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.out,outgoing_moves:"
 msgid "Outgoing Moves"
 msgstr "Внешнее перемещение"
@@ -989,6 +1003,10 @@ msgctxt "field:stock.shipment.out.return,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr ""
+
 msgctxt "field:stock.shipment.out.return,planned_date:"
 msgid "Planned Date"
 msgstr "Плановая дата"
@@ -1718,9 +1736,18 @@ msgid "/"
 msgstr "/"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ""
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Code:"
 msgstr "Код:"
 
+#, fuzzy
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Заказчик"
+
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "E-Mail:"
 msgstr "Эл.почта:"
@@ -1754,10 +1781,6 @@ msgid "Restocking List"
 msgstr "Список пополнения"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Supplier:"
-msgstr "Поставщик:"
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "To Location"
 msgstr "В местоположение"
 
diff --git a/locale/nl_NL.po b/locale/sl_SI.po
similarity index 74%
copy from locale/nl_NL.po
copy to locale/sl_SI.po
index 79691de..bb7bee4 100644
--- a/locale/nl_NL.po
+++ b/locale/sl_SI.po
@@ -7,1102 +7,1050 @@ msgid ""
 "You cannot change the default uom for a product which is associated to stock"
 " moves."
 msgstr ""
+"Privzete ME za izdelek, ki je povezan s prometom zaloge, ni možno "
+"spreminjati."
 
 msgctxt "error:stock.inventory.line:"
 msgid "Line quantity must be positive."
-msgstr ""
-
-msgctxt "error:stock.inventory.line:"
-msgid "Product must be unique by inventory."
-msgstr ""
+msgstr "Količina postavke mora biti večja od nič."
 
 msgctxt "error:stock.inventory:"
 msgid "Inventory \"%s\" must be cancelled before deletion."
-msgstr ""
+msgstr "Popis \"%s\" mora biti pred brisanjem preklican."
+
+msgctxt "error:stock.inventory:"
+msgid "Line \"%s\" is not unique on Inventory \"%s\"."
+msgstr "Postavka \"%s\" ni edinstvena na popis \"%s\"."
 
 msgctxt "error:stock.location:"
 msgid "Location \"%(location)s\" must be a child of warehouse \"%(warehouse)s\"."
-msgstr ""
+msgstr "Lokacija \"%(location)s\" mora biti pod skladiščem \"%(warehouse)s\"."
 
 msgctxt "error:stock.location:"
 msgid ""
 "Location \"%s\" with existing moves cannot be changed to a type that does "
 "not support moves."
 msgstr ""
+"Lokacije \"%s\" z obstoječim prometom ni možno pretvoriti v lokacijo, ki ne "
+"podpira prometa."
 
 msgctxt "error:stock.move:"
 msgid "Internal move quantity must be positive"
-msgstr ""
+msgstr "Količina notranjega prometa mora biti večja od nič."
 
 msgctxt "error:stock.move:"
 msgid "Move quantity must be positive"
-msgstr ""
+msgstr "Količina prometa mora biti večja od nič."
 
 msgctxt "error:stock.move:"
 msgid "Source and destination location must be different"
-msgstr ""
+msgstr "Izvorna in ciljna lokacija mora biti različni."
 
 msgctxt "error:stock.move:"
 msgid ""
 "You can not delete stock move \"%s\" because it is not in draft or cancelled"
 " state."
 msgstr ""
+"Prometa zaloge \"%s\" ni možno brisati, ker ni v stanju osnutka ali "
+"preklica."
 
 msgctxt "error:stock.move:"
 msgid "You can not modify move \"%(move)s\" because period \"%(period)s\" is closed."
 msgstr ""
+"Prometa \"%(move)s\" ni možno popravljati, ker je obdobje \"%(period)s\" "
+"zaključeno."
+
+msgctxt "error:stock.move:"
+msgid "You can not modify stock move \"%s\" because it is in \"Assigned\" state."
+msgstr "Prometa zaloge \"%s\" ni možno popravljati, ker je dodeljen."
 
 msgctxt "error:stock.move:"
 msgid ""
-"You can not modify stock move \"%s\"because it is in \"Assigned\", \"Done\" "
-"or \"Cancel\" state."
+"You can not modify stock move \"%s\" because it is in \"Done\" or \"Cancel\""
+" state."
 msgstr ""
+"Prometa zaloge \"%s\" ni možno popravljati, ker je bodisi zaključen bodisi "
+"preklican."
 
 msgctxt "error:stock.move:"
 msgid "You can not set stock move \"%s\" to assigned state."
-msgstr ""
+msgstr "Prometa zaloge \"%s\" ni možno postaviti v stanje \"dodeljeno\". "
 
 msgctxt "error:stock.move:"
 msgid "You can not set stock move \"%s\" to done state."
-msgstr ""
+msgstr "Prometa zaloge \"%s\" ni možno postaviti v stanje \"končano\". "
 
 msgctxt "error:stock.move:"
 msgid "You can not set stock move \"%s\" to draft state."
-msgstr ""
+msgstr "Prometa zaloge \"%s\" ni možno postaviti v stanje \"osnutek\". "
 
 msgctxt "error:stock.period:"
 msgid "You can not close a period in the future or today."
-msgstr ""
+msgstr "Obdobja ni možno zaključiti v prihodnosti ali na današnji dan."
 
 msgctxt "error:stock.period:"
 msgid "You can not close a period when there still are assigned moves."
 msgstr ""
+"Obdobja ni možno zaključiti, če še vedno obstaja promet v stanju "
+"\"dodeljeno\"."
 
 msgctxt "error:stock.shipment.in.return:"
 msgid "Supplier Return Shipment \"%s\" must be cancelled before deletion."
-msgstr ""
+msgstr "Vrnjena prevzemnica \"%s\" mora biti pred brisanjem preklicana."
 
 msgctxt "error:stock.shipment.in:"
 msgid ""
 "Incoming Moves must have the warehouse input location as destination "
 "location."
 msgstr ""
+"Vhodni promet mora imeti za ciljno lokacijo lokacijo prevzema v skladišče."
 
 msgctxt "error:stock.shipment.in:"
 msgid ""
 "Inventory Moves must have the warehouse input location as source location."
 msgstr ""
+"Inventarni promet mora imeti za izvorno lokacijo lokacijo prevzema v "
+"skladišče."
 
 msgctxt "error:stock.shipment.in:"
 msgid "Supplier Shipment \"%s\" must be cancelled before deletion."
-msgstr ""
+msgstr "Prevzemnica \"%s\" mora biti pred brisanjem preklicana."
 
 msgctxt "error:stock.shipment.internal:"
 msgid "Internal Shipment \"%s\" must be cancelled before deletion."
-msgstr ""
+msgstr "Notranja odpremnica \"%s\" mora biti pred brisanjem preklicana."
 
 msgctxt "error:stock.shipment.out.return.create:"
 msgid "The shipment with code \"%s\" is not yet sent."
-msgstr ""
+msgstr "Pošiljka s šifro \"%s\" še ni odposlana."
 
 msgctxt "error:stock.shipment.out.return.create:"
 msgid "You can not create return shipment"
-msgstr ""
+msgstr "Vrnjene pošiljke ni možno izdelati."
 
 msgctxt "error:stock.shipment.out.return:"
 msgid "Customer Return Shipment \"%s\" must be cancelled before deletion."
-msgstr ""
+msgstr "Vrnjena odpremnica \"%s\" mora biti pred brisanjem preklicana."
 
 msgctxt "error:stock.shipment.out:"
 msgid "Customer Shipment \"%s\" must be cancelled before deletion."
-msgstr ""
+msgstr "Odpremnica \"%s\" mora biti pred brisanjem preklicana."
 
 msgctxt "field:party.address,delivery:"
 msgid "Delivery"
-msgstr ""
+msgstr "Dostava"
 
 msgctxt "field:party.party,customer_location:"
 msgid "Customer Location"
-msgstr ""
+msgstr "Lokacija kupca"
 
 msgctxt "field:party.party,supplier_location:"
 msgid "Supplier Location"
-msgstr ""
+msgstr "Lokacija dobavitelja"
 
 msgctxt "field:product.by_location.start,forecast_date:"
 msgid "At Date"
-msgstr ""
+msgstr "Na datum"
 
 msgctxt "field:product.by_location.start,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:product.product,cost_value:"
 msgid "Cost Value"
-msgstr ""
+msgstr "Nabavna vrednost"
 
 msgctxt "field:product.product,forecast_quantity:"
 msgid "Forecast Quantity"
-msgstr ""
+msgstr "Predvidena količina"
 
-#, fuzzy
 msgctxt "field:product.product,quantity:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
 msgctxt "field:product.template,cost_value:"
 msgid "Cost Value"
-msgstr ""
+msgstr "Nabavna vrednost"
 
 msgctxt "field:product.template,forecast_quantity:"
 msgid "Forecast Quantity"
-msgstr ""
+msgstr "Predvidena količina"
 
-#, fuzzy
 msgctxt "field:product.template,quantity:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
 msgctxt "field:stock.configuration,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.configuration,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:stock.configuration,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:stock.configuration,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:stock.configuration,shipment_in_return_sequence:"
 msgid "Supplier Return Shipment Sequence"
-msgstr ""
+msgstr "Štetje vrnjenih prevzemnic"
 
 msgctxt "field:stock.configuration,shipment_in_sequence:"
 msgid "Supplier Shipment Sequence"
-msgstr ""
+msgstr "Štetje prevzemnic"
 
 msgctxt "field:stock.configuration,shipment_internal_sequence:"
 msgid "Internal Shipment Sequence"
-msgstr ""
+msgstr "Štetje notranjih odpremnic"
 
 msgctxt "field:stock.configuration,shipment_out_return_sequence:"
 msgid "Customer Return Shipment Sequence"
-msgstr ""
+msgstr "Štetje vrnjenih odpremnic"
 
 msgctxt "field:stock.configuration,shipment_out_sequence:"
 msgid "Customer Shipment Sequence"
-msgstr ""
+msgstr "Štetje odpremnic"
 
 msgctxt "field:stock.configuration,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.configuration,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:stock.inventory,company:"
 msgid "Company"
-msgstr "Bedrijf"
+msgstr "Podjetje"
 
 msgctxt "field:stock.inventory,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.inventory,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:stock.inventory,date:"
 msgid "Date"
-msgstr "Vervaldatum"
+msgstr "Datum"
 
 msgctxt "field:stock.inventory,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:stock.inventory,lines:"
 msgid "Lines"
-msgstr "Regels"
+msgstr "Postavke"
 
 msgctxt "field:stock.inventory,location:"
 msgid "Location"
-msgstr ""
+msgstr "Lokacija"
 
 msgctxt "field:stock.inventory,lost_found:"
 msgid "Lost and Found"
-msgstr ""
+msgstr "Izgubljeno/najdeno"
 
-#, fuzzy
 msgctxt "field:stock.inventory,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:stock.inventory,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
 msgctxt "field:stock.inventory,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.inventory,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:stock.inventory.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.inventory.line,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:stock.inventory.line,expected_quantity:"
 msgid "Expected Quantity"
-msgstr ""
+msgstr "Predvidena količina"
 
 msgctxt "field:stock.inventory.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:stock.inventory.line,inventory:"
 msgid "Inventory"
-msgstr ""
+msgstr "Popis"
 
-#, fuzzy
 msgctxt "field:stock.inventory.line,move:"
 msgid "Move"
-msgstr "Boeking"
+msgstr "Promet"
 
-#, fuzzy
 msgctxt "field:stock.inventory.line,product:"
 msgid "Product"
-msgstr "Producten"
+msgstr "Izdelek"
 
-#, fuzzy
 msgctxt "field:stock.inventory.line,quantity:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
-#, fuzzy
 msgctxt "field:stock.inventory.line,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:stock.inventory.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Decimalen eenheid"
+msgstr "Decimalke"
 
 msgctxt "field:stock.inventory.line,uom:"
 msgid "UOM"
-msgstr ""
+msgstr "ME"
 
 msgctxt "field:stock.inventory.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.inventory.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:stock.location,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
-#, fuzzy
 msgctxt "field:stock.location,address:"
 msgid "Address"
-msgstr "Adres"
+msgstr "Naslov"
 
-#, fuzzy
 msgctxt "field:stock.location,childs:"
 msgid "Children"
-msgstr "Onderliggende niveaus"
+msgstr "Podlokacije"
 
-#, fuzzy
 msgctxt "field:stock.location,code:"
 msgid "Code"
-msgstr "Code"
+msgstr "Šifra"
 
 msgctxt "field:stock.location,cost_value:"
 msgid "Cost Value"
-msgstr ""
+msgstr "Nabavna vrednost"
 
 msgctxt "field:stock.location,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.location,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:stock.location,forecast_quantity:"
 msgid "Forecast Quantity"
-msgstr ""
+msgstr "Predvidena količina"
 
 msgctxt "field:stock.location,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:stock.location,input_location:"
 msgid "Input"
-msgstr ""
+msgstr "Prevzem"
 
-#, fuzzy
 msgctxt "field:stock.location,left:"
 msgid "Left"
-msgstr "Links"
+msgstr "Levo"
 
-#, fuzzy
 msgctxt "field:stock.location,name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Naziv"
 
 msgctxt "field:stock.location,output_location:"
 msgid "Output"
-msgstr ""
+msgstr "Izdaja"
 
-#, fuzzy
 msgctxt "field:stock.location,parent:"
 msgid "Parent"
-msgstr "Bovenliggend niveau"
+msgstr "Matična lokacija"
 
-#, fuzzy
 msgctxt "field:stock.location,quantity:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
-#, fuzzy
 msgctxt "field:stock.location,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:stock.location,right:"
 msgid "Right"
-msgstr "Rechts"
+msgstr "Desno"
 
 msgctxt "field:stock.location,storage_location:"
 msgid "Storage"
-msgstr ""
+msgstr "Shramba"
 
 msgctxt "field:stock.location,type:"
 msgid "Location type"
-msgstr ""
+msgstr "Tip lokacije"
 
 msgctxt "field:stock.location,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.location,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:stock.move,company:"
 msgid "Company"
-msgstr "Bedrijf"
+msgstr "Podjetje"
 
-#, fuzzy
 msgctxt "field:stock.move,cost_price:"
 msgid "Cost Price"
-msgstr "Kostprijs"
+msgstr "Nabavna cena"
 
 msgctxt "field:stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.move,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:stock.move,currency:"
 msgid "Currency"
 msgstr "Valuta"
 
-#, fuzzy
 msgctxt "field:stock.move,effective_date:"
 msgid "Effective Date"
-msgstr "Effectieve datum"
+msgstr "Dejanski datum"
 
 msgctxt "field:stock.move,from_location:"
 msgid "From Location"
-msgstr ""
+msgstr "Iz lokacije"
 
 msgctxt "field:stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:stock.move,internal_quantity:"
 msgid "Internal Quantity"
-msgstr ""
+msgstr "Notranja količina"
 
 msgctxt "field:stock.move,origin:"
 msgid "Origin"
-msgstr ""
+msgstr "Poreklo"
 
 msgctxt "field:stock.move,planned_date:"
 msgid "Planned Date"
-msgstr ""
+msgstr "Načrtovan datum"
 
-#, fuzzy
 msgctxt "field:stock.move,product:"
 msgid "Product"
-msgstr "Producten"
+msgstr "Izdelek"
 
 msgctxt "field:stock.move,product_uom_category:"
 msgid "Product Uom Category"
-msgstr ""
+msgstr "Katerogija ME izdelka"
 
-#, fuzzy
 msgctxt "field:stock.move,quantity:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
-#, fuzzy
 msgctxt "field:stock.move,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:stock.move,shipment:"
 msgid "Shipment"
-msgstr ""
+msgstr "Pošiljka"
 
-#, fuzzy
 msgctxt "field:stock.move,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
 msgctxt "field:stock.move,to_location:"
 msgid "To Location"
-msgstr ""
+msgstr "Na lokacijo"
 
-#, fuzzy
 msgctxt "field:stock.move,unit_digits:"
 msgid "Unit Digits"
-msgstr "Decimalen eenheid"
+msgstr "Decimalke"
 
-#, fuzzy
 msgctxt "field:stock.move,unit_price:"
 msgid "Unit Price"
-msgstr "Eenheidsprijs"
+msgstr "Cena"
 
 msgctxt "field:stock.move,unit_price_required:"
 msgid "Unit Price Required"
-msgstr ""
+msgstr "Cena obvezna"
 
 msgctxt "field:stock.move,uom:"
 msgid "Uom"
-msgstr ""
+msgstr "ME"
 
 msgctxt "field:stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:stock.period,caches:"
 msgid "Caches"
-msgstr ""
+msgstr "Predpomnjenja"
 
-#, fuzzy
 msgctxt "field:stock.period,company:"
 msgid "Company"
-msgstr "Bedrijf"
+msgstr "Podjetje"
 
 msgctxt "field:stock.period,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.period,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:stock.period,date:"
 msgid "Date"
-msgstr "Vervaldatum"
+msgstr "Datum"
 
 msgctxt "field:stock.period,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:stock.period,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:stock.period,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
 msgctxt "field:stock.period,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.period,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:stock.period.cache,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.period.cache,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:stock.period.cache,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:stock.period.cache,internal_quantity:"
 msgid "Internal Quantity"
-msgstr ""
+msgstr "Notranja količina"
 
 msgctxt "field:stock.period.cache,location:"
 msgid "Location"
-msgstr ""
+msgstr "Lokacija"
 
-#, fuzzy
 msgctxt "field:stock.period.cache,period:"
 msgid "Period"
-msgstr "Periode"
+msgstr "Obdobje"
 
-#, fuzzy
 msgctxt "field:stock.period.cache,product:"
 msgid "Product"
-msgstr "Producten"
+msgstr "Izdelek"
 
-#, fuzzy
 msgctxt "field:stock.period.cache,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:stock.period.cache,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.period.cache,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:stock.product_quantities_warehouse,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.product_quantities_warehouse,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:stock.product_quantities_warehouse,date:"
 msgid "Date"
-msgstr "Vervaldatum"
+msgstr "Datum"
 
 msgctxt "field:stock.product_quantities_warehouse,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:stock.product_quantities_warehouse,quantity:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
-#, fuzzy
 msgctxt "field:stock.product_quantities_warehouse,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:stock.product_quantities_warehouse,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.product_quantities_warehouse,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:stock.product_quantities_warehouse.start,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:stock.product_quantities_warehouse.start,warehouse:"
 msgid "Warehouse"
-msgstr "Magazijn"
+msgstr "Skladišče"
 
 msgctxt "field:stock.products_by_locations.start,forecast_date:"
 msgid "At Date"
-msgstr ""
+msgstr "Na datum"
 
 msgctxt "field:stock.products_by_locations.start,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in,code:"
 msgid "Code"
-msgstr "Code"
+msgstr "Šifra"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in,company:"
 msgid "Company"
-msgstr "Bedrijf"
+msgstr "Podjetje"
 
 msgctxt "field:stock.shipment.in,contact_address:"
 msgid "Contact Address"
-msgstr ""
+msgstr "Kontakt"
 
 msgctxt "field:stock.shipment.in,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.shipment.in,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in,effective_date:"
 msgid "Effective Date"
-msgstr "Effectieve datum"
+msgstr "Dejanski datum"
 
 msgctxt "field:stock.shipment.in,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:stock.shipment.in,incoming_moves:"
 msgid "Incoming Moves"
-msgstr ""
+msgstr "Vhodni promet"
 
 msgctxt "field:stock.shipment.in,inventory_moves:"
 msgid "Inventory Moves"
-msgstr ""
+msgstr "Notranji promet"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in,moves:"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Porekla"
 
 msgctxt "field:stock.shipment.in,planned_date:"
 msgid "Planned Date"
-msgstr ""
+msgstr "Načrtovan datum"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in,reference:"
 msgid "Reference"
-msgstr "Referentie"
+msgstr "Sklic"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in,supplier:"
 msgid "Supplier"
-msgstr "Leverancier"
+msgstr "Dobavitelj"
 
 msgctxt "field:stock.shipment.in,supplier_location:"
 msgid "Supplier Location"
-msgstr ""
+msgstr "Lokacija dobavitelja"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in,warehouse:"
 msgid "Warehouse"
-msgstr "Magazijn"
+msgstr "Skladišče"
 
 msgctxt "field:stock.shipment.in,warehouse_input:"
 msgid "Warehouse Input"
-msgstr ""
+msgstr "Prevzem v skladišče"
 
 msgctxt "field:stock.shipment.in,warehouse_storage:"
 msgid "Warehouse Storage"
-msgstr ""
+msgstr "Shramba v skladišče"
 
 msgctxt "field:stock.shipment.in,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.shipment.in,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in.return,code:"
 msgid "Code"
-msgstr "Code"
+msgstr "Šifra"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in.return,company:"
 msgid "Company"
-msgstr "Bedrijf"
+msgstr "Podjetje"
 
 msgctxt "field:stock.shipment.in.return,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.shipment.in.return,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in.return,effective_date:"
 msgid "Effective Date"
-msgstr "Effectieve datum"
+msgstr "Dejanski datum"
 
 msgctxt "field:stock.shipment.in.return,from_location:"
 msgid "From Location"
-msgstr ""
+msgstr "Iz lokacije"
 
 msgctxt "field:stock.shipment.in.return,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in.return,moves:"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Porekla"
 
 msgctxt "field:stock.shipment.in.return,planned_date:"
 msgid "Planned Date"
-msgstr ""
+msgstr "Načrtovan datum"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in.return,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in.return,reference:"
 msgid "Reference"
-msgstr "Referentie"
+msgstr "Sklic"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in.return,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
 msgctxt "field:stock.shipment.in.return,to_location:"
 msgid "To Location"
-msgstr ""
+msgstr "Na lokacijo"
 
 msgctxt "field:stock.shipment.in.return,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.shipment.in.return,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:stock.shipment.in.return.assign.failed,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:stock.shipment.in.return.assign.failed,moves:"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
 
-#, fuzzy
 msgctxt "field:stock.shipment.internal,code:"
 msgid "Code"
-msgstr "Code"
+msgstr "Šifra"
 
-#, fuzzy
 msgctxt "field:stock.shipment.internal,company:"
 msgid "Company"
-msgstr "Bedrijf"
+msgstr "Podjetje"
 
 msgctxt "field:stock.shipment.internal,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.shipment.internal,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:stock.shipment.internal,effective_date:"
 msgid "Effective Date"
-msgstr "Effectieve datum"
+msgstr "Dejanski datum"
 
 msgctxt "field:stock.shipment.internal,from_location:"
 msgid "From Location"
-msgstr ""
+msgstr "Iz lokacije"
 
 msgctxt "field:stock.shipment.internal,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:stock.shipment.internal,moves:"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
 
 msgctxt "field:stock.shipment.internal,planned_date:"
 msgid "Planned Date"
-msgstr ""
+msgstr "Načrtovan datum"
 
-#, fuzzy
 msgctxt "field:stock.shipment.internal,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:stock.shipment.internal,reference:"
 msgid "Reference"
-msgstr "Referentie"
+msgstr "Sklic"
 
-#, fuzzy
 msgctxt "field:stock.shipment.internal,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
 msgctxt "field:stock.shipment.internal,to_location:"
 msgid "To Location"
-msgstr ""
+msgstr "Na lokacijo"
 
 msgctxt "field:stock.shipment.internal,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.shipment.internal,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:stock.shipment.internal.assign.failed,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:stock.shipment.internal.assign.failed,moves:"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out,code:"
 msgid "Code"
-msgstr "Code"
+msgstr "Šifra"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out,company:"
 msgid "Company"
-msgstr "Bedrijf"
+msgstr "Podjetje"
 
 msgctxt "field:stock.shipment.out,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.shipment.out,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out,customer:"
 msgid "Customer"
-msgstr "Klant"
+msgstr "Kupec"
 
 msgctxt "field:stock.shipment.out,customer_location:"
 msgid "Customer Location"
-msgstr ""
+msgstr "Lokacija kupca"
 
 msgctxt "field:stock.shipment.out,delivery_address:"
 msgid "Delivery Address"
-msgstr ""
+msgstr "Prejemnik"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out,effective_date:"
 msgid "Effective Date"
-msgstr "Effectieve datum"
+msgstr "Dejanski datum"
 
 msgctxt "field:stock.shipment.out,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:stock.shipment.out,inventory_moves:"
 msgid "Inventory Moves"
-msgstr ""
+msgstr "Notranji promet"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out,moves:"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Porekla"
 
 msgctxt "field:stock.shipment.out,outgoing_moves:"
 msgid "Outgoing Moves"
-msgstr ""
+msgstr "Izhodni promet"
 
 msgctxt "field:stock.shipment.out,planned_date:"
 msgid "Planned Date"
-msgstr ""
+msgstr "Načrtovan datum"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out,reference:"
 msgid "Reference"
-msgstr "Referentie"
+msgstr "Sklic"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out,warehouse:"
 msgid "Warehouse"
-msgstr "Magazijn"
+msgstr "Skladišče"
 
 msgctxt "field:stock.shipment.out,warehouse_output:"
 msgid "Warehouse Output"
-msgstr ""
+msgstr "Izdaja iz skladišča"
 
 msgctxt "field:stock.shipment.out,warehouse_storage:"
 msgid "Warehouse Storage"
-msgstr ""
+msgstr "Shramba v skladišču"
 
 msgctxt "field:stock.shipment.out,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.shipment.out,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:stock.shipment.out.assign.failed,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:stock.shipment.out.assign.failed,inventory_moves:"
 msgid "Inventory Moves"
-msgstr ""
+msgstr "Inventarni promet"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out.return,code:"
 msgid "Code"
-msgstr "Code"
+msgstr "Šifra"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out.return,company:"
 msgid "Company"
-msgstr "Bedrijf"
+msgstr "Podjetje"
 
 msgctxt "field:stock.shipment.out.return,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:stock.shipment.out.return,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out.return,customer:"
 msgid "Customer"
-msgstr "Klant"
+msgstr "Kupec"
 
 msgctxt "field:stock.shipment.out.return,customer_location:"
 msgid "Customer Location"
-msgstr ""
+msgstr "Lokacija kupca"
 
 msgctxt "field:stock.shipment.out.return,delivery_address:"
 msgid "Delivery Address"
-msgstr ""
+msgstr "Prejemnik"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out.return,effective_date:"
 msgid "Effective Date"
-msgstr "Effectieve datum"
+msgstr "Dejanski datum"
 
 msgctxt "field:stock.shipment.out.return,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:stock.shipment.out.return,incoming_moves:"
 msgid "Incoming Moves"
-msgstr ""
+msgstr "Vhodni promet"
 
 msgctxt "field:stock.shipment.out.return,inventory_moves:"
 msgid "Inventory Moves"
-msgstr ""
+msgstr "Inventarni promet"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out.return,moves:"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Porekla"
 
 msgctxt "field:stock.shipment.out.return,planned_date:"
 msgid "Planned Date"
-msgstr ""
+msgstr "Načrtovan datum"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out.return,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out.return,reference:"
 msgid "Reference"
-msgstr "Referentie"
+msgstr "Sklic"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out.return,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
-#, fuzzy
 msgctxt "field:stock.shipment.out.return,warehouse:"
 msgid "Warehouse"
-msgstr "Magazijn"
+msgstr "Skladišče"
 
 msgctxt "field:stock.shipment.out.return,warehouse_input:"
 msgid "Warehouse Input"
-msgstr ""
+msgstr "Prevzem v skladišče"
 
 msgctxt "field:stock.shipment.out.return,warehouse_storage:"
 msgid "Warehouse Storage"
-msgstr ""
+msgstr "Shramba v skladišče"
 
 msgctxt "field:stock.shipment.out.return,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:stock.shipment.out.return,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "help:party.party,customer_location:"
 msgid "The default destination location when sending products to the party."
-msgstr ""
+msgstr "Privzeta ciljna lokacija pri odpremi izdelkov k stranki."
 
 msgctxt "help:party.party,supplier_location:"
 msgid "The default source location when receiving products from the party."
-msgstr ""
+msgstr "Privzeta izvorna lokacija pri prevzemu izdelkov od stranke."
 
 msgctxt "help:product.by_location.start,forecast_date:"
 msgid ""
@@ -1110,6 +1058,9 @@ msgid ""
 "* An empty value is an infinite date in the future.\n"
 "* A date in the past will provide historical values."
 msgstr ""
+"Omogoča izračun predvidene količine na zalogi na ta dan.\n"
+"* Prazno polje pomeni neskončen datum v prihodnost.\n"
+"* Datum v preteklosti daje pretekle vrednosti."
 
 msgctxt "help:stock.products_by_locations.start,forecast_date:"
 msgid ""
@@ -1117,1330 +1068,1221 @@ msgid ""
 "* An empty value is an infinite date in the future.\n"
 "* A date in the past will provide historical values."
 msgstr ""
+"Omogoča izračun predvidene količine na zalogi na ta dan.\n"
+"* Prazno polje pomeni neskončen datum v prihodnost.\n"
+"* Datum v preteklosti daje pretekle vrednosti."
 
 msgctxt "model:ir.action,name:act_inventory_form"
 msgid "Inventories"
-msgstr ""
+msgstr "Popisi"
 
 msgctxt "model:ir.action,name:act_location_form"
 msgid "Locations"
-msgstr ""
+msgstr "Lokacije"
 
 msgctxt "model:ir.action,name:act_location_quantity_tree"
 msgid "Locations"
-msgstr ""
+msgstr "Lokacije"
 
 msgctxt "model:ir.action,name:act_location_tree"
 msgid "Locations"
-msgstr ""
+msgstr "Lokacije"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_move_form"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_period_list"
 msgid "Periods"
-msgstr "Perioden"
+msgstr "Obdobja"
 
 msgctxt "model:ir.action,name:act_product_quantities_warehouse"
 msgid "Product Quantities By Warehouse"
-msgstr ""
+msgstr "Količine izdelkov po skladiščih"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_products_by_locations"
 msgid "Products"
-msgstr "Producten"
+msgstr "Izdelki"
 
 msgctxt "model:ir.action,name:act_shipment_in_form"
 msgid "Supplier Shipments"
-msgstr ""
+msgstr "Prevzemnice"
 
 msgctxt "model:ir.action,name:act_shipment_in_return_form"
 msgid "Supplier Return Shipments"
-msgstr ""
+msgstr "Vrnjene prevzemnice"
 
 msgctxt "model:ir.action,name:act_shipment_internal_form"
 msgid "Internal Shipments"
-msgstr ""
+msgstr "Notranje odpremnice"
 
 msgctxt "model:ir.action,name:act_shipment_out_form"
 msgid "Customer Shipments"
-msgstr ""
+msgstr "Odpremnice"
 
 msgctxt "model:ir.action,name:act_shipment_out_form2"
 msgid "Customer Shipments"
-msgstr ""
+msgstr "Odpremnice"
 
 msgctxt "model:ir.action,name:act_shipment_out_form3"
 msgid "Supplier Shipments"
-msgstr ""
+msgstr "Prevzeminice"
 
 msgctxt "model:ir.action,name:act_shipment_out_return_form"
 msgid "Customer Return Shipments"
-msgstr ""
+msgstr "Vrnjene odpremnice"
 
 msgctxt "model:ir.action,name:act_stock_configuration_form"
 msgid "Stock Configuration"
-msgstr ""
+msgstr "Konfiguracija zaloge"
 
 msgctxt "model:ir.action,name:create_shipment_out_return"
 msgid "Create Return Shipment"
-msgstr ""
+msgstr "Izdelava vrnjene pošiljke"
 
 msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
 msgid "Restocking List"
-msgstr ""
+msgstr "Obnova zaloge"
 
 msgctxt "model:ir.action,name:report_shipment_internal"
 msgid "Internal Shipment"
-msgstr ""
+msgstr "Notranja odpremnica"
 
 msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
 msgid "Delivery Note"
-msgstr ""
+msgstr "Dobavnica"
 
 msgctxt "model:ir.action,name:report_shipment_out_picking_list"
 msgid "Picking List"
-msgstr ""
+msgstr "Prevzemni list"
 
 msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
 msgid "Restocking List"
-msgstr ""
+msgstr "Obnova zaloge"
 
 msgctxt "model:ir.action,name:wizard_product_by_location"
 msgid "Product by Locations"
-msgstr ""
+msgstr "Izdelek po lokacijah"
 
 msgctxt "model:ir.action,name:wizard_product_quantities_warehouse"
 msgid "Product Quantities By Warehouse"
-msgstr ""
+msgstr "Količine izdelkov po skladiščih"
 
 msgctxt "model:ir.action,name:wizard_products_by_locations"
 msgid "Products by Locations"
-msgstr ""
+msgstr "Izdelki po lokacijah"
 
 msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
 msgid "Assign Purchase Return Shipment"
-msgstr ""
+msgstr "Dodelitev vrnjene prevzemnice"
 
 msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
 msgid "Assign Shipment Internal"
-msgstr ""
+msgstr "Dodelitev notranje odpremnice"
 
 msgctxt "model:ir.action,name:wizard_shipment_out_assign"
 msgid "Assign Shipment Out"
-msgstr ""
+msgstr "Dodelitev odpremnice"
 
 msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
 msgid "All"
-msgstr ""
+msgstr "Vse"
 
-#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
 msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
 msgid "All"
-msgstr ""
+msgstr "Vse"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
 msgid "From Suppliers"
-msgstr ""
+msgstr "Od dobaviteljev"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
 msgid "From Suppliers Waiting"
-msgstr ""
+msgstr "Od dobaviteljev čakajoče"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
 msgid "To Customers"
-msgstr ""
+msgstr "Do kupcev"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
 msgid "All"
-msgstr ""
+msgstr "Vse"
 
-#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
 msgid "Received"
-msgstr ""
+msgstr "Prejeto"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
 msgid "All"
-msgstr ""
+msgstr "Vse"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
 msgid "Assigned"
-msgstr ""
+msgstr "Dodeljeno"
 
-#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
-#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
 msgid "Waiting"
-msgstr "In afwachting"
+msgstr "Čakajoče"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
 msgid "All"
-msgstr ""
+msgstr "Vse"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
 msgid "Assigned"
-msgstr ""
+msgstr "Dodeljeno"
 
-#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
-#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
 msgid "Waiting"
-msgstr "In afwachting"
+msgstr "Čakajoče"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
 msgid "All"
-msgstr ""
+msgstr "Vse"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
 msgid "Assigned"
-msgstr ""
+msgstr "Dodeljeno"
 
-#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
 msgid "Packed"
-msgstr ""
+msgstr "Zapakirano"
 
-#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
 msgid "Waiting"
-msgstr "In afwachting"
+msgstr "Čakajoče"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
 msgid "All"
-msgstr ""
+msgstr "Vse"
 
-#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
 msgid "Received"
-msgstr ""
+msgstr "Prejeto"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_in"
 msgid "Supplier Shipment"
-msgstr ""
+msgstr "Prevzemnica"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
 msgid "Supplier Return Shipment"
-msgstr ""
+msgstr "Vrnjena prevzemnica"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_internal"
 msgid "Internal Shipment"
-msgstr ""
+msgstr "Notranja odpremnica"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_out"
 msgid "Customer Shipment"
-msgstr ""
+msgstr "Odpremnica"
 
 msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
 msgid "Customer Return Shipment"
-msgstr ""
+msgstr "Vrnjena odpremnica"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
 msgid "Supplier Shipment"
-msgstr ""
+msgstr "Prevzemnica"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
 msgid "Supplier Return Shipment"
-msgstr ""
+msgstr "Vrnjena prevzemnica"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
 msgid "Internal Shipment"
-msgstr ""
+msgstr "Notranja odpremnica"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
 msgid "Customer Shipment"
-msgstr ""
+msgstr "Odpremnica"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
 msgid "Customer Return Shipment"
-msgstr ""
+msgstr "Vrnjena odpremnica"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
-msgstr "Instellingen"
+msgstr "Nastavitve"
 
 msgctxt "model:ir.ui.menu,name:menu_inventory_form"
 msgid "Inventories"
-msgstr ""
+msgstr "Popisi"
 
 msgctxt "model:ir.ui.menu,name:menu_location_form"
 msgid "Locations"
-msgstr ""
+msgstr "Lokacije"
 
 msgctxt "model:ir.ui.menu,name:menu_location_tree"
 msgid "Locations"
-msgstr ""
+msgstr "Lokacije"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_move_form"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_period_list"
 msgid "Periods"
-msgstr "Perioden"
+msgstr "Obdobja"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
-msgstr "Rapportage"
+msgstr "Poročila"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
 msgid "Supplier Shipments"
-msgstr ""
+msgstr "Prevzemnice"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
 msgid "Supplier Return Shipments"
-msgstr ""
+msgstr "Vrnjene prevzemnice"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
 msgid "Internal Shipments"
-msgstr ""
+msgstr "Notranje odpremnice"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
 msgid "Customer Shipments"
-msgstr ""
+msgstr "Odpremnice"
 
 msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
 msgid "Customer Return Shipments"
-msgstr ""
+msgstr "Vrnjene odpremnice"
 
 msgctxt "model:ir.ui.menu,name:menu_stock"
 msgid "Inventory & Stock"
-msgstr ""
+msgstr "Zaloga"
 
 msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
 msgid "Stock Configuration"
-msgstr ""
+msgstr "Konfiguracija"
 
 msgctxt "model:product.by_location.start,name:"
 msgid "Product by Location"
-msgstr ""
+msgstr "Izdelek po lokaciji"
 
-#, fuzzy
 msgctxt "model:res.group,name:group_stock"
 msgid "Stock"
-msgstr "Voorraad"
+msgstr "Zaloga"
 
 msgctxt "model:res.group,name:group_stock_admin"
 msgid "Stock Administration"
-msgstr ""
+msgstr "Zaloga - vodenje"
 
 msgctxt "model:res.group,name:group_stock_force_assignment"
 msgid "Stock Force Assignment"
-msgstr ""
+msgstr "Zaloga - rezervacija"
 
 msgctxt "model:stock.configuration,name:"
 msgid "Stock Configuration"
-msgstr ""
+msgstr "Konfiguracija zaloge"
 
 msgctxt "model:stock.inventory,name:"
 msgid "Stock Inventory"
-msgstr ""
+msgstr "Popis"
 
 msgctxt "model:stock.inventory.line,name:"
 msgid "Stock Inventory Line"
-msgstr ""
+msgstr "Postavka popisa"
 
 msgctxt "model:stock.location,name:"
 msgid "Stock Location"
-msgstr ""
+msgstr "Lokacija"
 
-#, fuzzy
 msgctxt "model:stock.location,name:location_customer"
 msgid "Customer"
-msgstr "Klant"
+msgstr "Kupec"
 
 msgctxt "model:stock.location,name:location_input"
 msgid "Input Zone"
-msgstr ""
+msgstr "Prevzem"
 
 msgctxt "model:stock.location,name:location_lost_found"
 msgid "Lost and Found"
-msgstr ""
+msgstr "Izgubljeno/najdeno"
 
 msgctxt "model:stock.location,name:location_output"
 msgid "Output Zone"
-msgstr ""
+msgstr "Izdaja"
 
 msgctxt "model:stock.location,name:location_storage"
 msgid "Storage Zone"
-msgstr ""
+msgstr "Shramba"
 
-#, fuzzy
 msgctxt "model:stock.location,name:location_supplier"
 msgid "Supplier"
-msgstr "Leverancier"
+msgstr "Dobavitelj"
 
-#, fuzzy
 msgctxt "model:stock.location,name:location_warehouse"
 msgid "Warehouse"
-msgstr "Magazijn"
+msgstr "Skladišče"
 
 msgctxt "model:stock.move,name:"
 msgid "Stock Move"
-msgstr ""
+msgstr "Promet zaloge"
 
 msgctxt "model:stock.period,name:"
 msgid "Stock Period"
-msgstr ""
+msgstr "Obdobje zaloge"
 
 msgctxt "model:stock.period.cache,name:"
 msgid "Stock Period Cache"
-msgstr ""
+msgstr "Predpomnjeno obdobje zaloge"
 
 msgctxt "model:stock.product_quantities_warehouse,name:"
 msgid "Product Quantities By Warehouse"
-msgstr ""
+msgstr "Količine izdelkov po skladiščih"
 
 msgctxt "model:stock.product_quantities_warehouse.start,name:"
 msgid "Product Quantities By Warehouse"
-msgstr ""
+msgstr "Količine izdelkov po skladiščih"
 
 msgctxt "model:stock.products_by_locations.start,name:"
 msgid "Products by Locations"
-msgstr ""
+msgstr "Izdelki po lokacijah"
 
 msgctxt "model:stock.shipment.in,name:"
 msgid "Supplier Shipment"
-msgstr ""
+msgstr "Prevzemnica"
 
 msgctxt "model:stock.shipment.in.return,name:"
 msgid "Supplier Return Shipment"
-msgstr ""
+msgstr "Vrnjena prevzemnica"
 
 msgctxt "model:stock.shipment.in.return.assign.failed,name:"
 msgid "Assign Supplier Return Shipment"
-msgstr ""
+msgstr "Dodelitev vrnjene prevzemnice"
 
 msgctxt "model:stock.shipment.internal,name:"
 msgid "Internal Shipment"
-msgstr ""
+msgstr "Notranja odpremnica"
 
 msgctxt "model:stock.shipment.internal.assign.failed,name:"
 msgid "Assign Shipment Internal"
-msgstr ""
+msgstr "Dodelitev notranje odpremnice"
 
 msgctxt "model:stock.shipment.out,name:"
 msgid "Customer Shipment"
-msgstr ""
+msgstr "Odpremnica"
 
 msgctxt "model:stock.shipment.out.assign.failed,name:"
 msgid "Assign Shipment Out"
-msgstr ""
+msgstr "Dodelitev odpremnice"
 
 msgctxt "model:stock.shipment.out.return,name:"
 msgid "Customer Return Shipment"
-msgstr ""
+msgstr "Vrnjena odpremnica"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "/"
-msgstr ""
+msgstr "/"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Code:"
-msgstr ""
+msgstr "Šifra:"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "E-Mail:"
-msgstr "E-mail:"
+msgstr "E-pošta:"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "From Location"
-msgstr ""
+msgstr "Iz lokacije"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Phone:"
-msgstr "Telefoon:"
+msgstr "Telefon:"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Planned Date:"
-msgstr ""
+msgstr "Načrtovan datum:"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Product"
-msgstr "Producten"
+msgstr "Izdelek"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Reference:"
-msgstr "Referentie:"
+msgstr "Sklic:"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Restocking List"
-msgstr ""
+msgstr "Obnova zaloge"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Supplier:"
-msgstr ""
+msgstr "Dobavitelj:"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "To Location"
-msgstr ""
+msgstr "Na lokacijo"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "VAT Number:"
-msgstr "BTW-nummer:"
+msgstr "DDV številka:"
 
 msgctxt "odt:stock.shipment.in.restocking_list:"
 msgid "Warehouse:"
-msgstr ""
+msgstr "Skladišče:"
 
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "/"
-msgstr ""
+msgstr "/"
 
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "Code:"
-msgstr ""
+msgstr "Šifra:"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "E-Mail:"
-msgstr "E-mail:"
+msgstr "E-pošta:"
 
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "From Location"
-msgstr ""
+msgstr "Iz lokacije"
 
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "From Location:"
-msgstr ""
+msgstr "Iz lokacije:"
 
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "Internal Shipment"
-msgstr ""
+msgstr "Notranja odpremnica"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "Phone:"
-msgstr "Telefoon:"
+msgstr "Telefon:"
 
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "Planned Date:"
-msgstr ""
+msgstr "Načrtovan datum:"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "Product"
-msgstr "Producten"
+msgstr "Izdelek"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "Reference:"
-msgstr "Referentie:"
+msgstr "Sklic:"
 
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "To Location"
-msgstr ""
+msgstr "Na lokacijo"
 
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "To Location:"
-msgstr ""
+msgstr "Na lokacijo:"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.internal.report:"
 msgid "VAT Number:"
-msgstr "BTW-nummer:"
+msgstr "DDV številka:"
 
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "/"
-msgstr ""
+msgstr "/"
 
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Customer Code:"
-msgstr ""
+msgstr "Šifra kupca:"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Date:"
 msgstr "Datum:"
 
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Delivery Note"
-msgstr ""
+msgstr "Dobavnica"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "E-Mail:"
-msgstr "E-mail:"
+msgstr "E-pošta:"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Phone:"
-msgstr "Telefoon:"
+msgstr "Telefon:"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Product"
-msgstr "Producten"
+msgstr "Izdelek"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Reference:"
-msgstr "Referentie:"
+msgstr "Sklic:"
 
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "Shipment Number:"
-msgstr ""
+msgstr "Dobavnica št.:"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.delivery_note:"
 msgid "VAT Number:"
-msgstr "BTW-nummer:"
+msgstr "DDV številka:"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "/"
-msgstr ""
+msgstr "/"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Code:"
-msgstr ""
+msgstr "Šifra:"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Customer:"
-msgstr ""
+msgstr "Kupec:"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "E-Mail:"
-msgstr "E-mail:"
+msgstr "E-pošta:"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "From Location"
-msgstr ""
+msgstr "Iz lokacije"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Phone:"
-msgstr "Telefoon:"
+msgstr "Telefon:"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Picking List"
-msgstr ""
+msgstr "Prevzemni list"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Planned Date:"
-msgstr ""
+msgstr "Načrtovan datum:"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Product"
-msgstr "Producten"
+msgstr "Izdelek"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Reference:"
-msgstr "Referentie:"
+msgstr "Sklic:"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "To Location"
-msgstr ""
+msgstr "Na lokacijo"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "VAT Number:"
-msgstr "BTW-nummer:"
+msgstr "DDV številka:"
 
 msgctxt "odt:stock.shipment.out.picking_list:"
 msgid "Warehouse:"
-msgstr ""
+msgstr "Skladišče:"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "/"
-msgstr ""
+msgstr "/"
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Code:"
-msgstr ""
+msgstr "Šifra:"
+
+msgctxt "odt:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Terjatve do kupcev"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "E-Mail:"
-msgstr "E-mail:"
+msgstr "E-pošta:"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "From Location"
-msgstr ""
+msgstr "Iz lokacije"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Phone:"
-msgstr "Telefoon:"
+msgstr "Telefon:"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Planned Date:"
-msgstr ""
+msgstr "Načrtovan datum:"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Product"
-msgstr "Producten"
+msgstr "Izdelek"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Reference:"
-msgstr "Referentie:"
+msgstr "Sklic:"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Restocking List"
-msgstr ""
-
-msgctxt "odt:stock.shipment.out.return.restocking_list:"
-msgid "Supplier:"
-msgstr ""
+msgstr "Obnova zaloge"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "To Location"
-msgstr ""
+msgstr "Na lokacijo"
 
-#, fuzzy
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "VAT Number:"
-msgstr "BTW-nummer:"
+msgstr "DDV številka:"
 
 msgctxt "odt:stock.shipment.out.return.restocking_list:"
 msgid "Warehouse:"
-msgstr ""
+msgstr "Skladišče:"
 
-#, fuzzy
 msgctxt "selection:stock.inventory,state:"
 msgid "Canceled"
-msgstr "Geannuleerd"
+msgstr "Preklicano"
 
-#, fuzzy
 msgctxt "selection:stock.inventory,state:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
-#, fuzzy
 msgctxt "selection:stock.inventory,state:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
-#, fuzzy
 msgctxt "selection:stock.location,type:"
 msgid "Customer"
-msgstr "Klant"
+msgstr "Kupec"
 
 msgctxt "selection:stock.location,type:"
 msgid "Lost and Found"
-msgstr ""
+msgstr "Izgubljeno/najdeno"
 
 msgctxt "selection:stock.location,type:"
 msgid "Production"
-msgstr ""
+msgstr "Proizvodnja"
 
 msgctxt "selection:stock.location,type:"
 msgid "Storage"
-msgstr ""
+msgstr "Shramba"
 
-#, fuzzy
 msgctxt "selection:stock.location,type:"
 msgid "Supplier"
-msgstr "Leverancier"
+msgstr "Dobavitelj"
 
-#, fuzzy
 msgctxt "selection:stock.location,type:"
 msgid "View"
-msgstr "Overzicht"
+msgstr "Vpogled"
 
-#, fuzzy
 msgctxt "selection:stock.location,type:"
 msgid "Warehouse"
-msgstr "Magazijn"
+msgstr "Skladišče"
 
 msgctxt "selection:stock.move,state:"
 msgid "Assigned"
-msgstr ""
+msgstr "Dodeljeno"
 
-#, fuzzy
 msgctxt "selection:stock.move,state:"
 msgid "Canceled"
-msgstr "Geannuleerd"
+msgstr "Preklicano"
 
-#, fuzzy
 msgctxt "selection:stock.move,state:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
-#, fuzzy
 msgctxt "selection:stock.move,state:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
 msgctxt "selection:stock.period,state:"
 msgid "Closed"
-msgstr ""
+msgstr "Zaprto"
 
-#, fuzzy
 msgctxt "selection:stock.period,state:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.in,state:"
 msgid "Canceled"
-msgstr "Geannuleerd"
+msgstr "Preklicano"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.in,state:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.in,state:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
 msgctxt "selection:stock.shipment.in,state:"
 msgid "Received"
-msgstr ""
+msgstr "Prejeto"
 
 msgctxt "selection:stock.shipment.in.return,state:"
 msgid "Assigned"
-msgstr ""
+msgstr "Dodeljeno"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.in.return,state:"
 msgid "Canceled"
-msgstr "Geannuleerd"
+msgstr "Preklicano"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.in.return,state:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.in.return,state:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.in.return,state:"
 msgid "Waiting"
-msgstr "In afwachting"
+msgstr "Čakajoče"
 
 msgctxt "selection:stock.shipment.internal,state:"
 msgid "Assigned"
-msgstr ""
+msgstr "Dodeljeno"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.internal,state:"
 msgid "Canceled"
-msgstr "Geannuleerd"
+msgstr "Preklicano"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.internal,state:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.internal,state:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.internal,state:"
 msgid "Waiting"
-msgstr "In afwachting"
+msgstr "Čakajoče"
 
 msgctxt "selection:stock.shipment.out,state:"
 msgid "Assigned"
-msgstr ""
+msgstr "Dodeljeno"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.out,state:"
 msgid "Canceled"
-msgstr "Geannuleerd"
+msgstr "Preklicano"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.out,state:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.out,state:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
 msgctxt "selection:stock.shipment.out,state:"
 msgid "Packed"
-msgstr ""
+msgstr "Zapakirano"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.out,state:"
 msgid "Waiting"
-msgstr "In afwachting"
+msgstr "Čakajoče"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.out.return,state:"
 msgid "Canceled"
-msgstr "Geannuleerd"
+msgstr "Preklicano"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.out.return,state:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
-#, fuzzy
 msgctxt "selection:stock.shipment.out.return,state:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
 msgctxt "selection:stock.shipment.out.return,state:"
 msgid "Received"
-msgstr ""
+msgstr "Prejeto"
 
-#, fuzzy
 msgctxt "view:party.party:"
 msgid "Stock"
-msgstr "Voorraad"
+msgstr "Zaloga"
 
 msgctxt "view:product.by_location.start:"
 msgid "Product by Location"
-msgstr ""
+msgstr "Izdelek po lokaciji"
 
-#, fuzzy
 msgctxt "view:product.product:"
 msgid "Products"
-msgstr "Producten"
+msgstr "Izdelki"
 
 msgctxt "view:stock.configuration:"
 msgid "Stock Configuration"
-msgstr ""
+msgstr "Konfiguracija zaloge"
 
 msgctxt "view:stock.inventory.line:"
 msgid "Inventory Line"
-msgstr ""
+msgstr "Postavka popisa"
 
 msgctxt "view:stock.inventory.line:"
 msgid "Inventory Lines"
-msgstr ""
+msgstr "Postavke popisa"
 
 msgctxt "view:stock.inventory:"
 msgid "Add an inventory line for each missing products"
-msgstr ""
+msgstr "Dodaj postavko popisa za vsak manjkajoči izdelek"
 
-#, fuzzy
 msgctxt "view:stock.inventory:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Preklic"
 
 msgctxt "view:stock.inventory:"
 msgid "Complete Inventory"
-msgstr ""
+msgstr "Izpolnitev popisa"
 
-#, fuzzy
 msgctxt "view:stock.inventory:"
 msgid "Confirm"
-msgstr "Bevestig"
+msgstr "Potrditev"
 
 msgctxt "view:stock.inventory:"
 msgid "Inventories"
-msgstr ""
+msgstr "Popisi"
 
 msgctxt "view:stock.inventory:"
 msgid "Inventory"
-msgstr ""
+msgstr "Popis"
 
 msgctxt "view:stock.location:"
 msgid "Location"
-msgstr ""
+msgstr "Lokacija"
 
 msgctxt "view:stock.location:"
 msgid "Location Quantity"
-msgstr ""
+msgstr "Količina na lokaciji"
 
 msgctxt "view:stock.location:"
 msgid "Locations"
-msgstr ""
+msgstr "Lokacije"
 
-#, fuzzy
 msgctxt "view:stock.move:"
 msgid "Move"
-msgstr "Boeking"
+msgstr "Promet"
 
-#, fuzzy
 msgctxt "view:stock.move:"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
 
 msgctxt "view:stock.period.cache:"
 msgid "Period Cache"
-msgstr ""
+msgstr "Predpomnjeno obdobje"
 
 msgctxt "view:stock.period.cache:"
 msgid "Period Caches"
-msgstr ""
+msgstr "Predpomnjena obdobja"
 
-#, fuzzy
 msgctxt "view:stock.period:"
 msgid "Close"
-msgstr "Sluiten"
+msgstr "Zaključitev"
 
-#, fuzzy
 msgctxt "view:stock.period:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
-#, fuzzy
 msgctxt "view:stock.period:"
 msgid "Period"
-msgstr "Periode"
+msgstr "Obdobje"
 
-#, fuzzy
 msgctxt "view:stock.period:"
 msgid "Periods"
-msgstr "Perioden"
+msgstr "Obdobja"
 
 msgctxt "view:stock.product_quantities_warehouse.start:"
 msgid "Product Quantities By Warehouse"
-msgstr ""
+msgstr "Količine izdelkov po skladiščih"
 
 msgctxt "view:stock.product_quantities_warehouse:"
 msgid "Product Quantities By Warehouse"
-msgstr ""
+msgstr "Količine izdelkov po skladiščih"
 
 msgctxt "view:stock.products_by_locations.start:"
 msgid "Products by Locations"
-msgstr ""
+msgstr "Izdelki po lokacijah"
 
 msgctxt "view:stock.shipment.in.return.assign.failed:"
 msgid "Unable to Assign"
-msgstr ""
+msgstr "Dodelitev ni možna"
 
 msgctxt "view:stock.shipment.in.return.assign.failed:"
 msgid "Unable to assign those products:"
-msgstr ""
+msgstr "Dodelitev ni možna za naslednje izdelke:"
 
 msgctxt "view:stock.shipment.in.return:"
 msgid "Assign"
-msgstr ""
+msgstr "Dodelitev"
 
-#, fuzzy
 msgctxt "view:stock.shipment.in.return:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Preklic"
 
-#, fuzzy
 msgctxt "view:stock.shipment.in.return:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
-#, fuzzy
 msgctxt "view:stock.shipment.in.return:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
 msgctxt "view:stock.shipment.in.return:"
 msgid "Supplier Return Shipment"
-msgstr ""
+msgstr "Vrnjena prevzemnica"
 
 msgctxt "view:stock.shipment.in.return:"
 msgid "Supplier Return Shipments"
-msgstr ""
+msgstr "Vrnjene prevzeminice"
 
 msgctxt "view:stock.shipment.in.return:"
 msgid "Wait"
-msgstr ""
+msgstr "Čakanje"
 
-#, fuzzy
 msgctxt "view:stock.shipment.in:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Preklic"
 
-#, fuzzy
 msgctxt "view:stock.shipment.in:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
 msgctxt "view:stock.shipment.in:"
 msgid "Incoming Moves"
-msgstr ""
+msgstr "Vhodni promet"
 
 msgctxt "view:stock.shipment.in:"
 msgid "Inventory Moves"
-msgstr ""
+msgstr "Inventarni promet"
 
 msgctxt "view:stock.shipment.in:"
 msgid "Receive"
-msgstr ""
+msgstr "Prejem"
 
-#, fuzzy
 msgctxt "view:stock.shipment.in:"
 msgid "Reset to Draft"
-msgstr "Terug naar concept"
+msgstr "Ponastavitev"
 
 msgctxt "view:stock.shipment.in:"
 msgid "Supplier Shipment"
-msgstr ""
+msgstr "Prevzemnica"
 
 msgctxt "view:stock.shipment.in:"
 msgid "Supplier Shipments"
-msgstr ""
+msgstr "Prevzemnice"
 
 msgctxt "view:stock.shipment.internal.assign.failed:"
 msgid "Unable to Assign"
-msgstr ""
+msgstr "Dodelitev ni možna"
 
 msgctxt "view:stock.shipment.internal.assign.failed:"
 msgid "Unable to assign those products:"
-msgstr ""
+msgstr "Dodelitev ni možna za naslednje izdelke:"
 
 msgctxt "view:stock.shipment.internal:"
 msgid "Assign"
-msgstr ""
+msgstr "Dodelitev"
 
-#, fuzzy
 msgctxt "view:stock.shipment.internal:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Preklic"
 
-#, fuzzy
 msgctxt "view:stock.shipment.internal:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
-#, fuzzy
 msgctxt "view:stock.shipment.internal:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
 msgctxt "view:stock.shipment.internal:"
 msgid "Internal Shipment"
-msgstr ""
+msgstr "Notranja odpremnica"
 
 msgctxt "view:stock.shipment.internal:"
 msgid "Internal Shipments"
-msgstr ""
+msgstr "Notranje odpremnice"
 
-#, fuzzy
 msgctxt "view:stock.shipment.internal:"
 msgid "Waiting"
-msgstr "In afwachting"
+msgstr "Čakajoče"
 
 msgctxt "view:stock.shipment.out.assign.failed:"
 msgid "Unable to Assign"
-msgstr ""
+msgstr "Dodelitev ni možna"
 
 msgctxt "view:stock.shipment.out.assign.failed:"
 msgid "Unable to assign those products:"
-msgstr ""
+msgstr "Dodelitev ni možna za naslednje izdelke:"
 
-#, fuzzy
 msgctxt "view:stock.shipment.out.return:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Preklic"
 
 msgctxt "view:stock.shipment.out.return:"
 msgid "Customer Return Shipment"
-msgstr ""
+msgstr "Vrnjena odpremnica"
 
 msgctxt "view:stock.shipment.out.return:"
 msgid "Customer Return Shipments"
-msgstr ""
+msgstr "Vrnjene odpremnice"
 
-#, fuzzy
 msgctxt "view:stock.shipment.out.return:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
-#, fuzzy
 msgctxt "view:stock.shipment.out.return:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
 msgctxt "view:stock.shipment.out.return:"
 msgid "Incoming Moves"
-msgstr ""
+msgstr "Vhodni promet"
 
 msgctxt "view:stock.shipment.out.return:"
 msgid "Inventory Moves"
-msgstr ""
+msgstr "Inventarni promet"
 
 msgctxt "view:stock.shipment.out.return:"
 msgid "Received"
-msgstr ""
+msgstr "Prejeto"
 
 msgctxt "view:stock.shipment.out:"
 msgid "Assign"
-msgstr ""
+msgstr "Dodelitev"
 
-#, fuzzy
 msgctxt "view:stock.shipment.out:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Preklic"
 
 msgctxt "view:stock.shipment.out:"
 msgid "Customer Shipment"
-msgstr ""
+msgstr "Odpremnica"
 
 msgctxt "view:stock.shipment.out:"
 msgid "Customer Shipments"
-msgstr ""
+msgstr "Odpremnice"
 
-#, fuzzy
 msgctxt "view:stock.shipment.out:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
-#, fuzzy
 msgctxt "view:stock.shipment.out:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
 msgctxt "view:stock.shipment.out:"
 msgid "Inventory Moves"
-msgstr ""
+msgstr "Inventarni promet"
 
 msgctxt "view:stock.shipment.out:"
 msgid "Make shipment"
-msgstr ""
+msgstr "Odprema"
 
 msgctxt "view:stock.shipment.out:"
 msgid "Outgoing Moves"
-msgstr ""
+msgstr "Izhodni promet"
 
-#, fuzzy
 msgctxt "view:stock.shipment.out:"
 msgid "Waiting"
-msgstr "In afwachting"
+msgstr "Čakajoče"
 
-#, fuzzy
 msgctxt "wizard_button:product.by_location,start,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Preklic"
 
-#, fuzzy
 msgctxt "wizard_button:product.by_location,start,open:"
 msgid "Open"
-msgstr "Open"
+msgstr "Odpri"
 
-#, fuzzy
 msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Preklic"
 
-#, fuzzy
 msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
 msgid "Open"
-msgstr "Open"
+msgstr "Odpri"
 
-#, fuzzy
 msgctxt "wizard_button:stock.products_by_locations,start,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Preklic"
 
-#, fuzzy
 msgctxt "wizard_button:stock.products_by_locations,start,open:"
 msgid "Open"
-msgstr "Open"
+msgstr "Odpri"
 
-#, fuzzy
 msgctxt "wizard_button:stock.shipment.in.return.assign,failed,end:"
 msgid "Ok"
-msgstr "Oké"
+msgstr "V redu"
 
 msgctxt "wizard_button:stock.shipment.in.return.assign,failed,force:"
 msgid "Force Assign"
-msgstr ""
+msgstr "Rezervacija"
 
-#, fuzzy
 msgctxt "wizard_button:stock.shipment.internal.assign,failed,end:"
 msgid "Ok"
-msgstr "Oké"
+msgstr "V redu"
 
 msgctxt "wizard_button:stock.shipment.internal.assign,failed,force:"
 msgid "Force Assign"
-msgstr ""
+msgstr "Rezervacija"
 
-#, fuzzy
 msgctxt "wizard_button:stock.shipment.out.assign,failed,end:"
 msgid "Ok"
-msgstr "Oké"
+msgstr "V redu"
 
 msgctxt "wizard_button:stock.shipment.out.assign,failed,force:"
 msgid "Force Assign"
-msgstr ""
+msgstr "Rezervacija"
diff --git a/location.py b/location.py
index 13cc197..2d9afdf 100644
--- a/location.py
+++ b/location.py
@@ -4,7 +4,7 @@ import datetime
 from decimal import Decimal
 from trytond.model import ModelView, ModelSQL, fields
 from trytond.wizard import Wizard, StateView, Button, StateAction
-from trytond.backend import TableHandler
+from trytond import backend
 from trytond.pyson import Not, Bool, Eval, Equal, PYSONEncoder, Date
 from trytond.transaction import Transaction
 from trytond.pool import Pool, PoolMeta
@@ -97,13 +97,15 @@ class Location(ModelSQL, ModelView):
         cls._order.insert(0, ('name', 'ASC'))
         cls._error_messages.update({
                 'invalid_type_for_moves': ('Location "%s" with existing moves '
-                    'cannot be changed to a type that does not support moves.'),
+                    'cannot be changed to a type that does not support moves.'
+                    ),
                 'child_of_warehouse': ('Location "%(location)s" must be a '
                     'child of warehouse "%(warehouse)s".'),
                 })
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         super(Location, cls).__register__(module_name)
         cursor = Transaction().cursor
 
@@ -186,12 +188,13 @@ class Location(ModelSQL, ModelView):
                 context['stock_date_end'] = datetime.date.max
 
         location_ids = [l.id for l in locations]
+        product_id = Transaction().context['product']
         with Transaction().set_context(context):
             pbl = Product.products_by_location(location_ids=location_ids,
-                product_ids=[Transaction().context['product']],
-                with_childs=True, skip_zero=False).iteritems()
+                product_ids=[product_id], with_childs=True)
 
-        return dict([(loc, qty) for (loc, prod), qty in pbl])
+        return dict((loc, pbl.get((loc, product_id), 0))
+            for loc in location_ids)
 
     @classmethod
     def get_cost_value(cls, locations, name):
diff --git a/location.xml b/location.xml
index 41d2f3e..8d106ec 100644
--- a/location.xml
+++ b/location.xml
@@ -25,7 +25,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_location_tree">
             <field name="name">Locations</field>
             <field name="res_model">stock.location</field>
-            <field name="domain">[('parent', '=', False)]</field>
+            <field name="domain">[('parent', '=', None)]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_location_tree_view1">
             <field name="sequence" eval="10"/>
diff --git a/move.py b/move.py
index 1c2cc91..2d4749c 100644
--- a/move.py
+++ b/move.py
@@ -1,14 +1,19 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
+import datetime
+import operator
 from decimal import Decimal
-from functools import reduce, partial
-from trytond.model import Workflow, ModelView, ModelSQL, fields
-from trytond.backend import TableHandler
+from functools import partial
+from sql import Column
+from sql.operators import Concat
+
+from trytond.model import Workflow, Model, ModelView, ModelSQL, fields
+from trytond import backend
 from trytond.pyson import In, Eval, Not, Equal, If, Get, Bool
 from trytond.transaction import Transaction
 from trytond.pool import Pool
 
-__all__ = ['Move']
+__all__ = ['StockMixin', 'Move']
 
 STATES = {
     'readonly': In(Eval('state'), ['cancel', 'assigned', 'done']),
@@ -16,6 +21,120 @@ STATES = {
 DEPENDS = ['state']
 
 
+class StockMixin:
+    '''Mixin class with helper to setup stock quantity field.'''
+
+    @classmethod
+    def _quantity_context(cls, name):
+        pool = Pool()
+        Date = pool.get('ir.date')
+
+        context = Transaction().context
+        new_context = {}
+        if name == 'quantity':
+            if (context.get('stock_date_end')
+                    and context['stock_date_end'] > Date.today()):
+                new_context['stock_date_end'] = Date.today()
+        elif name == 'forecast_quantity':
+            new_context['forecast'] = True
+            if not context.get('stock_date_end'):
+                new_context['stock_date_end'] = datetime.date.max
+        return new_context
+
+    @classmethod
+    def _get_quantity(cls, records, name, location_ids, products=None,
+            grouping=('product',), position=-1):
+        """
+        Compute for each record the stock quantity in the default uom of the
+        product.
+
+        location_ids is the list of IDs of locations to take account to compute
+            the stock. It can't be empty.
+        products restrict the stock computation to the this products (more
+            efficient), so it should be the products related to records.
+            If it is None all products are used.
+        grouping defines how stock moves are grouped.
+        position defines which field of grouping corresponds to the record
+            whose quantity is computed.
+
+        Return a dictionary with records id as key and quantity as value.
+        """
+        pool = Pool()
+        Product = pool.get('product.product')
+
+        record_ids = [r.id for r in records]
+        quantities = dict.fromkeys(record_ids, 0.0)
+        if not location_ids:
+            return quantities
+
+        product_ids = products and [p.id for p in products] or None
+
+        with Transaction().set_context(cls._quantity_context(name)):
+            pbl = Product.products_by_location(location_ids=location_ids,
+                product_ids=product_ids, with_childs=True,
+                grouping=grouping)
+
+        for key, quantity in pbl.iteritems():
+            # pbl could return None in some keys
+            if (key[position] is not None and
+                    key[position] in quantities):
+                quantities[key[position]] += quantity
+        return quantities
+
+    @classmethod
+    def _search_quantity(cls, name, location_ids, domain=None,
+            grouping=('product',), position=-1):
+        """
+        Compute the domain to filter records which validates the domain over
+        quantity field.
+
+        location_ids is the list of IDs of locations to take account to compute
+            the stock. It can't be empty.
+        grouping defines how stock moves are grouped.
+        position defines which field of grouping corresponds to the record
+            whose quantity is computed.
+        """
+        pool = Pool()
+        Product = pool.get('product.product')
+
+        if not location_ids or not domain:
+            return []
+
+        def _search_quantity_eval_domain(line, domain):
+            operator_funcs = {
+                '=': operator.eq,
+                '>=': operator.ge,
+                '>': operator.gt,
+                '<=': operator.le,
+                '<': operator.lt,
+                '!=': operator.ne,
+                'in': lambda v, l: v in l,
+                'not in': lambda v, l: v not in l,
+                }
+
+            field, op, operand = domain
+            value = line.get(field)
+            return operator_funcs[op](value, operand)
+
+        with Transaction().set_context(cls._quantity_context(name)):
+            pbl = Product.products_by_location(
+                location_ids=location_ids,
+                with_childs=True, grouping=grouping)
+
+        processed_lines = []
+        for key, quantity in pbl.iteritems():
+            # pbl could return None in some keys
+            if key[position] is not None:
+                processed_lines.append({
+                        'record_id': key[position],
+                        name: quantity,
+                        })
+
+        record_ids = [line['record_id'] for line in processed_lines
+            if _search_quantity_eval_domain(line, domain)]
+        return [('id', 'in', record_ids)]
+
+
 class Move(Workflow, ModelSQL, ModelView):
     "Stock Move"
     __name__ = 'stock.move'
@@ -75,7 +194,7 @@ class Move(Workflow, ModelSQL, ModelView):
             },
         domain=[
             ('id', If(In('company', Eval('context', {})), '=', '!='),
-                Get(Eval('context', {}), 'company', 0)),
+                Eval('context', {}).get('company', -1)),
             ],
         depends=['state'])
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
@@ -100,6 +219,13 @@ class Move(Workflow, ModelSQL, ModelView):
     @classmethod
     def __setup__(cls):
         super(Move, cls).__setup__()
+        cls._deny_modify_assigned = set(['product', 'uom', 'quantity',
+            'from_location', 'to_location', 'company', 'unit_price',
+            'currency'])
+        cls._deny_modify_done_cancel = (cls._deny_modify_assigned |
+            set(['planned_date', 'effective_date', 'state']))
+        cls._allow_modify_closed_period = set()
+
         cls._sql_constraints += [
             ('check_move_qty_pos',
                 'CHECK(quantity >= 0.0)', 'Move quantity must be positive'),
@@ -121,8 +247,10 @@ class Move(Workflow, ModelSQL, ModelView):
                 'it is not in draft or cancelled state.'),
             'period_closed': ('You can not modify move "%(move)s" because '
                 'period "%(period)s" is closed.'),
-            'modify_assigned_done_cancel': ('You can not modify stock move "%s"'
-                'because it is in "Assigned", "Done" or "Cancel" state.'),
+            'modify_assigned': ('You can not modify stock move "%s" because '
+                'it is in "Assigned" state.'),
+            'modify_done_cancel': ('You can not modify stock move "%s" '
+                'because it is in "Done" or "Cancel" state.'),
             })
         cls._transitions |= set((
                 ('draft', 'assigned'),
@@ -149,7 +277,10 @@ class Move(Workflow, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
+
         # Migration from 1.2: packing renamed into shipment
         table = TableHandler(cursor, cls, module_name)
         table.drop_constraint('check_packing')
@@ -177,10 +308,10 @@ class Move(Workflow, ModelSQL, ModelView):
                 for move in moves:
                     internal_quantity = cls._get_internal_quantity(
                             move.quantity, move.uom, move.product)
-                    cursor.execute(
-                        'UPDATE "' + cls._table + '" '
-                        'SET internal_quantity = %s '
-                        'WHERE id = %s', (internal_quantity, move.id))
+                    cursor.execute(*sql_table.update(
+                            columns=[sql_table.internal_quantity],
+                            values=[internal_quantity],
+                            where=sql_table.id == move.id))
             table = TableHandler(cursor, cls, module_name)
             table.not_null_action('internal_quantity', action='add')
 
@@ -199,9 +330,11 @@ class Move(Workflow, ModelSQL, ModelView):
             }
         for column, model in shipments.iteritems():
             if table.column_exist(column):
-                cursor.execute('UPDATE "' + cls._table + '" '
-                    'SET shipment = \'' + model + ',\' || "' + column + '" '
-                    'WHERE "' + column + '" IS NOT NULL')
+                cursor.execute(*sql_table.update(
+                        columns=[sql_table.shipment],
+                        values=[Concat(model + ',',
+                                Column(sql_table, column))],
+                        where=Column(sql_table, column) != None))
                 table.drop_column(column)
 
         # Add index on create_date
@@ -314,9 +447,9 @@ class Move(Workflow, ModelSQL, ModelView):
 
     @classmethod
     def get_shipment(cls):
-        Model = Pool().get('ir.model')
+        IrModel = Pool().get('ir.model')
         models = cls._get_shipment()
-        models = Model.search([
+        models = IrModel.search([
                 ('model', 'in', models),
                 ])
         return [(None, '')] + [(m.model, m.name) for m in models]
@@ -328,17 +461,16 @@ class Move(Workflow, ModelSQL, ModelView):
 
     @classmethod
     def get_origin(cls):
-        Model = Pool().get('ir.model')
+        IrModel = Pool().get('ir.model')
         models = cls._get_origin()
-        models = Model.search([
+        models = IrModel.search([
                 ('model', 'in', models),
                 ])
         return [(None, '')] + [(m.model, m.name) for m in models]
 
-    @classmethod
-    def validate(cls, moves):
-        super(Move, cls).validate(moves)
-        cls.check_period_closed(moves)
+    @property
+    def origin_name(self):
+        return self.origin.rec_name if self.origin else None
 
     @classmethod
     def check_period_closed(cls, moves):
@@ -363,7 +495,7 @@ class Move(Workflow, ModelSQL, ModelView):
 
     @classmethod
     def search_rec_name(cls, name, clause):
-        return [('product',) + clause[1:]]
+        return [('product',) + tuple(clause[1:])]
 
     def _update_product_cost_price(self, direction):
         """
@@ -511,30 +643,33 @@ class Move(Workflow, ModelSQL, ModelView):
             internal_quantity = cls._get_internal_quantity(vals['quantity'],
                 uom, product)
             vals['internal_quantity'] = internal_quantity
-        return super(Move, cls).create(vlist)
+        moves = super(Move, cls).create(vlist)
+        cls.check_period_closed(moves)
+        return moves
 
     @classmethod
     def write(cls, moves, vals):
-        if reduce(lambda x, y: x or y in vals, ('product', 'uom', 'quantity',
-                'from_location', 'to_location', 'company', 'unit_price',
-                'currency'), False):
+        vals_set = set(vals)
+        if cls._deny_modify_assigned & vals_set:
             for move in moves:
-                if move.state in ('assigned', 'done', 'cancel'):
-                    cls.raise_user_error('modify_assigned_done_cancel',
-                        (move.rec_name,))
-        if reduce(lambda x, y: x or y in vals,
-                ('planned_date', 'effective_date', 'state'), False):
+                if move.state == 'assigned':
+                    cls.raise_user_error('modify_assigned', (move.rec_name,))
+        if cls._deny_modify_done_cancel & vals_set:
             for move in moves:
                 if move.state in ('done', 'cancel'):
-                    cls.raise_user_error('modify_assigned_done_cancel',
+                    cls.raise_user_error('modify_done_cancel',
                         (move.rec_name,))
 
+        if any(f not in cls._allow_modify_closed_period for f in vals):
+            cls.check_period_closed(moves)
+
         super(Move, cls).write(moves, vals)
 
         for move in moves:
             internal_quantity = cls._get_internal_quantity(move.quantity,
                     move.uom, move.product)
-            if internal_quantity != move.internal_quantity:
+            if (internal_quantity != move.internal_quantity
+                    and internal_quantity != vals.get('internal_quantity')):
                 cls.write([move], {
                         'internal_quantity': internal_quantity,
                         })
@@ -571,7 +706,7 @@ class Move(Workflow, ModelSQL, ModelView):
         return to_pick
 
     @classmethod
-    def assign_try(cls, moves):
+    def assign_try(cls, moves, grouping=('product',)):
         '''
         Try to assign moves.
         It will split the moves to assign as much possible.
@@ -593,7 +728,17 @@ class Move(Workflow, ModelSQL, ModelView):
                 stock_assign=True):
             pbl = Product.products_by_location(
                 location_ids=[l.id for l in locations],
-                product_ids=[m.product.id for m in moves])
+                product_ids=[m.product.id for m in moves],
+                grouping=grouping)
+
+        def get_key(location):
+            key = (location.id,)
+            for field in grouping:
+                value = getattr(move, field)
+                if isinstance(value, Model):
+                    value = value.id
+                key += (value,)
+            return key
 
         success = True
         for move in moves:
@@ -605,11 +750,11 @@ class Move(Workflow, ModelSQL, ModelView):
                     ('parent', 'child_of', [move.from_location.id]),
                     ])
             for location in childs:
-                if (location.id, move.product.id) in pbl:
+                key = get_key(location)
+                if key in pbl:
                     location_qties[location] = Uom.compute_qty(
-                            move.product.default_uom,
-                            pbl[(location.id, move.product.id)], move.uom,
-                            round=False)
+                        move.product.default_uom, pbl[key], move.uom,
+                        round=False)
 
             to_pick = move.pick_product(location_qties)
 
@@ -640,10 +785,7 @@ class Move(Workflow, ModelSQL, ModelView):
                 qty_default_uom = Uom.compute_qty(move.uom, qty,
                         move.product.default_uom, round=False)
 
-                pbl[(from_location.id, move.product.id)] = (
-                    pbl.get((from_location.id, move.product.id), 0.0)
-                    - qty_default_uom)
-                pbl[(to_location.id, move.product.id)] = (
-                    pbl.get((to_location.id, move.product.id), 0.0)
-                    + qty_default_uom)
+                from_key, to_key = get_key(from_location), get_key(to_location)
+                pbl[from_key] = pbl.get(from_key, 0.0) - qty_default_uom
+                pbl[to_key] = pbl.get(to_key, 0.0) + qty_default_uom
         return success
diff --git a/period.py b/period.py
index d7981f2..fb29f87 100644
--- a/period.py
+++ b/period.py
@@ -1,7 +1,7 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 from itertools import chain
-from trytond.model import ModelView, ModelSQL, fields
+from trytond.model import Workflow, ModelView, ModelSQL, fields
 from trytond.pyson import Equal, Eval, If, In, Get
 from trytond.transaction import Transaction
 from trytond.pool import Pool
@@ -9,7 +9,7 @@ from trytond.pool import Pool
 __all__ = ['Period', 'Cache']
 
 
-class Period(ModelSQL, ModelView):
+class Period(Workflow, ModelSQL, ModelView):
     'Stock Period'
     __name__ = 'stock.period'
     _rec_name = 'date'
@@ -19,9 +19,10 @@ class Period(ModelSQL, ModelView):
     company = fields.Many2One('company.company', 'Company', required=True,
         domain=[
             ('id', If(In('company', Eval('context', {})), '=', '!='),
-                Get(Eval('context', {}), 'company', 0)),
+                Eval('context', {}).get('company', -1)),
             ])
-    caches = fields.One2Many('stock.period.cache', 'period', 'Caches')
+    caches = fields.One2Many('stock.period.cache', 'period', 'Caches',
+        readonly=True)
     state = fields.Selection([
         ('draft', 'Draft'),
         ('closed', 'Closed'),
@@ -33,9 +34,14 @@ class Period(ModelSQL, ModelView):
         cls._error_messages.update({
                 'close_period_future_today': ('You can not close a period '
                     'in the future or today.'),
-                'close_period_assigned_move': ('You can not close a period when '
+                'close_period_assigned_move': (
+                    'You can not close a period when '
                     'there still are assigned moves.'),
                 })
+        cls._transitions |= set((
+                ('draft', 'closed'),
+                ('closed', 'draft'),
+                ))
         cls._buttons.update({
                 'draft': {
                     'invisible': Eval('state') == 'draft',
@@ -49,28 +55,38 @@ class Period(ModelSQL, ModelView):
     def default_state():
         return 'draft'
 
+    @staticmethod
+    def groupings():
+        return [('product',)]
+
+    @staticmethod
+    def get_cache(grouping):
+        pool = Pool()
+        if grouping == ('product',):
+            return pool.get('stock.period.cache')
+
     @classmethod
     @ModelView.button
+    @Workflow.transition('draft')
     def draft(cls, periods):
-        Cache = Pool().get('stock.period.cache')
-        caches = []
-        for i in xrange(0, len(periods), Transaction().cursor.IN_MAX):
-            caches.append(Cache.search([
-                ('period', 'in', [p.id for p in
-                                periods[i:i + Transaction().cursor.IN_MAX]]),
-                        ], order=[]))
-        Cache.delete(list(chain(*caches)))
-        cls.write(periods, {
-                'state': 'draft',
-                })
+        in_max = Transaction().cursor.IN_MAX
+        for grouping in cls.groupings():
+            Cache = cls.get_cache(grouping)
+            caches = []
+            for i in xrange(0, len(periods), in_max):
+                caches.append(Cache.search([
+                            ('period', 'in',
+                                [p.id for p in periods[i:i + in_max]]),
+                            ], order=[]))
+            Cache.delete(list(chain(*caches)))
 
     @classmethod
     @ModelView.button
+    @Workflow.transition('closed')
     def close(cls, periods):
         pool = Pool()
         Product = pool.get('product.product')
         Location = pool.get('stock.location')
-        Cache = pool.get('stock.period.cache')
         Move = pool.get('stock.move')
         Date = pool.get('ir.date')
 
@@ -92,28 +108,30 @@ class Period(ModelSQL, ModelView):
                         ]]):
             cls.raise_user_error('close_period_assigned_move')
 
-        to_create = []
-        for period in periods:
-            with Transaction().set_context(
-                    stock_date_end=period.date,
-                    stock_date_start=None,
-                    stock_assign=False,
-                    forecast=False,
-                    stock_destinations=None,
-                    ):
-                pbl = Product.products_by_location([l.id for l in locations])
-            for (location_id, product_id), quantity in pbl.iteritems():
-                to_create.append({
+        for grouping in cls.groupings():
+            Cache = cls.get_cache(grouping)
+            to_create = []
+            for period in periods:
+                with Transaction().set_context(
+                        stock_date_end=period.date,
+                        stock_date_start=None,
+                        stock_assign=False,
+                        forecast=False,
+                        stock_destinations=None,
+                        ):
+                    pbl = Product.products_by_location(
+                        [l.id for l in locations], grouping=grouping)
+                for key, quantity in pbl.iteritems():
+                    values = {
+                        'location': key[0],
                         'period': period.id,
-                        'location': location_id,
-                        'product': product_id,
                         'internal_quantity': quantity,
-                        })
-        if to_create:
-            Cache.create(to_create)
-        cls.write(periods, {
-                'state': 'closed',
-                })
+                        }
+                    for i, field in enumerate(grouping, 1):
+                        values[field] = key[i]
+                    to_create.append(values)
+            if to_create:
+                Cache.create(to_create)
 
 
 class Cache(ModelSQL, ModelView):
diff --git a/picking_list.odt b/picking_list.odt
index 41d0b5b..6edecd1 100644
Binary files a/picking_list.odt and b/picking_list.odt differ
diff --git a/product.py b/product.py
index 6bb1fd0..4ca8975 100644
--- a/product.py
+++ b/product.py
@@ -2,13 +2,21 @@
 #this repository contains the full copyright notices and license terms.
 import datetime
 from decimal import Decimal
+from operator import itemgetter
+from sql import Literal, Union, Column
+from sql.aggregate import Max, Sum
+from sql.functions import Now
+from sql.conditionals import Coalesce
+
 from trytond.model import ModelSQL, ModelView, fields
 from trytond.wizard import Wizard, StateView, StateAction, Button
 from trytond.pyson import PYSONEncoder, Eval, Or
 from trytond.transaction import Transaction
-from trytond.tools import safe_eval, reduce_ids
+from trytond.tools import reduce_ids
 from trytond.pool import Pool, PoolMeta
 
+from .move import StockMixin
+
 __all__ = ['Template', 'Product',
     'ProductByLocationStart', 'ProductByLocation',
     'ProductQuantitiesByWarehouse', 'ProductQuantitiesByWarehouseStart',
@@ -69,7 +77,8 @@ class Template:
         super(Template, cls).write(templates, vals)
 
 
-class Product:
+class Product(object, StockMixin):
+    __metaclass__ = PoolMeta
     __name__ = "product.product"
     quantity = fields.Function(fields.Float('Quantity'), 'get_quantity',
             searcher='search_quantity')
@@ -80,80 +89,13 @@ class Product:
 
     @classmethod
     def get_quantity(cls, products, name):
-        Date = Pool().get('ir.date')
-
-        quantities = dict((p.id, 0.0) for p in products)
-        if not Transaction().context.get('locations'):
-            return quantities
-
-        context = {}
-        if (name == 'quantity'
-                and Transaction().context.get('stock_date_end')
-                and Transaction().context.get('stock_date_end') >
-                Date.today()):
-            context['stock_date_end'] = Date.today()
-
-        if name == 'forecast_quantity':
-            context['forecast'] = True
-            if not Transaction().context.get('stock_date_end'):
-                context['stock_date_end'] = datetime.date.max
-        with Transaction().set_context(context):
-            pbl = cls.products_by_location(
-                location_ids=Transaction().context['locations'],
-                product_ids=quantities.keys(), with_childs=True)
-
-        for location in Transaction().context['locations']:
-            for product in products:
-                quantities[product.id] += pbl.get((location, product.id), 0.0)
-        return quantities
-
-    @staticmethod
-    def _search_quantity_eval_domain(line, domain):
-        field, operator, operand = domain
-        value = line.get(field)
-        if value is None:
-            return False
-        if operator not in ("=", ">=", "<=", ">", "<", "!="):
-            return False
-        if operator == "=":
-            operator = "=="
-        return (safe_eval(str(value) + operator + str(operand)))
+        location_ids = Transaction().context.get('locations')
+        return cls._get_quantity(products, name, location_ids, products)
 
     @classmethod
     def search_quantity(cls, name, domain=None):
-        Date = Pool().get('ir.date')
-
-        if not (Transaction().context.get('locations') and domain):
-            return []
-
-        context = {}
-        if (name == 'quantity'
-                and Transaction().context.get('stock_date_end')
-                and Transaction().context.get('stock_date_end') >
-                Date.today()):
-            context['stock_date_end'] = Date.today()
-
-        if name == 'forecast_quantity':
-            context['forecast'] = True
-            if not Transaction().context.get('stock_date_end'):
-                context['stock_date_end'] = datetime.date.max
-
-        with Transaction().set_context(context):
-            pbl = cls.products_by_location(
-                    location_ids=Transaction().context['locations'],
-                    with_childs=True, skip_zero=False).iteritems()
-
-        processed_lines = []
-        for (location, product), quantity in pbl:
-            processed_lines.append({
-                    'location': location,  # XXX useful ?
-                    'product': product,
-                    name: quantity,
-                    })
-
-        res = [line['product'] for line in processed_lines
-            if cls._search_quantity_eval_domain(line, domain)]
-        return [('id', 'in', res)]
+        location_ids = Transaction().context.get('locations')
+        return cls._search_quantity(name, location_ids, domain)
 
     @classmethod
     def get_cost_value(cls, products, name):
@@ -174,7 +116,7 @@ class Product:
 
     @classmethod
     def products_by_location(cls, location_ids, product_ids=None,
-            with_childs=False, skip_zero=True):
+            with_childs=False, grouping=('product',)):
         """
         Compute for each location and product the stock quantity in the default
         uom of the product.
@@ -193,9 +135,9 @@ class Product:
                     the storage zone.
         If product_ids is None all products are used.
         If with_childs, it computes also for child locations.
-        If skip_zero it lists also items with zero quantity
+        grouping defines how stock moves are grouped.
 
-        Return a dictionary with (location id, product id) as key
+        Return a dictionary with location id and grouping as key
                 and quantity as value.
         """
         pool = Pool()
@@ -204,6 +146,13 @@ class Product:
         Location = pool.get('stock.location')
         Date = pool.get('ir.date')
         Period = pool.get('stock.period')
+        Move = pool.get('stock.move')
+        Product = pool.get('product.product')
+        Template = pool.get('product.template')
+
+        move = Move.__table__()
+        product = Product.__table__()
+        template = Template.__table__()
 
         today = Date.today()
 
@@ -211,6 +160,12 @@ class Product:
             return {}
         cursor = Transaction().cursor
         context = Transaction().context.copy()
+
+        for field in grouping:
+            if field not in Move._fields:
+                raise ValueError('"%s" has no field "%s"' % (Move, field))
+        assert 'product' in grouping
+
         # Skip warehouse location in favor of their storage location
         # to compute quantities. Keep track of which ids to remove
         # and to add after the query.
@@ -227,9 +182,14 @@ class Product:
                 wh_to_add[location.id] = location.storage_location.id
         location_ids = list(location_ids)
 
-        move_rule_query, move_rule_val = Rule.domain_get('stock.move')
+        move_rule_query = Rule.domain_get('stock.move')
+        if move_rule_query is None:
+            move_rule_query = Literal(True)
 
-        period_clause, period_vals = 'period = %s', [0]
+        PeriodCache = Period.get_cache(grouping)
+        period = None
+        if PeriodCache:
+            period_cache = PeriodCache.__table__()
 
         if not context.get('stock_date_end'):
             context['stock_date_end'] = datetime.date.max
@@ -239,152 +199,105 @@ class Product:
                 or (context['stock_date_end'] == today
                     and not context.get('forecast'))):
             state_date_clause = (
-                '('
-                    '(state in (%s, %s)) '
-                'AND '
-                    '('
-                        '('
-                            '(effective_date IS NULL) '
-                        'AND '
-                            '(planned_date <= %s) '
-                        ') '
-                    'OR '
-                        '(effective_date <= %s)'
-                    ')'
-                ')')
-            state_date_vals = ["done",
-                    context.get('stock_assign') and 'assigned' or 'done',
-                    context['stock_date_end'],
-                    context['stock_date_end'],
-                    ]
+                move.state.in_(['done',
+                        context.get('stock_assign') and 'assigned' or 'done'])
+                & (
+                    (
+                        (move.effective_date == None)
+                        & (move.planned_date <= context['stock_date_end'])
+                        )
+                    | (move.effective_date <= context['stock_date_end'])
+                    )
+                )
         # future date end: filter move on state done and date
         # before today, or on all state and date between today and
         # date_end.
         else:
             state_date_clause = (
-                '('
-                    '('
-                        '(state in (%s, %s)) '
-                    'AND '
-                        '('
-                            '('
-                                '(effective_date IS NULL) '
-                            'AND '
-                                '(planned_date <= %s) '
-                            ') '
-                        'OR '
-                            '(effective_date <= %s)'
-                        ')'
-                    ')'
-                'OR '
-                    '('
-                        '(state in (%s, %s, %s)) '
-                    'AND '
-                        '('
-                            '('
-                                '(effective_date IS NULL) '
-                            'AND '
-                                '(COALESCE(planned_date, %s) <= %s) '
-                            'AND '
-                                '(COALESCE(planned_date, %s) >= %s)'
-                            ')'
-                        'OR '
-                            '('
-                                '(effective_date <= %s) '
-                            'AND '
-                                '(effective_date >= %s)'
-                            ')'
-                        ')'
-                    ')'
-                ')')
-
-            state_date_vals = [
-                'done', context.get('stock_assign') and 'assigned' or 'done',
-                today, today,
-                'done', 'assigned', 'draft',
-                datetime.date.max, context['stock_date_end'],
-                datetime.date.max, today,
-                context['stock_date_end'], today,
-                ]
+                (move.state.in_(['done',
+                            context.get('stock_assign') and 'assigned'
+                            or 'done'])
+                    & (
+                        (
+                            (move.effective_date == None)
+                            & (move.planned_date <= today)
+                            )
+                        | (move.effective_date <= today)
+                        )
+                    )
+                | (move.state.in_(['done', 'assigned', 'draft'])
+                    & (
+                        (
+                            (move.effective_date == None)
+                            & (Coalesce(move.planned_date, datetime.date.max)
+                                <= context['stock_date_end'])
+                            & (Coalesce(move.planned_date, datetime.date.max)
+                                >= today)
+                            )
+                        | (
+                            (move.effective_date <= context['stock_date_end'])
+                            & (move.effective_date >= today)
+                            )
+                        )
+                    )
+                )
 
         if context.get('stock_date_start'):
             if context['stock_date_start'] > today:
-                state_date_clause += ('AND '
-                    '('
-                        '(state in (%s, %s, %s)) '
-                    'AND '
-                        '('
-                            '('
-                                '(effective_date IS NULL) '
-                            'AND '
-                                '('
-                                    '(planned_date >= %s) '
-                                'OR '
-                                    '(planned_date IS NULL)'
-                                ')'
-                            ') '
-                        'OR '
-                            '(effective_date >= %s)'
-                        ')'
-                    ')')
-                state_date_vals.extend(['done', 'assigned', 'draft',
-                     context['stock_date_start'], context['stock_date_start']])
+                state_date_clause &= (
+                    move.state.in_(['done', 'assigned', 'draft'])
+                    & (
+                        (
+                            (move.effective_date == None)
+                            & (
+                                (move.planned_date >=
+                                    context['stock_date_start'])
+                                | (move.planned_date == None)
+                                )
+                            )
+                        | (move.effective_date >= context['stock_date_start'])
+                        )
+                    )
             else:
-                state_date_clause += ('AND '
-                    '('
-                        '('
-                            '(state in (%s, %s, %s)) '
-                        'AND '
-                            '('
-                                '('
-                                    '(effective_date IS NULL) '
-                                'AND '
-                                    '('
-                                        '(planned_date >= %s) '
-                                    'OR '
-                                        '(planned_date IS NULL)'
-                                    ') '
-                                ')'
-                            'OR '
-                                '(effective_date >= %s)'
-                            ')'
-                        ') '
-                    'OR '
-                        '('
-                            '(state in (%s, %s)) '
-                        'AND '
-                            '('
-                                '('
-                                    '(effective_date IS NULL) '
-                                'AND '
-                                    '('
-                                        '('
-                                            '(planned_date >= %s) '
-                                        'AND '
-                                            '(planned_date < %s)'
-                                        ') '
-                                    'OR '
-                                        '(planned_date IS NULL)'
-                                    ')'
-                                ') '
-                            'OR '
-                                '('
-                                    '(effective_date >= %s) '
-                                'AND '
-                                    '(effective_date < %s)'
-                                ')'
-                            ')'
-                        ')'
-                    ')')
-
-                state_date_vals.extend(['done', 'assigned', 'draft',
-                    today, today,
-                    'done',
-                    context.get('stock_assign') and 'assigned' or 'done',
-                    context['stock_date_start'], today,
-                    context['stock_date_start'], today,
-                    ])
-        else:
+                state_date_clause &= (
+                    (
+                        move.state.in_(['done', 'assigned', 'draft'])
+                        & (
+                            (
+                                (move.effective_date == None)
+                                & (
+                                    (move.planned_date >= today)
+                                    | (move.planned_date == None)
+                                    )
+                                )
+                            | (move.effective_date >= today)
+                            )
+                        )
+                    | (
+                        move.state.in_(['done',
+                                context.get('stock_assign') and 'assigned'
+                                or 'done'])
+                        & (
+                            (
+                                (move.effective_date == None)
+                                & (
+                                    (
+                                        (move.planned_date >=
+                                            context['stock_date_start'])
+                                        & (move.planned_date < today)
+                                        )
+                                    | (move.planned_date == None)
+                                    )
+                                )
+                            | (
+                                (move.effective_date >=
+                                    context['stock_date_start'])
+                                & (move.effective_date < today)
+                                )
+                            )
+                        )
+                    )
+        elif PeriodCache:
             with Transaction().set_user(0, set_context=True):
                 periods = Period.search([
                         ('date', '<', context['stock_date_end']),
@@ -392,105 +305,104 @@ class Product:
                         ], order=[('date', 'DESC')], limit=1)
             if periods:
                 period, = periods
-                state_date_clause += (' AND '
-                    '(COALESCE(effective_date, planned_date, %s) > %s)')
-                state_date_vals.extend([datetime.date.max, period.date])
-                period_vals[0] = period.id
+                state_date_clause &= (
+                    Coalesce(move.effective_date, move.planned_date,
+                        datetime.date.max) > period.date)
 
         if with_childs:
-            query, args = Location.search([
+            location_query = Location.search([
                     ('parent', 'child_of', location_ids),
-                    ], query_string=True, order=[])
-            where_clause = " IN (" + query + ") "
-            where_vals = args
+                    ], query=True, order=[])
         else:
-            where_clause = " IN (" + \
-                ",".join(('%s',) * len(location_ids)) + ") "
-            where_vals = location_ids[:]
+            location_query = location_ids[:]
 
-        if move_rule_query:
-            move_rule_query = " AND " + move_rule_query + " "
-
-        product_template_join = ""
-        product_template_join_period = ""
+        from_ = move
+        if PeriodCache:
+            from_period = period_cache
         if product_ids:
-            red_clause, red_vals = reduce_ids('product', product_ids)
-            where_clause += "AND " + red_clause
-            where_vals += red_vals
+            where = reduce_ids(move.product, product_ids)
+            if PeriodCache:
+                where_period = reduce_ids(period_cache.product, product_ids)
         else:
-            where_clause += "AND product_template.active = %s"
-            where_vals.append(True)
-            product_template_join = (
-                "JOIN product_product "
-                    "ON (stock_move.product = product_product.id) "
-                "JOIN product_template "
-                    "ON (product_product.template = "
-                        "product_template.id) ")
-            product_template_join_period = (
-                "JOIN product_product "
-                    "ON (stock_period_cache.product = product_product.id) "
-                "JOIN product_template "
-                    "ON (product_product.template = product_template.id) ")
+            where = where_period = template.active == True
+            from_ = from_.join(product, condition=move.product == product.id)
+            from_ = from_.join(template,
+                condition=product.template == template.id)
+            if PeriodCache:
+                from_period = from_period.join(product,
+                    condition=period_cache.product == product.id)
+                from_period = from_period.join(template,
+                    condition=product.template == template.id)
 
         if context.get('stock_destinations'):
             destinations = context.get('stock_destinations')
-            dest_clause_from = " AND from_location in ("
-            dest_clause_from += ",".join(('%s',) * len(destinations))
-            dest_clause_from += ") "
-            dest_clause_to = " AND to_location in ("
-            dest_clause_to += ",".join(('%s',) * len(destinations))
-            dest_clause_to += ") "
-            dest_vals = destinations
+            dest_clause_from = move.from_location.in_(destinations)
+            dest_clause_to = move.to_location.in_(destinations)
 
-            dest_clause_period = (' AND location IN ('
-                + ','.join(('%s',) * len(destinations)) + ') ')
+            if PeriodCache:
+                dest_clause_period = period_cache.location.in_(destinations)
 
         else:
-            dest_clause_from = dest_clause_to = dest_clause_period = ""
-            dest_vals = []
+            dest_clause_from = dest_clause_to = dest_clause_period = \
+                Literal(True)
 
         # The main select clause is a union between three similar subqueries.
         # One that sums incoming moves towards locations, one that sums
         # outgoing moves and one for the period cache.  UNION ALL is used
         # because we already know that there will be no duplicates.
-        select_clause = (
-                "SELECT location, product, sum(quantity) AS quantity "
-                "FROM ( "
-                    "SELECT to_location AS location, product, "
-                        "SUM(internal_quantity) AS quantity "
-                    "FROM stock_move " + product_template_join + " "
-                    "WHERE (%s) "
-                        "AND to_location %s "
-                    "GROUP BY to_location, product "
-                    "UNION ALL "
-                    "SELECT from_location AS location, product, "
-                        "-SUM(internal_quantity) AS quantity "
-                    "FROM stock_move " + product_template_join + " "
-                    "WHERE (%s) "
-                        "AND from_location %s "
-                    "GROUP BY from_location, product, uom "
-                    "UNION ALL "
-                    "SELECT location, product, internal_quantity AS quantity "
-                    "FROM stock_period_cache "
-                        + product_template_join_period + " "
-                    "WHERE (%s) "
-                        "AND location %s "
-                ") AS T GROUP BY T.location, T.product")
-
-        cursor.execute(select_clause % (
-            state_date_clause,
-            where_clause + move_rule_query + dest_clause_from,
-            state_date_clause,
-            where_clause + move_rule_query + dest_clause_to,
-            period_clause, where_clause + dest_clause_period),
-            state_date_vals + where_vals + move_rule_val + dest_vals +
-            state_date_vals + where_vals + move_rule_val + dest_vals +
-            period_vals + where_vals + dest_vals)
+        move_keys = [Column(move, key).as_(key) for key in grouping]
+        query = from_.select(move.to_location.as_('location'),
+            Sum(move.internal_quantity).as_('quantity'),
+            *move_keys,
+            where=state_date_clause
+            & where
+            & move.to_location.in_(location_query)
+            & move.id.in_(move_rule_query)
+            & dest_clause_from,
+            group_by=[move.to_location] + move_keys)
+        query = Union(query, from_.select(move.from_location.as_('location'),
+                (-Sum(move.internal_quantity)).as_('quantity'),
+                *move_keys,
+                where=state_date_clause
+                & where
+                & move.from_location.in_(location_query)
+                & move.id.in_(move_rule_query)
+                & dest_clause_to,
+                group_by=[move.from_location] + move_keys),
+            all_=True)
+        if PeriodCache:
+            period_keys = [Column(period_cache, key).as_(key)
+                for key in grouping]
+            query = Union(query, from_period.select(
+                    period_cache.location.as_('location'),
+                    period_cache.internal_quantity.as_('quantity'),
+                    *period_keys,
+                    where=(period_cache.period
+                        == (period.id if period else None))
+                    & where_period
+                    & period_cache.location.in_(location_query)
+                    & dest_clause_period),
+                all_=True)
+        query_keys = [Column(query, key).as_(key) for key in grouping]
+        columns = ([query.location.as_('location')]
+            + query_keys
+            + [Sum(query.quantity).as_('quantity')])
+        query = query.select(*columns,
+            group_by=[query.location] + query_keys)
+        cursor.execute(*query)
         raw_lines = cursor.fetchall()
 
-        res_product_ids = set(product for _, product, _ in raw_lines)
-        res = dict(((location, product), quantity)
-                for location, product, quantity in raw_lines)
+        product_getter = itemgetter(grouping.index('product') + 1)
+        res_product_ids = set()
+        res = {}
+        keys = set()
+        for line in raw_lines:
+            location = line[0]
+            key = tuple(line[1:-1])
+            quantity = line[-1]
+            res[(location,) + key] = quantity
+            res_product_ids.add(product_getter(line))
+            keys.add(key)
 
         # Propagate quantities on from child locations to their parents
         if with_childs:
@@ -514,9 +426,10 @@ class Product:
                     locations.remove(l)
                     if l not in parent:
                         continue
-                    for product in res_product_ids:
-                        res.setdefault((parent[l], product), 0)
-                        res[(parent[l], product)] += res.get((l, product), 0)
+                    for key in keys:
+                        parent_key = (parent[l],) + key
+                        res.setdefault(parent_key, 0)
+                        res[parent_key] += res.get((l,) + key, 0)
                 next_leafs = set(locations)
                 for l in locations:
                     if l not in parent:
@@ -526,30 +439,20 @@ class Product:
                 leafs = next_leafs
 
             # clean result
-            for location, product in res.keys():
+            for key in res.keys():
+                location = key[0]
                 if location not in location_ids:
-                    del res[(location, product)]
+                    del res[key]
 
         # Round quantities
         default_uom = dict((p.id, p.default_uom) for p in
             cls.browse(list(res_product_ids)))
         for key, quantity in res.iteritems():
-            location, product = key
+            location = key[0]
+            product = product_getter(key)
             uom = default_uom[product]
             res[key] = Uom.round(quantity, uom.rounding)
 
-        # Complete result with missing products if asked
-        if not skip_zero:
-            # Search for all products, even if not linked with moves
-            if product_ids:
-                all_product_ids = product_ids
-            else:
-                all_product_ids = cls.search([])
-            keys = ((l, p) for l in location_ids for p in all_product_ids)
-            for location_id, product_id in keys:
-                if (location_id, product_id) not in res:
-                    res[(location_id, product_id)] = 0.0
-
         if wh_to_add:
             for wh, storage in wh_to_add.iteritems():
                 for product in product_ids:
@@ -632,24 +535,27 @@ class ProductQuantitiesByWarehouse(ModelSQL, ModelView):
         pool = Pool()
         Move = pool.get('stock.move')
         Location = pool.get('stock.location')
+        move = Move.__table__()
 
         product_id = Transaction().context.get('product')
         warehouse_id = Transaction().context.get('warehouse', -1)
-        warehouse_clause, warehouse_params = Location.search([
+        warehouse_query = Location.search([
                 ('parent', 'child_of', [warehouse_id]),
-                ], query_string=True, order=[])
-        return ('SELECT MAX(id) AS id, '
-                '0 AS create_uid, '
-                'NOW() AS create_date, '
-                'NULL AS write_uid, '
-                'NULL AS write_date, '
-                'COALESCE(effective_date, planned_date) AS date '
-            'FROM "' + Move._table + '" '
-            'WHERE product = %s '
-                'AND (from_location IN (' + warehouse_clause + ') '
-                    'OR to_location IN (' + warehouse_clause + ')) '
-                'AND COALESCE(effective_date, planned_date) IS NOT NULL '
-            'GROUP BY date, product', [product_id] + 2 * warehouse_params)
+                ], query=True, order=[])
+        date_column = Coalesce(move.effective_date, move.planned_date
+            ).as_('date')
+        return move.select(
+            Max(move.id).as_('id'),
+            Literal(0).as_('create_uid'),
+            Now().as_('create_date'),
+            Literal(None).as_('write_uid'),
+            Literal(None).as_('write_date'),
+            date_column,
+            where=(move.product == product_id)
+            & (move.from_location.in_(warehouse_query)
+                | move.to_location.in_(warehouse_query))
+            & (Coalesce(move.effective_date, move.planned_date) != None),
+            group_by=(date_column, move.product))
 
     @classmethod
     def get_quantity(cls, lines, name):
@@ -669,8 +575,8 @@ class ProductQuantitiesByWarehouse(ModelSQL, ModelView):
                 }
             with Transaction().set_context(**context):
                 quantities[date] = Product.products_by_location(
-                    [warehouse_id], [product_id], with_childs=True,
-                    skip_zero=False)[(warehouse_id, product_id)]
+                    [warehouse_id], [product_id],
+                    with_childs=True).get((warehouse_id, product_id), 0)
             try:
                 date_start = date + datetime.timedelta(1)
             except OverflowError:
diff --git a/product.xml b/product.xml
index 3f8fe0e..5b72e34 100644
--- a/product.xml
+++ b/product.xml
@@ -21,7 +21,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_location_quantity_tree">
             <field name="name">Locations</field>
             <field name="res_model">stock.location</field>
-            <field name="domain">[('parent', '=', False)]</field>
+            <field name="domain">[('parent', '=', None)]</field>
             <field name="window_name" eval="True"/>
         </record>
         <record model="ir.action.act_window.view" id="act_location_quantity_tree_view">
diff --git a/setup.py b/setup.py
index 26e2794..0ca2154 100644
--- a/setup.py
+++ b/setup.py
@@ -21,7 +21,7 @@ major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
 major_version = int(major_version)
 minor_version = int(minor_version)
 
-requires = []
+requires = ['python-sql']
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res|webdav)(\W|$)', dep):
         requires.append('trytond_%s >= %s.%s, < %s.%s' %
@@ -67,6 +67,7 @@ setup(name='trytond_stock',
         'Natural Language :: French',
         'Natural Language :: German',
         'Natural Language :: Russian',
+        'Natural Language :: Slovenian',
         'Natural Language :: Spanish',
         'Operating System :: OS Independent',
         'Programming Language :: Python :: 2.6',
diff --git a/shipment.py b/shipment.py
index aeb17d9..9c50a08 100644
--- a/shipment.py
+++ b/shipment.py
@@ -3,12 +3,16 @@
 import operator
 import itertools
 import datetime
+from sql import Table
+from sql.functions import Overlay, Position
+from sql.aggregate import Max
+from sql.operators import Concat
 
 from trytond.model import Workflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard, StateTransition, StateView, StateAction, \
     Button
-from trytond.backend import TableHandler
+from trytond import backend
 from trytond.pyson import Eval, Not, Equal, If, Or, And, Bool, In, Get, Id
 from trytond.transaction import Transaction
 from trytond.pool import Pool, PoolMeta
@@ -46,7 +50,7 @@ class ShipmentIn(Workflow, ModelSQL, ModelView):
             },
         domain=[
             ('id', If(In('company', Eval('context', {})), '=', '!='),
-                Get(Eval('context', {}), 'company', 0)),
+                Eval('context', {}).get('company', -1)),
             ],
         depends=['state'])
     reference = fields.Char("Reference", size=None, select=True,
@@ -79,7 +83,7 @@ class ShipmentIn(Workflow, ModelSQL, ModelView):
     warehouse_storage = fields.Function(fields.Many2One('stock.location',
             'Warehouse Storage', on_change_with=['warehouse']),
         'on_change_with_warehouse_storage')
-    incoming_moves = fields.Function(fields.One2Many('stock.move', None,
+    incoming_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
             'Incoming Moves',
             add_remove=[
                 ('shipment', '=', None),
@@ -99,7 +103,7 @@ class ShipmentIn(Workflow, ModelSQL, ModelView):
             depends=['state', 'warehouse', 'supplier_location',
                 'warehouse_input', 'company']),
         'get_incoming_moves', setter='set_incoming_moves')
-    inventory_moves = fields.Function(fields.One2Many('stock.move', None,
+    inventory_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
             'Inventory Moves',
             domain=[
                 ('from_location', '=', Eval('warehouse_input')),
@@ -116,6 +120,7 @@ class ShipmentIn(Workflow, ModelSQL, ModelView):
     moves = fields.One2Many('stock.move', 'shipment', 'Moves',
         domain=[('company', '=', Eval('company'))], readonly=True,
         depends=['company'])
+    origins = fields.Function(fields.Char('Origins'), 'get_origins')
     code = fields.Char("Code", size=None, select=True, readonly=True)
     state = fields.Selection([
         ('draft', 'Draft'),
@@ -160,22 +165,42 @@ class ShipmentIn(Workflow, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        model_data = Table('ir_model_data')
+        model = Table('ir_model')
+        model_field = Table('ir_model_field')
+        sql_table = cls.__table__()
+
         # Migration from 1.2: packing renamed into shipment
-        cursor.execute("UPDATE ir_model_data "
-            "SET fs_id = REPLACE(fs_id, 'packing', 'shipment') "
-            "WHERE fs_id like '%%packing%%' AND module = %s",
-            (module_name,))
-        cursor.execute("UPDATE ir_model "
-            "SET model = REPLACE(model, 'packing', 'shipment') "
-            "WHERE model like '%%packing%%' AND module = %s",
-            (module_name,))
-        cursor.execute("UPDATE ir_model_field "
-            "SET relation = REPLACE(relation, 'packing', 'shipment'), "
-                "name = REPLACE(name, 'packing', 'shipment') "
-            "WHERE (relation like '%%packing%%' "
-                "OR name like '%%packing%%') AND module = %s",
-            (module_name,))
+        cursor.execute(*model_data.update(
+                columns=[model_data.fs_id],
+                values=[Overlay(model_data.fs_id, 'shipment',
+                        Position('packing', model_data.fs_id),
+                        len('packing'))],
+                where=model_data.fs_id.like('%packing%')
+                & (model_data.module == module_name)))
+        cursor.execute(*model.update(
+                columns=[model.model],
+                values=[Overlay(model.model, 'shipment',
+                        Position('packing', model.model),
+                        len('packing'))],
+                where=model.model.like('%packing%')
+                & (model.module == module_name)))
+        cursor.execute(*model_field.update(
+                columns=[model_field.relation],
+                values=[Overlay(model_field.relation, 'shipment',
+                        Position('packing', model_field.relation),
+                        len('packing'))],
+                where=model_field.relation.like('%packing%')
+                & (model_field.module == module_name)))
+        cursor.execute(*model_field.update(
+                columns=[model_field.name],
+                values=[Overlay(model_field.name, 'shipment',
+                        Position('packing', model_field.name),
+                        len('packing'))],
+                where=model_field.name.like('%packing%')
+                & (model_field.module == module_name)))
 
         old_table = 'stock_packing_in'
         if TableHandler.table_exist(cursor, old_table):
@@ -196,22 +221,23 @@ class ShipmentIn(Workflow, ModelSQL, ModelView):
         Move = Pool().get('stock.move')
         if (not created_company
                 and TableHandler.table_exist(cursor, Move._table)):
-            cursor.execute('SELECT shipment.id, MAX(move.company) '
-                'FROM "%s" AS shipment '
-                'INNER JOIN "%s" AS move '
-                'ON \'%s,\' || shipment.id = move.shipment '
-                'GROUP BY shipment.id '
-                'ORDER BY MAX(move.company)'
-                % (cls._table, Move._table, cls.__name__))
+            move = Move.__table__()
+            cursor.execute(*sql_table.join(move,
+                    condition=(Concat(cls.__name__ + ',', sql_table.id)
+                        == move.shipment)
+                    ).select(sql_table.id, Max(move.company),
+                    group_by=sql_table.id,
+                    order_by=Max(move.company)))
             for company_id, values in itertools.groupby(cursor.fetchall(),
                     operator.itemgetter(1)):
                 shipment_ids = [x[0] for x in values]
                 for i in range(0, len(shipment_ids), cursor.IN_MAX):
                     sub_ids = shipment_ids[i:i + cursor.IN_MAX]
-                    red_sql, red_ids = reduce_ids('id', sub_ids)
-                    cursor.execute('UPDATE "' + cls._table + '" '
-                        'SET company = %s WHERE ' + red_sql,
-                        [company_id] + red_ids)
+                    red_sql = reduce_ids(sql_table.id, sub_ids)
+                    cursor.execute(*sql_table.update(
+                            columns=[sql_table.company],
+                            values=[company_id],
+                            where=red_sql))
             table.not_null_action('company', action='add')
 
         # Add index on create_date
@@ -326,6 +352,15 @@ class ShipmentIn(Workflow, ModelSQL, ModelView):
                     })
 
     @classmethod
+    def get_origins(cls, shipments, name):
+        origins = {}
+        with Transaction().set_user(0, set_context=True):
+            for shipment in cls.browse(shipments):
+                origins[shipment.id] = ', '.join(set(itertools.ifilter(None,
+                            (m.origin_name for m in shipment.moves))))
+        return origins
+
+    @classmethod
     def create(cls, vlist):
         pool = Pool()
         Sequence = pool.get('ir.sequence')
@@ -450,7 +485,7 @@ class ShipmentInReturn(Workflow, ModelSQL, ModelView):
             },
         domain=[
             ('id', If(In('company', Eval('context', {})), '=', '!='),
-                Get(Eval('context', {}), 'company', 0)),
+                Eval('context', {}).get('company', -1)),
             ],
         depends=['state'])
     code = fields.Char("Code", size=None, select=True, readonly=True)
@@ -482,6 +517,7 @@ class ShipmentInReturn(Workflow, ModelSQL, ModelView):
             ('company', '=', Eval('company')),
             ],
         depends=['state', 'from_location', 'to_location', 'company'])
+    origins = fields.Function(fields.Char('Origins'), 'get_origins')
     state = fields.Selection([
         ('draft', 'Draft'),
         ('cancel', 'Canceled'),
@@ -537,7 +573,9 @@ class ShipmentInReturn(Workflow, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
         # Migration from 1.2: packing renamed into shipment
         old_table = 'stock_packing_in_return'
         if TableHandler.table_exist(cursor, old_table):
@@ -558,22 +596,23 @@ class ShipmentInReturn(Workflow, ModelSQL, ModelView):
         Move = Pool().get('stock.move')
         if (not created_company
                 and TableHandler.table_exist(cursor, Move._table)):
-            cursor.execute('SELECT shipment.id, MAX(move.company) '
-                'FROM "%s" AS shipment '
-                'INNER JOIN "%s" AS move '
-                'ON \'%s,\' || shipment.id = move.shipment '
-                'GROUP BY shipment.id '
-                'ORDER BY MAX(move.company)'
-                % (cls._table, Move._table, cls.__name__))
+            move = Move.__table__()
+            cursor.execute(*sql_table.join(move,
+                    condition=(Concat(cls.__name__ + ',', sql_table.id)
+                        == move.shipment)
+                    ).select(sql_table.id, Max(move.company),
+                    group_by=sql_table.id,
+                    order_by=Max(move.company)))
             for company_id, values in itertools.groupby(cursor.fetchall(),
                     operator.itemgetter(1)):
                 shipment_ids = [x[0] for x in values]
                 for i in range(0, len(shipment_ids), cursor.IN_MAX):
                     sub_ids = shipment_ids[i:i + cursor.IN_MAX]
-                    red_sql, red_ids = reduce_ids('id', sub_ids)
-                    cursor.execute('UPDATE "' + cls._table + '" '
-                        'SET company = %s WHERE ' + red_sql,
-                        [company_id] + red_ids)
+                    red_sql = reduce_ids(sql_table.id, sub_ids)
+                    cursor.execute(*sql_table.update(
+                            columns=[sql_table.company],
+                            values=[company_id],
+                            where=red_sql))
             table.not_null_action('company', action='add')
 
         # Add index on create_date
@@ -609,6 +648,15 @@ class ShipmentInReturn(Workflow, ModelSQL, ModelView):
                     })
 
     @classmethod
+    def get_origins(cls, shipments, name):
+        origins = {}
+        with Transaction().set_user(0, set_context=True):
+            for shipment in cls.browse(shipments):
+                origins[shipment.id] = ', '.join(set(itertools.ifilter(None,
+                            (m.origin_name for m in shipment.moves))))
+        return origins
+
+    @classmethod
     def create(cls, vlist):
         pool = Pool()
         Sequence = pool.get('ir.sequence')
@@ -743,7 +791,7 @@ class ShipmentOut(Workflow, ModelSQL, ModelView):
             },
         domain=[
             ('id', If(In('company', Eval('context', {})), '=', '!='),
-                Get(Eval('context', {}), 'company', 0)),
+                Eval('context', {}).get('company', -1)),
             ],
         depends=['state'])
     customer = fields.Many2One('party.party', 'Customer', required=True,
@@ -777,7 +825,7 @@ class ShipmentOut(Workflow, ModelSQL, ModelView):
     warehouse_output = fields.Function(fields.Many2One('stock.location',
             'Warehouse Output', on_change_with=['warehouse']),
         'on_change_with_warehouse_output')
-    outgoing_moves = fields.Function(fields.One2Many('stock.move', None,
+    outgoing_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
             'Outgoing Moves',
             domain=[
                 ('from_location', '=', Eval('warehouse_output')),
@@ -791,7 +839,7 @@ class ShipmentOut(Workflow, ModelSQL, ModelView):
             depends=['state', 'warehouse', 'customer', 'warehouse_output',
                 'customer_location', 'company']),
         'get_outgoing_moves', setter='set_outgoing_moves')
-    inventory_moves = fields.Function(fields.One2Many('stock.move', None,
+    inventory_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
             'Inventory Moves',
             domain=[
                 ('from_location', 'child_of', [Eval('warehouse_storage', -1)],
@@ -809,6 +857,7 @@ class ShipmentOut(Workflow, ModelSQL, ModelView):
     moves = fields.One2Many('stock.move', 'shipment', 'Moves',
         domain=[('company', '=', Eval('company'))], depends=['company'],
         readonly=True)
+    origins = fields.Function(fields.Char('Origins'), 'get_origins')
     code = fields.Char("Code", size=None, select=True, readonly=True)
     state = fields.Selection([
         ('draft', 'Draft'),
@@ -876,7 +925,9 @@ class ShipmentOut(Workflow, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
         # Migration from 1.2: packing renamed into shipment
         old_table = 'stock_packing_out'
         if TableHandler.table_exist(cursor, old_table):
@@ -898,22 +949,23 @@ class ShipmentOut(Workflow, ModelSQL, ModelView):
         Move = Pool().get('stock.move')
         if (not created_company
                 and TableHandler.table_exist(cursor, Move._table)):
-            cursor.execute('SELECT shipment.id, MAX(move.company) '
-                'FROM "%s" AS shipment '
-                'INNER JOIN "%s" AS move '
-                'ON \'%s,\' || shipment.id = move.shipment '
-                'GROUP BY shipment.id '
-                'ORDER BY MAX(move.company)'
-                % (cls._table, Move._table, cls.__name__))
+            move = Move.__table__()
+            cursor.execute(*sql_table.join(move,
+                    condition=(Concat(cls.__name__ + ',', sql_table.id)
+                        == move.shipment)
+                    ).select(sql_table.id, Max(move.company),
+                    group_by=sql_table.id,
+                    order_by=Max(move.company)))
             for company_id, values in itertools.groupby(cursor.fetchall(),
                     operator.itemgetter(1)):
                 shipment_ids = [x[0] for x in values]
                 for i in range(0, len(shipment_ids), cursor.IN_MAX):
                     sub_ids = shipment_ids[i:i + cursor.IN_MAX]
-                    red_sql, red_ids = reduce_ids('id', sub_ids)
-                    cursor.execute('UPDATE "' + cls._table + '" '
-                        'SET company = %s WHERE ' + red_sql,
-                        [company_id] + red_ids)
+                    red_sql = reduce_ids(sql_table.id, sub_ids)
+                    cursor.execute(*sql_table.update(
+                            columns=[sql_table.company],
+                            values=[company_id],
+                            where=red_sql))
             table.not_null_action('company', action='add')
 
         # Migration from 1.0 customer_location is no more used
@@ -999,6 +1051,15 @@ class ShipmentOut(Workflow, ModelSQL, ModelView):
                 })
 
     @classmethod
+    def get_origins(cls, shipments, name):
+        origins = {}
+        with Transaction().set_user(0, set_context=True):
+            for shipment in cls.browse(shipments):
+                origins[shipment.id] = ', '.join(set(itertools.ifilter(None,
+                            (m.origin_name for m in shipment.moves))))
+        return origins
+
+    @classmethod
     @ModelView.button
     @Workflow.transition('draft')
     def draft(cls, shipments):
@@ -1262,7 +1323,7 @@ class ShipmentOutReturn(Workflow, ModelSQL, ModelView):
             },
         domain=[
             ('id', If(In('company', Eval('context', {})), '=', '!='),
-                Get(Eval('context', {}), 'company', 0)),
+                Eval('context', {}).get('company', -1)),
             ],
         depends=['state'])
     customer = fields.Many2One('party.party', 'Customer', required=True,
@@ -1296,7 +1357,7 @@ class ShipmentOutReturn(Workflow, ModelSQL, ModelView):
     warehouse_input = fields.Function(fields.Many2One('stock.location',
             'Warehouse Input', on_change_with=['warehouse']),
         'on_change_with_warehouse_input')
-    incoming_moves = fields.Function(fields.One2Many('stock.move', None,
+    incoming_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
             'Incoming Moves',
             domain=[
                 ('from_location', '=', Eval('customer_location')),
@@ -1310,7 +1371,7 @@ class ShipmentOutReturn(Workflow, ModelSQL, ModelView):
             depends=['state', 'warehouse', 'customer', 'customer_location',
                 'warehouse_input', 'company']),
         'get_incoming_moves', setter='set_incoming_moves')
-    inventory_moves = fields.Function(fields.One2Many('stock.move', None,
+    inventory_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
             'Inventory Moves',
             domain=[
                 ('from_location', '=', Eval('warehouse_input')),
@@ -1327,6 +1388,7 @@ class ShipmentOutReturn(Workflow, ModelSQL, ModelView):
     moves = fields.One2Many('stock.move', 'shipment', 'Moves',
         domain=[('company', '=', Eval('company'))], depends=['company'],
         readonly=True)
+    origins = fields.Function(fields.Char('Origins'), 'get_origins')
     code = fields.Char("Code", size=None, select=True, readonly=True)
     state = fields.Selection([
         ('draft', 'Draft'),
@@ -1368,7 +1430,9 @@ class ShipmentOutReturn(Workflow, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
         # Migration from 1.2: packing renamed into shipment
         old_table = 'stock_packing_out_return'
         if TableHandler.table_exist(cursor, old_table):
@@ -1390,22 +1454,23 @@ class ShipmentOutReturn(Workflow, ModelSQL, ModelView):
         Move = Pool().get('stock.move')
         if (not created_company
                 and TableHandler.table_exist(cursor, Move._table)):
-            cursor.execute('SELECT shipment.id, MAX(move.company) '
-                'FROM "%s" AS shipment '
-                'INNER JOIN "%s" AS move '
-                'ON \'%s,\' || shipment.id = move.shipment '
-                'GROUP BY shipment.id '
-                'ORDER BY MAX(move.company)'
-                % (cls._table, Move._table, cls.__name__))
+            move = Move.__table__()
+            cursor.execute(*sql_table.join(move,
+                    condition=(Concat(cls.__name__ + ',', sql_table.id)
+                        == move.shipment)
+                    ).select(sql_table.id, Max(move.company),
+                    group_by=sql_table.id,
+                    order_by=Max(move.company)))
             for company_id, values in itertools.groupby(cursor.fetchall(),
                     operator.itemgetter(1)):
                 shipment_ids = [x[0] for x in values]
                 for i in range(0, len(shipment_ids), cursor.IN_MAX):
                     sub_ids = shipment_ids[i:i + cursor.IN_MAX]
-                    red_sql, red_ids = reduce_ids('id', sub_ids)
-                    cursor.execute('UPDATE "' + cls._table + '" '
-                        'SET company = %s WHERE ' + red_sql,
-                        [company_id] + red_ids)
+                    red_sql = reduce_ids(sql_table.id, sub_ids)
+                    cursor.execute(*sql_table.update(
+                            columns=[sql_table.company],
+                            values=[company_id],
+                            where=red_sql))
             table.not_null_action('company', action='add')
 
         # Add index on create_date
@@ -1516,6 +1581,15 @@ class ShipmentOutReturn(Workflow, ModelSQL, ModelView):
                     })
 
     @classmethod
+    def get_origins(cls, shipments, name):
+        origins = {}
+        with Transaction().set_user(0, set_context=True):
+            for shipment in cls.browse(shipments):
+                origins[shipment.id] = ', '.join(set(itertools.ifilter(None,
+                            (m.origin_name for m in shipment.moves))))
+        return origins
+
+    @classmethod
     def create(cls, vlist):
         pool = Pool()
         Sequence = pool.get('ir.sequence')
@@ -1689,7 +1763,7 @@ class ShipmentInternal(Workflow, ModelSQL, ModelView):
             },
         domain=[
             ('id', If(In('company', Eval('context', {})), '=', '!='),
-                Get(Eval('context', {}), 'company', 0)),
+                Eval('context', {}).get('company', -1)),
             ],
         depends=['state'])
     code = fields.Char("Code", size=None, select=True, readonly=True)
@@ -1785,7 +1859,9 @@ class ShipmentInternal(Workflow, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
         # Migration from 1.2: packing renamed into shipment
         old_table = 'stock_packing_internal'
         if TableHandler.table_exist(cursor, old_table):
@@ -1806,22 +1882,23 @@ class ShipmentInternal(Workflow, ModelSQL, ModelView):
         Move = Pool().get('stock.move')
         if (not created_company
                 and TableHandler.table_exist(cursor, Move._table)):
-            cursor.execute('SELECT shipment.id, MAX(move.company) '
-                'FROM "%s" AS shipment '
-                'INNER JOIN "%s" AS move '
-                'ON \'%s,\' || shipment.id = move.shipment '
-                'GROUP BY shipment.id '
-                'ORDER BY MAX(move.company)'
-                % (cls._table, Move._table, cls.__name__))
+            move = Move.__table__()
+            cursor.execute(*sql_table.join(move,
+                    condition=(Concat(cls.__name__ + ',', sql_table.id)
+                        == move.shipment)
+                    ).select(sql_table.id, Max(move.company),
+                    group_by=sql_table.id,
+                    order_by=Max(move.company)))
             for company_id, values in itertools.groupby(cursor.fetchall(),
                     operator.itemgetter(1)):
                 shipment_ids = [x[0] for x in values]
                 for i in range(0, len(shipment_ids), cursor.IN_MAX):
                     sub_ids = shipment_ids[i:i + cursor.IN_MAX]
-                    red_sql, red_ids = reduce_ids('id', sub_ids)
-                    cursor.execute('UPDATE "' + cls._table + '" '
-                        'SET company = %s WHERE ' + red_sql,
-                        [company_id] + red_ids)
+                    red_sql = reduce_ids(sql_table.id, sub_ids)
+                    cursor.execute(*sql_table.update(
+                            columns=[sql_table.company],
+                            values=[company_id],
+                            where=red_sql))
             table.not_null_action('company', action='add')
 
         # Add index on create_date
@@ -2140,8 +2217,8 @@ class PickingList(CompanyReport):
                 from_location_ids.add(move.from_location.id)
                 to_location_ids.add(move.to_location.id)
 
-        from_locations = Location.search(list(from_location_ids))
-        to_locations = Location.search(list(to_location_ids))
+        from_locations = Location.browse(list(from_location_ids))
+        to_locations = Location.browse(list(to_location_ids))
 
         return {
             'from_location_ids': [l.id for l in from_locations],
@@ -2187,8 +2264,8 @@ class SupplierRestockingList(CompanyReport):
                 from_location_ids.add(move.from_location.id)
                 to_location_ids.add(move.to_location.id)
 
-        from_locations = Location.search(list(from_location_ids))
-        to_locations = Location.search(list(to_location_ids))
+        from_locations = Location.browse(list(from_location_ids))
+        to_locations = Location.browse(list(to_location_ids))
 
         return {
             'from_location_ids': [l.id for l in from_locations],
@@ -2234,8 +2311,8 @@ class CustomerReturnRestockingList(CompanyReport):
                 from_location_ids.add(move.from_location.id)
                 to_location_ids.add(move.to_location.id)
 
-        from_locations = Location.search(list(from_location_ids))
-        to_locations = Location.search(list(to_location_ids))
+        from_locations = Location.browse(list(from_location_ids))
+        to_locations = Location.browse(list(to_location_ids))
 
         return {
             'from_location_ids': [l.id for l in from_locations],
@@ -2281,8 +2358,8 @@ class InteralShipmentReport(CompanyReport):
                 from_location_ids.add(move.from_location.id)
                 to_location_ids.add(move.to_location.id)
 
-        from_locations = Location.search(list(from_location_ids))
-        to_locations = Location.search(list(to_location_ids))
+        from_locations = Location.browse(list(from_location_ids))
+        to_locations = Location.browse(list(to_location_ids))
 
         return {
             'from_location_ids': [l.id for l in from_locations],
diff --git a/supplier_restocking_list.odt b/supplier_restocking_list.odt
index 22d0b14..cfa779b 100644
Binary files a/supplier_restocking_list.odt and b/supplier_restocking_list.odt differ
diff --git a/tests/__init__.py b/tests/__init__.py
index dfff549..2349560 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -2,3 +2,5 @@
 #this repository contains the full copyright notices and license terms.
 
 from .test_stock import suite
+
+__all__ = ['suite']
diff --git a/tests/test_stock.py b/tests/test_stock.py
index 349e9e4..f83c075 100644
--- a/tests/test_stock.py
+++ b/tests/test_stock.py
@@ -84,11 +84,12 @@ class StockTestCase(unittest.TestCase):
                 })
 
             tests = [
-                (kg, 10, 10),
-                (g, 100, 0.1),
-                (g, 1, 0),  # rounded
+                (kg, 10, 10, 0),
+                (g, 100, 0.1, 1),
+                (g, 1, 0, 0),  # rounded
+                (kg, 35.23, 35.23, 2),  # check infinite loop
             ]
-            for uom, quantity, internal_quantity in tests:
+            for uom, quantity, internal_quantity, ndigits in tests:
                 move, = self.move.create([{
                             'product': product.id,
                             'uom': uom.id,
@@ -99,14 +100,16 @@ class StockTestCase(unittest.TestCase):
                             'unit_price': Decimal('1'),
                             'currency': currency.id,
                             }])
-                self.assertEqual(move.internal_quantity, internal_quantity)
+                self.assertEqual(round(move.internal_quantity, ndigits),
+                    internal_quantity)
 
-                for uom, quantity, internal_quantity in tests:
+                for uom, quantity, internal_quantity, ndigits in tests:
                     self.move.write([move], {
                         'uom': uom.id,
                         'quantity': quantity,
                         })
-                    self.assertEqual(move.internal_quantity, internal_quantity)
+                    self.assertEqual(round(move.internal_quantity, ndigits),
+                        internal_quantity)
 
     def test0020products_by_location(self):
         '''
@@ -210,9 +213,6 @@ class StockTestCase(unittest.TestCase):
 
             products_by_location = partial(self.product.products_by_location,
                     [storage.id], [product.id])
-            products_by_location_zero = partial(
-                    self.product.products_by_location,
-                    [storage.id], [product.id], skip_zero=False)
 
             tests = [
                 ({'stock_date_end': today + relativedelta(days=-6),
@@ -269,16 +269,26 @@ class StockTestCase(unittest.TestCase):
                 }, 6),
             ]
 
+            def tests_product_quantity(context, quantity):
+                with transaction.set_context(locations=[storage.id]):
+                    product_reloaded = self.product(product.id)
+                    if (not context.get('stock_date_end')
+                            or context['stock_date_end'] > today
+                            or context.get('forecast')):
+                        self.assertEqual(product_reloaded.forecast_quantity,
+                            quantity)
+                    else:
+                        self.assertEqual(product_reloaded.quantity, quantity)
+
             def test_products_by_location():
                 for context, quantity in tests:
                     with transaction.set_context(context):
                         if not quantity:
                             self.assertEqual(products_by_location(), {})
-                            self.assertEqual(products_by_location_zero(),
-                                    {(storage.id, product.id): quantity})
                         else:
                             self.assertEqual(products_by_location(),
                                     {(storage.id, product.id): quantity})
+                            tests_product_quantity(context, quantity)
 
             test_products_by_location()
 
@@ -288,7 +298,7 @@ class StockTestCase(unittest.TestCase):
                 today + relativedelta(days=-4),
                 today + relativedelta(days=-3),
                 today + relativedelta(days=-2),
-            ]
+                ]
 
             moves = self.move.create([{
                         'product': product.id,
@@ -377,7 +387,8 @@ class StockTestCase(unittest.TestCase):
         '''
         Test period.
         '''
-        with Transaction().start(DB_NAME, USER, context=CONTEXT):
+        with Transaction().start(DB_NAME, USER,
+                context=CONTEXT) as transaction:
             category, = self.category.create([{
                         'name': 'Test period',
                         }])
@@ -441,6 +452,18 @@ class StockTestCase(unittest.TestCase):
                         'currency': currency.id,
                         }])
             self.move.do(moves)
+            self.move.create([{
+                        'product': product.id,
+                        'uom': unit.id,
+                        'quantity': 3,
+                        'from_location': supplier.id,
+                        'to_location': storage.id,
+                        'planned_date': None,
+                        'effective_date': None,
+                        'company': company.id,
+                        'unit_price': Decimal('1'),
+                        'currency': currency.id,
+                        }])
 
             tests = [
                 (-5, {
@@ -454,6 +477,29 @@ class StockTestCase(unittest.TestCase):
                 })
             ]
 
+            products_by_location = partial(self.product.products_by_location,
+                [storage.id], [product.id])
+
+            tests_pbl = [
+                ({'stock_date_end': today + relativedelta(days=-6)}, 0),
+                ({'stock_date_end': today + relativedelta(days=-5)}, 10),
+                ({'stock_date_end': today + relativedelta(days=-4)}, 25),
+                ({'stock_date_end': today + relativedelta(days=-3)}, 20),
+                ({'stock_date_end': today + relativedelta(days=-2)}, 20),
+                ({'stock_date_end': today}, 20),
+                ({'stock_date_end': datetime.date.max}, 23),
+                ]
+
+            def test_products_by_location():
+                for context, quantity in tests_pbl:
+                    with transaction.set_context(context):
+                        if not quantity:
+                            self.assertEqual(products_by_location(), {})
+                        else:
+                            self.assertEqual(products_by_location(),
+                                    {(storage.id, product.id): quantity})
+
+            test_products_by_location()
             for days, quantities in tests:
                 period, = self.period.create([{
                             'date': today + relativedelta(days=days),
@@ -469,6 +515,8 @@ class StockTestCase(unittest.TestCase):
                     self.assertEqual(cache.internal_quantity,
                         quantities[cache.location.id])
 
+                test_products_by_location()
+
             # Test check_period_closed
             moves = self.move.create([{
                         'product': product.id,
diff --git a/tryton.cfg b/tryton.cfg
index 99bdad7..bbb5e93 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.8.2
+version=3.0.0
 depends:
     company
     currency
diff --git a/trytond_stock.egg-info/PKG-INFO b/trytond_stock.egg-info/PKG-INFO
index 600870d..e32e3bf 100644
--- a/trytond_stock.egg-info/PKG-INFO
+++ b/trytond_stock.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond-stock
-Version: 2.8.2
+Version: 3.0.0
 Summary: Tryton module for stock and inventory
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.8/
+Download-URL: http://downloads.tryton.org/3.0/
 Description: trytond_stock
         =============
         
@@ -60,6 +60,7 @@ Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
 Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovenian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python :: 2.6
diff --git a/trytond_stock.egg-info/SOURCES.txt b/trytond_stock.egg-info/SOURCES.txt
index 2822d28..2acd70d 100644
--- a/trytond_stock.egg-info/SOURCES.txt
+++ b/trytond_stock.egg-info/SOURCES.txt
@@ -43,6 +43,7 @@ locale/es_ES.po
 locale/fr_FR.po
 locale/nl_NL.po
 locale/ru_RU.po
+locale/sl_SI.po
 tests/scenario_stock_average_cost_price.rst
 tests/scenario_stock_shipment_out.rst
 trytond_stock.egg-info/PKG-INFO
diff --git a/trytond_stock.egg-info/requires.txt b/trytond_stock.egg-info/requires.txt
index 18b97a6..f714b59 100644
--- a/trytond_stock.egg-info/requires.txt
+++ b/trytond_stock.egg-info/requires.txt
@@ -1,5 +1,6 @@
-trytond_company >= 2.8, < 2.9
-trytond_currency >= 2.8, < 2.9
-trytond_party >= 2.8, < 2.9
-trytond_product >= 2.8, < 2.9
-trytond >= 2.8, < 2.9
\ No newline at end of file
+python-sql
+trytond_company >= 3.0, < 3.1
+trytond_currency >= 3.0, < 3.1
+trytond_party >= 3.0, < 3.1
+trytond_product >= 3.0, < 3.1
+trytond >= 3.0, < 3.1
\ No newline at end of file
diff --git a/view/inventory_line_form.xml b/view/inventory_line_form.xml
index 1181051..161332f 100644
--- a/view/inventory_line_form.xml
+++ b/view/inventory_line_form.xml
@@ -6,6 +6,7 @@ this repository contains the full copyright notices and license terms. -->
     <field name="product"/>
     <label name="uom"/>
     <field name="uom"/>
+    <newline/>
     <label name="expected_quantity"/>
     <field name="expected_quantity"/>
     <label name="quantity"/>
diff --git a/view/inventory_tree.xml b/view/inventory_tree.xml
index db5c588..1448000 100644
--- a/view/inventory_tree.xml
+++ b/view/inventory_tree.xml
@@ -6,5 +6,4 @@ this repository contains the full copyright notices and license terms. -->
     <field name="date"/>
     <field name="state"/>
     <field name="company"/>
-    <field name="create_date" tree_invisible="1"/>
 </tree>
diff --git a/view/move_form.xml b/view/move_form.xml
index d401b58..fe311d8 100644
--- a/view/move_form.xml
+++ b/view/move_form.xml
@@ -2,6 +2,8 @@
 <!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
 this repository contains the full copyright notices and license terms. -->
 <form string="Move" col="4">
+    <label name="shipment"/>
+    <field name="shipment" colspan="3"/>
     <label name="from_location"/>
     <field name="from_location"/>
     <label name="to_location"/>
diff --git a/view/move_tree.xml b/view/move_tree.xml
index 4d3623a..7211c03 100644
--- a/view/move_tree.xml
+++ b/view/move_tree.xml
@@ -8,7 +8,7 @@ this repository contains the full copyright notices and license terms. -->
     <field name="quantity"/>
     <field name="uom"/>
     <field name="planned_date"/>
+    <field name="effective_date"/>
     <field name="state"/>
     <field name="unit_digits" tree_invisible="1"/>
-    <field name="create_date" tree_invisible="1"/>
 </tree>
diff --git a/view/shipment_in_return_tree.xml b/view/shipment_in_return_tree.xml
index 3e6266f..3ee2aed 100644
--- a/view/shipment_in_return_tree.xml
+++ b/view/shipment_in_return_tree.xml
@@ -9,5 +9,4 @@ this repository contains the full copyright notices and license terms. -->
     <field name="from_location"/>
     <field name="to_location"/>
     <field name="state"/>
-    <field name="create_date" tree_invisible="1"/>
 </tree>
diff --git a/view/shipment_in_tree.xml b/view/shipment_in_tree.xml
index 7038fc1..41d0f56 100644
--- a/view/shipment_in_tree.xml
+++ b/view/shipment_in_tree.xml
@@ -9,5 +9,4 @@ this repository contains the full copyright notices and license terms. -->
     <field name="supplier"/>
     <field name="contact_address"/>
     <field name="state"/>
-    <field name="create_date" tree_invisible="1"/>
 </tree>
diff --git a/view/shipment_internal_tree.xml b/view/shipment_internal_tree.xml
index 4b4e126..ecf5b5c 100644
--- a/view/shipment_internal_tree.xml
+++ b/view/shipment_internal_tree.xml
@@ -9,5 +9,4 @@ this repository contains the full copyright notices and license terms. -->
     <field name="from_location"/>
     <field name="to_location"/>
     <field name="state"/>
-    <field name="create_date" tree_invisible="1"/>
 </tree>
diff --git a/view/shipment_out_return_tree.xml b/view/shipment_out_return_tree.xml
index 38950a9..6152586 100644
--- a/view/shipment_out_return_tree.xml
+++ b/view/shipment_out_return_tree.xml
@@ -9,5 +9,4 @@ this repository contains the full copyright notices and license terms. -->
     <field name="effective_date"/>
     <field name="customer"/>
     <field name="delivery_address"/>
-    <field name="create_date" tree_invisible="1"/>
 </tree>
diff --git a/view/shipment_out_tree.xml b/view/shipment_out_tree.xml
index c0e54f5..5783ae4 100644
--- a/view/shipment_out_tree.xml
+++ b/view/shipment_out_tree.xml
@@ -9,5 +9,4 @@ this repository contains the full copyright notices and license terms. -->
     <field name="customer"/>
     <field name="delivery_address"/>
     <field name="state"/>
-    <field name="create_date" tree_invisible="1"/>
 </tree>
-- 
tryton-modules-stock



More information about the tryton-debian-vcs mailing list