[tryton-debian-vcs] tryton-modules-sale branch debian updated. debian/2.8.2-1-5-ge0f881c

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


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

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

    Releasing debian version 3.0.0-1.

diff --git a/debian/changelog b/debian/changelog
index 1f469ca..555f80b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-sale (3.0.0-1) unstable; urgency=low
+
+  * 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:05 +0100
+
 tryton-modules-sale (2.8.2-1) unstable; urgency=low
 
   * Merging upstream version 2.8.2.
commit 03ea291c9fe279bf577bc6d82072e0a73256b7f5
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Nov 25 17:47:26 2013 +0100

    Adding python-sql to Depends.

diff --git a/debian/control b/debian/control
index 2b40662..b38d257 100644
--- a/debian/control
+++ b/debian/control
@@ -22,7 +22,8 @@ Depends:
  tryton-modules-currency (>= ${version:major}),
  tryton-modules-party (>= ${version:major}),
  tryton-modules-product (>= ${version:major}),
- tryton-modules-stock (>= ${version:major}), python-pkg-resources
+ tryton-modules-stock (>= ${version:major}),
+ python-sql, python-pkg-resources
 Description: Tryton Application Platform (Sale 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 d81cb10f472abe9a60f3c027bda0c2e432623af8
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 6548dac..2b40662 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-sale.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 8a3380eb4ba2db256e90bdafd1d0d6288f1bba2f
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 822d097..6548dac 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-sale.git
 Vcs-Git: git://debian.tryton.org/packages/tryton-modules-sale.git
commit 04349e822664624a25406f04046229bdc5e1f8eb
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 17:27:56 2013 +0100

    Merging upstream version 3.0.0.

diff --git a/CHANGELOG b/CHANGELOG
index 7a91add..abd2b7b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,8 +1,6 @@
-Version 2.8.2 - 2013-10-01
-* Bug fixes (see mercurial logs for details)
-
-Version 2.8.1 - 2013-07-22
+Version 3.0.0 - 2013-10-21
 * Bug fixes (see mercurial logs for details)
+* Replace reference copying by relate
 
 Version 2.8.0 - 2013-04-22
 * Bug fixes (see mercurial logs for details)
diff --git a/INSTALL b/INSTALL
index aac074e..aba12d0 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_company (http://www.tryton.org/)
  * trytond_party (http://www.tryton.org/)
  * trytond_stock (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index dafd736..95adefa 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond_sale
-Version: 2.8.2
+Version: 3.0.0
 Summary: Tryton module for sale
 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_sale
         ============
         
@@ -59,6 +59,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/__init__.py b/__init__.py
index fdf41cb..03ce289 100644
--- a/__init__.py
+++ b/__init__.py
@@ -3,6 +3,8 @@
 
 from trytond.pool import Pool
 from .sale import *
+from .product import *
+from .stock import *
 from .configuration import *
 from .invoice import *
 
@@ -24,6 +26,7 @@ def register():
         ShipmentOutReturn,
         HandleShipmentExceptionAsk,
         HandleInvoiceExceptionAsk,
+        ReturnSaleStart,
         Configuration,
         Invoice,
         InvoiceLine,
diff --git a/configuration.py b/configuration.py
index 46de41d..905b65a 100644
--- a/configuration.py
+++ b/configuration.py
@@ -11,8 +11,8 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
     __name__ = 'sale.configuration'
     sale_sequence = fields.Property(fields.Many2One('ir.sequence',
             'Sale Reference Sequence', domain=[
-                ('company', 'in', [Eval('context', {}).get('company', 0),
-                        False]),
+                ('company', 'in',
+                    [Eval('context', {}).get('company', -1), None]),
                 ('code', '=', 'sale.sale'),
                 ], required=True))
     sale_invoice_method = fields.Property(fields.Selection([
@@ -20,12 +20,12 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
                 ('order', 'On Order Processed'),
                 ('shipment', 'On Shipment Sent')
                 ], 'Sale Invoice Method', states={
-                'required': Bool(Eval('context', {}).get('company', 0)),
+                'required': Bool(Eval('context', {}).get('company')),
                 }))
     sale_shipment_method = fields.Property(fields.Selection([
                 ('manual', 'Manual'),
                 ('order', 'On Order Processed'),
                 ('invoice', 'On Invoice Paid'),
                 ], 'Sale Shipment Method', states={
-                'required': Bool(Eval('context', {}).get('company', 0)),
+                'required': Bool(Eval('context', {}).get('company')),
                 }))
diff --git a/invoice.py b/invoice.py
index 442c4d1..caa6056 100644
--- a/invoice.py
+++ b/invoice.py
@@ -1,14 +1,29 @@
 #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 functools import wraps
+from sql import Table
+
 from trytond.model import Workflow, fields
 from trytond.pool import Pool, PoolMeta
 from trytond.transaction import Transaction
-from trytond.backend import TableHandler
+from trytond import backend
 
 __all__ = ['Invoice', 'InvoiceLine']
 __metaclass__ = PoolMeta
 
 
+def process_sale(func):
+    @wraps(func)
+    def wrapper(cls, invoices):
+        pool = Pool()
+        Sale = pool.get('sale.sale')
+        func(cls, invoices)
+        with Transaction().set_user(0, set_context=True):
+            Sale.process([s for i in cls.browse(invoices)
+                    for s in i.sales])
+    return wrapper
+
+
 class Invoice:
     __name__ = 'account.invoice'
     sales = fields.Many2Many('sale.sale-account.invoice',
@@ -59,29 +74,32 @@ class Invoice:
 
     @classmethod
     def delete(cls, invoices):
+        pool = Pool()
+        Sale_Invoice = pool.get('sale.sale-account.invoice')
+        sale_invoice = Sale_Invoice.__table__()
+        cursor = Transaction().cursor
         if invoices:
-            Transaction().cursor.execute('SELECT id FROM sale_invoices_rel '
-                'WHERE invoice IN (' + ','.join(('%s',) * len(invoices)) + ')',
-                [i.id for i in invoices])
-            if Transaction().cursor.fetchone():
+            cursor.execute(*sale_invoice.select(sale_invoice.id,
+                    where=sale_invoice.invoice.in_(
+                        [i.id for i in invoices])))
+            if cursor.fetchone():
                 cls.raise_user_error('delete_sale_invoice')
         super(Invoice, cls).delete(invoices)
 
     @classmethod
+    @process_sale
+    def post(cls, invoices):
+        super(Invoice, cls).post(invoices)
+
+    @classmethod
+    @process_sale
     def paid(cls, invoices):
-        pool = Pool()
-        Sale = pool.get('sale.sale')
         super(Invoice, cls).paid(invoices)
-        with Transaction().set_user(0, set_context=True):
-            Sale.process([s for i in cls.browse(invoices) for s in i.sales])
 
     @classmethod
+    @process_sale
     def cancel(cls, invoices):
-        pool = Pool()
-        Sale = pool.get('sale.sale')
         super(Invoice, cls).cancel(invoices)
-        with Transaction().set_user(0, set_context=True):
-            Sale.process([s for i in cls.browse(invoices) for s in i.sales])
 
     @classmethod
     @Workflow.transition('draft')
@@ -102,22 +120,34 @@ class InvoiceLine:
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
 
         super(InvoiceLine, cls).__register__(module_name)
 
         # Migration from 2.6: remove sale_lines
-        rel_table = 'sale_line_invoice_lines_rel'
-        if TableHandler.table_exist(cursor, rel_table):
-            cursor.execute('SELECT sale_line, invoice_line '
-                'FROM "' + rel_table + '"')
+        rel_table_name = 'sale_line_invoice_lines_rel'
+        if TableHandler.table_exist(cursor, rel_table_name):
+            rel_table = Table(rel_table_name)
+            cursor.execute(*rel_table.select(
+                    rel_table.sale_line, rel_table.invoice_line))
             for sale_line, invoice_line in cursor.fetchall():
-                cursor.execute('UPDATE "' + cls._table + '" '
-                    'SET origin = %s '
-                    'WHERE id = %s',
-                    ('sale.line,%s' % sale_line, invoice_line))
+                cursor.execute(*sql_table.update(
+                        columns=[sql_table.origin],
+                        values=['sale.line,%s' % sale_line],
+                        where=sql_table.id == invoice_line))
             TableHandler.drop_table(cursor,
-                'sale.line-account.invoice.line', rel_table)
+                'sale.line-account.invoice.line', rel_table_name)
+
+    @property
+    def origin_name(self):
+        pool = Pool()
+        SaleLine = pool.get('sale.line')
+        name = super(InvoiceLine, self).origin_name
+        if isinstance(self.origin, SaleLine):
+            name = self.origin.sale.rec_name
+        return name
 
     @classmethod
     def _get_origin(cls):
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 710ebc9..cd5fe24 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -344,6 +344,11 @@ msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
+#, fuzzy
+msgctxt "field:sale.return_sale.start,id:"
+msgid "ID"
+msgstr "ID"
+
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Коментар"
@@ -630,6 +635,16 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Продажби"
 
+#, fuzzy
+msgctxt "model:ir.action,name:act_sale_invoice_relate"
+msgid "Sales"
+msgstr "Управление на продажби"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Управление на продажби"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Изпращания"
@@ -642,8 +657,9 @@ msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
 msgstr "Обработка на грешка към фактура"
 
+#, fuzzy
 msgctxt "model:ir.action,name:wizard_return_sale"
-msgid "Create Return Sale"
+msgid "Return Sale"
 msgstr "Създаване на меню Продажби"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
@@ -741,6 +757,11 @@ msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Ред от продажба - Нановосъздадено движение"
 
+#, fuzzy
+msgctxt "model:sale.return_sale.start,name:"
+msgid "Return Sale"
+msgstr "Създаване на меню Продажби"
+
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Продажба"
@@ -969,6 +990,11 @@ msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Създаден наново"
 
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Sale"
+msgstr "Продажба"
+
 msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Продукти"
@@ -1013,6 +1039,15 @@ msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Редове от продажба"
 
+msgctxt "view:sale.return_sale.start:"
+msgid "Are you sure to return those/this sale(s)?"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.return_sale.start:"
+msgid "Return Sale"
+msgstr "Създаване на меню Продажби"
+
 msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Отказ"
@@ -1080,3 +1115,12 @@ msgstr "Отказ"
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Добре"
+
+#, fuzzy
+msgctxt "wizard_button:sale.return_sale,start,end:"
+msgid "Cancel"
+msgstr "Отказване"
+
+msgctxt "wizard_button:sale.return_sale,start,return_:"
+msgid "Return"
+msgstr ""
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index c03b8d0..0d4c76b 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -350,6 +350,10 @@ msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
+msgctxt "field:sale.return_sale.start,id:"
+msgid "ID"
+msgstr "ID"
+
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Comentari"
@@ -622,7 +626,7 @@ msgstr "Tercers amb vendes"
 
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
-msgstr "Retorna"
+msgstr "Devolució"
 
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
@@ -636,6 +640,14 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Vendes"
 
+msgctxt "model:ir.action,name:act_sale_invoice_relate"
+msgid "Sales"
+msgstr "Vendes"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Vendes"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Albarans"
@@ -649,8 +661,8 @@ msgid "Handle Invoice Exception"
 msgstr "Gestiona excepció de factura"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
-msgid "Create Return Sale"
-msgstr "Crea comanda d'abonament"
+msgid "Return Sale"
+msgstr "Devolució comanda"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
@@ -743,6 +755,10 @@ msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Línia de venda - Moviment recreat"
 
+msgctxt "model:sale.return_sale.start,name:"
+msgid "Return Sale"
+msgstr "Devolució comanda"
+
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Venda"
@@ -829,7 +845,7 @@ msgstr "CIF/NIF:"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
-msgstr " "
+msgstr ""
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
@@ -961,7 +977,7 @@ msgstr "Pressupost"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
-msgstr " "
+msgstr ""
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
@@ -971,6 +987,10 @@ msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Recreat"
 
+msgctxt "view:party.party:"
+msgid "Sale"
+msgstr "Venda"
+
 msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productes"
@@ -1015,6 +1035,14 @@ msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Línies de venda"
 
+msgctxt "view:sale.return_sale.start:"
+msgid "Are you sure to return those/this sale(s)?"
+msgstr "Esteu segur de retornar aquestes comandes?"
+
+msgctxt "view:sale.return_sale.start:"
+msgid "Return Sale"
+msgstr "Devolució comanda"
+
 msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Cancel·la"
@@ -1082,3 +1110,11 @@ msgstr "Cancel·la"
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Accepta"
+
+msgctxt "wizard_button:sale.return_sale,start,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:sale.return_sale,start,return_:"
+msgid "Return"
+msgstr "Devolució"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index d2fc732..f7b505b 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -344,6 +344,10 @@ msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
 msgstr ""
 
+msgctxt "field:sale.return_sale.start,id:"
+msgid "ID"
+msgstr ""
+
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr ""
@@ -629,6 +633,14 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr ""
 
+msgctxt "model:ir.action,name:act_sale_invoice_relate"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr ""
@@ -642,7 +654,7 @@ msgid "Handle Invoice Exception"
 msgstr ""
 
 msgctxt "model:ir.action,name:wizard_return_sale"
-msgid "Create Return Sale"
+msgid "Return Sale"
 msgstr ""
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
@@ -736,6 +748,10 @@ msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr ""
 
+msgctxt "model:sale.return_sale.start,name:"
+msgid "Return Sale"
+msgstr ""
+
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr ""
@@ -964,6 +980,10 @@ msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr ""
 
+msgctxt "view:party.party:"
+msgid "Sale"
+msgstr ""
+
 msgctxt "view:product.product:"
 msgid "Products"
 msgstr ""
@@ -1008,6 +1028,14 @@ msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr ""
 
+msgctxt "view:sale.return_sale.start:"
+msgid "Are you sure to return those/this sale(s)?"
+msgstr ""
+
+msgctxt "view:sale.return_sale.start:"
+msgid "Return Sale"
+msgstr ""
+
 msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr ""
@@ -1075,3 +1103,11 @@ msgstr ""
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr ""
+
+msgctxt "wizard_button:sale.return_sale,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:sale.return_sale,start,return_:"
+msgid "Return"
+msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 6049522..25e6266 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -362,6 +362,10 @@ msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
+msgctxt "field:sale.return_sale.start,id:"
+msgid "ID"
+msgstr "ID"
+
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Kommentar"
@@ -649,6 +653,14 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Verkäufe"
 
+msgctxt "model:ir.action,name:act_sale_invoice_relate"
+msgid "Sales"
+msgstr "Verkäufe"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Verkäufe"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Lieferposten"
@@ -662,7 +674,7 @@ msgid "Handle Invoice Exception"
 msgstr "Rechnungsvorbehalt bearbeiten"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
-msgid "Create Return Sale"
+msgid "Return Sale"
 msgstr "Rücknahme erstellen"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
@@ -756,6 +768,10 @@ msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Verkauf Position - Bewegung Nachgebildet"
 
+msgctxt "model:sale.return_sale.start,name:"
+msgid "Return Sale"
+msgstr "Rücknahme erstellen"
+
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Verkauf"
@@ -984,6 +1000,10 @@ msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Nachgebildet"
 
+msgctxt "view:party.party:"
+msgid "Sale"
+msgstr "Verkauf"
+
 msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Artikel"
@@ -1028,6 +1048,15 @@ msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Positionen Verkauf"
 
+msgctxt "view:sale.return_sale.start:"
+msgid "Are you sure to return those/this sale(s)?"
+msgstr ""
+"Mit der Rücknahme dieses Verkaufs/dieser Verkäufe wirklich fortfahren?"
+
+msgctxt "view:sale.return_sale.start:"
+msgid "Return Sale"
+msgstr "Rücknahme erstellen"
+
 msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Annullieren"
@@ -1095,3 +1124,11 @@ msgstr "Abbrechen"
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "OK"
+
+msgctxt "wizard_button:sale.return_sale,start,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:sale.return_sale,start,return_:"
+msgid "Return"
+msgstr "Rücknahme durchführen"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index 9a3d7d6..a73bc7d 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -27,7 +27,7 @@ msgstr "Falta la propiedad «Cuenta a cobrar» por defecto de las ventas."
 msgctxt "error:sale.sale:"
 msgid "Invalid combination of shipment and invoicing methods on sale \"%s\"."
 msgstr ""
-"La combinación de métodos de envío y facturación en la venta «%s» no es "
+"La combinación de métodos de remito y facturación en la venta «%s» no es "
 "correcta."
 
 msgctxt "error:sale.sale:"
@@ -35,8 +35,8 @@ msgid ""
 "Invoice and Shipment addresses must be defined for the quotation of sale "
 "\"%s\"."
 msgstr ""
-"Las direcciones de envío y facturación se deben definir para el presupuesto "
-"de venta «%s»."
+"Las direcciones de remito y facturación se deben definir para el presupuesto"
+" de venta «%s»."
 
 msgctxt "error:sale.sale:"
 msgid "It misses an \"Account Receivable\" on the party \"%s\"."
@@ -350,6 +350,10 @@ msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
+msgctxt "field:sale.return_sale.start,id:"
+msgid "ID"
+msgstr "ID"
+
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Comentario"
@@ -368,11 +372,11 @@ msgstr "Usuario creación"
 
 msgctxt "field:sale.sale,currency:"
 msgid "Currency"
-msgstr "Divisa"
+msgstr "Moneda"
 
 msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
-msgstr "Dígitos de divisa"
+msgstr "Dígitos de moneda"
 
 msgctxt "field:sale.sale,description:"
 msgid "Description"
@@ -448,7 +452,7 @@ msgstr "Método de envío"
 
 msgctxt "field:sale.sale,shipment_returns:"
 msgid "Shipment Returns"
-msgstr "Devolución de envío"
+msgstr "Remitos de devolución"
 
 msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
@@ -456,7 +460,7 @@ msgstr "Estado de envío"
 
 msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Remitos"
 
 msgctxt "field:sale.sale,state:"
 msgid "State"
@@ -636,9 +640,17 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Ventas"
 
+msgctxt "model:ir.action,name:act_sale_invoice_relate"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Ventas"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Remitos"
 
 msgctxt "model:ir.action,name:report_sale"
 msgid "Sale"
@@ -649,12 +661,12 @@ msgid "Handle Invoice Exception"
 msgstr "Gestionar excepción de factura"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
-msgid "Create Return Sale"
+msgid "Return Sale"
 msgstr "Crear devolución de venta"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envío"
+msgstr "Gestionar excepción de remito"
 
 msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_all"
 msgid "All"
@@ -725,7 +737,7 @@ msgstr "Gestionar excepción de factura"
 
 msgctxt "model:sale.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envío"
+msgstr "Gestionar excepción de remito"
 
 msgctxt "model:sale.line,name:"
 msgid "Sale Line"
@@ -743,6 +755,10 @@ msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Línea de venta - Movimiento recreado"
 
+msgctxt "model:sale.return_sale.start,name:"
+msgid "Return Sale"
+msgstr "Crear devolución de venta"
+
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Venta"
@@ -971,6 +987,10 @@ msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Recreado"
 
+msgctxt "view:party.party:"
+msgid "Sale"
+msgstr "Venta"
+
 msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productos"
@@ -997,7 +1017,7 @@ msgstr "Seleccione movimientos a recrear"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Gestionar excepción de envío"
+msgstr "Gestionar excepción de remito"
 
 msgctxt "view:sale.line:"
 msgid "General"
@@ -1015,6 +1035,14 @@ msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Líneas de venta"
 
+msgctxt "view:sale.return_sale.start:"
+msgid "Are you sure to return those/this sale(s)?"
+msgstr "¿Está seguro de devolver estos pedidos?"
+
+msgctxt "view:sale.return_sale.start:"
+msgid "Return Sale"
+msgstr "Crear devolución de venta"
+
 msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Cancelar"
@@ -1033,7 +1061,7 @@ msgstr "Gestionar excepción de factura"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envío"
+msgstr "Gestionar excepción de remito"
 
 msgctxt "view:sale.sale:"
 msgid "Invoices"
@@ -1061,7 +1089,7 @@ msgstr "Ventas"
 
 msgctxt "view:sale.sale:"
 msgid "Shipments"
-msgstr "Envios"
+msgstr "Remitos"
 
 msgctxt "view:stock.move:"
 msgid "Moves"
@@ -1082,3 +1110,11 @@ msgstr "Cancelar"
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
+
+msgctxt "wizard_button:sale.return_sale,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:sale.return_sale,start,return_:"
+msgid "Return"
+msgstr "Devolver"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index e4821ed..74e8c95 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -143,7 +143,7 @@ msgstr "Recrear Movimientos"
 
 msgctxt "field:sale.line,amount:"
 msgid "Amount"
-msgstr "Cantidad"
+msgstr "Subtotal"
 
 msgctxt "field:sale.line,create_date:"
 msgid "Create Date"
@@ -353,6 +353,10 @@ msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
+msgctxt "field:sale.return_sale.start,id:"
+msgid "ID"
+msgstr "ID"
+
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Comentario"
@@ -639,6 +643,14 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Ventas"
 
+msgctxt "model:ir.action,name:act_sale_invoice_relate"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Ventas"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Envios"
@@ -652,7 +664,7 @@ msgid "Handle Invoice Exception"
 msgstr "Gestionar Excepción de Factura"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
-msgid "Create Return Sale"
+msgid "Return Sale"
 msgstr "Crear Devolución de Venta"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
@@ -700,11 +712,11 @@ msgstr "Clientes"
 
 msgctxt "model:ir.ui.menu,name:menu_sale"
 msgid "Sales"
-msgstr "Ventas"
+msgstr "Gestión de Ventas"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
 msgid "Sales Configuration"
-msgstr "Configuración de Ventas"
+msgstr "Ventas"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
@@ -746,6 +758,10 @@ msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Línea de Venta - Movimiento Recreado"
 
+msgctxt "model:sale.return_sale.start,name:"
+msgid "Return Sale"
+msgstr "Crear Devolución de Venta"
+
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Venta"
@@ -764,7 +780,7 @@ msgstr "Venta - Factura Recreada"
 
 msgctxt "odt:sale.sale:"
 msgid "Amount"
-msgstr "Cantidad"
+msgstr "Subtotal"
 
 msgctxt "odt:sale.sale:"
 msgid "Date:"
@@ -830,10 +846,9 @@ msgctxt "odt:sale.sale:"
 msgid "VAT:"
 msgstr "NIT:"
 
-#, fuzzy
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
@@ -963,10 +978,9 @@ msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
 msgstr "Cotización"
 
-#, fuzzy
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
@@ -976,6 +990,10 @@ msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Recreado"
 
+msgctxt "view:party.party:"
+msgid "Sale"
+msgstr "Venta"
+
 msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productos"
@@ -1020,6 +1038,14 @@ msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Líneas de Venta"
 
+msgctxt "view:sale.return_sale.start:"
+msgid "Are you sure to return those/this sale(s)?"
+msgstr "Esta seguro que desea devolver esta(s) venta(s)?"
+
+msgctxt "view:sale.return_sale.start:"
+msgid "Return Sale"
+msgstr "Crear Devolución de Venta"
+
 msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Cancelar"
@@ -1087,3 +1113,11 @@ msgstr "Cancelar"
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
+
+msgctxt "wizard_button:sale.return_sale,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:sale.return_sale,start,return_:"
+msgid "Return"
+msgstr "Devolución"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index da6eb2a..734a961 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -45,7 +45,7 @@ msgstr "Falta una \"Cuenta a cobrar\" al tercero \"%s\"."
 
 msgctxt "error:sale.sale:"
 msgid "Sale \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar la venta \"%s\" antes de borrar."
+msgstr "Debe cancelar la venta \"%s\" antes de borrarla."
 
 msgctxt "error:sale.sale:"
 msgid "Warehouse must be defined for the quotation of sale \"%s\"."
@@ -69,7 +69,7 @@ msgstr "Ventas"
 
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
-msgstr "Tiempo de envío"
+msgstr "Plazo de entrega"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -351,6 +351,10 @@ msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
+msgctxt "field:sale.return_sale.start,id:"
+msgid "ID"
+msgstr "ID"
+
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Comentario"
@@ -623,7 +627,7 @@ msgstr "Terceros con ventas"
 
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
-msgstr "Devolver"
+msgstr "Devolución"
 
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
@@ -637,6 +641,14 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Ventas"
 
+msgctxt "model:ir.action,name:act_sale_invoice_relate"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Ventas"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Albaranes"
@@ -650,8 +662,8 @@ msgid "Handle Invoice Exception"
 msgstr "Gestionar excepción de factura"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
-msgid "Create Return Sale"
-msgstr "Crear devolución de venta"
+msgid "Return Sale"
+msgstr "Devolución venta"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
@@ -744,6 +756,10 @@ msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Línea de venta - Movimiento recreado"
 
+msgctxt "model:sale.return_sale.start,name:"
+msgid "Return Sale"
+msgstr "Devolución venta"
+
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Venta"
@@ -822,7 +838,7 @@ msgstr "Precio unidad"
 
 msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
-msgstr "Número CIF/NIF:"
+msgstr "CIF/NIF:"
 
 msgctxt "odt:sale.sale:"
 msgid "VAT:"
@@ -972,6 +988,10 @@ msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Recreado"
 
+msgctxt "view:party.party:"
+msgid "Sale"
+msgstr "Venta"
+
 msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productos"
@@ -1016,6 +1036,14 @@ msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Líneas de venta"
 
+msgctxt "view:sale.return_sale.start:"
+msgid "Are you sure to return those/this sale(s)?"
+msgstr "¿Está seguro de devolver estos pedidos?"
+
+msgctxt "view:sale.return_sale.start:"
+msgid "Return Sale"
+msgstr "Devolución de venta"
+
 msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Cancelar"
@@ -1083,3 +1111,11 @@ msgstr "Cancelar"
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
+
+msgctxt "wizard_button:sale.return_sale,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:sale.return_sale,start,return_:"
+msgid "Return"
+msgstr "Devover"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 48f6613..05a24a8 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -10,10 +10,6 @@ msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr "Vous ne pouvez pas réinitialiser une facture générée par une vente."
 
-msgctxt "error:account.invoice:"
-msgid "You cannot reset to draft an invoice generated by a sale."
-msgstr "Vous ne pouvez pas réinitialiser une facture générée par une vente."
-
 msgctxt "error:sale.line:"
 msgid "Product \"%(product)s\" of sale %(sale)s misses a revenue account."
 msgstr ""
@@ -65,10 +61,6 @@ msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
 msgstr "Vous ne pouvez pas réinitialiser un mouvement généré par une vente."
 
-msgctxt "error:stock.shipment.out:"
-msgid "You cannot reset to draft a move generated by a sale."
-msgstr "Vous ne pouvez pas réinitialiser un mouvement généré par une vente."
-
 msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
 msgstr "État d'exception"
@@ -107,7 +99,7 @@ msgstr "Nom"
 
 msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
-msgstr "Facturation"
+msgstr "Méthod de facturation"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
@@ -115,7 +107,7 @@ msgstr "Séquence de référence de vente"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
-msgstr "Expédition"
+msgstr "Méthod d'expédition"
 
 msgctxt "field:sale.configuration,write_date:"
 msgid "Write Date"
@@ -147,7 +139,7 @@ msgstr "ID"
 
 msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Recréer les mouvements"
+msgstr "Recréer des mouvements"
 
 msgctxt "field:sale.line,amount:"
 msgid "Amount"
@@ -361,13 +353,17 @@ msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
+msgctxt "field:sale.return_sale.start,id:"
+msgid "ID"
+msgstr "ID"
+
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Commentaire"
 
 msgctxt "field:sale.sale,company:"
 msgid "Company"
-msgstr "Companie"
+msgstr "Société"
 
 msgctxt "field:sale.sale,create_date:"
 msgid "Create Date"
@@ -647,6 +643,14 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Ventes"
 
+msgctxt "model:ir.action,name:act_sale_invoice_relate"
+msgid "Sales"
+msgstr "Ventes"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Ventes"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Expéditions"
@@ -660,8 +664,8 @@ msgid "Handle Invoice Exception"
 msgstr "Gérer l'exception de facture"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
-msgid "Create Return Sale"
-msgstr "Créer le retour de vente"
+msgid "Return Sale"
+msgstr "Retourner la vente"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
@@ -754,6 +758,10 @@ msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Ligne de vente - Mouvement recréé"
 
+msgctxt "model:sale.return_sale.start,name:"
+msgid "Return Sale"
+msgstr "Créer le retour de vente"
+
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Vente"
@@ -775,14 +783,6 @@ msgid "Amount"
 msgstr "Montant"
 
 msgctxt "odt:sale.sale:"
-msgid "Amount"
-msgstr "Montant"
-
-msgctxt "odt:sale.sale:"
-msgid "Date:"
-msgstr "Date :"
-
-msgctxt "odt:sale.sale:"
 msgid "Date:"
 msgstr "Date :"
 
@@ -791,14 +791,6 @@ msgid "Description"
 msgstr "Description"
 
 msgctxt "odt:sale.sale:"
-msgid "Description"
-msgstr "Description"
-
-msgctxt "odt:sale.sale:"
-msgid "Description:"
-msgstr "Description :"
-
-msgctxt "odt:sale.sale:"
 msgid "Description:"
 msgstr "Description :"
 
@@ -807,14 +799,6 @@ msgid "Draft Sale Order"
 msgstr "Bon de commande brouillon"
 
 msgctxt "odt:sale.sale:"
-msgid "Draft Sale Order"
-msgstr "Bon de commande brouillon"
-
-msgctxt "odt:sale.sale:"
-msgid "E-Mail:"
-msgstr "E-Mail :"
-
-msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
 msgstr "E-Mail :"
 
@@ -823,14 +807,6 @@ msgid "Phone:"
 msgstr "Téléphone :"
 
 msgctxt "odt:sale.sale:"
-msgid "Phone:"
-msgstr "Téléphone :"
-
-msgctxt "odt:sale.sale:"
-msgid "Quantity"
-msgstr "Quantité"
-
-msgctxt "odt:sale.sale:"
 msgid "Quantity"
 msgstr "Quantité"
 
@@ -839,14 +815,6 @@ msgid "Quotation N°:"
 msgstr "Devis N° :"
 
 msgctxt "odt:sale.sale:"
-msgid "Quotation N°:"
-msgstr "Devis N° :"
-
-msgctxt "odt:sale.sale:"
-msgid "Sale Order N°:"
-msgstr "Bon de commande N° :"
-
-msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Bon de commande N° :"
 
@@ -855,14 +823,6 @@ msgid "Taxes"
 msgstr "Taxes"
 
 msgctxt "odt:sale.sale:"
-msgid "Taxes"
-msgstr "Taxes"
-
-msgctxt "odt:sale.sale:"
-msgid "Taxes:"
-msgstr "Taxes :"
-
-msgctxt "odt:sale.sale:"
 msgid "Taxes:"
 msgstr "Taxes :"
 
@@ -871,22 +831,10 @@ msgid "Total (excl. taxes):"
 msgstr "Total (HT) :"
 
 msgctxt "odt:sale.sale:"
-msgid "Total (excl. taxes):"
-msgstr "Total (HT) :"
-
-msgctxt "odt:sale.sale:"
 msgid "Total:"
 msgstr "Total :"
 
 msgctxt "odt:sale.sale:"
-msgid "Total:"
-msgstr "Total :"
-
-msgctxt "odt:sale.sale:"
-msgid "Unit Price"
-msgstr "Prix unitaire"
-
-msgctxt "odt:sale.sale:"
 msgid "Unit Price"
 msgstr "Prix unitaire"
 
@@ -895,14 +843,6 @@ msgid "VAT Number:"
 msgstr "Numéro TVA :"
 
 msgctxt "odt:sale.sale:"
-msgid "VAT Number:"
-msgstr "Numéro TVA :"
-
-msgctxt "odt:sale.sale:"
-msgid "VAT:"
-msgstr "TVA :"
-
-msgctxt "odt:sale.sale:"
 msgid "VAT:"
 msgstr "TVA :"
 
@@ -911,14 +851,6 @@ msgid ""
 msgstr ""
 
 msgctxt "selection:account.invoice,sale_exception_state:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:account.invoice,sale_exception_state:"
-msgid "Ignored"
-msgstr "Ignoré"
-
-msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
 msgstr "Ignoré"
 
@@ -926,14 +858,6 @@ msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
 msgstr "Recréé"
 
-msgctxt "selection:account.invoice,sale_exception_state:"
-msgid "Recreated"
-msgstr "Recréé"
-
-msgctxt "selection:sale.configuration,sale_invoice_method:"
-msgid "Manual"
-msgstr "Manuel"
-
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
 msgstr "Manuel"
@@ -946,14 +870,6 @@ msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
 msgstr "À la livraison"
 
-msgctxt "selection:sale.configuration,sale_invoice_method:"
-msgid "On Shipment Sent"
-msgstr "À la livraison"
-
-msgctxt "selection:sale.configuration,sale_shipment_method:"
-msgid "Manual"
-msgstr "Manuel"
-
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
 msgstr "Manuel"
@@ -963,10 +879,6 @@ msgid "On Invoice Paid"
 msgstr "Au paiement"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
-msgid "On Invoice Paid"
-msgstr "Au paiement"
-
-msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Order Processed"
 msgstr "Sur traitement de l'ordre"
 
@@ -975,14 +887,6 @@ msgid "Comment"
 msgstr "Commentaire"
 
 msgctxt "selection:sale.line,type:"
-msgid "Comment"
-msgstr "Commentaire"
-
-msgctxt "selection:sale.line,type:"
-msgid "Line"
-msgstr "Ligne"
-
-msgctxt "selection:sale.line,type:"
 msgid "Line"
 msgstr "Ligne"
 
@@ -991,14 +895,6 @@ msgid "Subtotal"
 msgstr "Sous-total"
 
 msgctxt "selection:sale.line,type:"
-msgid "Subtotal"
-msgstr "Sous-total"
-
-msgctxt "selection:sale.line,type:"
-msgid "Title"
-msgstr "Titre"
-
-msgctxt "selection:sale.line,type:"
 msgid "Title"
 msgstr "Titre"
 
@@ -1007,10 +903,6 @@ msgid "Manual"
 msgstr "Manuel"
 
 msgctxt "selection:sale.sale,invoice_method:"
-msgid "Manual"
-msgstr "Manuel"
-
-msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Order Processed"
 msgstr "Sur traitement de l'ordre"
 
@@ -1018,14 +910,6 @@ msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
 msgstr "À la livraison"
 
-msgctxt "selection:sale.sale,invoice_method:"
-msgid "On Shipment Sent"
-msgstr "À la livraison"
-
-msgctxt "selection:sale.sale,invoice_state:"
-msgid "Exception"
-msgstr "Exception"
-
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
 msgstr "Exception"
@@ -1035,22 +919,10 @@ msgid "None"
 msgstr "Aucun"
 
 msgctxt "selection:sale.sale,invoice_state:"
-msgid "None"
-msgstr "Aucun"
-
-msgctxt "selection:sale.sale,invoice_state:"
 msgid "Paid"
 msgstr "Payé"
 
 msgctxt "selection:sale.sale,invoice_state:"
-msgid "Paid"
-msgstr "Payé"
-
-msgctxt "selection:sale.sale,invoice_state:"
-msgid "Waiting"
-msgstr "En attente"
-
-msgctxt "selection:sale.sale,invoice_state:"
 msgid "Waiting"
 msgstr "En attente"
 
@@ -1059,14 +931,6 @@ msgid "Manual"
 msgstr "Manuel"
 
 msgctxt "selection:sale.sale,shipment_method:"
-msgid "Manual"
-msgstr "Manuel"
-
-msgctxt "selection:sale.sale,shipment_method:"
-msgid "On Invoice Paid"
-msgstr "Au paiement"
-
-msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
 msgstr "Au paiement"
 
@@ -1079,14 +943,6 @@ msgid "Exception"
 msgstr "Exception"
 
 msgctxt "selection:sale.sale,shipment_state:"
-msgid "Exception"
-msgstr "Exception"
-
-msgctxt "selection:sale.sale,shipment_state:"
-msgid "None"
-msgstr "Aucun"
-
-msgctxt "selection:sale.sale,shipment_state:"
 msgid "None"
 msgstr "Aucun"
 
@@ -1095,14 +951,6 @@ msgid "Sent"
 msgstr "Envoyé"
 
 msgctxt "selection:sale.sale,shipment_state:"
-msgid "Sent"
-msgstr "Envoyé"
-
-msgctxt "selection:sale.sale,shipment_state:"
-msgid "Waiting"
-msgstr "En attente"
-
-msgctxt "selection:sale.sale,shipment_state:"
 msgid "Waiting"
 msgstr "En attente"
 
@@ -1111,14 +959,6 @@ msgid "Canceled"
 msgstr "Annulé"
 
 msgctxt "selection:sale.sale,state:"
-msgid "Canceled"
-msgstr "Annulé"
-
-msgctxt "selection:sale.sale,state:"
-msgid "Confirmed"
-msgstr "Confirmé"
-
-msgctxt "selection:sale.sale,state:"
 msgid "Confirmed"
 msgstr "Confirmé"
 
@@ -1127,14 +967,6 @@ msgid "Done"
 msgstr "Fait"
 
 msgctxt "selection:sale.sale,state:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "selection:sale.sale,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:sale.sale,state:"
 msgid "Draft"
 msgstr "Brouillon"
 
@@ -1146,14 +978,6 @@ msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
 msgstr "Devis"
 
-msgctxt "selection:sale.sale,state:"
-msgid "Quotation"
-msgstr "Devis"
-
-msgctxt "selection:stock.move,sale_exception_state:"
-msgid ""
-msgstr ""
-
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
 msgstr ""
@@ -1163,16 +987,12 @@ msgid "Ignored"
 msgstr "Ignoré"
 
 msgctxt "selection:stock.move,sale_exception_state:"
-msgid "Ignored"
-msgstr "Ignoré"
-
-msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Recréé"
 
-msgctxt "selection:stock.move,sale_exception_state:"
-msgid "Recreated"
-msgstr "Recréé"
+msgctxt "view:party.party:"
+msgid "Sale"
+msgstr "Vente"
 
 msgctxt "view:product.product:"
 msgid "Products"
@@ -1182,22 +1002,10 @@ msgctxt "view:product.template:"
 msgid "Customers"
 msgstr "Clients"
 
-msgctxt "view:product.template:"
-msgid "Customers"
-msgstr "Clients"
-
 msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
 msgstr "Configuration des ventes"
 
-msgctxt "view:sale.configuration:"
-msgid "Sale Configuration"
-msgstr "Configuration des ventes"
-
-msgctxt "view:sale.handle.invoice.exception.ask:"
-msgid "Choose invoices to recreate"
-msgstr "Choisir les factures à recréer"
-
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr "Choisir les factures à recréer"
@@ -1206,23 +1014,11 @@ msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr "Gérer l'exception de facture"
 
-msgctxt "view:sale.handle.invoice.exception.ask:"
-msgid "Handle Invoice Exception"
-msgstr "Gérer l'exception de facture"
-
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Choisir le mouvement à recréer"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Choose move to recreate"
-msgstr "Choisir le mouvement à recréer"
-
-msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Handle shipment Exception"
-msgstr "Gérer l'exception d'expédition"
-
-msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
@@ -1231,14 +1027,6 @@ msgid "General"
 msgstr "Général"
 
 msgctxt "view:sale.line:"
-msgid "General"
-msgstr "Général"
-
-msgctxt "view:sale.line:"
-msgid "Notes"
-msgstr "Notes"
-
-msgctxt "view:sale.line:"
 msgid "Notes"
 msgstr "Notes"
 
@@ -1247,20 +1035,16 @@ msgid "Sale Line"
 msgstr "Ligne de vente"
 
 msgctxt "view:sale.line:"
-msgid "Sale Line"
-msgstr "Ligne de vente"
-
-msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Lignes de vente"
 
-msgctxt "view:sale.line:"
-msgid "Sale Lines"
-msgstr "Lignes de vente"
+msgctxt "view:sale.return_sale.start:"
+msgid "Are you sure to return those/this sale(s)?"
+msgstr "Êtes-vous sûr de retourner ces/cette vente(s) ?"
 
-msgctxt "view:sale.sale:"
-msgid "Cancel"
-msgstr "Annuler"
+msgctxt "view:sale.return_sale.start:"
+msgid "Return Sale"
+msgstr "Retourner la vente"
 
 msgctxt "view:sale.sale:"
 msgid "Cancel"
@@ -1271,22 +1055,10 @@ msgid "Confirm"
 msgstr "Confirmer"
 
 msgctxt "view:sale.sale:"
-msgid "Confirm"
-msgstr "Confirmer"
-
-msgctxt "view:sale.sale:"
 msgid "Draft"
 msgstr "Brouillon"
 
 msgctxt "view:sale.sale:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "view:sale.sale:"
-msgid "Handle Invoice Exception"
-msgstr "Gérer l'exception de facture"
-
-msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
 msgstr "Gérer l'exception de facture"
 
@@ -1295,14 +1067,6 @@ msgid "Handle Shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
 msgctxt "view:sale.sale:"
-msgid "Handle Shipment Exception"
-msgstr "Gérer l'exception d'expédition"
-
-msgctxt "view:sale.sale:"
-msgid "Invoices"
-msgstr "Factures"
-
-msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Factures"
 
@@ -1311,12 +1075,8 @@ msgid "Other Info"
 msgstr "Autre information"
 
 msgctxt "view:sale.sale:"
-msgid "Other Info"
-msgstr "Autre information"
-
-msgctxt "view:sale.sale:"
 msgid "Process"
-msgstr "Traitement"
+msgstr "Traiter"
 
 msgctxt "view:sale.sale:"
 msgid "Quote"
@@ -1327,14 +1087,6 @@ msgid "Sale"
 msgstr "Vente"
 
 msgctxt "view:sale.sale:"
-msgid "Sale"
-msgstr "Vente"
-
-msgctxt "view:sale.sale:"
-msgid "Sales"
-msgstr "Ventes"
-
-msgctxt "view:sale.sale:"
 msgid "Sales"
 msgstr "Ventes"
 
@@ -1342,10 +1094,6 @@ msgctxt "view:sale.sale:"
 msgid "Shipments"
 msgstr "Expéditions"
 
-msgctxt "view:sale.sale:"
-msgid "Shipments"
-msgstr "Expéditions"
-
 msgctxt "view:stock.move:"
 msgid "Moves"
 msgstr "Mouvements"
@@ -1365,3 +1113,11 @@ msgstr "Annuler"
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Ok"
+
+msgctxt "wizard_button:sale.return_sale,start,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:sale.return_sale,start,return_:"
+msgid "Return"
+msgstr "Retourner"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index 690a6b9..eb161f8 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -350,6 +350,10 @@ msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
 msgstr ""
 
+msgctxt "field:sale.return_sale.start,id:"
+msgid "ID"
+msgstr ""
+
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Opmerking"
@@ -638,6 +642,16 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Verkoop"
 
+#, fuzzy
+msgctxt "model:ir.action,name:act_sale_invoice_relate"
+msgid "Sales"
+msgstr "Verkoopbeheer"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Verkoopbeheer"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Leveringen"
@@ -651,7 +665,7 @@ msgid "Handle Invoice Exception"
 msgstr "Factuuruitzondering afhandelen"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
-msgid "Create Return Sale"
+msgid "Return Sale"
 msgstr ""
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
@@ -755,6 +769,10 @@ msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Offerteregel - boeking opnieuw aanmaken"
 
+msgctxt "model:sale.return_sale.start,name:"
+msgid "Return Sale"
+msgstr ""
+
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Verkoop"
@@ -1003,6 +1021,11 @@ msgid "Recreated"
 msgstr "Opnieuw aangemaakt"
 
 #, fuzzy
+msgctxt "view:party.party:"
+msgid "Sale"
+msgstr "Verkoop"
+
+#, fuzzy
 msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Producten"
@@ -1047,6 +1070,14 @@ msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Offerteregels"
 
+msgctxt "view:sale.return_sale.start:"
+msgid "Are you sure to return those/this sale(s)?"
+msgstr ""
+
+msgctxt "view:sale.return_sale.start:"
+msgid "Return Sale"
+msgstr ""
+
 msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Annuleren"
@@ -1119,3 +1150,12 @@ msgstr "Annuleren"
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Oké"
+
+#, fuzzy
+msgctxt "wizard_button:sale.return_sale,start,end:"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:sale.return_sale,start,return_:"
+msgid "Return"
+msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 937b02a..14f83eb 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -350,6 +350,11 @@ msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
 msgstr "Изменено пользователем"
 
+#, fuzzy
+msgctxt "field:sale.return_sale.start,id:"
+msgid "ID"
+msgstr "ID"
+
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Комментарии"
@@ -636,6 +641,16 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Продажи"
 
+#, fuzzy
+msgctxt "model:ir.action,name:act_sale_invoice_relate"
+msgid "Sales"
+msgstr "Продажи"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Продажи"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Доставка"
@@ -648,8 +663,9 @@ msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
 msgstr "Обработка особых ситуаций инвойса"
 
+#, fuzzy
 msgctxt "model:ir.action,name:wizard_return_sale"
-msgid "Create Return Sale"
+msgid "Return Sale"
 msgstr "Создать возврат продажи"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
@@ -743,6 +759,11 @@ msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Строка продажи - Созданные заново перемещения"
 
+#, fuzzy
+msgctxt "model:sale.return_sale.start,name:"
+msgid "Return Sale"
+msgstr "Создать возврат продажи"
+
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Продажа"
@@ -971,6 +992,11 @@ msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Создано заново"
 
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Sale"
+msgstr "Продажа"
+
 msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Продукция"
@@ -1015,6 +1041,15 @@ msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Строки продажи"
 
+msgctxt "view:sale.return_sale.start:"
+msgid "Are you sure to return those/this sale(s)?"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.return_sale.start:"
+msgid "Return Sale"
+msgstr "Создать возврат продажи"
+
 msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Отменить"
@@ -1082,3 +1117,12 @@ msgstr "Отменить"
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Ок"
+
+#, fuzzy
+msgctxt "wizard_button:sale.return_sale,start,end:"
+msgid "Cancel"
+msgstr "Отменить"
+
+msgctxt "wizard_button:sale.return_sale,start,return_:"
+msgid "Return"
+msgstr ""
diff --git a/locale/de_DE.po b/locale/sl_SI.po
similarity index 72%
copy from locale/de_DE.po
copy to locale/sl_SI.po
index 6049522..143a84f 100644
--- a/locale/de_DE.po
+++ b/locale/sl_SI.po
@@ -4,99 +4,95 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a sale."
-msgstr "Aus einem Verkauf stammende Rechnungen können nicht gelöscht werden."
+msgstr "Računov, ustvarjenih iz prodajnih nalogov, ni možno brisati."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr ""
-"Eine durch einen Verkauf generierte Rechnung kann nicht auf Entwurf "
-"zurückgesetzt werden."
+"Računa, ustvarjenega iz prodajnega naloga, ni možno prestaviti v stanje "
+"osnutka."
 
 msgctxt "error:sale.line:"
 msgid "Product \"%(product)s\" of sale %(sale)s misses a revenue account."
 msgstr ""
-"Für Artikel \"%(product)s\" in Verkauf %(sale)s ist kein Ertragskonto "
-"eingetragen."
+"Izdelku \"%(product)s\" na prodajnem nalogu %(sale)s manjka prihodkovni "
+"konto."
 
 msgctxt "error:sale.line:"
 msgid "Sale \"%(sale)s\" is missing the customer location in line \"%(line)s\"."
 msgstr ""
-"Für Verkauf \"%(sale)s\" Position \"%(line)s\" ist kein Lagerort Kunde "
-"eingetragen."
+"Na postavki \"%(line)s\" prodajnega naloga \"%(sale)s\" manjka kupčeva "
+"lokacija."
 
 msgctxt "error:sale.line:"
 msgid "Sale \"%(sale)s\" misses an \"account revenue\" default property."
 msgstr ""
-"Für Verkauf \"%(sale)s\"  ist keine Standardeigenschaft für das Ertragskonto"
-" eingetragen."
+"Prodajnemu nalogu \"%(sale)s\" manjka privzeta lastnost za prihodkovni "
+"konto."
 
 msgctxt "error:sale.sale:"
 msgid "Invalid combination of shipment and invoicing methods on sale \"%s\"."
 msgstr ""
-"Ungültige Kombination von Liefermethode und Rechnungsstellung in Verkauf "
+"Neveljavna kombinacija načina odpreme in obračuna pri prodajnem nalogu "
 "\"%s\"."
 
 msgctxt "error:sale.sale:"
 msgid ""
 "Invoice and Shipment addresses must be defined for the quotation of sale "
 "\"%s\"."
-msgstr ""
-"Rechnungs- und Lieferadresse müssen angegeben werden für Angebotserstellung "
-"von Verkauf \"%s\"."
+msgstr "Naslov plačnika in prejemnika sta obvezna pri prodajni ponudbi \"%s\"."
 
 msgctxt "error:sale.sale:"
 msgid "It misses an \"Account Receivable\" on the party \"%s\"."
-msgstr "Fehlendes \"Forderungskonto\" für Partei \"%s\"."
+msgstr "Stranki \"%s\" manjka terjatveni konto."
 
 msgctxt "error:sale.sale:"
 msgid "Sale \"%s\" must be cancelled before deletion."
-msgstr "Verkauf \"%s\" muss annulliert werden, bevor er gelöscht werden kann."
+msgstr "Pred brisanjem mora biti prodajni nalog \"%s\" preklican."
 
 msgctxt "error:sale.sale:"
 msgid "Warehouse must be defined for the quotation of sale \"%s\"."
-msgstr ""
-"Warenlager muss angegeben werden für die Angebotserstellung von Verkauf "
-"\"%s\"."
+msgstr "Skladišče je obvezno za prodajno ponudbo \"%s\"."
 
 msgctxt "error:stock.shipment.out.return:"
 msgid "You cannot reset to draft a move generated by a sale."
 msgstr ""
-"Eine durch einen Verkauf generierte Lagerbewegung kann nicht auf Entwurf "
-"zurückgesetzt werden."
+"Prometa, ustvarjenega iz prodajnega naloga, ni možno prestaviti v stanje "
+"osnutka."
 
 msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
 msgstr ""
-"Eine durch einen Verkauf generierte Bewegung kann nicht auf Entwurf "
-"zurückgesetzt werden."
+"Prometa, ustvarjenega iz prodajnega naloga, ni možno prestaviti v stanje "
+"osnutka."
 
 msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
-msgstr "Vorbehalt Status"
+msgstr "Pridržano"
 
 msgctxt "field:account.invoice,sales:"
 msgid "Sales"
-msgstr "Verkäufe"
+msgstr "Prodajni nalogi"
 
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
-msgstr "Lieferfrist"
+msgstr "Dostavljeno"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
-msgstr "Verkäuflich"
+msgstr "Za prodajo"
 
 msgctxt "field:product.template,sale_uom:"
 msgid "Sale UOM"
-msgstr "Einheit Verkauf"
+msgstr "Prodajna ME"
 
 msgctxt "field:sale.configuration,create_date:"
 msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgstr "Ustvarjeno"
 
 msgctxt "field:sale.configuration,create_uid:"
 msgid "Create User"
-msgstr "Erstellt durch"
+msgstr "Ustvaril"
 
 msgctxt "field:sale.configuration,id:"
 msgid "ID"
@@ -104,31 +100,31 @@ msgstr "ID"
 
 msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
-msgstr "Name"
+msgstr "Ime"
 
 msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
-msgstr "Rechnungsstellung Verkauf"
+msgstr "Način obračuna"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
-msgstr "Nummernkreis Verkauf"
+msgstr "Štetje prodajnih nalogov"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
-msgstr "Liefermethode Verkauf"
+msgstr "Način odpreme"
 
 msgctxt "field:sale.configuration,write_date:"
 msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgstr "Zapisano"
 
 msgctxt "field:sale.configuration,write_uid:"
 msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgstr "Zapisal"
 
 msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
-msgstr "Wertebereich Rechnungen (Domain)"
+msgstr "Vključeni računi"
 
 msgctxt "field:sale.handle.invoice.exception.ask,id:"
 msgid "ID"
@@ -136,11 +132,11 @@ msgstr "ID"
 
 msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr "Rechnungen nachbilden"
+msgstr "Poustvarjeni računi"
 
 msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
-msgstr "Wertebereich Bewegungen (Domain)"
+msgstr "Vključen promet"
 
 msgctxt "field:sale.handle.shipment.exception.ask,id:"
 msgid "ID"
@@ -148,31 +144,31 @@ msgstr "ID"
 
 msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Bewegungen nachbilden"
+msgstr "Poustvarjen promet"
 
 msgctxt "field:sale.line,amount:"
 msgid "Amount"
-msgstr "Betrag"
+msgstr "Znesek"
 
 msgctxt "field:sale.line,create_date:"
 msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgstr "Ustvarjeno"
 
 msgctxt "field:sale.line,create_uid:"
 msgid "Create User"
-msgstr "Erstellt durch"
+msgstr "Ustvaril"
 
 msgctxt "field:sale.line,delivery_date:"
 msgid "Delivery Date"
-msgstr "Lieferdatum"
+msgstr "Dostavljeno"
 
 msgctxt "field:sale.line,description:"
 msgid "Description"
-msgstr "Bezeichnung"
+msgstr "Opis"
 
 msgctxt "field:sale.line,from_location:"
 msgid "From Location"
-msgstr "Von Lagerort"
+msgstr "Iz lokacije"
 
 msgctxt "field:sale.line,id:"
 msgid "ID"
@@ -180,99 +176,99 @@ msgstr "ID"
 
 msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
-msgstr "Rechnungspositionen"
+msgstr "Postavke računa"
 
 msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
-msgstr "Bewegungen erledigt"
+msgstr "Zaključen promet"
 
 msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
-msgstr "Bewegungsvorbehalt"
+msgstr "Pridržani promet"
 
 msgctxt "field:sale.line,moves:"
 msgid "Moves"
-msgstr "Bewegungen"
+msgstr "Promet"
 
 msgctxt "field:sale.line,moves_ignored:"
 msgid "Ignored Moves"
-msgstr "Ignorierte Bewegungen"
+msgstr "Prezrt promet"
 
 msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
-msgstr "Nachgebildete Bewegungen"
+msgstr "Prenosi poustvarjeni"
 
 msgctxt "field:sale.line,note:"
 msgid "Note"
-msgstr "Notiz"
+msgstr "Opomba"
 
 msgctxt "field:sale.line,product:"
 msgid "Product"
-msgstr "Artikel"
+msgstr "Izdelek"
 
 msgctxt "field:sale.line,product_uom_category:"
 msgid "Product Uom Category"
-msgstr "Artikel Maßeinheit Kategorie"
+msgstr "Katerogija EM izdelka"
 
 msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
-msgstr "Anzahl"
+msgstr "Količina"
 
 msgctxt "field:sale.line,rec_name:"
 msgid "Name"
-msgstr "Name"
+msgstr "Ime"
 
 msgctxt "field:sale.line,sale:"
 msgid "Sale"
-msgstr "Verkauf"
+msgstr "Prodajni nalog"
 
 msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
-msgstr "Reihenfolge"
+msgstr "Zap.št."
 
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
-msgstr "Steuern"
+msgstr "Davki"
 
 msgctxt "field:sale.line,to_location:"
 msgid "To Location"
-msgstr "Zu Lagerort"
+msgstr "Na lokacijo"
 
 msgctxt "field:sale.line,type:"
 msgid "Type"
-msgstr "Typ"
+msgstr "Tip"
 
 msgctxt "field:sale.line,unit:"
 msgid "Unit"
-msgstr "Einheit"
+msgstr "Enota"
 
 msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Anzahl Stellen"
+msgstr "Decimalke"
 
 msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
-msgstr "Einzelpreis"
+msgstr "Cena"
 
 msgctxt "field:sale.line,warehouse:"
 msgid "Warehouse"
-msgstr "Warenlager"
+msgstr "Skladišče"
 
 msgctxt "field:sale.line,write_date:"
 msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgstr "Zapisano"
 
 msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgstr "Zapisal"
 
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgstr "Ustvarjeno"
 
 msgctxt "field:sale.line-account.tax,create_uid:"
 msgid "Create User"
-msgstr "Erstellt durch"
+msgstr "Ustvaril"
 
 msgctxt "field:sale.line-account.tax,id:"
 msgid "ID"
@@ -280,31 +276,31 @@ msgstr "ID"
 
 msgctxt "field:sale.line-account.tax,line:"
 msgid "Sale Line"
-msgstr "Position Verkauf"
+msgstr "Postavka"
 
 msgctxt "field:sale.line-account.tax,rec_name:"
 msgid "Name"
-msgstr "Name"
+msgstr "Ime"
 
 msgctxt "field:sale.line-account.tax,tax:"
 msgid "Tax"
-msgstr "Steuer"
+msgstr "Davek"
 
 msgctxt "field:sale.line-account.tax,write_date:"
 msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgstr "Zapisano"
 
 msgctxt "field:sale.line-account.tax,write_uid:"
 msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgstr "Zapisal"
 
 msgctxt "field:sale.line-ignored-stock.move,create_date:"
 msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgstr "Ustvarjeno"
 
 msgctxt "field:sale.line-ignored-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Erstellt durch"
+msgstr "Ustvaril"
 
 msgctxt "field:sale.line-ignored-stock.move,id:"
 msgid "ID"
@@ -312,31 +308,31 @@ msgstr "ID"
 
 msgctxt "field:sale.line-ignored-stock.move,move:"
 msgid "Move"
-msgstr "Bewegung"
+msgstr "Promet"
 
 msgctxt "field:sale.line-ignored-stock.move,rec_name:"
 msgid "Name"
-msgstr "Name"
+msgstr "Ime"
 
 msgctxt "field:sale.line-ignored-stock.move,sale_line:"
 msgid "Sale Line"
-msgstr "Position Verkauf"
+msgstr "Postavka"
 
 msgctxt "field:sale.line-ignored-stock.move,write_date:"
 msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgstr "Zapisano"
 
 msgctxt "field:sale.line-ignored-stock.move,write_uid:"
 msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgstr "Zapisal"
 
 msgctxt "field:sale.line-recreated-stock.move,create_date:"
 msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgstr "Ustvarjeno"
 
 msgctxt "field:sale.line-recreated-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Erstellt durch"
+msgstr "Ustvaril"
 
 msgctxt "field:sale.line-recreated-stock.move,id:"
 msgid "ID"
@@ -344,51 +340,55 @@ msgstr "ID"
 
 msgctxt "field:sale.line-recreated-stock.move,move:"
 msgid "Move"
-msgstr "Bewegung"
+msgstr "Promet"
 
 msgctxt "field:sale.line-recreated-stock.move,rec_name:"
 msgid "Name"
-msgstr "Name"
+msgstr "Ime"
 
 msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
-msgstr "Position Verkauf"
+msgstr "Postavka"
 
 msgctxt "field:sale.line-recreated-stock.move,write_date:"
 msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgstr "Zapisano"
 
 msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgstr "Zapisal"
+
+msgctxt "field:sale.return_sale.start,id:"
+msgid "ID"
+msgstr "ID"
 
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
-msgstr "Kommentar"
+msgstr "Opomba"
 
 msgctxt "field:sale.sale,company:"
 msgid "Company"
-msgstr "Unternehmen"
+msgstr "Podjetje"
 
 msgctxt "field:sale.sale,create_date:"
 msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgstr "Ustvarjeno"
 
 msgctxt "field:sale.sale,create_uid:"
 msgid "Create User"
-msgstr "Erstellt durch"
+msgstr "Ustvaril"
 
 msgctxt "field:sale.sale,currency:"
 msgid "Currency"
-msgstr "Währung"
+msgstr "Valuta"
 
 msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
-msgstr "Währung (signifikante Stellen)"
+msgstr "Decimalke"
 
 msgctxt "field:sale.sale,description:"
 msgid "Description"
-msgstr "Beschreibung"
+msgstr "Opis"
 
 msgctxt "field:sale.sale,id:"
 msgid "ID"
@@ -396,127 +396,127 @@ msgstr "ID"
 
 msgctxt "field:sale.sale,invoice_address:"
 msgid "Invoice Address"
-msgstr "Rechnungsadresse"
+msgstr "Naslov plačnika"
 
 msgctxt "field:sale.sale,invoice_method:"
 msgid "Invoice Method"
-msgstr "Rechnungsstellung"
+msgstr "Način obračuna"
 
 msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
-msgstr "Rechnungsstatus"
+msgstr "Stanje računa"
 
 msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
-msgstr "Rechnungen"
+msgstr "Računi"
 
 msgctxt "field:sale.sale,invoices_ignored:"
 msgid "Ignored Invoices"
-msgstr "Ignorierte Rechnungen"
+msgstr "Prezrti računi"
 
 msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
-msgstr "Nachgebildete Rechnungen"
+msgstr "Poustvarjeni računi"
 
 msgctxt "field:sale.sale,lines:"
 msgid "Lines"
-msgstr "Positionen"
+msgstr "Postavke"
 
 msgctxt "field:sale.sale,moves:"
 msgid "Moves"
-msgstr "Bewegungen"
+msgstr "Promet"
 
 msgctxt "field:sale.sale,party:"
 msgid "Party"
-msgstr "Partei"
+msgstr "Stranka"
 
 msgctxt "field:sale.sale,party_lang:"
 msgid "Party Language"
-msgstr "Sprache Partei"
+msgstr "Jezik stranke"
 
 msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
-msgstr "Zahlungsbedingung"
+msgstr "Plačilni rok"
 
 msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
-msgstr "Name"
+msgstr "Ime"
 
 msgctxt "field:sale.sale,reference:"
 msgid "Reference"
-msgstr "Beleg-Nr."
+msgstr "Sklic"
 
 msgctxt "field:sale.sale,sale_date:"
 msgid "Sale Date"
-msgstr "Verkaufsdatum"
+msgstr "Datum prodaje"
 
 msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
-msgstr "Lieferadresse"
+msgstr "Naslov prejemnika"
 
 msgctxt "field:sale.sale,shipment_method:"
 msgid "Shipment Method"
-msgstr "Liefermethode"
+msgstr "Način odpreme"
 
 msgctxt "field:sale.sale,shipment_returns:"
 msgid "Shipment Returns"
-msgstr "Lieferposten Rücknahmen"
+msgstr "Vrnjene odpremnice"
 
 msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
-msgstr "Lieferstatus"
+msgstr "Stanje pošiljke"
 
 msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
-msgstr "Lieferposten"
+msgstr "Pošiljke"
 
 msgctxt "field:sale.sale,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
 msgctxt "field:sale.sale,tax_amount:"
 msgid "Tax"
-msgstr "Steuer"
+msgstr "Davek"
 
 msgctxt "field:sale.sale,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr "Steuer Cache"
+msgstr "Davek predpomnjen"
 
 msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
-msgstr "Gesamt"
+msgstr "Skupaj"
 
 msgctxt "field:sale.sale,total_amount_cache:"
 msgid "Total Tax"
-msgstr "Gesamt Steuer"
+msgstr "Davek skupaj"
 
 msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
-msgstr "Netto"
+msgstr "Neobdavčeno"
 
 msgctxt "field:sale.sale,untaxed_amount_cache:"
 msgid "Untaxed Cache"
-msgstr "Netto Cache"
+msgstr "Neobdavčeno predpomnjeno"
 
 msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
-msgstr "Warenlager"
+msgstr "Skladišče"
 
 msgctxt "field:sale.sale,write_date:"
 msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgstr "Zapisano"
 
 msgctxt "field:sale.sale,write_uid:"
 msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgstr "Zapisal"
 
 msgctxt "field:sale.sale-account.invoice,create_date:"
 msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgstr "Ustvarjeno"
 
 msgctxt "field:sale.sale-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Erstellt durch"
+msgstr "Ustvaril"
 
 msgctxt "field:sale.sale-account.invoice,id:"
 msgid "ID"
@@ -524,31 +524,31 @@ msgstr "ID"
 
 msgctxt "field:sale.sale-account.invoice,invoice:"
 msgid "Invoice"
-msgstr "Rechnung"
+msgstr "Račun"
 
 msgctxt "field:sale.sale-account.invoice,rec_name:"
 msgid "Name"
-msgstr "Name"
+msgstr "Ime"
 
 msgctxt "field:sale.sale-account.invoice,sale:"
 msgid "Sale"
-msgstr "Verkauf"
+msgstr "Prodajni nalog"
 
 msgctxt "field:sale.sale-account.invoice,write_date:"
 msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgstr "Zapisano"
 
 msgctxt "field:sale.sale-account.invoice,write_uid:"
 msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgstr "Zapisal"
 
 msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
 msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgstr "Ustvarjeno"
 
 msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Erstellt durch"
+msgstr "Ustvaril"
 
 msgctxt "field:sale.sale-ignored-account.invoice,id:"
 msgid "ID"
@@ -556,31 +556,31 @@ msgstr "ID"
 
 msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
 msgid "Invoice"
-msgstr "Rechnung"
+msgstr "Račun"
 
 msgctxt "field:sale.sale-ignored-account.invoice,rec_name:"
 msgid "Name"
-msgstr "Name"
+msgstr "Ime"
 
 msgctxt "field:sale.sale-ignored-account.invoice,sale:"
 msgid "Sale"
-msgstr "Verkauf"
+msgstr "Prodajni nalog"
 
 msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
 msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgstr "Zapisano"
 
 msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
 msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgstr "Zapisal"
 
 msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
 msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgstr "Ustvarjeno"
 
 msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Erstellt durch"
+msgstr "Ustvaril"
 
 msgctxt "field:sale.sale-recreated-account.invoice,id:"
 msgid "ID"
@@ -588,193 +588,203 @@ msgstr "ID"
 
 msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
 msgid "Invoice"
-msgstr "Rechnung"
+msgstr "Račun"
 
 msgctxt "field:sale.sale-recreated-account.invoice,rec_name:"
 msgid "Name"
-msgstr "Name"
+msgstr "Ime"
 
 msgctxt "field:sale.sale-recreated-account.invoice,sale:"
 msgid "Sale"
-msgstr "Verkauf"
+msgstr "Prodajni nalog"
 
 msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
 msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgstr "Zapisano"
 
 msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
 msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgstr "Zapisal"
 
 msgctxt "field:stock.move,sale:"
 msgid "Sale"
-msgstr "Verkauf"
+msgstr "Prodajni nalog"
 
 msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
-msgstr "Status Vorbehalt"
+msgstr "Pridržano"
 
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
-msgstr "In Anzahl von Tagen"
+msgstr "V dnevih"
 
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
-msgstr ""
-"Die ausgewählten Rechnungen werden nachgebildet. Alle anderen werden "
-"ignoriert."
+msgstr "Izbrani računi bodo poustvarjeni, ostali bodo prezrti."
 
 msgctxt "model:ir.action,name:act_invoice_form"
 msgid "Invoices"
-msgstr "Rechnungsausgang"
+msgstr "Računi"
 
 msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
-msgstr "Parteien: Verkäufen zugeordnet"
+msgstr "Stranke, povezane s prodajo"
 
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
-msgstr "Rücknahmen"
+msgstr "Vrnjene odpremnice"
 
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
-msgstr "Verkauf"
+msgstr "Prodajna konfiguracija"
 
 msgctxt "model:ir.action,name:act_sale_form"
 msgid "Sales"
-msgstr "Verkäufe"
+msgstr "Prodajni nalogi"
 
 msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
-msgstr "Verkäufe"
+msgstr "Prodajni nalogi"
+
+msgctxt "model:ir.action,name:act_sale_invoice_relate"
+msgid "Sales"
+msgstr "Prodajni nalogi"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Prodajni nalogi"
 
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
-msgstr "Lieferposten"
+msgstr "Pošiljke"
 
 msgctxt "model:ir.action,name:report_sale"
 msgid "Sale"
-msgstr "Verkauf"
+msgstr "Prodajni nalog"
 
 msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
-msgstr "Rechnungsvorbehalt bearbeiten"
+msgstr "Obravnava pridržanih računov"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
-msgid "Create Return Sale"
-msgstr "Rücknahme erstellen"
+msgid "Return Sale"
+msgstr "Vrnitev prodajnega naloga"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Nachfrage Liefervorbehalt"
+msgstr "Obravnava pridržanih odpremnic"
 
 msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_all"
 msgid "All"
-msgstr "Alle"
+msgstr "Vse"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_sale_form_domain_confirmed"
 msgid "Confirmed"
-msgstr "Bestätigt"
+msgstr "Potrjeno"
 
 msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_draft"
 msgid "Draft"
-msgstr "Entwurf"
+msgstr "Osnutek"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_sale_form_domain_processing"
 msgid "Processing"
-msgstr "In Ausführung"
+msgstr "Obdelava"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_sale_form_domain_quotation"
 msgid "Quotation"
-msgstr "Angebot"
+msgstr "Ponudba"
 
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
-msgstr "Verkauf"
+msgstr "Prodajni nalog"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_sale"
 msgid "Sale"
-msgstr "Verkauf"
+msgstr "Prodajni nalog"
 
 msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
-msgstr "Einstellungen"
+msgstr "Nastavitve"
 
 msgctxt "model:ir.ui.menu,name:menu_customer"
 msgid "Parties associated to Sales"
-msgstr "Parteien: Verkäufen zugeordnet"
+msgstr "Stranke pri prodaji"
 
 msgctxt "model:ir.ui.menu,name:menu_sale"
 msgid "Sales"
-msgstr "Verkauf"
+msgstr "Prodaja"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
 msgid "Sales Configuration"
-msgstr "Verkauf"
+msgstr "Konfiguracija"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
-msgstr "Verkäufe"
+msgstr "Prodajni nalogi"
 
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
-msgstr "Verkauf"
+msgstr "Prodaja"
 
 msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
-msgstr "Verkauf Administration"
+msgstr "Prodaja - vodenje"
 
 msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
-msgstr "Einstellungen Verkauf"
+msgstr "Prodajna konfiguracija"
 
 msgctxt "model:sale.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr "Rechnungsvorbehalt Nachfrage"
+msgstr "Obravnava pridržanih računov"
 
 msgctxt "model:sale.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr "Nachfrage Liefervorbehalt"
+msgstr "Obravnava pridržanih odpremnic"
 
 msgctxt "model:sale.line,name:"
 msgid "Sale Line"
-msgstr "Verkauf Position"
+msgstr "Prodajna postavka"
 
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
-msgstr "Verkauf Position - Steuer"
+msgstr "Prodajna postavka - Davek"
 
 msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
-msgstr "Verkauf Position - Bewegung Ignoriert"
+msgstr "Prodajna postavka - Prezrt promet"
 
 msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
-msgstr "Verkauf Position - Bewegung Nachgebildet"
+msgstr "Prodajna postavka - Poustvarjen promet"
+
+msgctxt "model:sale.return_sale.start,name:"
+msgid "Return Sale"
+msgstr "Izdelava zavrnjene odpremnice"
 
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
-msgstr "Verkauf"
+msgstr "Prodajni nalog"
 
 msgctxt "model:sale.sale-account.invoice,name:"
 msgid "Sale - Invoice"
-msgstr "Verkauf - Rechnung"
+msgstr "Prodajni nalog - Račun"
 
 msgctxt "model:sale.sale-ignored-account.invoice,name:"
 msgid "Sale - Ignored Invoice"
-msgstr "Verkauf - Rechnung Ignoriert"
+msgstr "Prodajni nalog - Prezrt račun"
 
 msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
-msgstr "Verkauf - Rechnung Nachgebildet"
+msgstr "Prodajni nalog - Poustvarjen račun"
 
 msgctxt "odt:sale.sale:"
 msgid "Amount"
-msgstr "Betrag"
+msgstr "Znesek"
 
 msgctxt "odt:sale.sale:"
 msgid "Date:"
@@ -782,19 +792,19 @@ msgstr "Datum:"
 
 msgctxt "odt:sale.sale:"
 msgid "Description"
-msgstr "Bezeichnung"
+msgstr "Opis"
 
 msgctxt "odt:sale.sale:"
 msgid "Description:"
-msgstr "Bezeichnung:"
+msgstr "Opis:"
 
 msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
-msgstr "Auftrag (Entwurf)"
+msgstr "Osnutek prodajnega naloga"
 
 msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
-msgstr "E-Mail:"
+msgstr "E-pošta:"
 
 msgctxt "odt:sale.sale:"
 msgid "Phone:"
@@ -802,43 +812,43 @@ msgstr "Telefon:"
 
 msgctxt "odt:sale.sale:"
 msgid "Quantity"
-msgstr "Anzahl"
+msgstr "Količina"
 
 msgctxt "odt:sale.sale:"
 msgid "Quotation N°:"
-msgstr "Angebot Nr.:"
+msgstr "Ponudba št.:"
 
 msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
-msgstr "Auftrag Nr.:"
+msgstr "Prodajni nalog št.:"
 
 msgctxt "odt:sale.sale:"
 msgid "Taxes"
-msgstr "Steuern"
+msgstr "Davek"
 
 msgctxt "odt:sale.sale:"
 msgid "Taxes:"
-msgstr "Steuern:"
+msgstr "Davek:"
 
 msgctxt "odt:sale.sale:"
 msgid "Total (excl. taxes):"
-msgstr "Netto:"
+msgstr "Skupaj (brez davka):"
 
 msgctxt "odt:sale.sale:"
 msgid "Total:"
-msgstr "Gesamt:"
+msgstr "Skupaj:"
 
 msgctxt "odt:sale.sale:"
 msgid "Unit Price"
-msgstr "Einzelpreis"
+msgstr "Cena"
 
 msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
-msgstr "USt-ID-Nr.:"
+msgstr "DDV številka:"
 
 msgctxt "odt:sale.sale:"
 msgid "VAT:"
-msgstr "USt:"
+msgstr "DDV:"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
@@ -846,131 +856,131 @@ msgstr ""
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
-msgstr "Ignoriert"
+msgstr "Prezrto"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
-msgstr "Nachgebildet"
+msgstr "Poustvarjeno"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
-msgstr "Manuell"
+msgstr "Ročno"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Order Processed"
-msgstr "Nach Auftragsausführung"
+msgstr "Po obdelavi naloga"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
-msgstr "Bei Versand"
+msgstr "Po izvršeni odpremi"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
-msgstr "Manuell"
+msgstr "Ročno"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Invoice Paid"
-msgstr "Bei Bezahlung"
+msgstr "Po plačilu računa"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Order Processed"
-msgstr "Nach Auftragsausführung"
+msgstr "Po obdelavi naloga"
 
 msgctxt "selection:sale.line,type:"
 msgid "Comment"
-msgstr "Kommentar"
+msgstr "Opomba"
 
 msgctxt "selection:sale.line,type:"
 msgid "Line"
-msgstr "Position"
+msgstr "Postavka"
 
 msgctxt "selection:sale.line,type:"
 msgid "Subtotal"
-msgstr "Zwischensumme"
+msgstr "Vmesna vsota"
 
 msgctxt "selection:sale.line,type:"
 msgid "Title"
-msgstr "Überschrift"
+msgstr "Napis"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "Manual"
-msgstr "Manuell"
+msgstr "Ročno"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Order Processed"
-msgstr "Nach Auftragsausführung"
+msgstr "Po obdelavi naloga"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
-msgstr "Bei Versand"
+msgstr "Po izvršeni odpremi"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
-msgstr "Vorbehalt"
+msgstr "Pridržano"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "None"
-msgstr "Kein"
+msgstr "Brez"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Paid"
-msgstr "Bezahlt"
+msgstr "Plačano"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Waiting"
-msgstr "Wartend"
+msgstr "Čakajoče"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "Manual"
-msgstr "Manuell"
+msgstr "Ročno"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
-msgstr "Bei Bezahlung"
+msgstr "Po plačilu računa"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Order Processed"
-msgstr "Nach Auftragsausführung"
+msgstr "Po obdelavi naloga"
 
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
-msgstr "Vorbehalt"
+msgstr "Pridržano"
 
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "None"
-msgstr "Kein"
+msgstr "Brez"
 
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "Sent"
-msgstr "Gesendet"
+msgstr "Odpremljeno"
 
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "Waiting"
-msgstr "Wartend"
+msgstr "Čakajoče"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Canceled"
-msgstr "Annulliert"
+msgstr "Preklicano"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Confirmed"
-msgstr "Beauftragt"
+msgstr "Potrjeno"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Done"
-msgstr "Erledigt"
+msgstr "Zaključeno"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Draft"
-msgstr "Entwurf"
+msgstr "Osnutek"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Processing"
-msgstr "In Ausführung"
+msgstr "Obdelava"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
-msgstr "Angebot"
+msgstr "Ponudba"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
@@ -978,120 +988,140 @@ msgstr ""
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
-msgstr "Ignoriert"
+msgstr "Prezrto"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
-msgstr "Nachgebildet"
+msgstr "Poustvarjeno"
+
+msgctxt "view:party.party:"
+msgid "Sale"
+msgstr "Prodajni nalog"
 
 msgctxt "view:product.product:"
 msgid "Products"
-msgstr "Artikel"
+msgstr "Izdelki"
 
 msgctxt "view:product.template:"
 msgid "Customers"
-msgstr "Kunden"
+msgstr "Kupci"
 
 msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
-msgstr "Einstellungen Verkauf"
+msgstr "Prodajna konfiguracija"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
-msgstr "Rechnungen zum Nachbilden auswählen"
+msgstr "Izbor računov za poustvaritev"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Rechnungsvorbehalt bearbeiten"
+msgstr "Obravnava pridržanih računov"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
-msgstr "Bewegungen zum Nachbilden auswählen"
+msgstr "Izbor prometa za poustvaritev"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Liefervorbehalt bearbeiten"
+msgstr "Obravnava pridržanih odpremnic"
 
 msgctxt "view:sale.line:"
 msgid "General"
-msgstr "Allgemein"
+msgstr "Splošno"
 
 msgctxt "view:sale.line:"
 msgid "Notes"
-msgstr "Notizen"
+msgstr "Opombe"
 
 msgctxt "view:sale.line:"
 msgid "Sale Line"
-msgstr "Position Verkauf"
+msgstr "Prodajna postavka"
 
 msgctxt "view:sale.line:"
 msgid "Sale Lines"
-msgstr "Positionen Verkauf"
+msgstr "Prodajne postavke"
+
+msgctxt "view:sale.return_sale.start:"
+msgid "Are you sure to return those/this sale(s)?"
+msgstr "Ali res želite vrniti to/te prodajo/e?"
+
+msgctxt "view:sale.return_sale.start:"
+msgid "Return Sale"
+msgstr "Izdelava zavrnjenega odpremnice"
 
 msgctxt "view:sale.sale:"
 msgid "Cancel"
-msgstr "Annullieren"
+msgstr "Prekliči"
 
 msgctxt "view:sale.sale:"
 msgid "Confirm"
-msgstr "Bestätigen"
+msgstr "Potrditev"
 
 msgctxt "view:sale.sale:"
 msgid "Draft"
-msgstr "Entwurf"
+msgstr "Osnutek"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
-msgstr "Rechnungsvorbehalt bearbeiten"
+msgstr "Obravnava pridržanih računov"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
-msgstr "Liefervorbehalt bearbeiten"
+msgstr "Obravnava pridržanih odpremnic"
 
 msgctxt "view:sale.sale:"
 msgid "Invoices"
-msgstr "Rechnungen"
+msgstr "Računi"
 
 msgctxt "view:sale.sale:"
 msgid "Other Info"
-msgstr "Sonstiges"
+msgstr "Drugo"
 
 msgctxt "view:sale.sale:"
 msgid "Process"
-msgstr "Ausführen"
+msgstr "Obdelava"
 
 msgctxt "view:sale.sale:"
 msgid "Quote"
-msgstr "Angebot"
+msgstr "Ponudba"
 
 msgctxt "view:sale.sale:"
 msgid "Sale"
-msgstr "Verkauf"
+msgstr "Prodaja"
 
 msgctxt "view:sale.sale:"
 msgid "Sales"
-msgstr "Verkäufe"
+msgstr "Prodajni nalogi"
 
 msgctxt "view:sale.sale:"
 msgid "Shipments"
-msgstr "Lieferposten"
+msgstr "Odpremnice"
 
 msgctxt "view:stock.move:"
 msgid "Moves"
-msgstr "Lagerbewegungen"
+msgstr "Promet"
 
 msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
-msgstr "Abbrechen"
+msgstr "Prekliči"
 
 msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
 msgid "Ok"
-msgstr "OK"
+msgstr "V redu"
 
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
 msgid "Cancel"
-msgstr "Abbrechen"
+msgstr "Prekliči"
 
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
-msgstr "OK"
+msgstr "V redu"
+
+msgctxt "wizard_button:sale.return_sale,start,end:"
+msgid "Cancel"
+msgstr "Prekliči"
+
+msgctxt "wizard_button:sale.return_sale,start,return_:"
+msgid "Return"
+msgstr "Vrni"
diff --git a/product.py b/product.py
new file mode 100644
index 0000000..d771b7d
--- /dev/null
+++ b/product.py
@@ -0,0 +1,118 @@
+#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
+
+from trytond.model import fields
+from trytond.pyson import Eval
+from trytond.pool import Pool, PoolMeta
+from trytond.transaction import Transaction
+
+__all__ = ['Template', 'Product']
+__metaclass__ = PoolMeta
+
+
+class Template:
+    __name__ = 'product.template'
+    salable = fields.Boolean('Salable', states={
+            'readonly': ~Eval('active', True),
+            }, depends=['active'])
+    sale_uom = fields.Many2One('product.uom', 'Sale UOM', states={
+            'readonly': ~Eval('active', True),
+            'invisible': ~Eval('salable', False),
+            'required': Eval('salable', False),
+            },
+        domain=[
+            ('category', '=', Eval('default_uom_category')),
+            ],
+        on_change_with=['default_uom', 'sale_uom', 'salable'],
+        depends=['active', 'salable', 'default_uom_category'])
+    delivery_time = fields.Integer('Delivery Time', states={
+            'readonly': ~Eval('active', True),
+            'invisible': ~Eval('salable', False),
+            'required': Eval('salable', False),
+            },
+        depends=['active', 'salable'],
+        help='In number of days')
+
+    @classmethod
+    def __setup__(cls):
+        super(Template, cls).__setup__()
+        required = ~Eval('account_category', False) & Eval('salable', False)
+        if not cls.account_revenue.states.get('required'):
+            cls.account_revenue.states['required'] = required
+        else:
+            cls.account_revenue.states['required'] = (
+                    cls.account_revenue.states['required'] | required)
+        if 'account_category' not in cls.account_revenue.depends:
+            cls.account_revenue.depends.append('account_category')
+        if 'salable' not in cls.account_revenue.depends:
+            cls.account_revenue.depends.append('salable')
+
+    @staticmethod
+    def default_delivery_time():
+        return 0
+
+    def on_change_with_sale_uom(self):
+        if self.default_uom:
+            if self.sale_uom:
+                if self.default_uom.category == self.sale_uom.category:
+                    return self.sale_uom.id
+                else:
+                    return self.default_uom.id
+            else:
+                return self.default_uom.id
+
+
+class Product:
+    __name__ = 'product.product'
+
+    @staticmethod
+    def get_sale_price(products, quantity=0):
+        '''
+        Return the sale price for products and quantity.
+        It uses if exists from the context:
+            uom: the unit of measure
+            currency: the currency id for the returned price
+        '''
+        pool = Pool()
+        Uom = pool.get('product.uom')
+        User = pool.get('res.user')
+        Currency = pool.get('currency.currency')
+        Date = pool.get('ir.date')
+
+        today = Date.today()
+        prices = {}
+
+        uom = None
+        if Transaction().context.get('uom'):
+            uom = Uom(Transaction().context.get('uom'))
+
+        currency = None
+        if Transaction().context.get('currency'):
+            currency = Currency(Transaction().context.get('currency'))
+
+        user = User(Transaction().user)
+
+        for product in products:
+            prices[product.id] = product.list_price
+            if uom:
+                prices[product.id] = Uom.compute_price(
+                    product.default_uom, prices[product.id], uom)
+            if currency and user.company:
+                if user.company.currency != currency:
+                    date = Transaction().context.get('sale_date') or today
+                    with Transaction().set_context(date=date):
+                        prices[product.id] = Currency.compute(
+                            user.company.currency, prices[product.id],
+                            currency, round=False)
+        return prices
+
+    def compute_delivery_date(self, date=None):
+        '''
+        Compute the delivery date a the given date
+        '''
+        Date = Pool().get('ir.date')
+
+        if not date:
+            date = Date.today()
+        return date + datetime.timedelta(self.delivery_time)
diff --git a/sale.odt b/sale.odt
index 600372b..0a64610 100644
Binary files a/sale.odt and b/sale.odt differ
diff --git a/sale.py b/sale.py
index 2ced8d9..a5da83d 100644
--- a/sale.py
+++ b/sale.py
@@ -1,27 +1,31 @@
 #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 decimal import Decimal
-import datetime
 from itertools import groupby, chain
 from functools import partial
+from sql import Table
+from sql.functions import Overlay, Position
+from sql.operators import Concat
+
 from trytond.model import Workflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard, StateAction, StateView, StateTransition, \
     Button
-from trytond.backend import TableHandler
+from trytond import backend
 from trytond.pyson import If, Eval, Bool, PYSONEncoder, Id
 from trytond.transaction import Transaction
 from trytond.pool import Pool, PoolMeta
 
 __all__ = ['Sale', 'SaleInvoice', 'SaleIgnoredInvoice', 'SaleRecreatedInvoice',
     'SaleLine', 'SaleLineTax', 'SaleLineIgnoredMove',
-    'SaleLineRecreatedMove', 'SaleReport', 'Template', 'Product',
-    'ShipmentOut', 'ShipmentOutReturn', 'Move', 'OpenCustomer',
+    'SaleLineRecreatedMove', 'SaleReport', 'OpenCustomer',
     'HandleShipmentExceptionAsk', 'HandleShipmentException',
     'HandleInvoiceExceptionAsk', 'HandleInvoiceException',
-    'ReturnSale']
+    'ReturnSaleStart', 'ReturnSale']
 __metaclass__ = PoolMeta
 
+_ZERO = Decimal(0)
+
 
 class Sale(Workflow, ModelSQL, ModelView):
     'Sale'
@@ -33,7 +37,7 @@ class Sale(Workflow, ModelSQL, ModelView):
             },
         domain=[
             ('id', If(Eval('context', {}).contains('company'), '=', '!='),
-                Eval('context', {}).get('company', 0)),
+                Eval('context', {}).get('company', -1)),
             ],
         depends=['state'], select=True)
     reference = fields.Char('Reference', readonly=True, select=True)
@@ -97,21 +101,21 @@ class Sale(Workflow, ModelSQL, ModelView):
     comment = fields.Text('Comment')
     untaxed_amount = fields.Function(fields.Numeric('Untaxed',
             digits=(16, Eval('currency_digits', 2)),
-            depends=['currency_digits']), 'get_untaxed_amount')
+            depends=['currency_digits']), 'get_amount')
     untaxed_amount_cache = fields.Numeric('Untaxed Cache',
         digits=(16, Eval('currency_digits', 2)),
         readonly=True,
         depends=['currency_digits'])
     tax_amount = fields.Function(fields.Numeric('Tax',
             digits=(16, Eval('currency_digits', 2)),
-            depends=['currency_digits']), 'get_tax_amount')
+            depends=['currency_digits']), 'get_amount')
     tax_amount_cache = fields.Numeric('Tax Cache',
         digits=(16, Eval('currency_digits', 2)),
         readonly=True,
         depends=['currency_digits'])
     total_amount = fields.Function(fields.Numeric('Total',
             digits=(16, Eval('currency_digits', 2)),
-            depends=['currency_digits']), 'get_total_amount')
+            depends=['currency_digits']), 'get_amount')
     total_amount_cache = fields.Numeric('Total Tax',
         digits=(16, Eval('currency_digits', 2)),
         readonly=True,
@@ -154,10 +158,10 @@ class Sale(Workflow, ModelSQL, ModelView):
             ('exception', 'Exception'),
             ], 'Shipment State', readonly=True, required=True)
     shipments = fields.Function(fields.One2Many('stock.shipment.out', None,
-        'Shipments'), 'get_shipments')
+        'Shipments'), 'get_shipments', searcher='search_shipments')
     shipment_returns = fields.Function(
         fields.One2Many('stock.shipment.out.return', None, 'Shipment Returns'),
-        'get_shipment_returns')
+        'get_shipment_returns', searcher='search_shipment_returns')
     moves = fields.Function(fields.One2Many('stock.move', None, 'Moves'),
         'get_moves')
 
@@ -169,7 +173,8 @@ class Sale(Workflow, ModelSQL, ModelView):
         cls._error_messages.update({
                 'invalid_method': ('Invalid combination of shipment and '
                     'invoicing methods on sale "%s".'),
-                'addresses_required': ('Invoice and Shipment addresses must be '
+                'addresses_required': (
+                    'Invoice and Shipment addresses must be '
                     'defined for the quotation of sale "%s".'),
                 'warehouse_required': ('Warehouse must be defined for the '
                     'quotation of sale "%s".'),
@@ -227,20 +232,36 @@ class Sale(Workflow, ModelSQL, ModelView):
     def __register__(cls, module_name):
         pool = Pool()
         SaleLine = pool.get('sale.line')
-        sale_line_invoice_line_table = 'sale_line_invoice_lines_rel'
+        TableHandler = backend.get('TableHandler')
+        sale_line_invoice_line_table_name = 'sale_line_invoice_lines_rel'
         Move = pool.get('stock.move')
         cursor = Transaction().cursor
+        model_data = Table('ir_model_data')
+        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_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_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)))
         table = TableHandler(cursor, cls, module_name)
         table.column_rename('packing_state', 'shipment_state')
         table.column_rename('packing_method', 'shipment_method')
@@ -249,9 +270,10 @@ class Sale(Workflow, ModelSQL, ModelView):
         super(Sale, cls).__register__(module_name)
 
         # Migration from 1.2
-        cursor.execute("UPDATE " + cls._table + " "
-                "SET invoice_method = 'shipment' "
-                "WHERE invoice_method = 'packing'")
+        cursor.execute(*sql_table.update(
+                columns=[sql_table.invoice_method],
+                values=['shipment'],
+                where=sql_table.invoice_method == 'packing'))
 
         table = TableHandler(cursor, cls, module_name)
         # Migration from 2.2
@@ -260,27 +282,30 @@ class Sale(Workflow, ModelSQL, ModelView):
         # state confirmed splitted into confirmed and processing
         if (TableHandler.table_exist(cursor, SaleLine._table)
                 and TableHandler.table_exist(cursor,
-                    sale_line_invoice_line_table)
+                    sale_line_invoice_line_table_name)
                 and TableHandler.table_exist(cursor, Move._table)):
+            sale_line = SaleLine.__table__()
+            sale_line_invoice_line = \
+                Table(sale_line_invoice_line_table_name)
+            move = Move.__table__()
             # Wrap subquery inside an other inner subquery because MySQL syntax
             # doesn't allow update a table and select from the same table in a
             # subquery.
-            cursor.execute('UPDATE "%s" '
-                "SET state = 'processing' "
-                'WHERE id IN ('
-                    'SELECT id '
-                    'FROM ('
-                        'SELECT s.id '
-                        'FROM "%s" AS s '
-                        'INNER JOIN "%s" AS l ON l.sale = s.id '
-                        'LEFT JOIN "%s" AS li ON li.sale_line = l.id '
-                        'LEFT JOIN "%s" AS m ON m.origin = \'%s,\' || l.id '
-                        "WHERE s.state = 'confirmed' "
-                            'AND (li.id IS NOT NULL '
-                                'OR m.id IS NOT NULL)) AS foo)'
-                % (cls._table, cls._table, SaleLine._table,
-                    sale_line_invoice_line_table, Move._table,
-                    SaleLine.__name__))
+            sub_query = sql_table.join(sale_line,
+                condition=sale_line.sale == sql_table.id
+                ).join(sale_line_invoice_line, 'LEFT',
+                    condition=sale_line_invoice_line.sale_line == sale_line.id
+                    ).join(move, 'LEFT',
+                        condition=(move.origin == Concat(SaleLine.__name__,
+                                sale_line.id))
+                        ).select(sql_table.id,
+                            where=(sql_table.state == 'confirmed')
+                            & ((sale_line_invoice_line.id != None)
+                                | (move.id != None)))
+            cursor.execute(*sql_table.update(
+                    columns=[sql_table.state],
+                    values=['processing'],
+                    where=sql_table.id.in_(sub_query.select(sub_query.id))))
 
         # Add index on create_date
         table = TableHandler(cursor, cls, module_name)
@@ -427,22 +452,11 @@ class Sale(Workflow, ModelSQL, ModelView):
             res['total_amount'] = self.currency.round(res['total_amount'])
         return res
 
-    def get_untaxed_amount(self, name):
-        if (self.state in self._states_cached
-                and self.untaxed_amount_cache is not None):
-            return self.untaxed_amount_cache
-        amount = sum((l.amount for l in self.lines if l.type == 'line'),
-            Decimal(0))
-        return self.currency.round(amount)
-
-    def get_tax_amount(self, name):
+    def get_tax_amount(self):
         pool = Pool()
         Tax = pool.get('account.tax')
         Invoice = pool.get('account.invoice')
 
-        if (self.state in self._states_cached
-                and self.tax_amount_cache is not None):
-            return self.tax_amount_cache
         context = self.get_tax_context()
         taxes = {}
         for line in self.lines:
@@ -458,15 +472,39 @@ class Sale(Workflow, ModelSQL, ModelView):
                     taxes[key] = val['amount']
                 else:
                     taxes[key] += val['amount']
-        amount = sum((self.currency.round(taxes[key]) for key in taxes),
-            Decimal(0))
-        return self.currency.round(amount)
+        return sum((self.currency.round(tax) for tax in taxes.values()), _ZERO)
 
-    def get_total_amount(self, name):
-        if (self.state in self._states_cached
-                and self.total_amount_cache is not None):
-            return self.total_amount_cache
-        return self.currency.round(self.untaxed_amount + self.tax_amount)
+    @classmethod
+    def get_amount(cls, sales, names):
+        untaxed_amount = {}
+        tax_amount = {}
+        total_amount = {}
+
+        for sale in sales:
+            if (sale.state in cls._states_cached
+                    and sale.untaxed_amount_cache is not None
+                    and sale.tax_amount_cache is not None
+                    and sale.total_amount_cache is not None):
+                untaxed_amount[sale.id] = sale.untaxed_amount_cache
+                tax_amount[sale.id] = sale.tax_amount_cache
+                total_amount[sale.id] = sale.total_amount_cache
+            else:
+                untaxed_amount[sale.id] = sum(
+                    (line.amount for line in sale.lines
+                        if line.type == 'line'), _ZERO)
+                tax_amount[sale.id] = sale.get_tax_amount()
+                total_amount[sale.id] = (
+                    untaxed_amount[sale.id] + tax_amount[sale.id])
+
+        result = {
+            'untaxed_amount': untaxed_amount,
+            'tax_amount': tax_amount,
+            'total_amount': total_amount,
+            }
+        for key in result.keys():
+            if key not in names:
+                del result[key]
+        return result
 
     def get_invoice_state(self):
         '''
@@ -509,6 +547,19 @@ class Sale(Workflow, ModelSQL, ModelView):
     get_shipments = get_shipments_returns('stock.shipment.out')
     get_shipment_returns = get_shipments_returns('stock.shipment.out.return')
 
+    def search_shipments_returns(model_name):
+        '''
+        Search on shipments or returns
+        '''
+        def method(self, name, clause):
+            return [('lines.moves.shipment.id',) + tuple(clause[1:])
+                + (model_name,)]
+        return classmethod(method)
+
+    search_shipments = search_shipments_returns('stock.shipment.out')
+    search_shipment_returns = search_shipments_returns(
+        'stock.shipment.out.return')
+
     def get_moves(self, name):
         return [m.id for l in self.lines for m in l.moves]
 
@@ -659,7 +710,6 @@ class Sale(Workflow, ModelSQL, ModelView):
             return Invoice(
                 company=self.company,
                 type=invoice_type,
-                reference=self.reference,
                 journal=journal,
                 party=self.party,
                 invoice_address=self.invoice_address,
@@ -686,7 +736,9 @@ class Sale(Workflow, ModelSQL, ModelView):
             return
 
         invoice = self._get_invoice_sale(invoice_type)
-        invoice.lines = list(chain.from_iterable(invoice_lines.itervalues()))
+        invoice.lines = ((list(invoice.lines)
+                if hasattr(invoice, 'lines') else [])
+            + list(chain.from_iterable(invoice_lines.itervalues())))
         invoice.save()
 
         with Transaction().set_user(0, set_context=True):
@@ -752,7 +804,6 @@ class Sale(Workflow, ModelSQL, ModelView):
             values = {
                 'customer': self.party.id,
                 'delivery_address': self.shipment_address.id,
-                'reference': self.reference,
                 'company': self.company.id,
                 }
             values.update(dict(key))
@@ -876,9 +927,7 @@ class SaleLine(ModelSQL, ModelView):
     _rec_name = 'description'
     sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE',
         select=True)
-    sequence = fields.Integer('Sequence',
-        order_field='(%(table)s.sequence IS NULL) %(order)s, '
-        '%(table)s.sequence %(order)s')
+    sequence = fields.Integer('Sequence')
     type = fields.Selection([
         ('line', 'Line'),
         ('subtotal', 'Subtotal'),
@@ -924,7 +973,6 @@ class SaleLine(ModelSQL, ModelView):
             'locations': If(Bool(Eval('_parent_sale', {}).get('warehouse')),
                 [Eval('_parent_sale', {}).get('warehouse', 0)], []),
             'stock_date_end': Eval('_parent_sale', {}).get('sale_date'),
-            'salable': True,
             'stock_skip_warehouse': True,
             }, depends=['type'])
     product_uom_category = fields.Function(
@@ -985,7 +1033,8 @@ class SaleLine(ModelSQL, ModelView):
         super(SaleLine, cls).__setup__()
         cls._order.insert(0, ('sequence', 'ASC'))
         cls._error_messages.update({
-                'customer_location_required': ('Sale "%(sale)s" is missing the '
+                'customer_location_required': (
+                    'Sale "%(sale)s" is missing the '
                     'customer location in line "%(line)s".'),
                 'missing_account_revenue': ('Product "%(product)s" of sale '
                     '%(sale)s misses a revenue account.'),
@@ -995,19 +1044,28 @@ class SaleLine(ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
-        super(SaleLine, cls).__register__(module_name)
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
+        super(SaleLine, cls).__register__(module_name)
         table = TableHandler(cursor, cls, module_name)
 
         # Migration from 1.0 comment change into note
         if table.column_exist('comment'):
-            cursor.execute('UPDATE "' + cls._table + '" SET note = comment')
+            cursor.execute(*sql_table.update(
+                    columns=[sql_table.note],
+                    values=[sql_table.comment]))
             table.drop_column('comment', exception=True)
 
         # Migration from 2.4: drop required on sequence
         table.not_null_action('sequence', action='remove')
 
     @staticmethod
+    def order_sequence(tables):
+        table, _ = tables[None]
+        return [table.sequence == None, table.sequence]
+
+    @staticmethod
     def default_type():
         return 'line'
 
@@ -1251,6 +1309,7 @@ class SaleLine(ModelSQL, ModelView):
         invoice_line.product = self.product
         invoice_line.unit_price = self.unit_price
         invoice_line.taxes = self.taxes
+        invoice_line.invoice_type = invoice_type
         if self.product:
             invoice_line.account = self.product.account_revenue_used
             if not invoice_line.account:
@@ -1302,7 +1361,7 @@ class SaleLine(ModelSQL, ModelView):
         else:
             quantity = 0.0
             for invoice_line in self.invoice_lines:
-                if invoice_line.invoice.state in ('posted', 'paid'):
+                if invoice_line.invoice.state == 'paid':
                     quantity += Uom.compute_qty(invoice_line.unit,
                         invoice_line.quantity, self.unit)
 
@@ -1368,300 +1427,6 @@ class SaleReport(CompanyReport):
     __name__ = 'sale.sale'
 
 
-class Template:
-    __name__ = 'product.template'
-    salable = fields.Boolean('Salable', states={
-            'readonly': ~Eval('active', True),
-            }, depends=['active'])
-    sale_uom = fields.Many2One('product.uom', 'Sale UOM', states={
-            'readonly': ~Eval('active', True),
-            'invisible': ~Eval('salable', False),
-            'required': Eval('salable', False),
-            },
-        domain=[
-            ('category', '=', Eval('default_uom_category')),
-            ],
-        on_change_with=['default_uom', 'sale_uom', 'salable'],
-        depends=['active', 'salable', 'default_uom_category'])
-    delivery_time = fields.Integer('Delivery Time', states={
-            'readonly': ~Eval('active', True),
-            'invisible': ~Eval('salable', False),
-            'required': Eval('salable', False),
-            },
-        depends=['active', 'salable'],
-        help='In number of days')
-
-    @classmethod
-    def __setup__(cls):
-        super(Template, cls).__setup__()
-        required = ~Eval('account_category', False) & Eval('salable', False)
-        if not cls.account_revenue.states.get('required'):
-            cls.account_revenue.states['required'] = required
-        else:
-            cls.account_revenue.states['required'] = (
-                    cls.account_revenue.states['required'] | required)
-        if 'account_category' not in cls.account_revenue.depends:
-            cls.account_revenue.depends.append('account_category')
-        if 'salable' not in cls.account_revenue.depends:
-            cls.account_revenue.depends.append('salable')
-
-    @staticmethod
-    def default_salable():
-        return True if Transaction().context.get('salable') else False
-
-    @staticmethod
-    def default_delivery_time():
-        return 0
-
-    def on_change_with_sale_uom(self):
-        if self.default_uom:
-            if self.sale_uom:
-                if self.default_uom.category == self.sale_uom.category:
-                    return self.sale_uom.id
-                else:
-                    return self.default_uom.id
-            else:
-                return self.default_uom.id
-
-
-class Product:
-    __name__ = 'product.product'
-
-    @staticmethod
-    def get_sale_price(products, quantity=0):
-        '''
-        Return the sale price for products and quantity.
-        It uses if exists from the context:
-            uom: the unit of measure
-            currency: the currency id for the returned price
-        '''
-        pool = Pool()
-        Uom = pool.get('product.uom')
-        User = pool.get('res.user')
-        Currency = pool.get('currency.currency')
-        Date = pool.get('ir.date')
-
-        today = Date.today()
-        prices = {}
-
-        uom = None
-        if Transaction().context.get('uom'):
-            uom = Uom(Transaction().context.get('uom'))
-
-        currency = None
-        if Transaction().context.get('currency'):
-            currency = Currency(Transaction().context.get('currency'))
-
-        user = User(Transaction().user)
-
-        for product in products:
-            prices[product.id] = product.list_price
-            if uom:
-                prices[product.id] = Uom.compute_price(
-                    product.default_uom, prices[product.id], uom)
-            if currency and user.company:
-                if user.company.currency != currency:
-                    date = Transaction().context.get('sale_date') or today
-                    with Transaction().set_context(date=date):
-                        prices[product.id] = Currency.compute(
-                            user.company.currency, prices[product.id],
-                            currency, round=False)
-        return prices
-
-    def compute_delivery_date(self, date=None):
-        '''
-        Compute the delivery date a the given date
-        '''
-        Date = Pool().get('ir.date')
-
-        if not date:
-            date = Date.today()
-        return date + datetime.timedelta(self.delivery_time)
-
-
-class ShipmentOut:
-    __name__ = 'stock.shipment.out'
-
-    @classmethod
-    def __setup__(cls):
-        super(ShipmentOut, cls).__setup__()
-        cls._error_messages.update({
-                'reset_move': 'You cannot reset to draft a move generated '
-                    'by a sale.',
-            })
-
-    @classmethod
-    def write(cls, shipments, vals):
-        pool = Pool()
-        Sale = pool.get('sale.sale')
-        SaleLine = pool.get('sale.line')
-
-        super(ShipmentOut, cls).write(shipments, vals)
-
-        if 'state' in vals and vals['state'] in ('done', 'cancel'):
-            sales = []
-            move_ids = []
-            for shipment in shipments:
-                move_ids.extend([x.id for x in shipment.outgoing_moves])
-
-            with Transaction().set_user(0, set_context=True):
-                sale_lines = SaleLine.search([
-                        ('moves', 'in', move_ids),
-                        ])
-                if sale_lines:
-                    sales = list(set(l.sale for l in sale_lines))
-                    Sale.process(sales)
-
-    @classmethod
-    @ModelView.button
-    @Workflow.transition('draft')
-    def draft(cls, shipments):
-        SaleLine = Pool().get('sale.line')
-        for shipment in shipments:
-            for move in shipment.outgoing_moves:
-                if (move.state == 'cancel'
-                        and isinstance(move.origin, SaleLine)):
-                    cls.raise_user_error('reset_move')
-
-        return super(ShipmentOut, cls).draft(shipments)
-
-
-class ShipmentOutReturn:
-    __name__ = 'stock.shipment.out.return'
-
-    @classmethod
-    def __setup__(cls):
-        super(ShipmentOutReturn, cls).__setup__()
-        cls._error_messages.update({
-                'reset_move': 'You cannot reset to draft a move generated '
-                    'by a sale.',
-            })
-
-    @classmethod
-    def write(cls, shipments, vals):
-        pool = Pool()
-        Sale = pool.get('sale.sale')
-        SaleLine = pool.get('sale.line')
-
-        super(ShipmentOutReturn, cls).write(shipments, vals)
-
-        if 'state' in vals and vals['state'] == 'received':
-            sales = []
-            move_ids = []
-            for shipment in shipments:
-                move_ids.extend([x.id for x in shipment.incoming_moves])
-
-            with Transaction().set_user(0, set_context=True):
-                sale_lines = SaleLine.search([
-                        ('moves', 'in', move_ids),
-                        ])
-                if sale_lines:
-                    for sale_line in sale_lines:
-                        if sale_line.sale not in sales:
-                            sales.append(sale_line.sale)
-
-                    sales = Sale.browse([s.id for s in sales])
-                    Sale.process(sales)
-
-    @classmethod
-    @ModelView.button
-    @Workflow.transition('draft')
-    def draft(cls, shipments):
-        SaleLine = Pool().get('sale.line')
-        for shipment in shipments:
-            for move in shipment.incoming_moves:
-                if (move.state == 'cancel'
-                        and isinstance(move.origin, SaleLine)):
-                    cls.raise_user_error('reset_move')
-
-        return super(ShipmentOutReturn, cls).draft(shipments)
-
-
-class Move:
-    __name__ = 'stock.move'
-    sale = fields.Function(fields.Many2One('sale.sale', 'Sale', select=True),
-        'get_sale', searcher='search_sale')
-    sale_exception_state = fields.Function(fields.Selection([
-        ('', ''),
-        ('ignored', 'Ignored'),
-        ('recreated', 'Recreated'),
-        ], 'Exception State'), 'get_sale_exception_state')
-
-    @classmethod
-    def __register__(cls, module_name):
-        cursor = Transaction().cursor
-
-        super(Move, cls).__register__(module_name)
-
-        table = TableHandler(cursor, cls, module_name)
-
-        # Migration from 2.6: remove sale_line
-        if table.column_exist('sale_line'):
-            cursor.execute('UPDATE "' + cls._table + '" '
-                'SET origin = \'sale.line,\' || sale_line '
-                'WHERE sale_line IS NOT NULL')
-            table.drop_column('sale_line')
-
-    @classmethod
-    def _get_origin(cls):
-        models = super(Move, cls)._get_origin()
-        models.append('sale.line')
-        return models
-
-    def get_sale(self, name):
-        SaleLine = Pool().get('sale.line')
-        if isinstance(self.origin, SaleLine):
-            return self.origin.sale.id
-
-    @classmethod
-    def search_sale(cls, name, clause):
-        return [('origin.' + name,) + tuple(clause[1:]) + ('sale.line',)]
-
-    def get_sale_exception_state(self, name):
-        SaleLine = Pool().get('sale.line')
-        if not isinstance(self.origin, SaleLine):
-            return ''
-        if self in self.origin.moves_recreated:
-            return 'recreated'
-        if self in self.origin.moves_ignored:
-            return 'ignored'
-        return ''
-
-    @classmethod
-    def write(cls, moves, vals):
-        pool = Pool()
-        Sale = pool.get('sale.sale')
-        SaleLine = pool.get('sale.line')
-
-        super(Move, cls).write(moves, vals)
-        if 'state' in vals and vals['state'] in ('cancel',):
-            with Transaction().set_user(0, set_context=True):
-                sale_lines = SaleLine.search([
-                        ('moves', 'in', [m.id for m in moves]),
-                        ])
-                if sale_lines:
-                    sales = list(set(l.sale for l in sale_lines))
-                    Sale.process(sales)
-
-    @classmethod
-    def delete(cls, moves):
-        pool = Pool()
-        Sale = pool.get('sale.sale')
-        SaleLine = pool.get('sale.line')
-
-        with Transaction().set_user(0, set_context=True):
-            sale_lines = SaleLine.search([
-                    ('moves', 'in', [m.id for m in moves]),
-                    ])
-
-        super(Move, cls).delete(moves)
-
-        if sale_lines:
-            sales = list(set(l.sale for l in sale_lines))
-            with Transaction().set_user(0, set_context=True):
-                Sale.process(sales)
-
-
 class OpenCustomer(Wizard):
     'Open Customers'
     __name__ = 'sale.open_customer'
@@ -1672,8 +1437,11 @@ class OpenCustomer(Wizard):
         pool = Pool()
         ModelData = pool.get('ir.model.data')
         Wizard = pool.get('ir.action.wizard')
+        Sale = pool.get('sale.sale')
         cursor = Transaction().cursor
-        cursor.execute("SELECT DISTINCT(party) FROM sale_sale")
+        sale = Sale.__table__()
+
+        cursor.execute(*sale.select(sale.party, group_by=sale.party))
         customer_ids = [line[0] for line in Transaction().cursor.fetchall()]
         action['pyson_domain'] = PYSONEncoder().encode(
             [('id', 'in', customer_ids)])
@@ -1703,11 +1471,15 @@ class HandleShipmentExceptionAsk(ModelView):
     @classmethod
     def __register__(cls, module_name):
         cursor = Transaction().cursor
+        model = Table('ir_model')
         # Migration from 1.2: packing renamed into shipment
-        cursor.execute("UPDATE ir_model "
-                "SET model = REPLACE(model, 'packing', 'shipment') "
-                "WHERE model like '%%packing%%' AND module = %s",
-                (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)))
         super(HandleShipmentExceptionAsk, cls).__register__(module_name)
 
 
@@ -1830,17 +1602,31 @@ class HandleInvoiceException(Wizard):
         return 'end'
 
 
+class ReturnSaleStart(ModelView):
+    'Return Sale'
+    __name__ = 'sale.return_sale.start'
+
+
 class ReturnSale(Wizard):
+    'Return Sale'
     __name__ = 'sale.return_sale'
-    start_state = 'make_return'
-    make_return = StateTransition()
+    start = StateView('sale.return_sale.start',
+        'sale.return_sale_start_view_form', [
+            Button('Cancel', 'end', 'tryton-cancel'),
+            Button('Return', 'return_', 'tryton-ok', default=True),
+            ])
+    return_ = StateAction('sale.act_sale_form')
 
-    def transition_make_return(self):
+    def do_return_(self, action):
         Sale = Pool().get('sale.sale')
 
-        sale = Sale(Transaction().context['active_id'])
-        new_sale, = Sale.copy([sale])
-        for new_line in new_sale.lines:
-            new_line.quantity *= -1
-            new_line.save()
-        return 'end'
+        sales = Sale.browse(Transaction().context['active_ids'])
+        return_sales = Sale.copy(sales)
+        for sale in return_sales:
+            for line in sale.lines:
+                line.quantity *= -1
+                line.save()
+        data = {'res_id': [s.id for s in return_sales]}
+        if len(return_sales) == 1:
+            action['views'].reverse()
+        return action, data
diff --git a/sale.xml b/sale.xml
index 5db5c14..d67233d 100644
--- a/sale.xml
+++ b/sale.xml
@@ -154,6 +154,54 @@ this repository contains the full copyright notices and license terms. -->
             <field name="group" ref="group_sale"/>
         </record>
 
+        <record model="ir.action.act_window" id="act_sale_invoice_relate">
+            <field name="name">Sales</field>
+            <field name="res_model">sale.sale</field>
+            <field name="domain">[('invoices', 'in', [Eval('id')])]</field>
+        </record>
+        <record model="ir.action.act_window.view"
+            id="act_sale_invoice_relate_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="sale_view_tree"/>
+            <field name="act_window" ref="act_sale_invoice_relate"/>
+        </record>
+        <record model="ir.action.act_window.view"
+            id="act_sale_invoice_relate_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="sale_view_form"/>
+            <field name="act_window" ref="act_sale_invoice_relate"/>
+        </record>
+        <record model="ir.action.keyword"
+                id="act_sale_invoice_relate_keyword">
+            <field name="keyword">form_relate</field>
+            <field name="model">account.invoice,-1</field>
+            <field name="action" ref="act_sale_invoice_relate"/>
+        </record>
+
+        <record model="ir.action.act_window" id="act_sale_shipments_relate">
+            <field name="name">Sales</field>
+            <field name="res_model">sale.sale</field>
+            <field name="domain">[('shipments', 'in', [Eval('id')])]</field>
+        </record>
+        <record model="ir.action.act_window.view"
+            id="act_sale_shipments_relate_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="sale_view_tree"/>
+            <field name="act_window" ref="act_sale_shipments_relate"/>
+        </record>
+        <record model="ir.action.act_window.view"
+            id="act_sale_shipments_relate_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="sale_view_form"/>
+            <field name="act_window" ref="act_sale_shipments_relate"/>
+        </record>
+        <record model="ir.action.keyword"
+            id="act_sale_shipments_relate_keyword">
+            <field name="keyword">form_relate</field>
+            <field name="model">stock.shipment.out,-1</field>
+            <field name="action" ref="act_sale_shipments_relate"/>
+        </record>
+
         <record model="ir.model.access" id="access_sale">
             <field name="model" search="[('model', '=', 'sale.sale')]"/>
             <field name="perm_read" eval="False"/>
@@ -295,6 +343,11 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">template_tree</field>
         </record>
 
+        <record model="ir.ui.view" id="party_view_form">
+            <field name="model">party.party</field>
+            <field name="inherit" ref="party.party_view_form"/>
+            <field name="name">party_form</field>
+        </record>
         <record model="ir.action.wizard" id="act_open_customer">
             <field name="name">Parties associated to Sales</field>
             <field name="wiz_name">sale.open_customer</field>
@@ -305,8 +358,14 @@ this repository contains the full copyright notices and license terms. -->
             icon="tryton-list"
             id="menu_customer"/>
 
+        <record model="ir.ui.view" id="return_sale_start_view_form">
+            <field name="model">sale.return_sale.start</field>
+            <field name="type">form</field>
+            <field name="name">return_sale_start_form</field>
+        </record>
+
         <record model="ir.action.wizard" id="wizard_return_sale">
-            <field name="name">Create Return Sale</field>
+            <field name="name">Return Sale</field>
             <field name="wiz_name">sale.return_sale</field>
             <field name="model">sale.sale</field>
         </record>
diff --git a/setup.py b/setup.py
index 4501651..31c4408 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_sale',
         '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/stock.py b/stock.py
new file mode 100644
index 0000000..542cc76
--- /dev/null
+++ b/stock.py
@@ -0,0 +1,209 @@
+#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 sql.operators import Concat
+
+from trytond.model import Workflow, ModelView, fields
+from trytond.transaction import Transaction
+from trytond.pool import Pool, PoolMeta
+from trytond import backend
+
+__all__ = ['ShipmentOut', 'ShipmentOutReturn', 'Move']
+__metaclass__ = PoolMeta
+
+
+class ShipmentOut:
+    __name__ = 'stock.shipment.out'
+
+    @classmethod
+    def __setup__(cls):
+        super(ShipmentOut, cls).__setup__()
+        cls._error_messages.update({
+                'reset_move': 'You cannot reset to draft a move generated '
+                    'by a sale.',
+            })
+
+    @classmethod
+    def write(cls, shipments, vals):
+        pool = Pool()
+        Sale = pool.get('sale.sale')
+        SaleLine = pool.get('sale.line')
+
+        super(ShipmentOut, cls).write(shipments, vals)
+
+        if 'state' in vals and vals['state'] in ('done', 'cancel'):
+            sales = []
+            move_ids = []
+            for shipment in shipments:
+                move_ids.extend([x.id for x in shipment.outgoing_moves])
+
+            with Transaction().set_user(0, set_context=True):
+                sale_lines = SaleLine.search([
+                        ('moves', 'in', move_ids),
+                        ])
+                if sale_lines:
+                    sales = list(set(l.sale for l in sale_lines))
+                    Sale.process(sales)
+
+    @classmethod
+    @ModelView.button
+    @Workflow.transition('draft')
+    def draft(cls, shipments):
+        SaleLine = Pool().get('sale.line')
+        for shipment in shipments:
+            for move in shipment.outgoing_moves:
+                if (move.state == 'cancel'
+                        and isinstance(move.origin, SaleLine)):
+                    cls.raise_user_error('reset_move')
+
+        return super(ShipmentOut, cls).draft(shipments)
+
+
+class ShipmentOutReturn:
+    __name__ = 'stock.shipment.out.return'
+
+    @classmethod
+    def __setup__(cls):
+        super(ShipmentOutReturn, cls).__setup__()
+        cls._error_messages.update({
+                'reset_move': 'You cannot reset to draft a move generated '
+                    'by a sale.',
+            })
+
+    @classmethod
+    def write(cls, shipments, vals):
+        pool = Pool()
+        Sale = pool.get('sale.sale')
+        SaleLine = pool.get('sale.line')
+
+        super(ShipmentOutReturn, cls).write(shipments, vals)
+
+        if 'state' in vals and vals['state'] == 'received':
+            sales = []
+            move_ids = []
+            for shipment in shipments:
+                move_ids.extend([x.id for x in shipment.incoming_moves])
+
+            with Transaction().set_user(0, set_context=True):
+                sale_lines = SaleLine.search([
+                        ('moves', 'in', move_ids),
+                        ])
+                if sale_lines:
+                    for sale_line in sale_lines:
+                        if sale_line.sale not in sales:
+                            sales.append(sale_line.sale)
+
+                    sales = Sale.browse([s.id for s in sales])
+                    Sale.process(sales)
+
+    @classmethod
+    @ModelView.button
+    @Workflow.transition('draft')
+    def draft(cls, shipments):
+        SaleLine = Pool().get('sale.line')
+        for shipment in shipments:
+            for move in shipment.incoming_moves:
+                if (move.state == 'cancel'
+                        and isinstance(move.origin, SaleLine)):
+                    cls.raise_user_error('reset_move')
+
+        return super(ShipmentOutReturn, cls).draft(shipments)
+
+
+class Move:
+    __name__ = 'stock.move'
+    sale = fields.Function(fields.Many2One('sale.sale', 'Sale', select=True),
+        'get_sale', searcher='search_sale')
+    sale_exception_state = fields.Function(fields.Selection([
+        ('', ''),
+        ('ignored', 'Ignored'),
+        ('recreated', 'Recreated'),
+        ], 'Exception State'), 'get_sale_exception_state')
+
+    @classmethod
+    def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
+        cursor = Transaction().cursor
+        sql_table = cls.__table__()
+
+        super(Move, cls).__register__(module_name)
+
+        table = TableHandler(cursor, cls, module_name)
+
+        # Migration from 2.6: remove sale_line
+        if table.column_exist('sale_line'):
+            cursor.execute(*sql_table.update(
+                    columns=[sql_table.origin],
+                    values=[Concat('sale.line,', sql_table.sale_line)],
+                    where=sql_table.sale_line != None))
+            table.drop_column('sale_line')
+
+    @classmethod
+    def _get_origin(cls):
+        models = super(Move, cls)._get_origin()
+        models.append('sale.line')
+        return models
+
+    def get_sale(self, name):
+        SaleLine = Pool().get('sale.line')
+        if isinstance(self.origin, SaleLine):
+            return self.origin.sale.id
+
+    @classmethod
+    def search_sale(cls, name, clause):
+        return [('origin.' + name,) + tuple(clause[1:]) + ('sale.line',)]
+
+    def get_sale_exception_state(self, name):
+        SaleLine = Pool().get('sale.line')
+        if not isinstance(self.origin, SaleLine):
+            return ''
+        if self in self.origin.moves_recreated:
+            return 'recreated'
+        if self in self.origin.moves_ignored:
+            return 'ignored'
+        return ''
+
+    @property
+    def origin_name(self):
+        pool = Pool()
+        SaleLine = pool.get('sale.line')
+        name = super(Move, self).origin_name
+        if isinstance(self.origin, SaleLine):
+            name = self.origin.sale.rec_name
+        return name
+
+    @classmethod
+    @ModelView.button
+    @Workflow.transition('cancel')
+    def cancel(cls, moves):
+        pool = Pool()
+        Sale = pool.get('sale.sale')
+        SaleLine = pool.get('sale.line')
+
+        super(Move, cls).cancel(moves)
+
+        with Transaction().set_user(0, set_context=True):
+            sale_lines = SaleLine.search([
+                    ('moves', 'in', [m.id for m in moves]),
+                    ])
+            if sale_lines:
+                sale_ids = list(set(l.sale.id for l in sale_lines))
+                sales = Sale.browse(sale_ids)
+                Sale.process(sales)
+
+    @classmethod
+    def delete(cls, moves):
+        pool = Pool()
+        Sale = pool.get('sale.sale')
+        SaleLine = pool.get('sale.line')
+
+        with Transaction().set_user(0, set_context=True):
+            sale_lines = SaleLine.search([
+                    ('moves', 'in', [m.id for m in moves]),
+                    ])
+
+        super(Move, cls).delete(moves)
+
+        if sale_lines:
+            sales = list(set(l.sale for l in sale_lines))
+            with Transaction().set_user(0, set_context=True):
+                Sale.process(sales)
diff --git a/tests/__init__.py b/tests/__init__.py
index 656a242..479d61c 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_sale import suite
+
+__all__ = ['suite']
diff --git a/tests/scenario_sale.rst b/tests/scenario_sale.rst
index 10936c9..fa10185 100644
--- a/tests/scenario_sale.rst
+++ b/tests/scenario_sale.rst
@@ -112,7 +112,7 @@ Create chart of accounts::
 
     >>> AccountTemplate = Model.get('account.account.template')
     >>> Account = Model.get('account.account')
-    >>> account_template, = AccountTemplate.find([('parent', '=', False)])
+    >>> account_template, = AccountTemplate.find([('parent', '=', None)])
     >>> create_chart = Wizard('account.create_chart')
     >>> create_chart.execute('account')
     >>> create_chart.form.account_template = account_template
@@ -235,6 +235,23 @@ Sale 5 products::
     >>> sale.reload()
     >>> len(sale.shipments), len(sale.shipment_returns), len(sale.invoices)
     (1, 0, 1)
+    >>> invoice, = sale.invoices
+    >>> invoice.origins == sale.rec_name
+    True
+    >>> shipment, = sale.shipments
+    >>> shipment.origins == sale.rec_name
+    True
+
+Post invoice and check no new invoices::
+
+
+    >>> config.user = account_user.id
+    >>> Invoice = Model.get('account.invoice')
+    >>> Invoice.post([i.id for i in sale.invoices], config.context)
+    >>> config.user = sale_user.id
+    >>> sale.reload()
+    >>> len(sale.shipments), len(sale.shipment_returns), len(sale.invoices)
+    (1, 0, 1)
 
 Sale 5 products with an invoice method 'on shipment'::
 
@@ -288,18 +305,19 @@ Open customer invoice::
     u'out_invoice'
     >>> len(invoice.lines)
     2
+    >>> for line in invoice.lines:
+    ...     line.quantity = 1
+    ...     line.save()
     >>> Invoice.post([invoice.id], config.context)
-    >>> invoice.reload()
-    >>> invoice.state
-    u'posted'
-    >>> receivable.reload()
-    >>> (receivable.debit, receivable.credit) == \
-    ... (Decimal('50.00'), Decimal('0.00'))
-    True
-    >>> revenue.reload()
-    >>> (revenue.debit, revenue.credit) == \
-    ... (Decimal('0.00'), Decimal('50.00'))
-    True
+
+Check second invoices::
+
+    >>> config.user = sale_user.id
+    >>> sale.reload()
+    >>> len(sale.invoices)
+    2
+    >>> sum(l.quantity for i in sale.invoices for l in i.lines)
+    5.0
 
 Create a Return::
 
@@ -350,16 +368,9 @@ Open customer credit note::
     u'out_credit_note'
     >>> len(credit_note.lines)
     1
+    >>> sum(l.quantity for l in credit_note.lines)
+    4.0
     >>> Invoice.post([credit_note.id], config.context)
-    >>> credit_note.reload()
-    >>> credit_note.state
-    u'posted'
-    >>> receivable.reload()
-    >>> (receivable.debit, receivable.credit) == (Decimal(50), Decimal(40))
-    True
-    >>> revenue.reload()
-    >>> (revenue.debit, revenue.credit) == (Decimal(40), Decimal(50))
-    True
 
 Mixing return and sale::
 
@@ -423,20 +434,12 @@ Checking the invoice::
     (u'out_invoice', u'out_credit_note')
     >>> len(mix_invoice.lines), len(mix_credit_note.lines)
     (1, 1)
+    >>> sum(l.quantity for l in mix_invoice.lines)
+    7.0
+    >>> sum(l.quantity for l in mix_credit_note.lines)
+    2.0
     >>> Invoice.post([mix_invoice.id], config.context)
-    >>> mix_invoice.reload()
-    >>> mix_invoice.state
-    u'posted'
     >>> Invoice.post([mix_credit_note.id], config.context)
-    >>> mix_credit_note.reload()
-    >>> mix_credit_note.state
-    u'posted'
-    >>> receivable.reload()
-    >>> (receivable.debit, receivable.credit) == (Decimal(120), Decimal(60))
-    True
-    >>> revenue.reload()
-    >>> (revenue.debit, revenue.credit) == (Decimal(60), Decimal(120))
-    True
 
 Mixing stuff with an invoice method 'on shipment'::
 
diff --git a/tryton.cfg b/tryton.cfg
index d35c499..8d98329 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.8.2
+version=3.0.0
 depends:
     account
     account_invoice
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index a5ed6e8..fffdcc9 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond-sale
-Version: 2.8.2
+Version: 3.0.0
 Summary: Tryton module for sale
 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_sale
         ============
         
@@ -59,6 +59,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_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
index 8450b33..59424ac 100644
--- a/trytond_sale.egg-info/SOURCES.txt
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -16,7 +16,9 @@ tryton.cfg
 ./__init__.py
 ./configuration.py
 ./invoice.py
+./product.py
 ./sale.py
+./stock.py
 ./tests/__init__.py
 ./tests/test_sale.py
 doc/index.rst
@@ -30,6 +32,7 @@ locale/es_ES.po
 locale/fr_FR.po
 locale/nl_NL.po
 locale/ru_RU.po
+locale/sl_SI.po
 tests/scenario_sale.rst
 trytond_sale.egg-info/PKG-INFO
 trytond_sale.egg-info/SOURCES.txt
@@ -42,7 +45,9 @@ view/configuration_form.xml
 view/handle_invoice_exception_ask_form.xml
 view/handle_shipment_exception_ask_form.xml
 view/move_list_shipment.xml
+view/party_form.xml
 view/product_list_sale_line.xml
+view/return_sale_start_form.xml
 view/sale_form.xml
 view/sale_line_form.xml
 view/sale_line_tree.xml
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
index 54d6265..bc38aef 100644
--- a/trytond_sale.egg-info/requires.txt
+++ b/trytond_sale.egg-info/requires.txt
@@ -1,9 +1,10 @@
-trytond_account >= 2.8, < 2.9
-trytond_account_invoice >= 2.8, < 2.9
-trytond_account_product >= 2.8, < 2.9
-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_stock >= 2.8, < 2.9
-trytond >= 2.8, < 2.9
\ No newline at end of file
+python-sql
+trytond_account >= 3.0, < 3.1
+trytond_account_invoice >= 3.0, < 3.1
+trytond_account_product >= 3.0, < 3.1
+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_stock >= 3.0, < 3.1
+trytond >= 3.0, < 3.1
\ No newline at end of file
diff --git a/view/party_form.xml b/view/party_form.xml
new file mode 100644
index 0000000..915f65b
--- /dev/null
+++ b/view/party_form.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<data>
+    <xpath expr="/form/notebook" position="inside">
+        <page id="sale" string="Sale">
+        </page>
+    </xpath>
+</data>
diff --git a/view/return_sale_start_form.xml b/view/return_sale_start_form.xml
new file mode 100644
index 0000000..fa87481
--- /dev/null
+++ b/view/return_sale_start_form.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!-- 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="Return Sale" col="2">
+    <image name="tryton-dialog-information" xexpand="0" xfill="0"/>
+    <label string="Are you sure to return those/this sale(s)?" id="return"
+        yalign="0.0" xalign="0.0" xexpand="1"/>
+</form>
diff --git a/view/sale_tree.xml b/view/sale_tree.xml
index 8be9f5c..abdf83c 100644
--- a/view/sale_tree.xml
+++ b/view/sale_tree.xml
@@ -14,5 +14,4 @@ this repository contains the full copyright notices and license terms. -->
     <field name="shipment_state"/>
     <field name="description"/>
     <field name="currency_digits" tree_invisible="1"/>
-    <field name="create_date" tree_invisible="1"/>
 </tree>
-- 
tryton-modules-sale



More information about the tryton-debian-vcs mailing list